From 2bf85c03c1e059a2f75dbd48ef73be5961e12414 Mon Sep 17 00:00:00 2001 From: hylom Date: Thu, 1 Sep 2011 13:44:19 +0900 Subject: [PATCH] initial commit from 1.97b zip archive --- FFFTP.chm | Bin 0 -> 262974 bytes FFFTP.exe | Bin 0 -> 425984 bytes FFFTP.sln | 25 + FFFTP.txt | 171 + FFFTP.vcproj | 443 +++ FFFTP_English.vcproj | 439 +++ JRE32.DLL | Bin 0 -> 27648 bytes OLDregistory.c | 2364 ++++++++++++++ OleDragDrop.c | 814 +++++ OleDragDrop.h | 72 + Resource/FFFTP.APS | Bin 0 -> 149812 bytes Resource/FFFTP.rc | 2101 +++++++++++++ Resource/Thumbs.db | Bin 0 -> 8704 bytes Resource/bitmap1.bmp | Bin 0 -> 502 bytes Resource/cursor1.cur | Bin 0 -> 326 bytes Resource/cursor2.cur | Bin 0 -> 326 bytes Resource/drag_csr.cur | Bin 0 -> 326 bytes Resource/ffftp.exe.manifest | 23 + Resource/icon1.ico | Bin 0 -> 16158 bytes Resource/icon2.ico | Bin 0 -> 766 bytes Resource/list_bmp.bmp | Bin 0 -> 638 bytes Resource/main_too.bmp | Bin 0 -> 374 bytes Resource/nodrop_c.cur | Bin 0 -> 326 bytes Resource/resource.h | 601 ++++ Resource/toolbar1.bmp | Bin 0 -> 3574 bytes Resource_eng/FFFTP-eng.aps | Bin 0 -> 156748 bytes Resource_eng/FFFTP-eng.rc | 2152 +++++++++++++ Resource_eng/Thumbs.db | Bin 0 -> 8704 bytes Resource_eng/bitmap1.bmp | Bin 0 -> 502 bytes Resource_eng/cursor1.cur | Bin 0 -> 326 bytes Resource_eng/cursor2.cur | Bin 0 -> 326 bytes Resource_eng/drag_csr.cur | Bin 0 -> 326 bytes Resource_eng/ffftp.exe.manifest | 23 + Resource_eng/icon1.ico | Bin 0 -> 16158 bytes Resource_eng/icon2.ico | Bin 0 -> 766 bytes Resource_eng/list_bmp.bmp | Bin 0 -> 638 bytes Resource_eng/main_too.bmp | Bin 0 -> 374 bytes Resource_eng/nodrop_c.cur | Bin 0 -> 326 bytes Resource_eng/resource.h | 600 ++++ Resource_eng/toolbar1.bmp | Bin 0 -> 3574 bytes SourceCode.txt | 3 + aes.h | 205 ++ aes_modes.c | 945 ++++++ aes_via_ace.h | 529 ++++ aescrypt.c | 301 ++ aeskey.c | 555 ++++ aesopt.h | 746 +++++ aestab.c | 398 +++ aestab.h | 180 ++ bookmark.c | 610 ++++ brg_endian.h | 133 + brg_types.h | 226 ++ cache.c | 495 +++ clipboard.c | 79 + codecnv.c | 1679 ++++++++++ common.h | 1619 ++++++++++ config.h | 4 + connect.c | 2125 +++++++++++++ diskfree.c | 158 + dlgsize.c | 211 ++ filelist.c | 5322 ++++++++++++++++++++++++++++++++ ftpproc.c | 3283 ++++++++++++++++++++ getput.c | 2520 +++++++++++++++ helpid.h | 59 + history.c | 432 +++ history.txt | 1242 ++++++++ hostman.c | 2065 +++++++++++++ htmlhelp/FFFTP.$HP | Bin 0 -> 73767 bytes htmlhelp/FFFTP.CHM | Bin 0 -> 262974 bytes htmlhelp/FFFTP.HHC | 267 ++ htmlhelp/FFFTP.HHK | 323 ++ htmlhelp/FFFTP.HHP | 142 + htmlhelp/FFFTP.KHP | Bin 0 -> 73767 bytes htmlhelp/HTML/H0000001.HTM | 30 + htmlhelp/HTML/H0000002.HTM | 6 + htmlhelp/HTML/H0000003.HTM | 12 + htmlhelp/HTML/H0000004.HTM | 11 + htmlhelp/HTML/H0000005.HTM | 28 + htmlhelp/HTML/H0000006.HTM | 10 + htmlhelp/HTML/H0000007.HTM | 17 + htmlhelp/HTML/H0000008.HTM | 36 + htmlhelp/HTML/H0000009.HTM | 24 + htmlhelp/HTML/H0000010.HTM | 28 + htmlhelp/HTML/H0000011.HTM | 28 + htmlhelp/HTML/H0000012.HTM | 31 + htmlhelp/HTML/H0000013.HTM | 29 + htmlhelp/HTML/H0000014.HTM | 10 + htmlhelp/HTML/H0000015.HTM | 9 + htmlhelp/HTML/H0000016.HTM | 9 + htmlhelp/HTML/H0000017.HTM | 17 + htmlhelp/HTML/H0000018.HTM | 7 + htmlhelp/HTML/H0000019.HTM | 24 + htmlhelp/HTML/H0000020.HTM | 24 + htmlhelp/HTML/H0000021.HTM | 21 + htmlhelp/HTML/H0000022.HTM | 11 + htmlhelp/HTML/H0000023.HTM | 16 + htmlhelp/HTML/H0000024.HTM | 85 + htmlhelp/HTML/H0000025.HTM | 19 + htmlhelp/HTML/H0000027.HTM | 27 + htmlhelp/HTML/H0000028.HTM | 31 + htmlhelp/HTML/H0000029.HTM | 31 + htmlhelp/HTML/H0000030.HTM | 22 + htmlhelp/HTML/H0000031.HTM | 20 + htmlhelp/HTML/H0000032.HTM | 36 + htmlhelp/HTML/H0000034.HTM | 28 + htmlhelp/HTML/H0000035.HTM | 61 + htmlhelp/HTML/H0000036.HTM | 35 + htmlhelp/HTML/H0000037.HTM | 24 + htmlhelp/HTML/H0000038.HTM | 10 + htmlhelp/HTML/H0000039.HTM | 12 + htmlhelp/HTML/H0000040.HTM | 6 + htmlhelp/HTML/H0000041.HTM | 9 + htmlhelp/HTML/H0000042.HTM | 29 + htmlhelp/HTML/H0000043.HTM | 17 + htmlhelp/HTML/H0000044.HTM | 14 + htmlhelp/HTML/H0000045.HTM | 15 + htmlhelp/HTML/H0000046.HTM | 17 + htmlhelp/HTML/H0000047.HTM | 13 + htmlhelp/HTML/H0000048.HTM | 33 + htmlhelp/HTML/H0000049.HTM | 67 + htmlhelp/HTML/H0000050.HTM | 18 + htmlhelp/HTML/H0000051.HTM | 12 + htmlhelp/HTML/H0000052.HTM | 25 + htmlhelp/HTML/H0000054.HTM | 15 + htmlhelp/HTML/H0000055.HTM | 18 + htmlhelp/HTML/H0000056.HTM | 10 + htmlhelp/HTML/H0000057.HTM | 9 + htmlhelp/HTML/H0000058.HTM | 8 + htmlhelp/HTML/H0000059.HTM | 6 + htmlhelp/HTML/H0000060.HTM | 20 + htmlhelp/HTML/H0000061.HTM | 38 + htmlhelp/HTML/H0000062.HTM | 18 + htmlhelp/HTML/H0000064.HTM | 16 + htmlhelp/helpid.h | 59 + htmlhelp/pic/__OLD_dlg_opt_notify.png | Bin 0 -> 3514 bytes htmlhelp/pic/bmarkmenu.png | Bin 0 -> 3122 bytes htmlhelp/pic/btn_abort.png | Bin 0 -> 234 bytes htmlhelp/pic/btn_asc.png | Bin 0 -> 220 bytes htmlhelp/pic/btn_auto.png | Bin 0 -> 242 bytes htmlhelp/pic/btn_bin.png | Bin 0 -> 215 bytes htmlhelp/pic/btn_chdir.png | Bin 0 -> 248 bytes htmlhelp/pic/btn_con.png | Bin 0 -> 192 bytes htmlhelp/pic/btn_del.png | Bin 0 -> 219 bytes htmlhelp/pic/btn_discon.png | Bin 0 -> 241 bytes htmlhelp/pic/btn_down.png | Bin 0 -> 202 bytes htmlhelp/pic/btn_euc.png | Bin 0 -> 201 bytes htmlhelp/pic/btn_jis.png | Bin 0 -> 204 bytes htmlhelp/pic/btn_list.png | Bin 0 -> 173 bytes htmlhelp/pic/btn_mirrorup.png | Bin 0 -> 242 bytes htmlhelp/pic/btn_mkdir.png | Bin 0 -> 238 bytes htmlhelp/pic/btn_nocnv.png | Bin 0 -> 206 bytes htmlhelp/pic/btn_quick.png | Bin 0 -> 220 bytes htmlhelp/pic/btn_refresh.png | Bin 0 -> 220 bytes htmlhelp/pic/btn_rename.png | Bin 0 -> 212 bytes htmlhelp/pic/btn_report.png | Bin 0 -> 182 bytes htmlhelp/pic/btn_sync.png | Bin 0 -> 211 bytes htmlhelp/pic/btn_up.png | Bin 0 -> 210 bytes htmlhelp/pic/btn_updir.png | Bin 0 -> 237 bytes htmlhelp/pic/dlg_bmark_edit.png | Bin 0 -> 1288 bytes htmlhelp/pic/dlg_bookmark.png | Bin 0 -> 2230 bytes htmlhelp/pic/dlg_chattr.png | Bin 0 -> 2019 bytes htmlhelp/pic/dlg_defattr.png | Bin 0 -> 1236 bytes htmlhelp/pic/dlg_download.png | Bin 0 -> 1988 bytes htmlhelp/pic/dlg_downmirror_list.png | Bin 0 -> 3419 bytes htmlhelp/pic/dlg_downmirror_notify.png | Bin 0 -> 2711 bytes htmlhelp/pic/dlg_downnotify.png | Bin 0 -> 2856 bytes htmlhelp/pic/dlg_filter.png | Bin 0 -> 1858 bytes htmlhelp/pic/dlg_find.png | Bin 0 -> 957 bytes htmlhelp/pic/dlg_hostcon.png | Bin 0 -> 1398 bytes htmlhelp/pic/dlg_hostlist.png | Bin 0 -> 2794 bytes htmlhelp/pic/dlg_hset_adv.png | Bin 0 -> 3514 bytes htmlhelp/pic/dlg_hset_adv2.png | Bin 0 -> 3487 bytes htmlhelp/pic/dlg_hset_code.png | Bin 0 -> 3202 bytes htmlhelp/pic/dlg_hset_dialup.png | Bin 0 -> 2885 bytes htmlhelp/pic/dlg_hset_main.png | Bin 0 -> 3864 bytes htmlhelp/pic/dlg_mailadrs.png | Bin 0 -> 1956 bytes htmlhelp/pic/dlg_mirror_list.png | Bin 0 -> 3329 bytes htmlhelp/pic/dlg_mirror_notify.png | Bin 0 -> 2907 bytes htmlhelp/pic/dlg_opt_connect.png | Bin 0 -> 4929 bytes htmlhelp/pic/dlg_opt_disp.png | Bin 0 -> 3424 bytes htmlhelp/pic/dlg_opt_fwall.png | Bin 0 -> 4887 bytes htmlhelp/pic/dlg_opt_mirror.png | Bin 0 -> 4574 bytes htmlhelp/pic/dlg_opt_misc.png | Bin 0 -> 4095 bytes htmlhelp/pic/dlg_opt_notify.png | Bin 0 -> 31469 bytes htmlhelp/pic/dlg_opt_sound.png | Bin 0 -> 3275 bytes htmlhelp/pic/dlg_opt_tool.png | Bin 0 -> 3805 bytes htmlhelp/pic/dlg_opt_tool_diff.png | Bin 0 -> 3571 bytes htmlhelp/pic/dlg_opt_trmode1.png | Bin 0 -> 4593 bytes htmlhelp/pic/dlg_opt_trmode2.png | Bin 0 -> 4267 bytes htmlhelp/pic/dlg_opt_trmode3.png | Bin 0 -> 3422 bytes htmlhelp/pic/dlg_opt_user.png | Bin 0 -> 2676 bytes htmlhelp/pic/dlg_otpcalc.png | Bin 0 -> 2120 bytes htmlhelp/pic/dlg_quick.png | Bin 0 -> 1803 bytes htmlhelp/pic/dlg_rasreconnect.png | Bin 0 -> 1397 bytes htmlhelp/pic/dlg_sel_local.png | Bin 0 -> 1984 bytes htmlhelp/pic/dlg_sel_remote.png | Bin 0 -> 1989 bytes htmlhelp/pic/dlg_sort.png | Bin 0 -> 3091 bytes htmlhelp/pic/dlg_upload.png | Bin 0 -> 1974 bytes htmlhelp/pic/dlg_upnotify.png | Bin 0 -> 2957 bytes htmlhelp/pic/hide_property.png | Bin 0 -> 995 bytes htmlhelp/pic/hosttree_after.png | Bin 0 -> 1939 bytes htmlhelp/pic/main.png | Bin 0 -> 16399 bytes htmlhelp/pic/main_filter.png | Bin 0 -> 1748 bytes htmlhelp/pic/main_icon.png | Bin 0 -> 3214 bytes htmlhelp/pic/main_mirror.png | Bin 0 -> 10680 bytes htmlhelp/pic/main_sync.png | Bin 0 -> 5794 bytes htmlhelp/pic/main_tab.png | Bin 0 -> 2030 bytes htmlhelp/pic/main_tips.png | Bin 0 -> 1247 bytes htmlhelp/pic/menu_bookmark.png | Bin 0 -> 1078 bytes htmlhelp/pic/menu_command.png | Bin 0 -> 3645 bytes htmlhelp/pic/menu_connect.png | Bin 0 -> 2257 bytes htmlhelp/pic/menu_disp.png | Bin 0 -> 3167 bytes htmlhelp/pic/menu_help.png | Bin 0 -> 874 bytes htmlhelp/pic/menu_option.png | Bin 0 -> 543 bytes htmlhelp/pic/menu_tool.png | Bin 0 -> 560 bytes htmlhelp/pic/proxy.png | Bin 0 -> 2393 bytes htmlhelp/pic/rcvsts.png | Bin 0 -> 445 bytes htmlhelp/pic/sym_batu.png | Bin 0 -> 248 bytes htmlhelp/pic/sym_maru.png | Bin 0 -> 248 bytes jreusr.h | 241 ++ local.c | 259 ++ lvtips.c | 359 +++ main.c | 2620 ++++++++++++++++ md4.c | 302 ++ md4.h | 52 + md5.c | 335 ++ md5.h | 51 + mesg-eng.h | 304 ++ mesg-jpn.h | 304 ++ misc.c | 1702 ++++++++++ option.c | 1792 +++++++++++ ras.c | 693 +++++ regexp.c | 208 ++ registory.c | 2671 ++++++++++++++++ remote.c | 1487 +++++++++ sample.h | 55 + sha.c | 355 +++ sha.h | 15 + skey.c | 453 +++ socket.c | 1037 +++++++ statuswin.c | 226 ++ taskwin.c | 358 +++ tool.c | 155 + toolmenu.c | 1754 +++++++++++ updatebell.c | 90 + wildcard.c | 172 ++ 246 files changed, 56105 insertions(+) create mode 100644 FFFTP.chm create mode 100644 FFFTP.exe create mode 100644 FFFTP.sln create mode 100644 FFFTP.txt create mode 100644 FFFTP.vcproj create mode 100644 FFFTP_English.vcproj create mode 100644 JRE32.DLL create mode 100644 OLDregistory.c create mode 100644 OleDragDrop.c create mode 100644 OleDragDrop.h create mode 100644 Resource/FFFTP.APS create mode 100644 Resource/FFFTP.rc create mode 100644 Resource/Thumbs.db create mode 100644 Resource/bitmap1.bmp create mode 100644 Resource/cursor1.cur create mode 100644 Resource/cursor2.cur create mode 100644 Resource/drag_csr.cur create mode 100644 Resource/ffftp.exe.manifest create mode 100644 Resource/icon1.ico create mode 100644 Resource/icon2.ico create mode 100644 Resource/list_bmp.bmp create mode 100644 Resource/main_too.bmp create mode 100644 Resource/nodrop_c.cur create mode 100644 Resource/resource.h create mode 100644 Resource/toolbar1.bmp create mode 100644 Resource_eng/FFFTP-eng.aps create mode 100644 Resource_eng/FFFTP-eng.rc create mode 100644 Resource_eng/Thumbs.db create mode 100644 Resource_eng/bitmap1.bmp create mode 100644 Resource_eng/cursor1.cur create mode 100644 Resource_eng/cursor2.cur create mode 100644 Resource_eng/drag_csr.cur create mode 100644 Resource_eng/ffftp.exe.manifest create mode 100644 Resource_eng/icon1.ico create mode 100644 Resource_eng/icon2.ico create mode 100644 Resource_eng/list_bmp.bmp create mode 100644 Resource_eng/main_too.bmp create mode 100644 Resource_eng/nodrop_c.cur create mode 100644 Resource_eng/resource.h create mode 100644 Resource_eng/toolbar1.bmp create mode 100644 SourceCode.txt create mode 100644 aes.h create mode 100644 aes_modes.c create mode 100644 aes_via_ace.h create mode 100644 aescrypt.c create mode 100644 aeskey.c create mode 100644 aesopt.h create mode 100644 aestab.c create mode 100644 aestab.h create mode 100644 bookmark.c create mode 100644 brg_endian.h create mode 100644 brg_types.h create mode 100644 cache.c create mode 100644 clipboard.c create mode 100644 codecnv.c create mode 100644 common.h create mode 100644 config.h create mode 100644 connect.c create mode 100644 diskfree.c create mode 100644 dlgsize.c create mode 100644 filelist.c create mode 100644 ftpproc.c create mode 100644 getput.c create mode 100644 helpid.h create mode 100644 history.c create mode 100644 history.txt create mode 100644 hostman.c create mode 100644 htmlhelp/FFFTP.$HP create mode 100644 htmlhelp/FFFTP.CHM create mode 100644 htmlhelp/FFFTP.HHC create mode 100644 htmlhelp/FFFTP.HHK create mode 100644 htmlhelp/FFFTP.HHP create mode 100644 htmlhelp/FFFTP.KHP create mode 100644 htmlhelp/HTML/H0000001.HTM create mode 100644 htmlhelp/HTML/H0000002.HTM create mode 100644 htmlhelp/HTML/H0000003.HTM create mode 100644 htmlhelp/HTML/H0000004.HTM create mode 100644 htmlhelp/HTML/H0000005.HTM create mode 100644 htmlhelp/HTML/H0000006.HTM create mode 100644 htmlhelp/HTML/H0000007.HTM create mode 100644 htmlhelp/HTML/H0000008.HTM create mode 100644 htmlhelp/HTML/H0000009.HTM create mode 100644 htmlhelp/HTML/H0000010.HTM create mode 100644 htmlhelp/HTML/H0000011.HTM create mode 100644 htmlhelp/HTML/H0000012.HTM create mode 100644 htmlhelp/HTML/H0000013.HTM create mode 100644 htmlhelp/HTML/H0000014.HTM create mode 100644 htmlhelp/HTML/H0000015.HTM create mode 100644 htmlhelp/HTML/H0000016.HTM create mode 100644 htmlhelp/HTML/H0000017.HTM create mode 100644 htmlhelp/HTML/H0000018.HTM create mode 100644 htmlhelp/HTML/H0000019.HTM create mode 100644 htmlhelp/HTML/H0000020.HTM create mode 100644 htmlhelp/HTML/H0000021.HTM create mode 100644 htmlhelp/HTML/H0000022.HTM create mode 100644 htmlhelp/HTML/H0000023.HTM create mode 100644 htmlhelp/HTML/H0000024.HTM create mode 100644 htmlhelp/HTML/H0000025.HTM create mode 100644 htmlhelp/HTML/H0000027.HTM create mode 100644 htmlhelp/HTML/H0000028.HTM create mode 100644 htmlhelp/HTML/H0000029.HTM create mode 100644 htmlhelp/HTML/H0000030.HTM create mode 100644 htmlhelp/HTML/H0000031.HTM create mode 100644 htmlhelp/HTML/H0000032.HTM create mode 100644 htmlhelp/HTML/H0000034.HTM create mode 100644 htmlhelp/HTML/H0000035.HTM create mode 100644 htmlhelp/HTML/H0000036.HTM create mode 100644 htmlhelp/HTML/H0000037.HTM create mode 100644 htmlhelp/HTML/H0000038.HTM create mode 100644 htmlhelp/HTML/H0000039.HTM create mode 100644 htmlhelp/HTML/H0000040.HTM create mode 100644 htmlhelp/HTML/H0000041.HTM create mode 100644 htmlhelp/HTML/H0000042.HTM create mode 100644 htmlhelp/HTML/H0000043.HTM create mode 100644 htmlhelp/HTML/H0000044.HTM create mode 100644 htmlhelp/HTML/H0000045.HTM create mode 100644 htmlhelp/HTML/H0000046.HTM create mode 100644 htmlhelp/HTML/H0000047.HTM create mode 100644 htmlhelp/HTML/H0000048.HTM create mode 100644 htmlhelp/HTML/H0000049.HTM create mode 100644 htmlhelp/HTML/H0000050.HTM create mode 100644 htmlhelp/HTML/H0000051.HTM create mode 100644 htmlhelp/HTML/H0000052.HTM create mode 100644 htmlhelp/HTML/H0000054.HTM create mode 100644 htmlhelp/HTML/H0000055.HTM create mode 100644 htmlhelp/HTML/H0000056.HTM create mode 100644 htmlhelp/HTML/H0000057.HTM create mode 100644 htmlhelp/HTML/H0000058.HTM create mode 100644 htmlhelp/HTML/H0000059.HTM create mode 100644 htmlhelp/HTML/H0000060.HTM create mode 100644 htmlhelp/HTML/H0000061.HTM create mode 100644 htmlhelp/HTML/H0000062.HTM create mode 100644 htmlhelp/HTML/H0000064.HTM create mode 100644 htmlhelp/helpid.h create mode 100644 htmlhelp/pic/__OLD_dlg_opt_notify.png create mode 100644 htmlhelp/pic/bmarkmenu.png create mode 100644 htmlhelp/pic/btn_abort.png create mode 100644 htmlhelp/pic/btn_asc.png create mode 100644 htmlhelp/pic/btn_auto.png create mode 100644 htmlhelp/pic/btn_bin.png create mode 100644 htmlhelp/pic/btn_chdir.png create mode 100644 htmlhelp/pic/btn_con.png create mode 100644 htmlhelp/pic/btn_del.png create mode 100644 htmlhelp/pic/btn_discon.png create mode 100644 htmlhelp/pic/btn_down.png create mode 100644 htmlhelp/pic/btn_euc.png create mode 100644 htmlhelp/pic/btn_jis.png create mode 100644 htmlhelp/pic/btn_list.png create mode 100644 htmlhelp/pic/btn_mirrorup.png create mode 100644 htmlhelp/pic/btn_mkdir.png create mode 100644 htmlhelp/pic/btn_nocnv.png create mode 100644 htmlhelp/pic/btn_quick.png create mode 100644 htmlhelp/pic/btn_refresh.png create mode 100644 htmlhelp/pic/btn_rename.png create mode 100644 htmlhelp/pic/btn_report.png create mode 100644 htmlhelp/pic/btn_sync.png create mode 100644 htmlhelp/pic/btn_up.png create mode 100644 htmlhelp/pic/btn_updir.png create mode 100644 htmlhelp/pic/dlg_bmark_edit.png create mode 100644 htmlhelp/pic/dlg_bookmark.png create mode 100644 htmlhelp/pic/dlg_chattr.png create mode 100644 htmlhelp/pic/dlg_defattr.png create mode 100644 htmlhelp/pic/dlg_download.png create mode 100644 htmlhelp/pic/dlg_downmirror_list.png create mode 100644 htmlhelp/pic/dlg_downmirror_notify.png create mode 100644 htmlhelp/pic/dlg_downnotify.png create mode 100644 htmlhelp/pic/dlg_filter.png create mode 100644 htmlhelp/pic/dlg_find.png create mode 100644 htmlhelp/pic/dlg_hostcon.png create mode 100644 htmlhelp/pic/dlg_hostlist.png create mode 100644 htmlhelp/pic/dlg_hset_adv.png create mode 100644 htmlhelp/pic/dlg_hset_adv2.png create mode 100644 htmlhelp/pic/dlg_hset_code.png create mode 100644 htmlhelp/pic/dlg_hset_dialup.png create mode 100644 htmlhelp/pic/dlg_hset_main.png create mode 100644 htmlhelp/pic/dlg_mailadrs.png create mode 100644 htmlhelp/pic/dlg_mirror_list.png create mode 100644 htmlhelp/pic/dlg_mirror_notify.png create mode 100644 htmlhelp/pic/dlg_opt_connect.png create mode 100644 htmlhelp/pic/dlg_opt_disp.png create mode 100644 htmlhelp/pic/dlg_opt_fwall.png create mode 100644 htmlhelp/pic/dlg_opt_mirror.png create mode 100644 htmlhelp/pic/dlg_opt_misc.png create mode 100644 htmlhelp/pic/dlg_opt_notify.png create mode 100644 htmlhelp/pic/dlg_opt_sound.png create mode 100644 htmlhelp/pic/dlg_opt_tool.png create mode 100644 htmlhelp/pic/dlg_opt_tool_diff.png create mode 100644 htmlhelp/pic/dlg_opt_trmode1.png create mode 100644 htmlhelp/pic/dlg_opt_trmode2.png create mode 100644 htmlhelp/pic/dlg_opt_trmode3.png create mode 100644 htmlhelp/pic/dlg_opt_user.png create mode 100644 htmlhelp/pic/dlg_otpcalc.png create mode 100644 htmlhelp/pic/dlg_quick.png create mode 100644 htmlhelp/pic/dlg_rasreconnect.png create mode 100644 htmlhelp/pic/dlg_sel_local.png create mode 100644 htmlhelp/pic/dlg_sel_remote.png create mode 100644 htmlhelp/pic/dlg_sort.png create mode 100644 htmlhelp/pic/dlg_upload.png create mode 100644 htmlhelp/pic/dlg_upnotify.png create mode 100644 htmlhelp/pic/hide_property.png create mode 100644 htmlhelp/pic/hosttree_after.png create mode 100644 htmlhelp/pic/main.png create mode 100644 htmlhelp/pic/main_filter.png create mode 100644 htmlhelp/pic/main_icon.png create mode 100644 htmlhelp/pic/main_mirror.png create mode 100644 htmlhelp/pic/main_sync.png create mode 100644 htmlhelp/pic/main_tab.png create mode 100644 htmlhelp/pic/main_tips.png create mode 100644 htmlhelp/pic/menu_bookmark.png create mode 100644 htmlhelp/pic/menu_command.png create mode 100644 htmlhelp/pic/menu_connect.png create mode 100644 htmlhelp/pic/menu_disp.png create mode 100644 htmlhelp/pic/menu_help.png create mode 100644 htmlhelp/pic/menu_option.png create mode 100644 htmlhelp/pic/menu_tool.png create mode 100644 htmlhelp/pic/proxy.png create mode 100644 htmlhelp/pic/rcvsts.png create mode 100644 htmlhelp/pic/sym_batu.png create mode 100644 htmlhelp/pic/sym_maru.png create mode 100644 jreusr.h create mode 100644 local.c create mode 100644 lvtips.c create mode 100644 main.c create mode 100644 md4.c create mode 100644 md4.h create mode 100644 md5.c create mode 100644 md5.h create mode 100644 mesg-eng.h create mode 100644 mesg-jpn.h create mode 100644 misc.c create mode 100644 option.c create mode 100644 ras.c create mode 100644 regexp.c create mode 100644 registory.c create mode 100644 remote.c create mode 100644 sample.h create mode 100644 sha.c create mode 100644 sha.h create mode 100644 skey.c create mode 100644 socket.c create mode 100644 statuswin.c create mode 100644 taskwin.c create mode 100644 tool.c create mode 100644 toolmenu.c create mode 100644 updatebell.c create mode 100644 wildcard.c diff --git a/FFFTP.chm b/FFFTP.chm new file mode 100644 index 0000000000000000000000000000000000000000..03a6b14d7d6552db1c93bb32f90a2a3776ffe390 GIT binary patch literal 262974 zcmeEvWl$YWyX{7T6WkpV+}(q_OYq?Ct_kig!6CT2y9Fm`65O2t!QC!o=X>*V&Z)Zh z{BlI7woape2ZU3Dn|qW zKp(UJY)?f`_`_p*@(=pa+$;uEi4 zQ&bX`2Kb<7;y->oqFRVv~# zLb57~Ah8dU-cqo1uSCR+989HkO|3xU#sR)wD$sPVWCbL|WfYY_;+h>k!lBWZz zx3|_e)pam+GL$m4GPi&79`Anygwlnz04*kCs3Mknb z8iK_6*;h#YYVDbYkgkI+NL=k3e^1o^W+<&|^VkkAGS+`X{^f=oAq<^}h=`ILt(ce~ zNWiRQKj@zVNsz!S>3JduIx!__sV7#*z&$bgUx|VCu^hxZha>{_Ilu@6s%U*)J_ne9 zKn=H_%5#7P2sENZqC5v!fj~d0zvgp*4G4^Y22(!=*nz+lZJg0_fCC8Zp@u0v0~qLm zz@0u)0R1@tWbV^N<_Gf} z05bRKW$-nB4gi_^4B`g4KL>!!eZFG&;y(v~%zY+V!nmFRj6mi-t2SX4&w<~}4>Uuc zcP-;@=GVslNY5>PGk2f!IA-b&jBEF|0tS3+vfm~xql*l zu=R5Q$lN~*J^=YS0A%i8KoHCF8~`%+Z&u2E^9*1CGWTCW33;v+3y``0u5KXoa|(5qQr5Ai;n*kpRf&0FYonva}!Xa{x#%;1jIxf8hZn z7?365D#S~=3%SQ&$a9=InmBL6x<&%sJtSI^qc;TI4*Lg8(O_y@4p2NsW^cxxj4 zDRy+Q29|#n@wWSOxSpvMuz1|sTjfu&zV+|oOfzr3Kg9-y7Qc=ToptxtK>4R~15^8d z4Eo)@ZT~cDVD0?7qVMe95`W4qOznZ*M@*x5)1duRlclMhowc2#&97EMF1ftz{!q3w zH!!sWHvbde+v*Qs>u9QP4rI}Y>aB_TPi=OFMs|kwCcmJFStoDJKQ7xDTIpIE0&AOp z>#g)}#O6QJM$GVev;J|~-qi}IZA7cCw<5wn&HQ#Z_}0o>0pnMxfrYX5ukO<}G%y7c z4NKAwfdUf!g<4yiKlSe~55j_IqFI3+JYo7Kx(*J%nJ!XB>H`TqAqIv<|3HyP{J~0p zDtuDf!dlk=sKXR!q!8{ut~_BtWwrkiKD2`{Sp)xnI>gG_!PLkVC`~c+M~pv|p6dA* z8oVhIPyWYkBU1|pL!jGX+2#=fe|$5sws-ia;oxk_k7obE>>+7DT^+$@QdY`aIK1N2shBH-D?4L{F zU}yQ*Nen=rqeZiA|0fvO!;!V@nN{^?jdU3)vje|KE?&YKX&Kj*ij&7bjg&lk!1MHn5RME@EAX6>l*ztY>pluvf+O@^v}r| zcyHzHg#cvsRH*&$VOB*G{`kQBbhG#cnf`MX4$@3|`7fJ)oi-u4U|-q)W%JKPE$p*x zDe=Dm2U8pSUp@!jzYo?15_-BDY3u#_(iMAw7W7+*U!cCVrKRrgGbtkTRVoiqrQg_} zK@kzD7%l(1wWmt|84(ff%!!XrKfgFV0VakPz@ZXxW*T7jo6{5Uc=DP4zDq?MN%#@` z%jTc+HDX@Dj~;lTw$pdAcK{L!9<=b~0bbVaT`jfsbRB@V*sxAlZjjp~Soy_CCL+bGs1^{rA|GQk#!P-vO*pNc${+Vx(@OI6L&TdK}L2CW_lV9AtnYI1_q(W zJpo2G8hUzudO;2bVGcny!S{6HR`w3MR{DldB0W7Ynf^a+Lc#FyPNbx(XJH8NhVVxG z&!oWL`2TT^;cxu^H~|Bkc3}X97=Ppcr#UI0B#eLK|G)A7e@=$K@&DiW|8ZX9ar)w) zXz*|R|2VhvH~#+{|I^2hBzHfs~2;h2qaSK*e3S)8=x` zSr}t%@nv%2_jKZdddvEEtV205IOnsz4V=hVg0=bDnTDAARjdx6V+0c>1Xu>VwA9z& zYArKtorn{6OQ)8MxqaVCM7kT}gtN3i=`Kj3cq>5_;NQ>ZI(Xz6;6$>)%h9U{*ZYyy zeUReTivphGu%pk--x!KxJ2U0e=d}z59tSC+9`mo-t=t;`J|lpM2_WnM#(C*{;rub( z{d8(Jo~t@LjxcZ5YBH>6bB$EJw@0e zmWuUli&mv7*`5m7-L>%7uB|e<7W7$hx+hr`JMZC5{K1Mn=aPLYTJGBd@*R6@O`Q$h zJU{QQ(By*amVUQF^)b>A-r3&IJvD`MJ(~TgzrlpMlZm|*w)d5t1h;u|)(eGOGfKOF zjD8)^RTRDN`~6b*$E5Z*-?Nq}KTI(neY`y^%}(AFMi>_i81_-t4fSqg9y81_WVg7PixG<-GV{KutQ zuO9}B8X*}Zp!L1oqTSv)%~6?{=i>KKYcb_|H`FkR$&)cT_uvZeg?>w@WincraDlTG zs4<|N*A8Hi3f9ANS99OkH;dyY$D+($43qCv(@#+IqKT~|e(#RkLymujNDkQVGS2s& ztm5cW?pO;r+o-@g>uth~kVAmfUNd7ImU7tr-gDAW-T(Dc!(kaC%EVgY$G6Ho;RUI7 zt;Cg^_eGXi+;r-Wo!Ms?2#VJ8>{e@PtKIGDz0K?$Zo>kWlt#1@jB`DE6AV8lDMnEc z!~(Y)V_D{?j|FcUR#)Il%#ow9 zzc|E96qZ2Hjr+C`8hQuKWTYMne;}+Yas1WgOV+q(Mel$N#=RRsBBVEq5sy>z+llCcIHHW2_-*!}Qgn6LDu9ljYz{7E@oqGP9Qs=;G;2G7pI6oab0+KlttI z!Dldhg;eO7`-V{HsHSfbR9#MT%RSl=(kg};L;l$Y->t52i2cX9WqbQ2!8d?~cf#e! z5=N@=%8Rc^2OMheHkUYSCxjfaJz^mkgjbg2^a6G#7^{Wpb_8g_lmtiUj9W}yFfGor z-Uk-egbQ#^zs@cLwEku_S`SC&O3M?|2-7 zp<0d+Cm85!k`S3NM|D%P$F5+*fz*KnD@iN81mjFouAP&-@#3 zOh+bEj1ScVo`!GGe{59pG-Hi{wWYrA^N&tQ9zI_P!hyhRuS|HSo=Sv@Q!j*$43Jl| z>_n=MBsfe~@_5F;=uJBEIr)fTcyq}B7&+fn=JNtw01)u=HGw98Jb0HWh!)ct?XV>l z6XE7lx!6v996uACt;4fUgw+fx@$D5n9e!W7Zbn+>m~I^7tjo`kC1VvbR)jLB9%Eqa zCKZsm$CdCqjdF6p@0+ANHcu_Wv728+-=QQ*(Of1U&12uLB9s_wW)sCR7jzSAe{b$3 zN@Z^7CO7J9=oJhz!GuWDX&>TQPk!pVq;!xbz3m&BnEvR+PR#yR#pg=gS!SAT^`VmnHrXrK?FVi?l?o|pqKks;pXP2#nuP$@P4qh> zD6Lklf`3K2$BwS{00j-p-k z@jSm#4A9#z<@BoV;vJJ&pd$cu$=RC{-#|ESTfJRF_8T8tpR4LOKT7o|)w9uH6)UC}#2s{tnJkS=W+)@(e)zHNQY3O)9^y^~B{nlw7W**RzKGp3^UGsRwFs}(=ytmY1qz6|Qt3BV#Zx$sKa8Vwj@j;b zw>BUyH^?>(joK1efBy7gKnQXum{|s|*rtR1uGS2bR-d4}D!d>;yCYcLz`A`(oB$Ue zuIci{Fz&wezB!%doa@^GJFw*h+0SUGH#@fT>SLc{yJNnjd5_sO(%G$WY_#>gtcRXX zP^*=YhRHD;)GWB7lD9y39ggu%cnjSHlL>BL1^(gihaSa*qLVZcH50p~*1-H-MTx@= zSBgcD>`+Vf{QGo`DR?^8me&?lFyTx=tAJdhEUQM2AIU>j`2}V1C});*`|cGF&8~Dq z{+x~^iszEW9_wXE0{N#nOJwOV4*0?~z5Jh5Sw`Xpi_IZvD`8x*P7ix|jg@YYF<@o_ z^gbVoIx$;R%Gu?Iz@LeR_ex$(w6$&%`!^=R7gV8sy=7R+02lNDxpAGPahwusH})O3 z@4;voB)+9~k%}COfSnow;>1CWsWc6>Y(5Jp$sQEY8B)}^sP3cSJ4?JV*N-J z32`e(T+!EwD6$+b&G0;T-nk)s?w34OUnS{nd-?gg!4JJ}v%6cXj64)B#v88mjpQOJ z#sL~M^UO+&qe~NqOJU8Vf8;>fX9!3_4t^mdcPm4^;j(J_itW-X(N_q4nfsVB6V&!< zHM9+v5@>{OICo#e$5V0hbh5XAdjWPmqH0y+@wbFGELE$Sepvt!s<3`(fbBYFNxGbkK2FoBiN-o{#G}zD)O?b=l-r%E*jP5xulnmLGg9J}XZPK;d zDB83{+R4+eO@yd5Exqq5xtJTx|1dDXKFh>Kf!!d_IU<1XZYy48yK1g-V%i`t{6wayuzp zgxYzNUMP3nC6Vlsq(7^Jti4g8$)^UBE;%f5H%WIv$!!U0)>CC{+LE5Mtr>_{hqQzW$$u_OQ0!5@ISjSZ?GL%ut>81}w z!oQx_>;S8|oZyWD$`wrP?!c9KV>?>#$^>Kdg(r<#V zG;4oobp;E=ddi;fkb(=GXI5NrI*#$vyKExLFJ#eJu6>a{(TM}<-98!SI^@{U6C8|w zcP8oWqfwHkS|fViVjN8Ob4SvLc^vF*e1&OF{`}DNYuIF#FwEr)%(J<@y>yeHUdBC* zaBvo@W}X=;UWd81D|CC&YVohtT0%5F@O}=^wFqS8=>4K|A@A=~4YIySG268Fc3dH7 z{AX%?@vHo<;2-vMV+1-zcj7CuZ9|71i&skoqHH*MHQnVV2UFtmKi^)-^e*d`Q9Cl- zy(XK_?dK$`g?tdGJFDb|U*)1%xpH^e6y&OH{t!E}0r~i%-gm;|dJ32RzQdlr@c26p zA(lv9`JuVV@-yGN7&I|m@a_j(E?cmT+xwpFA3Y=`7vjv>P$4sDMGDL5+QS%HsVi+4 zs1!+-r(=qxyTi$ylv-Mc(Rh(a@$@HGn0NRXXs=?r+X4xZ9ae6)s?FwyKxv3mJ~L>= zpNsT|mGN0DaxEw$-Kn^~WiG!&pVUhYG)8bUCt*aq(zq`l&&Eq<{midzk8Cr=-%^M| z&AMxtVwlOrlDr%hCwal{sGN&)>dv4r*E@kb;CqcgTLcDvl0x%YVd4!q+2s4;_FD6y z`@*Y2$+)*Kz7>lh!^*NQl%j~mHTO?LFZdnl#lHdX75V9j5}Bc*6_(JllYJNLKm+9= zqwA*O{Au}+&VXM~?ldW73|1uqj5%k(eh6g>QS{4aei`HANa_;ZySyAB*dB&Y#asGe ze9WD+C)v=3`P?OXpyh99GH2$I5}B)(eHhDvGYxt_oXIRj&|}H-b%7|wLV@VCKxJt# zZ*W@#x;4C}@wxrdC=R#JYP9Pf0$sr7P&p5mfLT9BZBM>1jeQI7(?LDN~X?!$nlaX?j>Cmvzu=~#&n`4;BDdF0$$Zx5Qf(gx*a^CoK zMzg2?9Pybf!rC1mxjDtNQhXid$1z93h|Xet=g-7LaWa2(i*$j~6GEx4jX+f1H4+y| zylPB@I4Vn1WZrMWHM^sOEijf|Ei{U}p8ERbji9~_^L_`9YW*epO(S6?zeOEu37U zeU{|Nb~MUjf`)?Z3^`|xUd;BOdqH#<9juK7y#%C72f zJI>~jc=u`;thJls{3pU5hMI<=9$m_b=P}1<;DB`L;&J!b;oPZM7pyY!R<8p2X2Ax% zgmKbvSCv0U*w&~}&+&+yTV?DkODor zJDs@J#>*W9FQUv#KmDngN;4v(Dzx4)4Q7ve6ncqj?=3obdCK~s zPgn>})VD?{8rQ2{?h=OtSx&eUs zq@@?Y43i#fn_O0nxT~AqEd`{kRre~x;#%O^&ykOOyK;V;&)xAOJfdC(0ut(%*&C$^vCk?<1bHBxioGfU>HyI)K zZzMqfgzjkryVl_f9xtD7<5_`T!Lf{-3l^*~ zVE%O=D%eW3M`2ignJAk20rasE*da)qNg7?4f)5YeHbgfQf<%v8hz_7pw&3S6i!xtEfxt=U_oJ6TR#`9Z(U3J;)d_ zhN!2g2rYguB`D5!f^TqbUcn3c=lbCbH*onRJ^rsQh{fa?9LW1+^7W!se zi~vXMHIX1G%C#plCzdP0C|zI;L-!Vhcv1i44hm4W#;QB%&{ z_yo8R7NaCtqMU~P@oUG%1wEg{O$pY98L8^FFIK`wW}rHu!`s4q^42FTZ5K_bvpX0QOOob zAZ=YVuzXa3Ng9m@c`I)#nCVQjje@S{W56qi9P4_QYa)_>0cWW#TV#*vS8#7OVIEqM zC8%>t3EqhGIFS>Wi+G3Kde%h8eT5FDne;=+3xDHHPLSEXt3)<7^U~^VG83Xr21J%? z0KTvb#zho!xsO12rSz*VP!Sl0C0_J>&$_wsoDUCJE(ngN>c$_&d>z^2g-4@4@E(c> z&=)8lT=aZWJb)Q45uEi%uWHFwE~GEUv46?u6FzBfMFJ8*R@+7ix0rkg#UF9Zl<9zT zDv=}~@r`|;za6apU0tcAT4?G+&_c8Lxg5L}q^%O%smW_9x6T~08dFt(3|r(48PkOCW=Ud`0C9&a$2yBD4w z3*45VS#1x~dRH2y@U5H0m6rol&0I)$XF<+8`I4YSr|{6P=WmdP&4R!8I_{2^ndtOi zMXoIyutSgJv!u7s=kM+;C}W;mH!-97ADRz*bH`OwSW@7uEsnXpn+zsU&tFLA53ON+ zVF+>{@^jEdGdhKSb&gAA1za|@?zM6^myr+UHmOOokZy>iQ|cA5_(+ON?whS@f-j5c z6Q(abR~SV&w<)TB2c(p4`iU`P@6A4AO!4EwA$n>XMB zElLT&;6?mNgp%XlOLOKzm&0-@Gb_zL^xLkgca^xNT5Q&6qZ<)&5O*glt&<+O5IK@!q(i1c&wSe~ERi1NbPk4qR*rqBitS*iWW&0`yV zHqTa>7jP}6e1>GS9YwtAs+MzftChNf3S6zqH{2UIMB+sXZ4owLnB7F4B+8hE4?cBShKv|?o^ErM7S2UytHD_ zbs6=%D9puH-~F{%_g0p46X)eoGK+2k;;R?p#@{dcA@{lSgAYnAcR<67TIz9M_AxpY zcPQ`Ii{l4#*yAYf$z|3s#sw_MeLg3FFCDdc=#S{TBO=J7CVg>@VexuH>D32>sTHEZ z__~_l`?Zen7@JYF4zlD#56 z9Ut$I;!L)U_W#NMQG68a=JQ&L)A2PSVv=+gu~5N;+b44+_UgW1;@$lZ^A^b7FNG6d zrzTG&4J}J;3%+U2t0?84NNWYyjTL*73DZ^deEdoN6F)5P+-B;wA#lKlHI3OV#(%(; ztD$S~e#Y6fwV^5mpEmeQkJ@+0)JYQW$#?W?KQ@Mo!`SJpZSGf9B@Z`_857|wlbm{G z>)i6rI-AEjQSs)6U$Wo|9GY5w#I7uWjtv1NslTvI9R7N0JAzs4) zBb$=)Tf$!DsX$_<`;dUyTM%e*zkvwG2VwkxMIasQ+BikH56dq+$Qsh5K{oGzcUy^?OgA_i9-wcJPf}yZB|F1gZ8@Y~E9W zOdBW_8dX(&bI(=Wpe*AQP%9PVEI53x;D*ty?ax_p%zIb23jvme-`x11YLCYG6K5N8 zS*O3*JhgjQH?2YV?oeK`p`@b#v-ezk0+I%uUbWWt=5}LMP{!|oe~y6cs~wS3!v#Zf z`$xWjtF6i}Lt7+69TEG^UV(AS1j0_gtFk1BK8;WYBOS@Dd52OG z4TdtXEMNk|8-(5c(J5d99>U;`)wKr{Bm_Cg4#SbV06fRG|GEsus)mivL7fc3bY@h2OAHg7Yg=#Cl|jZ~3jJNniQToeEpg^apcFIcM){V(OLjYKb-Hy%zeeq(*#nTz3X2A*Xo-Os(COjWMHZMw?ab zg*`VPj2Y-ZLOi>j``V-l%;$Pi1d;XN@WMwGJM9h|?&}XIo~f3l3m8H)xx& zP1^)L3z^sxP?WP=Xze2SMPE{;lid4Kr)$B9c@75lK(Bys*ATu8R_KUT5{%%e3R6zD zNnV=>5A1WkD;$G*yK4V<*2v@;&3f#aMZ3ZDYl?eejGjQD1%ocardHS;@Hr9Njql}$ z-wN*!vUjKH&?&3o4Qxt!Iw1FRr{25Y6yMBYK0wA{D9xjFsMVIdAV!i=@=l>>q*T#= zmw`q#oi0(3BtQ3JZ#J~RI$K2b{k(7JoY`xWZ|cSAYuhE}LV=e4B9lC*nM^fMot;ET z8Z>>1nBmJ1^M+Djz6rag;ld_KK1+tw3Fy2d({~Vec68Lzb5>y25L`x`y3-M44c}5% zprP70Xs&9O{iOB7DvN4WE@fok-oo<4&a7=^RkAa0td70RXbE#ZnA=exi?uPXy?z0K zHVN*3vkHgivnml_GP$=?n=Vh3C8tj3P;x8`Tl|Ste;S_-3d|ic*Ntxd>B0T!9ON^ZUf%O37=bNae#DM-8g;hF;ra_+h;y*E#A3 z*_y7`e6og#dVC}%Z=g57UdD`O$ul1ZDXPrCRJW$Zb5u}wt?_uh8-+l3RuVm9PJO90 zf;VOzi9&X}NhT|(swI=)kQHxcFGafFO{SnnAttc`*jf~Jf7!}T3VX@nUhRc>6P6KB zLz{kal66p%f@D&2=&!D~qCEN1NqHgOLXj@!Rk7UmoZ2-`4bn{Po835-1P>ioA+1n5Lq8xe)wFV2 zpm;bXK$YP0O)AF)=5+|d+?zZ3bLv+fqEo4j%2VVbk2;(xqxfbeTM1e3vgp9T&OtM%m-80uWz4q=}d z*k0F*4|(PRKH|q+nyAL*Y`I$-_KGzr-TR<|)5zH4Qk#WA+8gNmA}Bf_4F?9%sD!Z} zttl;;xLy-sjF4s;7k~9gD}CAOF_$;-scvnKvz9aMRCfQTIi;dvzOsS{=Fg?bn@F1~ z=ZjXU1S}bA*lh9C+xg_cTJmigB|CtEJRVqXj#~)kf^x0n3M53g+~Vz3RT9HhHjU9I zu!!4w)*C@z&m!;c~)Y2fm7a}-Sj;5vc!5wXI)1I2xUN_U<+Z}n?J`mHya3FC;1PCL*w6f}5RAHQ+Kf@ua6GeL?0u&lUy|qerwAqTYrIB@JsI zZxD%jodt3+F#BS+qag$RWfaH|Qz*|a5?Rg{MR*JyCt8C&6=`Rb7Z;{Y1FX0NUvA2v ztKK*$(01}d_m#7MI<6uiBKE*U?Hc4|Ylh-H$au}s@Aebip@APcT(jLjOMGraj|<+c zwmtiSiVb%m5k19gKHV;@QB?Afmm&yRIv$aXHb1-(SJHnsWns!cq3yfCnOVE^%t7>} z;){-W-T81gf5*{nZi!dbfB}pNG?Cn6Necz^W_@G_BZy5+Xutd|qjJV`VrTUqc8UDh zlCegn?CnMUwqP_U@0+4?g=96VZUP&LB*e~9z(Y5iGKwYnJYH1@$GQc@OD9%0_5=() zR5Iqgs#%xP6x;d=qr{ubY9kn(NRAMj`i83}DD1>i%-MI_og_BQg1uMJ`MUuQvOyxG zzQ#{i)x8t4Mu{xN+MdLwP%ipt83oFN@JT2^J&$Y)43oC6r0VomsJMLvJUVSR(}X{e zOWD??4K$dAWG|}ceD-^z@%piOW1)O+B3F(TJ@8Hu5M{H%gQo-ESIKPR5$Da*ZD_bK zekCFd_FYkf_NQiaYTYS*?`&B}$of4Hf-ELw1>T}+j3eEYENA`)WaI=&YKhkAPtk$i zyc09>?_kXzhC&fZGbhk{mhFjT3}24%8sjm+z1nm6f&U)g9=d|T1-Zrzv@N`1N!XTcINVYho-i656Y}5A47OMrSmA~O|@rNkz*)BYJ7nux}5%9Cf!zI z-dAn8-A;-zMkyZcy;GFzR>ZUfIY{1A{jceB>p3$YV&jX&q8(W9XiRlzAnVOt;#$`T zY;UzyrWdi^$f&>*a7?80y0huhNKjXuYG56|_t6sUkv=eH;>G3OHL*%2x;|E=^|VF# zbV*#EIv01@)9dLzBRN2(h`0~!OYm0X?v+Sfz#b9Y48Dohw=>aB-fWI=h3=>_D0p5I ze!MVuey{wcwijxA3f1rtsieu!Q;4uQI}=7E{ApFr&?Gc`bY<~1g!F}L7BUjQGTQd1k7D&$P61j|%2~V=KT`IcPAAm` zpQ5-r_aG=tcv{#Vo%RO+-6*_^2}(^+x#splR;=PXZ>Ugo{`4V|WCGlbSNi>LG>5xz z)`MIja?Q$AIo(a(7!(ml)T|glB%kT`x~)isynh3_DAjf@%i(RCBE@c22M7#;>(;vn8WH;H!!;BB!W7RYu@w$;i*6EV$4aU z#gmhBhEH@(>r$`xai_xplaA60Q&yIiyE(~|rE~dhdHV`;0x?S@9jF!qms-|)mB%dpvh0j?M+Z0>78Tte7+Ly?!2|Ny?M^c+S%}& z)HU%`>PV|GSBW7Ml>-8)1Z85@$Hvwsfcbl(FH(*;O2-Lm7c8g{6chjig`B=)??n(n zo@b}sii3m>o7&0X9lrKeTkMS<)fx#?8Cv`3Eo$2Zc~Bi=p4}o$JPZWv#L;ofVgfl~ zCg28EWNL*#gkQju5QE3z$a$l2i)bL_%h^%UgmPNhcFg(P??;NMEA~Fx7@zTWqZ&do z{Aq=U9gN>)PV<~=3UM6|pYwQ|L?=G}JfVT3u~c7raCU#N=+WM>h?G_z>VS6BMlSv{ za*a+5ou%fGYd*n{_HH!i9=;5Y!AUV{N3H2cVe+t%s=+1x?8}iOuCt`H<2@L%B?xt& z9^>zeuN)WNF4Y#F%yOB!m44l8bYZIR?dA-g#dbd0h0!uMU10$vPyKLG2dAdyPiE3- zr=oYchf`i5KMfk}Zt+kEhTc3n;CIf`JMU!C)Lws^=(x4F(`$q}qBi)#=@X6%A&EA~ zl$^E0qNU=ET4)I-Ld&dCDHe~^{piOt*I@4yZT;ETQdM(Kup~#IMX%j9tXt_S&h^aS z9?`*bSvWGs?x(L?LeC!#d>tu{s6AgPFmuKTdR*I80r!RK%gK#MMIhZn4|Ry-{?J}| z&P&=__{iQ>)eD*OHds7S-!gq0rqa?f@T+#(4UBG>KBZG;7Tbek&iRq?#U(g0R~zTW z#`<8<(&d~&c=m*d9xE*U<~@!0Vl=Ma0P&h|SRCoJ{bJbAy)Pvl3YI63eSL4(eRf2K z;>u`b6{t$7Y+zk7A!+A|Q?zbG484Dk68u6mM9boXc5~yx^7dUK-mq628F}G| z_U4IXNv;U3hqm|Ni*MZDFdS*;%fs=mp~{wm;DRkQlh~Z)+*yCtGPhH=R4v*5cpKaz zFvu*&hYMJcEnXU7h$G?0z@px%maCS_Abt4uIDs57E~a~ zKye7HMlJQ)wItUvGzm0Kx3HQz-ppN?d6u8U{a(i?N?h%JQPXG>ZQ0S@lF`c-xm)Zt z@oZ+cKUKpXA8OK^WAum%7AwlPC_zuAr-Qoh%+j^ra=}55hV{n{Vbi}^=)Tm*73fOq zP*(^od>QpAVE{CKLD}J+Bs0;wQ721q#ffvNNt2k}qE0=rb8L2s^yEe zL@Kuw)QZ~Ylaba)Id3D*gavQ6k?ZyNyK-y|s^tA)xQNX&oGJ0_QZDO}7VI+V@x3yS zuyg5RPrksn<~xM5sgbfXL|TTpTE}EA;vejws)w8g20C(TqY(C;-sMfC6TYv~+`z%) z#%sGgB|Qn77q5>NKJ(7tI*Cjai`=b&*g$Xxy`zs$Kt$uE&pZ&QHzDK{F(5uE;T~YH z%XdbiVIJ>!p?_Y$$>k6`oZ)0C=Q*4uV}0?NPAgNutb}?9E@2(Llq!##lF(@&y?7a~ zt?*(ED~dY+uzRIz@J^3rc`_b}qMNpUE@5&N;-@qfu8?H#W{hL!NSQf351=&@6s~a7&&OX z4qD&i4!87L=1~P7uuY(ILrG1HcyakM7}~jaQYI9j)$516CfM1(-si@4NFL|*53xFX zqw`^fDbcKRnbv!B^~Wj7#qvNTV;~{=EC+2p^n9s?xc2-a1^wx=&StFviRN726jMiR zBR;n-9I3bZ8SIXaos^xf-LaNgnLKJQV`fPLjh%mYir;rbAuj<`>DM9}HEQ-_9rp6+0LA|m2pSG*}BV@?$ zT}eAel$(X9%p~S525hNtIroQn_Uw)YkrOs3K(Yqht*vnA307CitJ7(`&C?DdxNZ2N zdl~}Chb4&>z+B(OtVOfGz3$_8m7q%LtV|!({n@d+m-T}goZ`;!{n^ntBxR*Yo4r9F)su;E*rkj=+o7GrXK-0f9j#7azIsiOM)4)=9r>0H zuL?Yb=t9d3ho696S_h_+)Jr}!g?%lI;eHpIn!EevkV;BwQ$BAxxu5vXH-=$13!1$z z1Z1xZ%gY$5Sicspy3@(PwMT#Pi!{0}P>qg@kc?tY<=gDF!oX|^Oq0@=kRaO?OT?(k zp~u$VYip72Q8Spxm+6)9FPcqK7sq)BSqHbdm3u63L5ye|zBj zF_eW0Cq>kxLT()hn7Z_toS} z&1H5?bJ8urV^+bQy`HwDcOC_jpp<-HQmUNWy-Y&UPjetvg?w;@HZqYB7d6ppSHU_ z;v54lU9wnq%mF?zCpb#X<$2n~Awl~x!XVP|XsNNtvpdnXd(~L$5b0{-g#mQIvuyPh zcnnjgLrZ0}#YXGq)lrwKO7cUW1#%azg>J?;#}^jW?}*(sT1Zh-l-aSnP?;xJYN`q_ z@Z|BnR0}CGEO+Z9r8o9gEL?6NR?ZlZ!G}6Ec4PXnv;{!iM2ALbU>LpjHKRV!SG@E} z_v{V6jiP8r0KJ&)6DQ@L57x)}dP&{i{oS#}j?7y2n^_&qZCv0?esNTyK)DV`f}Z2| z-byA&x$DKBYj@tWJL6f~ll`CdGjx~7($6sp(QSiIhWK2dbJ^&&LcT$rg$p`H`+i&h zZu7IUpgfsjI){vw82WgGU;kDjAx1w~NSu*tjm5K%Y!qmfu==Q89LUW*F# z`xL?DE^?g6x@_Lo9Y|V2i_aXA<#aHW%B|qokL&_YJjp(xaPwd5 ze`O@`TKaxL2XP(&#zp=GA#H~fNk~H|BY5qBG%9|&pJmg@EH(b(yQ&?9zkLtg*TAo) z_7E2S-S&tSA5>->{o6tZ_ALAvY?49K3v>x<@e@z!+x-uHyrAKy7|0iBHSKr!0+6mQ z<%7i+jb=S&BWLhSqxq)Hw>I6y=k|`UydE+~8)`m{Ib;4@sH14Tj3nIlSbvAoE{#M8 zzERLdJz*YV?u+uh@|LgU2j@G4YOBSnQL?yL4$CGMrlW25tSA|wj`~_#x6+vRJq2M~ zpfGkrqgddgLB5l^;e4W`!or^~*ZGjhQ05alHTu0Leq2W1(77Pkh3u>$-vov@V=a;4 z85_#cjaY(^av=&wohWlJ1W{gBr+O4mzR)nO#`rMLh(c zk}-h8Cu>nn5g+#Y_$fgMrQv7XQm>dR{MIzt$CinvoVf4lo%@%0xd0X#wX2(P8ls*ykf5bMxvoT~#YLPohlzp6TAor@B0=i)1UY*E|=&QTI`J zAI$w$gvw0q>*~Qpjy3+Pa4$tpIkt27R;DcFTZt=)hnEuBU#w*^)AN?H3LQmND8F!% zvJfkjFW6W#S=LkwFZ36r^F>pDLN&d!5>+8?elNtO8No;`k@&-b`$sG>G>0?8)RG%T zf)bLY{)_?#k!+S`ZW2 z`pY0M@+QMsT*6vTX80)r#}pUeu?d73koYe~am`rigM7F$^PyRHa1le-b2hp9+@-Ma zp<@25^tzHw<_!aL!3r87sY!WtD-9h5JjX#D?9rhHEtjXQMh_vo0-j5%K%Q%q|adrJm%_xkOW> zZ6Ep#=g)Fose3O|cUP*lf)S}d2AH$uJAD)O{YL2GWqm=Q7b9Y8&aXV{h*kGI!pdrB4rn85= zQnp?quN0+dE>hGh(dpQZ7cnuVu*WYLf0~txdqge4GoOC*7FlHLMF@IvfD+eAyu^Xx zvIy*|?Qn_KWkvF#tM#_nGT@a%-PTUU_WDSZTA2RzV;-8!24M_}<_O$IZHn<0RW>W=v#$a=88Pp>bT7 zkCAaTJalVW1W;C*+sYlO6>&0f5K$adTueb8LHo(d7 zAX00bZ}k1nUaSr!d7d0xmes}=L@{d#)#GYZL*!bm3WlljGPOCljafWTJD7S**7W{i zUh#l&gqf*}@oQc?(`ad)JqR?>2+^Sve_d_zyx9{!9{5e}A%p8t`Q|=UjcIgHd+^-$ zE&cOiNu+%alsGQEhr~@}(=?b^?tp(f#RY z#LCMCrpd?5S$BmFUtBD1CG;aAoaI`RR-oM2;=Ntd%FV7k^=Lm~a?lx9t~Apua2WAY z;K)e5Y%fF!H=03ZK+Q6U@a*5Jo9_GJy_UFb4Ta`I0;=@B{UN8?p8pD-G5rE@@8y}= z;yid2rP#^DJMK?5jhn5XV$@GT+lGv82de2A2B$Zo`zZbw09`<$zx#Jkl-3-8=w|qxzuly~+zHo!eASpGf0So;)R(`NvZ7uBZiE_$c(3PLD)jnW)>|j2 z$KzYQ^30@pan~DGyNy)2@X+4RXoM z3jlITI<{0o=1Z%YIp17ao;1={4IT&wKK(pzw>w9_>+Wo8KX4R2s(MCBPZ^4IbRD``LwGl; zR#iO6Jaj4hpMg~+a)Wu7q<%?yw|F>!`10*@?=N0Szw;B^8K01>O4{s9EI7+mZfQ5T0 zI?Spn6B!X4-ww#o78jr5xuZ#llpyWym|1qfv1HT@oFI&gp{j zM+8P^v5iIIA-$_;F*7QpWLij{w1RU{-fK^kwH?IhNCijaTeuvlnC#^5aMq@3lS$e# zho)Fk3=w3yd<0~+JQq+w=dm`qaRRApe}>-sewda*kcn{^piZBdS3 zwLri`_^W0T`a?@F_0TNDA%Pej`CMKxqEUNRg(wnfKdOL$(GOn7R-nJUC#_Jv`02LfvBM_sV$LSM&&b>u?R#E-VqijEc=p*s*rl7YW(t8)f~}^ z&{cV^tG~5nnSobO%dW%HwJWq=PDqtk%sN?hYDvoumboSP1O7V zP*ld4*gqhsbQ3vxY&{7Yn_aDNtr0{MV*zkBAhMKSQC1)4jMLGd_jOs{himyrA}_Sz zuT!6lj5zkVYGIVxo-4IgIWhOH;AI9|Z|m!;1Vx>AhkE18EMSeq z<;9dJ3_#r7g?{)B{8FMyWfD(w`dAh_KbCXOnBeY0L6!}gi&IJ>8ZQ*`xDH56mfZgU zuq6c)?Sw))EMHy=Cj{M^FLiV2Wg*k4#S1;EEgy5O^{5UI4S|P~5@1oY7Euq`+K#@; zOUU;hU-aaRfm!=}!2%peFVa>Cdr15Qi#~t${IYjJhVli?+t7HKL7l$Y6C?c^Z>(CI znzi3(a+>omwm3%oWL=j1Bf@uh)L{Q*m&@4CN zAS4jBcC|P4t3;&ed#*XqeTCQyFNL54zfM8(Jm|Ed-BVTPhSLsN zBZyqjv;4j2uO3=36;bKEGRr@6koB5ysi_1K`LD zC|CzAxZ6PBhG$BF`H2tE(HIBtyEPQ~4b|S7tRhH1qA0xfT^h{`-k+3J#8K&^-Ae^! z0xJ3nf8wwOnkrgAC;*>)hC$_w2q zD9D+5cEU0}7ut(!*NJl-<|~2_%&f9R=Hd`;XV4_;v&yh%mu&QOOTE>@E>k7d3-y^B z<{RD+fO(AWaV$xY%I#twJC&`64P_HbuBo!B%ckp0kNMgQZwAMf#9F4IbU+>Gg3&~R z7RdgYUp^hTo_`sPBh^!GK55clh^bJV=0}LirYiB$jCjRS!L<1x|LDGg~qhVkU3Z- zNQ#pikYAPkm z>zO=R7$$-%%r3;0+zWgll|=m%Mft9&38mMZs_CAm)tR##w*qjA{#b5`qgBouflGTH zrjQ=Fs12J9os=)I(r*+F1=oWJ0PTJ#SL;h+2}Qr%^~9FVt!=F*#cD?Ca}TsFA`9E@ z)H;Bs%!`1J(C29^rcBYK3%cIn?KIS?=fAN3xek0ue4Se@wSYh(=aAOo6P+p5@zj>e z3TihCNv1&}-7R=?P$l0^(`7fgZq7JDU+Y4K3|L=+%$91u{9{M5sX)-JF{Q?_R0bUX zze?Z{7>FfV?I@!YQzPbhyF%dq;OIN{~Ouu9dD7zO|46jI?BJ+lET@K0?g)a115G^k%BKLwfc&t%&h@j(XA1GO=CGDJy6_n^b^x?UFzl|$! z7|jxe0+B464;4tp9gavx?t@%M4;8!5o8=l?cgg` zrH;{R_}o$$vQ_yaVMxaz8CoRE+uWb?`BpvADZl(YN_@&doeWIOHIDEbgcNf>55k8g zrd@gTP|;*@$)(@hK)M2qO(jHE;gz)@Y4B^T=}mk@vKzzq{aIUE98BeKg_QLHjlU zui2bP^OyCFmFi(=IIdzP6(`YCse+^IF8PF5*f2@?_Rw)x#f_boYbK=p5qZz5r}G<1 zfB7u!r3|yZvcCe+4W8Gk_xtHx+&@@12S7jnk-ZXhE^v}%c z;jUh@YOhMhn~4;GJvN@*=<9$CAx#oD%PQ0u3N)D3rImZbWncAPh!^~aNfsibxLy72 z_Y0O^iz#iHU||UBqhEN+yGwkquw0XzXZECpGpUBuLrBQyv%wZ3hE;#?G^08{)7itQr2!1^^GIIEX5H zN1ILUsS^-P#-{yttsomwKIN$FlZDUU??VfGJE4*kgu=c&aSCn z*)0-Z?UH1zj_-7>CY+t3AXP7fSKA7*gW^z7(uWnSRq3LgowrRWD$U0x7l;gu2VA-WNQT6^kRJs8F?PS`oH|40Gut7^D|!^;4jI}KrZNj+{-h&NmyahoGjC7L21Nd%%=UnisA-fNJEem_D00vma{EfaDy1cx6oeg%Mi8l==Z zPbZ3`Y&)1!UkDK+WwE(rC_bC2N=Ys*(Qr+P`$(AcFQ^7Y01>3AG+9Hd9dF!zCq~rd z?UnctFOAJh{akh@+)$M0X+LVZsZbQHIzqJnrnTBi0M8zq&@uZ}Qv#5pPNCwX0shXx zDHeLQJQvjy~x<7L}rHrZByM%U*A8{NaHso5b0 zI>+4kJ%21UJE0WIPMxu;3zkJD#roDFKm*u$C@UoU*&ALU{Q?RIV8eg(U(`Edx33sO zkOTanmd1OqxmgM>NpYWYA^kuj92-hVikEr$`C=O@rQZ;aze33HHV|IaKFB{?QoP@# zUcgP;GAZIHUZMwUyjGxa&1zEeQumo@QTzc@&R-;IP|`%xl;e?#@;^utOCov4p7_VA zu!&3WSZm6udU50D--nLA|dqK&3BB`#eTUm#97QqVLib;JJN$oh7j z|JLF$=0E~cVKpETnW^;50XNR{TquQj1m#gc#ld(}~e4icsCU z-oE*efeH2NcsyoYyjT6a4%PQu_qN$jQrm8wJe#Ghm*bZUdRTl~=;HTkWS+CNCFdtF zRqcmt`W`lAUGDX=(1hW>}#fX_uBlhkOzio+Rf>c1EI2q zSslxvN;4`bTnxx@td8X=V2ua}%W&pMV+P%(LTYnE5qhZq${gqIk`{wgg(e9%xE=5h z>bJCG%-VS@t?TVfx_J&r^WJU1jV=HKk@`gQdRt)`)+T)82MUqxB7;~Kp7bo3D@>;K zD63lciE58w@NbOIFglL7t+|7r+2BR{&QS7%-)VWB7<DMk%QYbQIG#X zsT5(IgiBnG2z_HRpq#aQlT6xeXpVXv`s05=i<%$VZnKiHAJ|RS$=o1aJ1X*O;*=vr zpWSv&M@AzKnyahCNgtM_iM&Z)y9658#A-@WI&n`^96tIof@|sOGMRsIX|d$x+}f;i zvEvD~`k+nI)AxeWrqiSYzr;lGRUjU@9JTKT2F5B4hBM7U41^ce7yN4L-y+<;RYFFL z@e7z`OOPEz?-t*2vO-EtdFBpmzvHja_+E9hECEAsz$7ReYM~N{ElOKxROJILl{P_M8LolCEbkS}SoA*y(vDimiGE_70GXRM+jlR<#<2%s=^ZXL>kryn_ z`$&J(!pG;u^1MwypE$y$gd1D?^dt9INA4{898{Kzuw?ppJ{NC{eG$r*&I|@~^rl_fz_k>gTO9mZiG?p#>I|d2MrnSOYx1D%8s7XX4V?xi+k>`WQPDH2rfrx_Pmi#LH7{e8L}qJ!*p9WG?3Ki)z%-zE{C3nhVfaf01+Kpa)u|G!Ehfr5um&<(oD5W+ zNEG0F5M{a6rKS-?B2MM4(WhpcVp>@zVtG5NiZw&zSM(<;`jIeX6pKsBNc<{0k_a_g ze?elob=Zkgl9DKQ_`K)jMu@HAsuI$@I!fy?eB^fJr>Q*0)h5b|9gCg5U_7r=O1Vc0 z;!BDkrC+R4ROif`hjl=$)j=rr6#dn}zp&DPg->8iW?u}maUG3|)7ci%ho*f7fn8;2 zR#;tzort;By|Kl!`qVUu8!wsP{?l{TTge;SKe&V!5!txOwYV;vT)E05GESKqa^kS& z5{ZF(V&hguiXCamLtiI}&Iz>c-zZX(mR<>sd9;TsZ{)0v$nE-6R1858(B67L7M%ITM5v=X`nr zc1wQ<=`JYH4g#TAA@GKFDF}yStn#A@34*A4Du1h?L6GK6{~yA7eJxR|XM8(&y=28KxTLr&>#{eSUgkRYiay$??q z$;2QS_|Uf&)+X$!dakVc57AX0-6sAJ4q!O!s-)gYD$-6l;f$@LC4X<6Yx^i zAdvWA%LgxBpuYoZ7vLLI3ktB(xDT-=4}%s2Va5LU1UIh?^P~A+p`Pm=!?ZYPHf8|o zkpE!CyGcok>(a+q5ySsWfdshZRRZ0S4g?Py=w2uY5(Ez$M~#AZZwGusUxb3henNrX zt+4sS&A#Mi9Hb3u(}$h#2m+5BUk+@Mf`>LtkUtN}_W@G}ZLJD|fDf#OfM0`wk6{d- zpyC)diq-h6h#+Iwb}I-7lOX&Jd47qt?IzOiFsy(eVA#U;2xgNUyUkSRbRS#+f9(Jg z!iKHZp`=6yVFOlo?BSw=utBQFm{g$yu#qax=5L~dumP&o-fp_$!v>>vG?>=d#>W4j zN4h}&x9~d==KwyCySiNRN5Aq8qA`2!bRtAEGtxIe=l+!*Sh$I1- ze2zsda%gTOv=BEoh_4u}3Ti(O8k#x>G|+e;2+T~Scn&nEcu)w{WHoce&!f25+dd3|gINHZ*NQ(B0@lKn zuQ#56@(-$Gs29NI01Y`FmMS+CfTjc)+T) zL?ejaU;Z;-E*_W!Rvz{tHn$YCO>Z;-E*^;rH=F>X510WLim&nGL`~|6 z=VZizgHQa$HAQojLB)fjEXI{ZbNs=_gQJYbwnTGm!>ETrfQ@a6=Zu4j2SxaeZi?qz zgNg@5dXDIp&Ko7f5BD^;gRMC%1F#1`nU14JSXqw8S;=6$TIYlYGY^FLH{v@so?ZSR zn^$KPOZFSS4Z|LW6QXMbP&Y1{tv;OB4S zHsmjp$ubujUhp0eo$3A_)DRSI@e-yCTaZTA&HQ|z(78g)Bl?I1V%yw$Z zngS+(3M4QpqaZ{)g7E+V003qR0E!og+A>tkL!#a@L|uQ_2}x$mUD_!G{W}8w$idBb zIp#xKJ3etu;m*O5(1eP-d(=usFOqfgp8{vA5+LsU*s^#kdEYV=KQ_$7wIyv<8#+W&P@rrAYiUES1 zmK;aK#4W|9!d~1gTz7K17HcL7p|Po=KKm+_#Q2u!v2@DJn0ZA8y9@$SJVxQj9TI+% z7wmsr{fZKscF|9rE#kT#vlNdJe5Qlz$jIKd#8NHlLxiyyRm}>7MeavAbB#DMmCEqp zkL&tSg-?}a8Bc;_N;wI{Xgztc0Hij&lyIg3RlEI;r=0OiAOIEQw>r1R9pOMv zX>oRfMPm6yBfSdUN2_B9GP8$btY$y0G*7)W;gd#5quZU(s}p11bq)PK3W@bSqB9O1 zZ*tk0t(AR;NDnPs0YyYS;lHW)>W{(L^jKDWDyq-e7?4q9!|$QmsQ9VF#OEL6@p?ff zJsGT?+F_L-^E4L4__0fxYr0q5!AnmQ{c{RS_R!NA2@@yTax!Aj%xlFrf)h|%2$jrj zO6fP45O9U)7Mt5bTHxmh*SO6IYLB6g32MR4Zu_RG#=3CjSiZETHQY4(_pNrHCgt`( z+WMO&jY#`83&YY#HE73_-Apg7I5o%?o&d`Af~G`Rc;FMqHBCbp%Q#6Ai5CK;@R!>W zq)~VP_TLv0B;9Vny0q5a@xk=$u8E~%+5IPHLpjkv^0s6Q(5vdIJK{40^L|^ zq;vuYpB=b1i#U*5m(4vER%~dIia6PaBuCweAviq;utF==p`C;!K__KZt)O$njUz8} zm3;N8xf1{Zn%~=k)o^tbEbhm>UgE^lO*3-I{S?@EOY_C?#??QH&>S``l1Lbh~JnV9T|{1f`&yo>%g35nuaWvCNlDQ*tX zS`w~~h}sx?rH|y^uATa%xcc71#kDzc7Lw^MGPWPf;2h@oh+GNf`g)CMoAH?(5Rug# zIgWhr-9ooO;}&WIC3#2@rls zL6zOg7wg+&^ggw(cmoffZurTCHqNNJEfz*92Bnx=Wt79XV$`*ZmjFb@GJ3PDIB&78 zt^GWf1SpXlmY!l-y8a?!$(Rb` zctr+VCA)O3R5UxH+dL~asTT!`LZyCiOAo(L%vtz#ZhJYzACo>JH*OPS-pO+La>-uP zcxg$qb54p^eem0tP`QF1dPKX;I-UsVn(#*Kfjg9Bursj$1a1y~!^CBc5rfTo50iPsuuO#SAH(e9a%7iWXs^mk<{l;6`h8uwEbhSyX z+kr!uT#%S{YL~y>M8Q-TPYy?V6dB;V^EIiW4_tElN1qA>T*nv zy+@?hH_7~|!Md$j)Tm#~7pfZ&(BYnSv5OmxDdR=#V{h9+tcfrWOpb(ak>hG~{;g2I zC)jF2H_(bfPMfT6i8fnbQ|My+_-Uv9jR`c2%kI+rWEY3!f7_=by}WzNz#zi8*iLpq<2tQ#voj64`&z3+lXjWd@o zKlK+fi%et!w_{14Z(w`^>}RDH0REMX#{7Ql_2*M|ux~d@II;Pnx;O%PWYa};)!Sq> zreR@U{3t@z2DVzk;sSon+~96*$m`iaM_0si1{-qc}MWgau-RZTdh z2W@YG+g&PW@YelZ!|iJOE28vY;B!|KP^gSnEalNxn< z1cdm=Pv&hPvn_}0Gx${LWy%YzIEFWK+Q#f+@h(aQz3>g;SbH69$FKG9L}wh9)k6u28UrhMPwx)NA9Z~S zzlXtNMUTVxu#Au?K?*^g&Sz0#hux0|T{vNgP*J9w!PZPzHddHoUZZ9KWOc1pYK5B{ zb8t27`dwyyOyjDCg!6@ak05SanWda?T1tG6H$&LYj=^=-$S50-F2d7WtwIXbLdpl= zSfnLmod;j>k5Na9>U@OAHiG9cDKzPvm@YF5F$E27TjwXoA8ulhkgu$>uP+Je0vVie zsB*A|xr22fG`OCn=6@tR$Hwe}a;+HlX2kk&H12dpdjukMl-s)$bwKPm2Nv(m1zLOZ7m7V-DUhfTLHrH014 z+@+pgzcBcrPVqfFD%C`j7MO@*fI)^d+$Nl#F3>eX8b1OZv!k!cGKPa-WJeT~T@wSP z?kuLAqOH08jG2fbg^YzKWa@cJXNVw0BQNSIEdRIf3ZDcAprhxb%a-jMCc#j-)(x7< z_jBousi*yKxHpS-Tp7soD%`cX!E?Yx#K!qM7ee?W;+H|$xz)S8pr*8NI( z@0o7jG|zo-3kpm-$hQQKTq`TbnI9e8Gw8N`WI8sww9d2*Q`+9|7$mREb8IAwx&MZm zx@@eRXFG$NYRYml!T@*8&I~6_pYml0{=1=TUY{Wlp zj#s8HLc8I@U+(INyi`u5c27s7p4y(o zgQe1x3YpNvwHnN&Im0q@7GqMZ_51Gp@K3{ktM+om&W~+C;i)3+Fglni;!`g}XkcP` z@C%^`tvREjar$GdM5mh1XpE+$=ex06=%BUD9W8_WE(78h5_7g~l-n zAkEWyTRHsTq08X)_1k;HLH_wPqu}w2-Q-G*5vsg~L4jIoY5vZ)9wup4WKFh~dHj5d1~WWR^||M;&Z7eU5oo)R*JI zZA>_j*(!uAQjS8%+FU!VXkgT{HG)RKvyX#ne_!&b)}e zYTp^0_DGIGwP#^w3q^ea3!-q^3Gb(aOz)Q8m(hjI)zpQUkqs|lY>39Hhps2nTNl{e zN|%xbYr3?#fuzO8P!$S#cZy{=x;htsK=q?>2CJPmPr(mq8%SNi_?viNDG-TkRAc6w z+1EibYGw`!!&y@cQgtepvdE*+-8Xwax*8R7GIlJeN0umqA2YWRv!Q8PY^vbp^fv2Ju+dUNxf|8YfQPB79cZb~id4CI zMTOTN7XrNL9L&w?H7~-j3flLM)MLqNMCCG!HgLI_Y4t`S8elg{W)P{WK2Vm){Gx1R zjELn~Yb>E0HP^APC{cdOc)6yPMBAe-z`>j1#(aRf{zOL|HXR+wa109e**Df$%jiO16HDuVToQ`kF*<@ zfHR?1g2VfGPE}bdG$``_4V2*yDB7LCa#j9k*z9YKF`73 zXP*4HNg38cFO@Z{8UYIp!=WO0leJsYsGzrA!05^a9Syk#DIV!;fe|-1!#%ivD2mDN zCDNYJHqG|4`z&)9R|g2SE^O#S^x@CYZ7`T>5yrO&a|X<}vIk$<8^Y(TGnMLU=QB*r z=Fx%-zJWRH+Rh>Ep=_uQik!Ra>yz1n^q%RM%*AzSa?~&kb;9*QCo+^|>+>#|h-2$A z^=lc?b_21}XAHYpC0+o_bdR<#^URrf&r~Aw_Ysmb6|u0^p9UPjCWcl&*IcK2dWC+MLALre_vWDYyIg-*dt2g}wOBs5D7)UF7TkgawG zus?I$5Yjg_v?+qEKZZwQ@?2%&OO;sZWRIy-pQ5J4AokPcxQ!Dv^EDKyaDLEOyt=8E zLz@%(nus7^&!|$l#Ko-u?|wZJhqp9vSS$0@+Wb=2$d1SkVrpUSgdnCb%X$-L0f$wC z98`H^p&;j!xuN)Oq-dU{-?nCpS|Bc70?*L;s&MF}hqcIFN4iP1ouxW~b=&WuPnf`} z4P_u>$C+R^P4+N5#z`~5IV_u)IXlx;ZP9qwGB;}rMN~yIi7&gmWCBst&PAwY*=c^( zHXAriwZskAY_^@LeVNo$AeVc&L%U6VuYUH?9Tvv{;R?_F*bH94*i@)2OsW+e@T*hQ(I{hLu$Y4nQGTSzFvPb8jlJZ0K;UJZ~ft2!ocp7${m4Ak(a_V=vQenyQ=aWPtZOj_c&5_w0l*iJ5+b{<&hMVJX(iVY07K}dLH@Q zo}`O5G^GSt-fRO4e$0dWQ)OHBc@s_kM$;Ql6D%wT6!(d8_OeP}0)yu~gUFXN2hfef za{X(f)0}l@u&?XRi3C^@I6QhgzHUerT97$Tw5ds7O0-0~JGDQMAGFhVMp>_knD(?f zv;6*i34Y5w0kPNKr%GNYuRm|G`xC<}ez;$s7|Ew}-3iY!4Dx?|VBL0<#qC_$wejmA z+P7$UknoVj!GA~5(v0iG-o@MsV?BJ#7wv>b`#;ZI+u_O3_aTA_ z;{;>E*zfgVG$Cgk(f#|n?NOkqPzg!OTi>3yo4WCBJn@ljFOuK_AXns*ne#Jg$;dGU zo+XC2MAI+(htUbfvjT4y=A8f7UNPx0dme=9*4q|eDn3XZzB~HqEM(_0TDU0zo}6Wf zjAcB$yDkoKwtFOl_AoKmb?R`ww%I{Hu^$3dkWNyR!y9()DY_*TC+&WfjAw5X7T-rCV{uGH@w7kYzTua2$#2W6Q=Tbg!z_cpCwyUB z2qBeJe(XP>^HOsQCd)Yrb=?@^v>3gqWx*9lI$HJY&jIFy&?I#q^C@1LmrXGFlf(9{ zyQ_LnuSX;&k_gp(7oR?L2W+eMuA3;6#h|5W%+AwGK2!{P{$Oj|r|pelY|Dqr@6DNc z?SCx#HLE@c@`ChJgD=4^MS9zW+&p8k?9%CT_+$#=}Xco?>}JtOnlRBGLpM1 zX}^sqme<9x3~BH?Do4*4`SxA}qUi@^Elv~{yefi?Zh@t5v>dq0R|E6%mnNsd&F~j1 z(|;IQ#;@PMeQ)TnY!GaG-POFVkVFj$Ri(KQ)FW`n(BTKmAcD4Tk5!{-S|Ai~dbFN^y!G*X>hj{pRVuC?WHtbb*}ow?conrG*~()vLzC&5v1HzrOdt;gxWllDjuW99k}+WZLEIw0jEa|G86YSQ z?`sguhgjS2-q5-2b;1sJC_>BjPX1YQR|cOCVLQ+{wrv#9|JL8+Dh^F9fEUB(K~j}^ zH#}Fi-1bzaNp7UYO~X5LRBe^?mLlKg4hU8QNnDPLscaH7}s88-fUwuQ4TjUdIQZO7uV#VFmUhS?~#8WSw-m zd3=S;3Vlugf*%K){4Hy?9;#+LJONVw>LtMfy1i&lLr&QW+lXSvS|&riN|(x&NCHFU zuPmZ(;`6-HqS7d1((R0JUC267_63VOo8uJXpu2bDpav_dBpGr#1|Kyq)0V)mJ;%G8 z%f2(URla6L;v->?pG>y14(CgPwb5D>d*+u2nca)#rBc?Gm`S8E{fU~hBF$`mX36U7 zQi4gP-Hbo((|uB|S@<=J>EDc`QNtj2k+FZl5iZD?9HmMl-Z)7WeZx6_(uQf!=6EIv zPx=DgTX-1yzF&Dczen6fIE620S_+$@Pkq?aVkOY&>A+tdTDcHgt>`-x>>iq z9Jz|%H@?`UQ(ti8fnxG|ty8!h1%wFm;k zIsW@_u_CzYxwhdQ*CHc`i$vLOba6D zX1{~fFhsuw(S-!z?nq>@9P^!*>?)$+Hdvc26_Mz*7h=DoK*#Mto3ny%G6zLHJ>Q(kj~Yp2`1Dac%v|s2p4K;X}U{NaNQ`C zL=xY8q+ZO@Hb(uaD@<>jc+ap@>_ro{IMx0UqNRAv&h`Kidy zpYUc{h&FE|&m-T3G9YL&qJ46nJ~WkRo;<2IRn$=kOUFvA^i81OiXS!92oOPIjFAB> z!W3zV6#__w<4ZXrOyK$=_9^|C>>~E@>>zmxYSYb8FNtIianm_Wl+LN!if0uK=-^-? zxe#wP#d*y8bv{E5q7o)P6O-xufzyY2Dcu@dD3$z02YVvVU-;P&n+mQ`Rv1ZK5)rUi zNToFrET<3A*tbNrF|0lLvM-!~lPOHYajsN}rTaTFg7Z!~A?+u|nZRQe4{{YJnLOc_ zBG`E<=Tc0-7E=;{_}qZsNAJ~TP>pvxDt{!qh0L39aZsG~9!SV8W`9 z>6wTpESoC~%sP?Q zgLhzddhWBe!?Lwg@+4e}p0tX>L5;+$GxAS`ZWuY|4Emp^^y`N_oyVrQ;Oe^=PbK!g zIbx$dlZ94##ov1wF=%%^7&rg#RS_awJ!vMPlXiM!UBT}^eR${M?`M%FpJKE@Je>H5 zaday+%MtK38+8w#w!(h$@$be{;(%=)n2B2tlx}{FqXVBMu0dj|D?p{us{;nlJx0ZM z!-yFi7Kah$kz!Oc)r6}wTGwL;s-J(^8}(@P8|=|73%+1xcyr5vlD&dO8!zXxsWFZ* zBJF6ta7(IDG?S83Hv;_96X+1OvfWoey);95H5cDd(z36KaN9|Y$lHfr?@3+%ca1+I(c)(WPif$N)=a#*)m zBSiiEvRIRA3`H9oJXlq8g!hP7UAcmI7c=|g2f3o8S7NBisF>pZ9b<1jy%$tdy5z#@ zZ#`rJp3%QHG3R14uGVjCkTwQ77bw&pgqP4IF)jbNQN{brcYAvyz7Shs;*BpMHyw;E5hF%`mL`AemmPpOQe?^nx(r{ z3e{WWw&_H8^8z!!`jz$@H>ae$&rPxj^@?}vedY=F=M5LRu)H1<+%uPVn(T&z=q5_M z*;~8OD2OuScFI|wxnC?Ln#NyT7!Z&eX7?g7e>$-iId z!xK#*vpl+0vKidcy^Z+Hzl^*iQhj=3dfcu)&2p=k%{aQAcy960z#syhNyZXv_xa-+;{ca!i-3%S*GavToWJ15 zP|qh~U)Q(5vJ^?Atj%$k^O?xE8`*=h|9U469t5TRW^#jgdjzAW@S|JgyhkEb>&vSS zmbm-m7YHADb{!^p>cZ=}C(prs*DTM(SV_+NRlOyT^M@K%HZOt;UH3s95Bi<~*RKC{ zbS1r}^n(JwHCfUoe+Durwx)?AVu%bzeVA)74^x%Dgnh3vC{_^4`&G{=m7AIO(>E(+ zYLn^T$_H#}6@#p}N|TQmoz1$TUId}nnDd2?#OR=Xyc7CuZ+j4>)5RN@Oe*KgDon-_ z795$UTd%8Gi~|2{U^1XDbg~U{y&n<%Sd&aSVB5Vkfcn@iB+u9`bp{4BYD7lUkZJjF zp&4f|2BE_#=}k*JnT>=W2?`{Jy$l<{H`y3I#m+{MtyjT*Adh5BAPi2&$De^V`$xMR?CZRt3JuCBp3UCVG3ISH@0x|cD%3sM{pBJ!hW@x z(4wvv`hjES7L3%J0~#F$+JcqK*=Np(>Hug!^^Y}CM;q^gvWNT)$@i@CbY)6l{H`u5 zH21!??`k{pS_~r(bXsEkNWxtx-GTK@w(Rxfk1KM6<|4pZXiz(fZn2u)aEdOVsmcj) zvoq{pT!xGjJA7@(CE9^;=FegQWtuMK#otJVe;_b1$!979-L%48(jGv09b!`0B1tp* zrHW7)Tqe6yMoMLmMS4Kg3O6EjT%v4z`Y%W?8eoPiGK* z^R)Xy-S{DSj*7~9S-#3dU%eP%CsUHgpWB_TJ#+bJk7|K*oX=e|eU$a&2uAMr5#^NS+Uyczjg^MiGDvu#;PS5Y(_zdq59tuxoSjj#Jt(@VusRvhihWZX zs=Kwd(8O=tdv>pSOs+LkI#XrgdrcY&uc*)F5vjLUo~ON72!i2dW*C)s)l`H)H+~Bx z^}!enU8XHdSOdjK;-ZMMvKdmcd})OBdc}!M%ZumKgvkamNpl>@wrt{HRBjARsPP0p zFLKvZv%-kp;Y>-u!?buIj6i;k18kO1{ng7S;vQOAamaS((do}{^2j@C`nk89Leu}5 zeW6J*dCce4DLT)M2wc_s^+pH~f9O4YSmUG1#%T$gT?Dbz^_;Y#fU?BIkbfOtE14Eg z2tswmz`?`-%i_5LG*a(NU zJ{{?=NXN`%&0_1YG5hbemk=*l9LYx?y1-qAjY1tS))Z@gW)EFS<;Pj33c*C{)>0&z zB71bYXgxwjl>6+=yKGw#e$H517D8+mb1rakzoh#lZnXx1bWb+aV@irGxU5ta(5 zDo8e$x_-TC*B_Blg;&o-xVz|uE)!RvJi$3~ zkzg$Qjzn*>*bhOslgtbO!@$vxvW=9*dGb~GumZm-|Fh~v1Q>7c;i6`uJmoC#Vufz@qKrKTNcMhZ*l;@PA&&U;+HCGLU9tZ>g;l;EEIW4eP)!O?s^j_ zM}WR=a$=@yl7Sd(Jw~Ze0~&z;8pG=FYGpCnY+uETf!qGP4X+;c(3G0G9xrI67HKQP ztNBGgrxRNu_V-AMIo-xY>M@RT@5Rimh|gEX07~8=cW=K!E|RpH z?WU6V4)`Oz#w9^6NIZGo`*{de@AkrAwBFOsvb7ze>kAL5$$IF&Rpr5(S=nxb^Y&r< zAMgUSBb%FpseCHA+$s|)GbJlLmkJEXQoSa7u;WS0Lp`@9_@+9)Cr#u`w6sFY1OM^TVenG={)&AGs_rHumW`kTe<7 z8RPH6h80(vYsAmtXZ8i|zEqt0Z9NV{uUE!W*!LO#&M_MzJeW#6F~HL3yG-;y$a#qp z5?L(iEQDoLJ%lS2xgb`$ZBngAd&(ZquCZ#H0Y^}Tc%+qC(zR8;qpGGn*H~CMFTo3L zZvM;|f1(&OsqEvrfiHzn=BU8&4`gY=Os&Ecm6(duRj9TvJ4HMr!r1cu)&P+++P9-A&;;`nS%WiQ?rcpQM>wGAg5cP9_}0Dbr;-5-1-FU_}bI} z56&6NU~f>Rw0fV5OFvuuzNg%u80xWy(SE(=d?Wq`=*6>->5mrdsMI$-!x^tAp7=O( zGdyk#hCzk&w_tL9vEUd?R@j9baXB;z`=P#jXl09OTlv>*99%`^BS{20HnL4v=!9uz zNC5fA7by-nZ5wTqF+}^1g8T8Hn=e&;V>z#>n%>IU;7CswRKxX$7S-Cb;Ey|1sbkqR z|7*#Zkv#j!O_FNg7;O^+(J$9TVFa$k5VHwFd1Kq&Y!dSNFyC1eopF@fwz;c;4{?%0l+G>M@ zY-biojq0|$y^2b14GJR}X!!?XyU{N)W=*O;iRQG$^+eI=u~S#EvUj-l`gf1w$nKhj zym3gF#F=e0YX==;uK2(WR9Ekn0R2+tdpElBTot9ps@h^%^24fy`FfhpydScM=MX3yD zkx$#)Uk?l@hi@ikyHGdrundM&)rujz`*4a1NnL~ou^{gE zRWAmi&25W0k@y1t4B-ZLucQydt~&UVzuSNbaJ(4vndGNRjQf52tvKZTS5fXAGrlh? zWC+>6TE2Pg1I1?10=OEklib%fo|b=i)f!^tgrh9>Y&Sx20iW$^H zfRd_%&nn8IKLplntnd{7BlcxwW{dS@K^Z1KwY(`K4|jZX*k4kYhPZ5Ntxmvx1KcA~ zWG&5FqvG(}aOwPX|41QOte2z`VcGzf-$p7Yrb%%ZFohO+yW79<#&1X0Ru}gM zGdu*XL>U*Wg@*v;`qrp)HjJDXe#MO~j!dq?_5VuS)_dSue@D0* z97Q$@?(4|nm@@71P-E^K=eN->;ok2{4>GSC;o1ALQDW7w znAd^rFkb}X9yinS@`ClZQn>#}R^zzLB@i-Am^1Z>cPWDa3{E639XfJBiz)EbM#CxA z3wZ1{W5{o)VMA{Ii?*r){P4G(L@|ImdqbmHFltz#>GBbeKRX(;OCb!cCuF|{rr8O; za9z!V9KxY5ldm`UEyCbOH%{I1mq~Y+UDAkO8AI3eE?88U8DgR+ve00}am24XZ1U{K zQ~m;TGgwT6V~R@==PK)CfNWm!+-Zde{~T?a@Xr?jWQSUa_UF-9H9%@qe?G{3-?QDO zi8sGi&|3WhDsM^H6f9i6>b!`TQEXoGV@XrM^2{Boo*@|+DGr^lEzlv4Uc2!wTNDqc zyw6tg;kcy6_j9F2)v>1cDh34C0yLb=l)8)&MOcPR3YOsV%dHAN-#-n}E;!JhGzi$||dN6cXpWg;^Cis$exZC|~gS`@Vf!?1nL zjI51)qujMiJI#(EgQfK;Ep9ZaN!i6YGRTJ`3iEUfGKZvvvYE}=O^;qU$O(Tl$!KwE z4Ra`LM5X(R`WYfBehwBjCi30rm-AUF7)EzkuG$nZBQUr|d5LA(hFnxnfoBOJi0ju) z_8a=twTexelr$Sn%eLAQf#Lx-CnyBdJj`2orgYVgrkT9t{6s2J+0+Mh=WC8OUV(KM zbG}T4+l&}0F$`w)Su&JNhq4exHlJELXX>&ybG4_oFt7Yg>LQ}QbXtFQaPQ-pr&_v9 z!dHcsQj%L}36Q$H%m*gnjE^6A2)^3PzLTe$UoXrlqsg!cenD{qRa{fx%f;wla%Vtb z&LUsC!92q{B5zXWj=c6t6;_u3m_r;wF3dV&007x2doM0!M9V}FFHkQ@I7))-7Rt`i zYd1FaAc?Q^p!gV+zFskzwjLslFWMktI`~5ki>Q$Gb7UT3>+9LTobFoqI`@kh*pCVf z?L1`9%ty1$CuZe3Ae`8Gbpb;gH$0V7<~W42m&9f`My&m@Us7qCWz!jtkzTcOrss^! z+CoLY-9s*DQ)Btm?64)0MOWEEOXh3W$ds0hZkc9{-0j}vcJw8tRnEoR6zf(lLT|Qn zVgF0d`^Eg{x11!J&bMpPb!B?Yu(BaWpfLaN;M7apAvl;y;<6M*?Y{$mfRL=FuJ%Ow zr(}M;i6#kVnFNzfk!gsepJ>A^mPZ{|Jz8M($F_(!(wKvm`#)1aBEce>KX>7zg`W zB1AF@aqfvn*P`~XUX3Bj8AZuDWOK;}{;_saMl#JxnnOLum~2x`)swa(-xG`5rsb#U z;w>#z!k@+lHM)cu5D5K`N7fEcaGa`jwDKWm%QxzjQaEMbFlsR3T;n5?>e0$!@WP=K zn-+6OZyI=JEzHpPLD5r^Df<8rzBXH+tYYI3_1HyZ@6`(#Vx--Em37a$a?e~BJ-XUf z^68P%7ndpD{PaLD<}|I7cV&<7vzGwZBPno0B@oSs(PUPYqWpB8okVhjfvvqhr+iR4p%Gtp4?#S-5@tkn4~M<}dK7$8bo4s^7Zu4s z{shZbG42AYl*nEQK`-OIf;Aa~+98%NZgr%BnPsArEYaA!sM^U)emf$E?dXjYO@1+I zMECLVNwW%q^Vj8&TL66c#U~?ak9ROH@>zIVVu7D5`RoZtB)->sV5fFek;K#G&uYRG zgG`1+aHvpH!1x1Aa;7S=oqGY{Ye8kXcr+LLZscu zI~DuSg`6@mg%g_M10sncJdQy3%0CvxX0}!O4yhxUa|BZ`Yb@BjDathI}**fqqM^zRj-&Ed~qnu)7pRf zPdI&^{^2~6ony=ushUWq1k%AvW~0_V{Q*hFTtts8bvN%glV!gka{Vm}*KIb@9L!_z z(Z?k8mP=W{V(0oyL-SG7e1N?5Z=pLS3oa(y?3>BAG?!eRz~9uD zI!{p2z0+Mc%RV9gb!3?b8oy&rX)_<+4|4uPT51z z>rW|^gZG>PLil=#c(_RX0u$qBR=D4e|zY;ehrzDJJhLsX>NARt++%VYl=Wk`-Jyz?aI!hr9{%W7;}zql;0NRNBOxsB{oK;A z11LN};iHEewsYRP-X9!hj$sH52XBxZgDn+Zk7&lD?jT=iDO{2x$r;GPl?!-$KW6cW z=6y;OOqwx=#8&7w(&owE`|4MVGMh?%vtMhWF6WfQ?BXgfNi-l zTjmz~@B?T_tnE#oi=E(o)PWN7GFXG<%R8GT7fRu^2iF$zDp4+LSCp#(pJUQgW+O^+ zFHj?^s-d6y`htgJyu($H)44xFWT(K{jL*CE?N^*&aYx!-RLvNyYytE^?-&m4Bp*%- zlS1fJLSvmx+b{~n{baf8jL47M>(FSWB#*I(Jbwzxe#RK0gk9u~VN`plQI; z-9-eg%cs9p39>%lslRbKAyGZ`Gls8{hv|B~0`&@)8a^`N!UMYrnKgePK-$V3nQ(x- zVbNpsa~5?~=FsT0=4Ua3IFuHxY;=P+^npr6w%0R>IXfteUUi zQYu2aA%MTMRXG^v>5R`8Ark{-tDpzxG7vgQlUH-Qyz@YdvX5m2x|i~V@x7&+BT~F# zX%QEppLYGa%!C4@ni08CSHP>hvcxNi&~<+mxbZ|>h1>1ktYW4V-)T8pr3C+;NZDtG zHOqU|Oi4zpC%cbR6!`?#^%-pu*9AQUf`_M6~+I3y<18 z>Y$xvg2ac8dcv5_u4;NKmNKDaG$)zlti5clGuT^=Vs9K^j>3M|ZyYDmBP*;~X4g+O zS+c1i)};*>{mWJ8^D3`qz+||?j+wMNcq3_UF2f_;{119ea6a8)=S90z$D_#8?CAR? z*t&UBeYMvPQH6MEHpabdgtYH0_A)%4Oj@J>ovA*G-do$Ep>3bQ#laoifz^N|Yl>n2 zWhGo84ec!FjxTnJaKDJFbR2tcWxNMdBWATp566_5Xc%Ibv%6^95E zeCair^CNQU(WLNYW9lG1*y%PV$N$I)evXD7eW)XErO629WJ07SJm-Gw<-6Sk8Dm?n zg3z447ew*Ib~=|;fmg))(xKz%WT+e+6nxDeNdD^4*8Pac+}08sB-Gjsl+AoDNkSO? zQg$&<#>SlW3F2m644}V)gA^mijL)}>XEIb^D8-MzY}hX$-&#DQYGidSS_y8%5edo@ zD2uzyd2!4nr!Ye^zI{3HTDgGvnYf%oR$B%bG1w6R=`edb+cE~V@otuF_Y7noVy6|{ z#dNIj{(C9j7g#a&U-S*aih=8nbQA~+mT_yU%&i~xTil3-8AL37Yg4TA_S_?E)ZJ|G z!UWj{UfOrycoKZ_|Av)ZB;YKwpQxS3{`-{z>+LUZ+Ul;76n1Wil4f{tbVhv*F+0Xt z>==V1llvs4ak%iIE89($UqVf>rK3V6$Oj5|h_U?v^7f=^q-YQhwYQBdLKnRX{KvmP={rGLgxxzk*D>4aQKQh>f+U1Q z$&LICJ7#U!;q~Z#ID0+4&Ft&}`^4$w_FgP*v<)n87Da_YGZU+Z1#(atg37z37LdbQ zQA>e~_F#|^fso^5y-FCOw%}Cl7+($o0jG$|+uMB=@ zFUpThFi8DLS4ZaZKf*ERRHw_%ujE-&YgKttX-CgcU(IxiJJACzZfH-B$eqz_C2|mDJSl6Qg>M~lE-|OIWqcid z=ii=!3xGHLJNFVyY|M&cv&q)-+T?Gud{8h#S&iF>59Z;IxAUg7h~^9~EUJ?d2(=!F z77`i*dGQFDpQ6{=B-}sCis?%#0D+K~aF_J4D+>y{rJgSt^i55R)7jz8W2vPt2vcny zmS;`O66!6zju(=n32%o2aU>GKJttA+NvYHn(RK%Wov8tb<+mWQMK?p;7>ok(Sqj(S zVJ3+nMH9%!-;WrT2QFyPF9EM)w z2e9!ee;ue?!4sccTNlV?C>evrnYR-4eYe5${jR8rbVo7Or`1PcU!i|=e1V6@ES3gUkT+C3vU3{^c`hsOOgaYRzvWOI{i#)&~)#yjlSO93SJ^n7n8845v zv(Uugx4LV?AK{~?7Rp+9?bv#NgrQvLxd$QZEw`4yB6wfr0}7Xr>8 z8p1S@7O6?apP0bW4*$+HRYxFb&G-*ukTO#LX>0c1ul;;k zS$|vAPw^qZh}y&b?g$pTxOC5oV4U(uHl8VT^^D^&x9pJSgt zXRuXyf>fyOtzxvz0r~3i2wQWFgtF=litjc)F-}f^NKLH_5!-$^B1Tj#PxGpIc;%b3Zma_^faEK>RuV4elKD0Fv|)!s+Ak>eWg4ORB^p_CmVv5R!~Ogt%;8(6byB5Rvv361kDRdrI1S!i zihWOAW?haSlff34s%Jx<ya4(z1?#cQ9Z?Pd z$hN4m7cd1m1Dk!7cM_gkHI-Jk>q8|uOw)&x3PzrN535%bFQ2vAqiKtY3$GECM&2Lj z&ASGV1KaIBIYm*pt)`wl@lZxzT)7vl3Kulay9E;*c^mu}T#A*vXVman@>RuLJ1Fp< zs9T6Y(+Iq$XeO*-Wn;PZZ-x8Lo5xpe8No4M`d}-y`Bp#VA5z^Z6e%DBI@k%mpl~8k zRXCR=LF6=jtZ5|p7!pJhRFz`CnM}au2HNosPo3%RPoRmxw6curr}xh2I-*W6QD?T0 zq#iqY{I?h{7m=5bsVL_MGW&{|E!d@uFNrWytXE3-0cIk)6@$=gDbG#faM`aJ@L&pR zOsRAQCTIVp<^es@*hzUGq4rgtDh;~%$Xb9__u3|k6U;`|ElNwsd|1bg=CjL2@C*+y zq+z&SHdho()A%8ox&RIYlouKbii^96Hepma?6*TyD@E&|7|}>7&7pdqUu}p{@-%oEWON=h)Z-q- zAC4z+yPROzyIUjX?T>?5aDcWgn(ns|`{%N`ENEqAM(mwLuG|QCuolj~giO2G0_XGx zNv^^pZp-ZOpz}BEp-7&JDK@{tiRLHlpRm94i%Gw)gYg!+0@ovp4uo44n7?bVVgyBd zH*nc@yp;VoLuWy=~5=q}`{ zt@drln_@u{Svlet*J+V~*mB)cO~u1)Pa+}Phb2b3pMgblK#ILRMMUOtxukh@%s75( z61yGYI$ANDIbaGNU|FN;>O^nQsl4m^C0fA!mvCC?x1XUI_W;8CfxndUyqtgf*=8=; zt55hG2|*Uoi&`5D1yFxZkn)Sq$i})Ta8?uH8~TV!z4X4)mI}lBEDG0ni&;4t1eva& z3Rf%C$Xr#hEyDI!))--qyrqypcrXF0_yzNa*mCsDjXLRMCupZ(|89~uZoGeOHNFd3a7AE7}{OL7YtOlbRt-*Npr7+NGz=DB8AFX&$iRH?eCYC zui2@K)KgvJL)@T-@4{5)YOJb*DZ6WH^E*BD?jqv}3aZ3mAeA_%tKr27dLFOYn)o+n z!}u4l)oEXQUU#c{%~ypdbTD*=Df^I%gvY8`A&=jr%H(s}>rt*|?L(Gn$)MJUkRVIZeE)~t*lUr|e& zgWRn)ZqK+srFj^E%y6zSF*l*Db_uhD#si5|tQ(^Ofe+5AvGXkxYOUzR*TR@3iMSQ$*Izwwq6E5jSa`huE~g^-b32+DJ?Jizp*{pGnj z^Gg!9sF!g&e4a81%i&$(y*z*nYgj}^;MgK{L?@D<0(Zevpqv%Sr7?x)anK^RAxT}= z+UfVdJWDfjCE-zHLl2}N15tNiK%ae{ms3x>z91{>?u@|_rx9E7ajEgD*M6ZQ;Idd9 z1_pAPPYYePG?@N<{|J-NPa=TeU?{=rVXy~~ciU+2a&g|qGjy$1q}3jge}5|t_ftdi zg+m5hwTxw8c)|);200xymLQj`yzYcTS>Waze2!W{pfz}lj$2DUz`ICPolmE^T+VwW z!mY;7+ro9g?&4t5lZk9aU+Ho~5 z?V;lUhxMfc`++Q@I2TE9Niq<%v9FZEl>bKMlUbkl*^g|1=pa+POrl?q9aq9~7Y&(P zdBLWFXvLQu=I|{M%y*t2e|Nfcbd>mGTR2>r!=PMW!_2G>>UkLJ^$MLmIUbur!4$_S zC>PXH0)*~}y-RV0Vi<M@=8kx}B#z`bIRSxMt{4^wQv} zL6GWA`7NfexE-bdZP=W*vzJ|erO}qZV>QqhTC*iU*eCI-B4T-BHjPWLOfL)IbeM## zvu>;6W>z;iZu}7<9 zxw2Y9k-OnfT%d^P8!^z?l>fm-w4qvB7Gk=>oWS+!#`5kUH`#ZPVFI%ZeaNOZ$WGwj z%f*y-zre!+pRM{Kb2BOcuP|H5#M4b0Gjzy?+Zv@2vs_%Exz!GRIXTziDbcd^@>(jG zOk5j<$oflS(cBwb!UIs6M_`%Pw*=g2ARq(!?lt`@X6Dht8KuvC^?nAOmP2ER7u+h@ ziR9G}*m{%Gg*R+9Vl-25S|g++SrjZeqTVm{wctk>j4WPcBoS?Wkx}8-%y}=&G8UEQ z5A2X@I8`=_L5XXR66KCQR#xMP3L6*g(7Z=Xm7=87H`yHVcZYF^RJm!W+)>9u=L&M+ znCSbKESkB#zTC39JUs-M6_y_(Q6h8K`>iZM|x8N>J z_1UH%}Af4C7xRIpJi@H}vaK%Y#eiUr4 zYmhqkxR&~m{ce?xC$R~-rgHhC?l><+tRGjKjRAx(p?SgMIb+o<@%Yxjm9S?{`n%4A z6IR4xT3p~t4^>wI#on{KrU96FEqsEBSPAqr7!sq<%6K#@P%ZHDwByml{5oqyFY0tT zp*cg?vZ5T^#Mk)^E{KRn+g16*y<|4&5aN~v$Qv);8{L=&9d*E8#l|{a2hO}5n;jw% ztVZ-6{iywv8n~$hnNS6TITUsZWD8S)yedk9vv#hF9`U*0p;<$TdwCAkv7=d&XEqs~ zB?E!R?jxx1nduVlX8ksOgWDDCyPL^uw5WeKEtNUzUtF+KO9dqG1RPxe*UgIqjgEcb zJ8H9=GA47?rL1}Q2{&$LReVs3o2*1Sg~=AwJWCKalsUw3iY9E_G0}&iDpThB4xm`P zl~eU#h?`5Oi)zmL)-dIJILl-__23=>qYOUAvC4a@QiV^pG{o0HVN77$F0#OkEk~z2 zws0YGp~}%n66iL0OtMK|YXzpxxlIL5)zIGng6ys?%-bv9_|Pb6v9$KmLrnzH6Rl*{ z8SAA&4nnG*1e-asGPsp8_Y@kjtDwJrb(E48xz1DH&9m35lG~fh&tbTP(!DvINtTsD z{?JPjlE{I7@>%8lU8K*cbHbA~_oQZTqis8iUGx(8PJ z^EW!h?rxbsD%MCq2e*$c_&EwU6L6-oTr^LIbcm}-;i%&n`)xkrGTofTE?U$XCGG2$ z>c;}%5b(7O^(qCAlhyEETb@*amd*?io+EN`yKtiNm ze*NEuOhTRDO>gahUF!EgyJIXab!0D+nxqB?}_=yl(l(K5_K)=URgbptgCHSd|zAJ z=B(ivJ~V{zJ|#)Rk}%<1;RsJgTiv3R2QWx~zV#Lyut~`0 zKZLjsfj~qw-4fZwGa=iPWyf0MYHW^m!c||yn1WMyUh)c!1Nq4gqLOh2O}}w04UL7s ze7qstIR(J63AC~l#DrC!B$<;Av9pSPGk{C0Y-A>Y0-mnNpr@4H{e70c!L4#=Ha!HG zqeVR>_~rt;{Qxm;*n?^xs*0#E@VNCrTBFlZjxv>~yqSp>J3)yx2u(?rfEiTDS@%K< zmcvj3n)GFv>yopr98u#Dz> z0(ZB_mgltBql8@^hF2IAc-*z-BMj6GveU+FpLaMq!?8(QQ9~Mk7F!&n;-I2c0OPYe z&AQQ6!OHf?$ad6-k2;N|nyPrVX7YOboUQe|#0uLMY7gO7u^bhr`!=#j13F zT{ft>PVO4`H!1Zs(}~NqGtlR819*+3=6Ue^n_KSx#7l6q_eE5HjQ?2aPyhR_@~^-B z^t_V6tnp|6QW5`iy?xRI=2`?4TpcS~xE}LHeEkHkGM*xP3q5=Q0AOCz00>Ph~|8*1o$Nj>Y zpFb&ETVVJNFgRrnkP)9RT#OJ`;M_@9%gItTF`5mI=cGJy* zRjiif=Tk^0)`~pvZ3mbmltl?2NW9YsznFv$mvK*3yMp;IKcLP_cp6n2UcVD84$rnF zD@D+4jiJkOE5W;x&#b>YeGchhhLuAQh8zP!%9Hyj(VqS_xGxG!LzRt~IE2r0G`tap zZ=2c8zuUzNzDvJ$YWkBoxaNB8U%fuXn>&ne!Vk+el@fsO4I|95i*&i8a&vCqr5M<< z)D5Mrb$J>!Hq({pxrzZj-JBi6}EyrqOCvK^@d%IlrI zi`D$iDKU@mk|rT4v74ypBn7asjVkh9Z09V3dqP?%ZVu(o*i!*+Z?pwJ+!1iticf zEMZ7mULOnPCiu72Yv&0ElbPt)x-}HGWltnQ5R=|jH;!#TzhqC+IO-&6R6&PY&}G1~ z-To?Wr%(P>cT71!$&!d4iQhABs?jLR8lxMF-t7-Pk+&^!wtgypr04blG`xG>99 zjs8?5JGoxT8(H4RG+gGkW`Gh$Lw8e?&nNkBp^SxkM;+M=(5?=KD$ZqkLWL}gg65FoFuw|tWY!veITLL4a=B31UV(JBW^#NT_+)9y zIbN*+jmc!WQMT-K0X}a^6}(;$^Jol-wG!R;@WGi+kKzt6e2id?)DF+aa%CQ(38+`G z#;}o$7S>sr!hrQ65JeTaZFU#-uEk#EG0Zb^bKI=$oE3JBcjGIgyN9Q<8UY2A$Dh2L z)XV$HHFSd>mG`X{hZT>>@}_uF>n;3{y^~bss=1LxnVf)oMvTNC`_wbIYW?pXg3%Mj z!OmLe!tmxnib%2oQnjBqF@Uq&*C`HTdEY=38`UR7&@AEFwmDn{;5`^nWN0yhiFjCB{a5#{1-n*Y{V2aVBezvgka7 zw1pYLJ!%)RyrW$0p)neh(mjQ?-z`TH0e2RSS-L}RvK;5eH#%&-=jfW5&4U$C%?Hp1 zr$jen7R`hm~`lD-4oC5`wKkq zv6YFgBUFOkxo80Y+d%M3aS_(ZN?!`uY;)~i?${Ti=TvD#B!=wc{LIR|9nm1-N#@Z@O;Uf$%N zB0E=PJ|@Zxiw6*w!9rl%;^c4J&8-L~ig@+2Sl-WX6D^n#N>i(8L$Gub^Yn@ebKgYn zOXAn|LZ4|6Nv##dw9@V^#jm2^?GWMfhYEhd*7D!MRN7;*{muH<7Y15I>*7X)&8Nm9 zl1f@B^d>5J%C?IJ|8-JW{V?pRUr}0i+Vb-~olB}MtW!#_ z{w8Iev9|Hq&^}+)q{|NSOfQBtgw6jf?<}$W{bvQW1?zsXs*F3`*o=l{CWfd5xgJRN1oLRO0>_Q`Jk6! z$I^>q{+u;Wy1#wupS^ykuUNZgsu(7wmO4+6XRH{zmxjXd^5E|zoB=Vgvb9088vX0C zu&eRji~wK32dx**^v=hDHAPr!Nv8h~piNBwI;FACfCV<9l5(<;gAwvU>(6szGz^1t zUf16l^ebl}Z2?h+sPO{$54@Y&yP(Nsb?ed_C0G2OmRCcpDPlXFTm&%cHR6CLqoH{hh6V^3>?OxMJj<-3yYKxEUZoJzcfwlx$P%{ z5qW`j4|Etw?|Uzg+18=3+Oco|)J>;YEP!E6`auZ2ok7&*GkalbMloQ$7xok7WeJ0U z@XEy|^X}&l;^*Bf*Z$n_*cv43sH@?d*ZQ=4>$X{!rY8iF76SdT@M-^XY?e^p2|PeN z8peGp2}3oX{Y?ysqdYZ?AyD~|~n4gW%( zFn>rq$;P*gaDO?mtk^->23au6nBedDXSo8&hDO|(&wo}ulhbE{&93@4IYExn^;9r-7Al;fCPY`{!3v{yVeXP5meD|)0mbBFs;y1npVI4g14_IVQ&#V z<^(bl3iU@snF`t7`};llN5~)jN59FT-nAwF^QVXAzXnQ-%Z`I{nc(^#kAwb-)nG0s z)HK~C9&qXdvT#lIXfp4P`u=GKhWF$vszd1B7t7Q_v}jPuj<3$I8STT$`JjqejLVe8)#aM(o19E z>6+ydZDM@(Kv}f2T&>+Z)b|Exidf(YQuP9+q|KFAx?^rN_x=)Xac$`Du4ZoTiA4TU zki3@QPp2E%cbn5J5$_9FGpB($V)>gDjc3j?8upFK`!svLr%y4Ggv*KqHeQPp>3-Du zFmVp|~;)LJ-;$oJd)9)^QZusOstT{SG0 zR`5rDaVkiesQg?V;o(}MIl;R=tDMBcl(pFeyTaQrFIN>fFN9^G3Xc z$9agol-KZ_!4m7}1XDaTsIPqwZVphc_bj6KiEiZTSi{N(^WKr;VDJedCUNTse#kf z4Mi9XJ7SR~Q~t36R=-E4HAgx*!RHsk=J^`1-xWOXaYnba@?(4K%+aJPoE5j98lS5T zf_vIyQKX-HchZX~9>Ti&+%#Emgvgyc6*zmi*jM*Vvk zG=y^D4A+-Da6{hI0Phx@l<*6bu0NY@gIH!UY66~wHwx!BZIpkPX84qLv%t$kF#7Dc z6r8XQF$9pWqKafy&XZ7Z&RnVk;^#s0`ee{%0%k5^B>hRM*r8ZFS(>FsSZCPMLuzw! zEif3Y9-R0hc7-Q#z8c)f&usTt?T@SrapY?-qAwiE0~Zmt*m^3Lc?c2^k*W$){rQ|M z$QKO)UptpWXyh@HZ*JaZ4i*#B`%_a~728S_l=_2V$V{dU3XBt*flA(16HGHL+Wg%3 z*1r03p*BU1!B$@#EBnB^HlzCZqor{l=$-f6dJ!?gWCeIxS}~u4EP6M;TvIaC?$1l$ zPA~XL(LE^l@Q62k&kgt~^?F~T%gWVJ@+9`)bQvUWJYk9)t(xl3%$&Fu;pn>~D9l%= zj6!GI9x3)gVrY|dv>Gq-BL9}U8@=J2y)*tO-*CFgYrGY*@=%(Fe4#2CoLfh8M$1!wChBL^QTxLW8+zk{V;QmvEB#U8Tf0teaQS<=E2dXmm2M&ySW2NyXSd z%KT{$44A0mdLDm*Zyu2KFTUjHCO{gk`t#;>qw*Bq96kq_9cUx}6`#ZTPvqpk z*X^u|3GEdG^(>#lc||9{%z`PF&ZYWOFYdvtkMW(@1lD-KYa8ILS-lbflqilbpuQ>a zrS^GM{3Vhw2p+L8U$7e^AM*fI$u})1Z(>S(NP62ZopQaANZ;v!!OLIZ?#LI_gPyK| zEB=Yj7xxqY2*G%#Hua}W)CXLbRrB??xBi9yyZ0}R%#snVzgYlo{jC^l_ONopm%ww6 zWQR*Wp4U#mizvEI*?*h`sgP(-={sN~(C)S*YaKOvQcPmL8?d;;a0I-%4GSqp%HRu# znFkUC?@IIl(n)XSsd^=|bt|KGkUH|OW;yYjj=ST~& z)ZvFOo2Y$&Q6Q=2GxWIw&U#PsK`PxDN`|3)lDuP*oJCJVDv=g1IQCh>t}9pD z5E;fY?1f&RdstPFUY=D_vi=DSg;Bl zMk=T7K?;=3-1D?;MVC#5g%e-wP{@Vf1}O!QZ{W|vF8|P0hmn6Dc%hEBUjxnPZz)ZI zwfwm4)jn(jRgMD~S`!m9LAXI91KR@!Gr10GYPq(aw%`R{6;K~5F63Me3_?K*2L2SZ zUr|{9pig*D2z>bTd)DT6nIF-S@?U?i=Bm{9F*kex^`%`z`cc6L;hdU9+TA=QA@tC( z0^PK~VE+$dAq4F;YudIa4KVz7$hYe_@+pi{h{gT>&n${>P+w`p>TV{W_W5r;(%?-3 z0bi#UpC-5|uEl>pP7?X;SYxU0 zR|(790ssNRdpKWpLZ(h!RzdxU+26%>(#VW&O4}%R$j1f@2u{{KfDqU7r1RsfaQ7by zvHnc1_RzBHH{Ss*^H}~xUWy6(Uoh9p|7%t;*Y*kKyn6C#B9BUrNYsn3>jl-%P7 zbJb(O`P=f!NO%rm2qjdENOwUK@#&rL$p$b&VPP2>xowH)pf-9u)l&EmEZ_{aJ|yhB zV8jNL443|jBbX)`{qHrrX*fnHCky~niFjwNUn{dO>MWN!hUxWS#UJ0Gx&;76K)JtF zQ6jQ}Zab94;>G^z_U%rh8Z$^bn`xhzvLx6JD zO{B6TMD4{aR|wP~!s8U!D{>{iYRm_2P^2E?>8qa|Pxam37t--;^SB!R+UFg&PYp$x zG`%zMMi%3qEWDe$Z{B)gv^%2%J6yt0yE3s`D9sg4lC!MngN;2)PIdf+e|H0BtC#pX z^)eschSixGwTt#lnqj%x!$5bojmv0k(HJe z)?RuN71nVY466y^g0CIP9Vc2EJ>yq+ORUpx7>THQpdE1+aMX<%dv&}lo8}@lQF$w> zY31Y)M{LJEGTUP?(&4E_i4$xqKH-KS_wdMePXb~*nsm-$%QC{`DBLwFyP7Z}PT;gi z;rYOJCkZ`7zw2n9t`?zvY*wk*k?7ok}%gt$dS)LW4xq>q9K@i zSBQfoG}BA{w>Pnu8d^l{qhE9Hp6ERdz4Qf+ zP(lP1Y7sB~wtXtsEZa=hOgHT(_fv*gw4YHIUDZiy_ z%Ejy=!Qy-~nB2aK!p%Nv7&QLBo(zbzOqZ3fg)Dmp9#d9BWO$6E1DtozL1x`OC(C(L`^ulsf6y;|PG8&!F6PxC-eR>OcM}DLZE)i( z?A3ZOwc5v@beujPpgbhr#E(wI=V}hvnY!cUt>*!&=fvv@ zFb}oh{w`ERVr04`aWm)mJ6C7PW&#DX&6mS73o+XBabJkHFH${jl;uN^1lhUq`dTcZ zJ_eYHOIKtu-W3N!gm})y^aBKntyogfgJh*5C?=5Tzj@qzVw^S-uSK$%xo$k{s>5r+ zYDGZLJYSLJ;MoaBc~LK{TY2e+WkFfa^p2V zxj)B0(t5K0aJAUyBSU%n0d(C){x?3*jdt3BjszC99WGZp$VwHVE^=ZNJ?Gn=Ttn%R z5*>DfvJJgRW{1F^lGa+KaRVV3vEUODVB|$D$yC=hC7)C#TNy^FBz22V9U>8{t@}W> z;-IGuXeAiijMi{s#WDw&jR5-&3AgtU36^)1cFQG^MkCMF)t$3LLi(qOs{?VU;Md*N z`Jz-?&;o(0#(pQeTgsV9Eo8>3($sJoFSM8_Hx-xe5;h#gM-m|#h0kV|Iu|=87$P>P zexmVf@V}Se$yO?$vI0q$ktc#YxnbOpRKu6x;}zgh^AGUUU9jAxTd}|EeVn644uO!? zDW{TwzIp8i)eerG&Ftgdgw2_4C|@9n1<#zv{;I4cP9Y?f#*o#ORNNx$PeqNp)c`QR zPKoN>*E8OY8s$;@)Ad>`XQ_yr1G2Y&SA(>lw0-J;J`Bt-*7rD68pQSsfHk?of4`O- zaqJC5b?cf4nID?VGlv~>mHeFx)J(I6tL}a@;S`29PhRIn{M*+K_j63!mxdU9%*`&? z#$g_$n>*g@L*@R6ziG1}ri_J<$RBC^6G+@{G0^i)@)D!UpSf+6oJE&|Y#>YM7ydxw z<$mwaZz%fPUw@x&x4*yo-S4Zi&wv!~J04vAq>{NlNhs9R!u|%ve@E~h29A-2I@6YL zr=-CHUN#5dUY|v$R?EXA$Q?7!?-V@HF;3&?dG#%=$|{h)lwx<3yS_lmdENa>oUOMK z{o5Fqww<@;3sX2}OCDi+F&{mcU)KYj&38&}Q=N+=R(PEVC>{Sj{L>4=jBxjmZV#%)9R8Ux_@5zc4S|GECE9dV>qxlYf-KiG& zErHzT98v4ArFug3?@UOQiP-_GA0;(TT~Erbp@=9?LsKOjJM;jx`@=jDH=}Gabj+P( zx{|Qe;A1$;hGY`I(-}C2ij!WRVX_ITcLvN%go51vt zfC@7%{e#8IycIGXIp?h(CIR@L|54@K6w+9USsl$fOT1=@1wv0RHoNTT2 z3?KFIjl>Yc5Lx{{7#E+islZ7MhIb0rgY0~cS+K+UH%C3im!$(m#6y?2BQsGMR7Wf| z!}#9Bxt_~#NuP*7pz`_jvfme4W;`!>RP&+eG2DsY`Y^L2NdN=WbjA_e>Kb3X&Q!}) z;)TZLtG{E!LQ{RAv<#qlnwKa-!a9;5Ff<@cjGg=CGHU7~8XI#if#cYCO zrjMWmE?iPxS*Y^@a&p#UFUJH5Ad~HlsD=7xVJH`XA{@XJ5{TKT(f;>LfPpNpx=~E> zpSWijmFu6#Yf;aDu8TlDlp7K#U3Y+WU0%Ibr0>+2Ynf03Q=@s>kN z!is`7N+G*bOJZBCeiMtv#JwRcaBY1p#y)A$8ze6H;X9U;O-nJ*=0{z}GC|`P>DrNn zV~pX~EJ9JPET8AcSK*d(p5%xh-hAE+P3&@RwaEG={g}e!&7Mv^R*hNH159j95%$qs zO+{uoNd_extnjs7yV*{`Dwj>cYHbCh(z6z7Ev{+-b89Gfz#X(rx5}{IT~A5X5I4ju z!aw*;2Mw@D^J&u-P=E~GTnBRiU6<;42b zrQ-QnRAlGM`-#%CfU|=Gi_}+*tHJBgMFa4Ivg-&k6G4JW<~c36S{3d)zX*c9IC3n1 z8L<$F5HU~nmyjE!&~<>}guRh~XZEbCNS!2ih=-OQd|>;GvOMfPo@{*I)5X24 z)&qp&x#Etp-G3WC4sT)b0=Fn#4zs^m+xf%`meLZE6#cu=upW<|@5K5zMFIvd>Y1b^ zyhNqsQfM}{W{%xW3UbU4uFI6e5h@_6D#1ac3fH7|AX|qDJ@S+b+D+(o+EDeq)%=sMCbRc76sH%Z)1rbpxxF3meRaY$X9`0 zPkC((lJdopdZXfc%Z#mSFp|G9L_+_$e>vCCd(DpWQ1);{qWL@`!y|%tt+H8K)ek3Q znjp}7Xo+Wz8e^!^@Ai*cYLs+QITy&Qb^s-alTQh(x|&ylYnE4_6pt@4`{%4^T3YP|Ze3Pgr2@tAcDU{aUKsG>^CON)dYDUD@S)9kRPSNpBIAX`nI4#M4ilx>~p2S z&f&duQ!R2U48e(5G*sEHh~hV(c(t+z4FSCTHG$NWWLRu{{bt`*pbS3W<$Cl_3wybo(*5LPeu)%juE8wE&UK^=yAh3oTL0r75$o-UYc@HAz^q%KN6j=N)OZz zF5DI~6F1a(F#Tb#E|pS5CFQM<;VMq*|^mDDLo(FxOqR-PfN0=PJ)<{lEoH{2}* z9oX;dljxbBF9qNb;!Yg}r#JkGXJ&GpkfUUlQe^_ESY$O*aD>=x7sH<%SdqSX{WuuL~A6Xt;{b;55vmiEbvVz?q^Rd5>5GB zS*zXK*!~qZvIEVrxJ>@qP&r-`?7la@@nw7Y)RZ)glGeDCO1u`K`{Q6tk(E@cD+Q~P z%ax4D-roLQBAcX(RK|B}a+peKY;cj*=*K~H!o!DXL?!n)g$5s#w*&Tgs~`@o;N95c zJi3_p`m}`7K;!loj4w#Bh02&$7C#ux$qaf#eFQ1tSX zJS2TEmG6YhJE4wjD71ysM9Cat5z&cc6ZgS_X&zl#n0f{&$=1K=u@;s~@LHvY339*0 zuL>UWSHS1WyiuYLS#I`l8HJnY4vOD2_^W;1VQsR~B1|c$E9^j4_)=g~xm=7dtd#|= zdog4%gzrj8t7Rx|0YMcAPo%dxc-o72wVZNl_KEC*5dL1vTR?fXUjoa1yOQqoy~(16 zH<&iouTBK((?EHp{%OV+&72Z*WsH4*3Dk_96kMwEQQmvOoT$JH(4QN1Q7rF~MlkZx zQrv_7nRjb(*0VyhHc%3uHT^iVsVFlRMKD;J59cWVvQ)FLt{sFbi_o8-1L&`Qp{yaU zvnPH2gge#`jkg*|wb7=&RizzSfKfm3GvB-gLj*K=1NDePfJT6?9nE_TlEC1B1OOTv z|9Z;fVsrC^E$M;T=fB|jei6^I{WIRpl(7wG{yaPYAny5QU$8Hd#1jWm>mfnhX-3J1)INBy4kl&S=CV==dzmp)3;cKssygo#3P%w#eAST2;!Q+&CDk#rffdf zb$`-Gg%5}b8SNAa{oZM=!Wq-9B40K((F^g_>CFk4kcqdlrtIt6FcpRN7clG;d+DSS z6z`_4h*44sZQZ-`nZbYyHM!&!zC2SBGWq`_|cesMde9KT{0q+x@Thx73FE zy>KMrK@WJk=7G3jai(S!#=fejcpqUS6d8YV>~o7-cH!FZN?4Ml6wAyahA)N!v2*3m za%8$Sm@qJ%L^S*TDU47H;k#T-qP6J=nwHYgqbpGak`ZY-@g$86YH~Y7l4FT35CvDHm~7|7a@g+2eUdrqZ&8@iz*2C>!HnH@c;*@_HXYVSAIJKQ2yXzc7R zX;SvWLtrZw5Ce!lglm^@5ai(BIem`@5xXuL$@YiU&$k?|EeYLltK68liY0}{K&@$R za3o(qinL}@cme0x!gDDv8sv!i{Vncg&7gP7MAt8_dABJrEWADxXNKr)n zhh5fxYjRfo>j5u2q~3cGGTt~2q=fHN?h1WxGGt+@I#1=yMDtZN5R7==`d+SL@`WL_ z>7^c5Nu-${WL0BFzZ6Jz*F2YHpnj)?!>_+0Y6dAkizj{N%Ix-CY#j^?#A<=euS3CU zcwYXpqkRyGwe!T=*!f`Zo>LlaPTDjs{n8XZh7wHy_<>iLjUqbF2R~s#Q4PGtFY^uM z0#%UO|gkQn!RmaOd!9mrXZHIVF0J3G1*~!*rE@Dys$(+l1N1@<>ao4IIgpyd^FnWm8pqCF=G4 z?HYKv`5l*#WY7osR=kaFBSVfuxeaCej-P`ejtAnCNacl%-hki)3jNu(A8_^ zQRnNZeOGgp54f?m@o4Jw_sH!kn&b9i39w-*Up8(3MXpkFE(2P?7#Wcz4Y~@CARz>qk ziB4aiU!g^e7_|&fzp>wNee{1!#2Ru3RcauV<6;uNtRzTTr0Fi+bj(wR2`}$}NMw-i zPa1)4?LCpennZ1ANMGKE2|{P-_SHj53AaN@%?v9h1#ShJGj18^%L8i1IJIxZaVH$El+j|QkTXc|MfR$^+T_w$oKcw| z9N8iRRe(@ZjoL6UklmCI%NTY@g3zsHDLcLURA40$EMqNOY_>wfGKX>y=y+Mf*?Z}HZc+PCWh$RU^y^x%LYE3%l&i=dhxue>SthZV*WS_Izi~o=_ z6y}jYe`(|{l8Y$u-w%0OveA@0Z4o!CrsV#WjVMEN)*Z;n_spH zV~xYXzWMoM|C}yVT5%g?{z%2V=lfTk_@h@bPw-@^pPH2vA4tz;+Alz3UnWgZ3LNZo zP$TMV5-a+#ec({qouF|aBl|V5384%pWC7#Zo=@kCTC#N^Qt$~=CE?wizn`w4neyCbqm%C0<-)-7b=zR&U>Eu$>~zZhEjT| zHjObYSOdwisO~ z7KIH(zAMR5m-=C=da%T8kjlp2*A8;^498(jl*ok4GCzCXt(z{;#6-}eh!a)mlUWvh z)O(L7nBsH%$;$426-Cixj!TY$5fI7+8Tzhp3L)C(rV?aB6wJ7?vC@a_!mB@wr%YM8 z)f|(zFhF|(~;1`nn`E4Ft?_R2dFm*Wx}I$Yg+uaao9EcTUhd6DiOS0u{w5 zfDn$nJTzkZ1WM#8`wr$R5MU1_83LDFDEp)|EuNHV9l%?yH>L8z(e3*&HSgL0O60kJ zk=Kw8;U_1ZOYkA^$I6K`r~T=+%{Ow_CR_HLK3=ob`hv>-x(P!`OZb1|;i|$+jG#@}K|A%On zQwWrOt=#1BBmn9X+yk39N|b>^}^yJm~|5sTO2D&7O^9E zfiuGV$Gu0qzW3njB4F}^r5&Z{!r4$%!(yUnT0fm93q#GLpnvhFTyYuZIVkOA<*mi` zwAUQOJsWU>p5sW1=;T960HuX*q~e-0YYhDB8~TX$Y^396;g1g0n#^jUNpY`AFZGTu zmY`;!{$mv@kUU}8QhH$)jHTfCgot=3=oc!I(*qI8%VklaW2TCS^OE$1s8&-=s3W#_ z!U>!I1%PQeZ04cQwcrhf{iIsqo${;0i&_hEpB4^3+V`qKDh>)hkxo?NrT-ydt5u@h8wu zAv8~4nR!006${5r?8D!#gmlf@xoNjUV`tiN5@%DIY<2pOPxG zJ)4WQ%Fbiy1t|!lPlp zz`MG=8E)Yko=g2~JqMtThdGsLAZ}jU0p1#nYw?rlQ`IJcMA_gEW+L#sY7giDnKdrX z_*M2iLa{4Df{6^G=7g2we)FPj6z^QR+B%fdOGq)jmBEEIjWPQ^o$hp!)~8JLg6z!` zGU4qnEi?lyDFA(Rf3!T!yA1L4LA3rC7Gj49;ign9lYG@)B7g1&O1g(k`e|4S$c3IR zoaizZkM{BB9M_G6F3V};AQNeEg-jmb#f!W+zA;hEHFNDFv)d~_ErRv=US+S7p?osJe2AW#LWmYEj zd;Z$m`G_N71@Bd+O~}_N;8n<`+}-c31FbMdVP+s%3}oB&zSqSspJLNM>@r5U#}l%x zTY{J8P`CM9%_cpW0t(rl)f_GfLh1a3ej=tOjqY`XOnN`hT2F7}f>IUy`8nXPX6JcSvIW576v(p%V=GKriyUm@oy!s%nfiYLYQysh(KQw@Fo@*yN!t30zpYqXN|B(8Lzju8ZU=S z8;Nq6S9ONcD_bD-6+5>YNM4(DvU?59`;cWU$%>@+J+OLg&HQJ3Jv@*fvVY8Wv_E-? zv;GG&`9M#2V!B+zXI;AWd)zB-Mhm7EoPBY4u0C<8_Unhwl_S-;Iq#A|gZ7uc$IF#N zJ{+|zz#61{XkkXQ@0`qN#|zb#lU1M78j!d>`^{v@z&P@tUmgQ=iPm`*DOKA-(~b}V z=LnMgdvne?;l^fiIVhmgB~iL|a+hdE9@*a_s`$|R`f6{UY2YXcFd;kd&1$Xn;rN>roYPaBCkDwYu7|4&*IC@T3ert z;^{{@z~~onb^@7M>_MxPdgBx?N~UNknfcEI=-+^b0Q@*uFFjjM!OBS`B)SQtAgww8 zoBfF8L|somwtbPDUH#H*ip6~rwGc+Qf@@rBEw0mGV`(=ln<_pr+=am=Pj{)S-p!uc2v-mRdgsE#h(a&dmb$Zt?b^6K2%_MXR0dUSnS$Fm zSv8Z`#xR!x{2AVk1?P4l&Eew}+`ED{J;L$L%(4@vLEA~{XZd}M(1OHEWP8u00>-&) ztGx!ucm7Ye?oCMv6+2|r)K}yxmSour<)riTT`D;EydalZlp|o3Gz2m=ugEOt%VV8) zL%oWi$4c&=EhDK%PMasmi=A-klFtaVUZu3N%n}b}Q?Dp`q91U&Ub1&X*5Xmop5T$S zvF=TNm3TXQRFXGpo3?HTU{v=^-DH>B`MUZ$_)*gi7E8BL(k=OQp6a}*T?^=)-br8q zFIfrat*^QBAX~px+4+C(y0WC&Lt4kw(gH+Bd4d5VFJ9a>`6fk2k^ld=pF05R{n{(x zh{M+ZKL_b|y7bEZud1;B|6=pb&wpuYscq@04}Cumu|`(Xo%bR9w;*@_VMDPG6kEvp zh4r3&-pX)|?BkJ&hv=U3t_FZNzl+WEiUNjihSaaMNMGm0RZrt(GbU|^{rM2LPC&#n zdy?0)3)t^)VZ-N)mLZd~<(C{b{}eX#x65z5^BR0I4BWy)xF~FKd@YhVh(>be+s&k+ z*~I`IY|Rw0ZNW}l7(85sbo9Gj41})w27ghQ$KS27Wp33skB|z62)9K$2LQ|YJrBHN zq(tk##->ih{Vr|L9P3vv_dO#LMVW>t9zd7f@UYIAJIT|>C!I1epllA(jkaMY8Ln4E zjVq%@Af~&q4g-QW(rwwUC5dTzKshbC+auabYryuN#;HR%52Y3$Tny?KyBNV-z7})I z&_uy>CREiJ<0Jg-a{j1;)6aq8Fr$Lt3Fqq%JMk{1hnO}9EAVWa%;eC3EbDJhMD&8b zmfX%q>Q(NjuS`?eT63C&N$gCJeb14TdhtQxMm)}o=+g7&B*H_!YjZFsga)%9V~J$@ z#ttuY^Es|2Hx+^6R_nsmV*|6Fy*k**Lefj)Tu3Gw=fNd!bgtLMeYQw=2$G->^s|$j zyu$Cp+v1eVFc~YhqB$E6Z?Vp-+?9|od?*=%BLUn)9rL%*1OPV5a%Nm(No?y4{4PS_ zl@HXl5If`rtOw5i7Cns#U>K$D(AgY$#Z+B9vYCEi7ImZ|xC(y*IEPjKA~FTjsq4rN zeJ8e;a=8z(rL@m)s2o`p`T`_w)vr)UcW*s(Mj_Z6);sl7W(j0(aa#+yMyZj7Ot1QA zQLhf64X^JdCDPomiIRMiPjl*7FElvHHw;6e)U7-k)k$h$WufOAoxs=hrR;iBk{rVv zpda$L&NuQqg$(OX0E8|4@5lc|H+*Vb$W-0mbl=RH6h zHkf@E5;r|H-z0@M@=dZe&AHvJhc6>GbYQOCUMSa<4c{3ZIXMpo54Md_iNRYtSyM>5 zIpq2#7rP@Gx;wZ!!cNq6I4JGfa-(bcjmu62p=~_4p(|9j!Y`-_?~Kryjhl49T-^uB z0}f9!=tEGv{oLhfOO`tv(`2u%r64&Ro@;XEs<4v9UQ+UCG7Iu# z3)jLv&|UrvPn2ndMnXn6V!QfHT};B!!e!PFruV6%Fp-hCCJjVI)ZA>uV6+YUvB9Vr zPYaRa!cR$sk$8o!#qcPN;qou zd%45AKHhPeQRVcR6^#;~CWF@XKRp7q2Q?DUSvFjknN_*yf3fULX{aaVVKQRyu4B~jL`W3s?UIWhJb6rinVa(#w!Dvx+=#+#ykc+h_zcBad+HA zO&#(}M=ZXXFO6N>2JcI1EMT~Gpbv=?@-!wGgtN?1RWZVyI zzJ#1}yWJf%c~wgT>=&fkxv5gL%7fQwU$6ym&_Hu z<;K^hY6+nl;1KPJ0Yb9E%H{Io*x2a;zHwNWmL+wTYgfjEE7 z@AFGD6g?2?OTs2D#7w=z(UB0V1Jpw8^JTNxO`UE$s+ybnF`Gu(dj0mq3{&t=`*gVQC$oh4R-T-T_5xAC z=OZyVzyH#G#H08v2fUsgP8D)kde5r~%DWu;;Sw>zLXy1tv+k595#x#kdC1|S5Y)I z@h8`71eDI_xMZXeBzqOr_9+b>;82g?ue51U%)3T1j`N@Kvy5`^4=8O@dbvX3uj5lr3$tD`$nf?^bD&75NI1GGp8-8YTXuJ$8UuVW1IE zrBwRvJW*Hw1-~%=S0Tw?c?VJf8#z4`!G_o+az-t$|DbM7-ozi`m=`UKyRW3;O_%*c z)Gz>USKP_STt{3nERl+cG(i{?^vIcdG(9h*8Xrj?cgU^Xga99jO7ZZJ_4(3=XDJv0 zew|Y~skZ3}5N~dY?wpwGKnlf@<$UG7C;QqjmO4(VRUKf^$Z^(rBz9H>iCuKQ?>;oa zjjVBJ^8{Jn3boT4KfJtf8hslYx5>%?D7n)4U>70`BiaLl6fzl6ph_Kxb$hmR=yQU_ zCOeq#sJNf$-UJ^)gmfI-__Z2;xwy@O7UG3PGglbrbaN+R=Mlzlfl(ZK(j1qH*;jKs zViy)Cj>-rSw%#yy^b))y439)AVEnO((z78~pQ#SW4%)n6?~)W_3DFyda`THxC_pr$ zK`^mgdjQ~GhF`Rf7gJF&cz5Y%d8-5Xak;T=@dQ7!IKI8RKPpGZUv9z}e;A&r(?Q%C z*FL$(V%X$2j;PDUeAdek_2TfeGnKx>gWyoHGc8@y#5JdZJU#GTIVDt)gX~(Txs>wX zx~OipeXD3y?tVQ)Wo10~57LNX7HV7X0UqXa1K<30l{aBCMc6ywe+R8Gy)nyZxR(|4JwppPNQ!4%OHfYUr_mku8^?S7;9rl3vw5e3>F#XTdDPnYisWm;z$18v?F}ADPmPCYKwlo$Ei&CRach;#G4!)QjZZ(*#Xr@D7nymTvivMgTmA9K>M+aJ$mPvatH)AN7W5Wh?cua4c1b%?Gu0l1NQoFwPi zcK4OA^lsx#JsjEHs^b;;D|oD@{4DQyJR}6oLlP&w!}UOAIBAn)h&6Lxmq1Y9 zLUS`JCLNyTAZ~T+d^IHTJYptIiWu=e|DoYWc# zv}xPl_j_dW#i3Z7KNLt#MX;URm=~HlcXOgv5RGX%l0qAq1#`|j({q#U?DT~Mk2@a+ ze_7}wQG-O6g^tQ|HAPL%G|)NUNLN(D;?qaC6W6W)4AvRE@~}A*OJ`J#oUhi^(pTy9W9c#)f&Ih?Y3a|T4;Nqt%S=XL4n z&-{VB7J_bID+7F%O}Pc}$uZz(7VMmWKLZ=tsqpfK)_=i#kkte+k$#6FYz4Pj^I$~z z{Uv>0AIj7Rc1t*%0D+C-1oo0Yg-yQ03s9)y#v>Fk$ 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≠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 zh5pth|4nv>@>G_|D0MY;e0000000000000000000000000 Z00000000000000000000002J#0MwAQ>)-$Y literal 0 HcmV?d00001 diff --git a/FFFTP.exe b/FFFTP.exe new file mode 100644 index 0000000000000000000000000000000000000000..65ca7100ffec260531663691963401c8a85985cb GIT binary patch literal 425984 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 +$twN*{?{#Jti=cXDW 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FFFTP_English.vcproj b/FFFTP_English.vcproj new file mode 100644 index 0000000..484fe3e --- /dev/null +++ b/FFFTP_English.vcproj @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JRE32.DLL b/JRE32.DLL new file mode 100644 index 0000000000000000000000000000000000000000..02f65644a940c743cec2c42525f253f3302225e8 GIT binary patch literal 27648 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 literal 0 HcmV?d00001 diff --git a/OLDregistory.c b/OLDregistory.c new file mode 100644 index 0000000..888ea1d --- /dev/null +++ b/OLDregistory.c @@ -0,0 +1,2364 @@ +/*============================================================================= +* ƒŒƒWƒXƒgƒŠŠÖŒW +* +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" +#include "sample.h" +#include "sha.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr); +static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum); +static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf); +static int RestoreFontData(char *Str, LOGFONT *Font); + +static void EncodePassword(char *Str, char *Buf); +static void EncodePasswordOriginal(char *Str, char *Buf); +static void EncodePassword2(char *Str, char *Buf, const char* Key); + +static void DecodePassword(char *Str, char *Buf); +static void DecodePasswordOriginal(char *Str, char *Buf); +static void DecodePassword2(char *Str, char *Buf, const char* Key); + +static void SetRegType(int Type); +static int OpenReg(char *Name, void **Handle); +static int CreateReg(char *Name, void **Handle); +static int CloseReg(void *Handle); +static int OpenSubKey(void *Parent, char *Name, void **Handle); +static int CreateSubKey(void *Parent, char *Name, void **Handle); +static int CloseSubKey(void *Handle); +static int DeleteSubKey(void *Handle, char *Name); +static int DeleteValue(void *Handle, char *Name); +static int ReadIntValueFromReg(void *Handle, char *Name, int *Value); +static int WriteIntValueToReg(void *Handle, char *Name, int Value); +static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size); +static int WriteStringToReg(void *Handle, char *Name, char *Str); +static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Size); +static int WriteMultiStringToReg(void *Handle, char *Name, char *Str); +static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size); +static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len); + +int CheckPasswordValidity( char* Password, int length, const char* HashStr ); +void CreatePasswordHash( char* Password, int length, char* HashStr ); +void SetHashSalt( DWORD salt ); + + +/* 2010.01.30 genta ’ljÁ */ +static char SecretKey[FMAX_PATH+1]; +static int SecretKeyLength; +static int IsMasterPasswordError = PASSWORD_OK; +/*===== ŠO•”ŽQÆ =====*/ + +/* Ý’è’l */ +extern int WinPosX; +extern int WinPosY; +extern int WinWidth; +extern int WinHeight; +extern int LocalWidth; +extern int TaskHeight; +extern int LocalTabWidth[4]; +extern int RemoteTabWidth[6]; +extern char UserMailAdrs[USER_MAIL_LEN+1]; +extern char ViewerName[VIEWERS][FMAX_PATH+1]; +extern HFONT ListFont; +extern LOGFONT ListLogFont; +extern int LocalFileSort; +extern int LocalDirSort; +extern int RemoteFileSort; +extern int RemoteDirSort; +extern int TransMode; +extern int ConnectOnStart; +extern int DebugConsole; +extern int SaveWinPos; +extern char AsciiExt[ASCII_EXT_LEN+1]; +extern int RecvMode; +extern int SendMode; +extern int MoveMode; +extern int ListType; +extern int CacheEntry; +extern int CacheSave; +extern char DefaultLocalPath[FMAX_PATH+1]; +extern int SaveTimeStamp; +extern int FindMode; +extern int DotFile; +extern int DclickOpen; +extern SOUNDFILE Sound[SOUND_TYPES]; +extern int FnameCnv; +extern int ConnectAndSet; +extern int TimeOut; +extern int RmEOF; +extern int RegType; +extern char FwallHost[HOST_ADRS_LEN+1]; +extern char FwallUser[USER_NAME_LEN+1]; +extern char FwallPass[PASSWORD_LEN+1]; +extern int FwallPort; +extern int FwallType; +extern int FwallDefault; +extern int FwallSecurity; +extern int FwallResolv; +extern int FwallLower; +extern int FwallDelimiter; +extern int PasvDefault; +extern char MirrorNoTrn[MIRROR_LEN+1]; +extern char MirrorNoDel[MIRROR_LEN+1]; +extern int MirrorFnameCnv; +//extern int MirrorFolderCnv; +extern int RasClose; +extern int RasCloseNotify; +extern int FileHist; +extern char DefAttrList[DEFATTRLIST_LEN+1]; +extern SIZE HostDlgSize; +extern SIZE BmarkDlgSize; +extern SIZE MirrorDlgSize; +extern int Sizing; +extern int SortSave; +extern char TmpPath[FMAX_PATH+1]; +extern int QuickAnonymous; +extern int PassToHist; +extern int VaxSemicolon; +extern int SendQuit; +extern int NoRasControl; +extern int SuppressSave; + +extern int UpExistMode; +extern int ExistMode; +extern int DispIgnoreHide; +extern int DispDrives; +extern int MirUpDelNotify; +extern int MirDownDelNotify; + +extern int FolderAttr; +extern int FolderAttrNum; + +/*----- ƒ}ƒXƒ^ƒpƒXƒ[ƒh‚̐ݒè ---------------------------------------------- +* +* Parameter +* const char* Password : ƒ}ƒXƒ^[ƒpƒXƒ[ƒh +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +void SetMasterPassword( const char* Password ) +{ + ZeroMemory( SecretKey, MAX_PASSWORD_LEN + 12 ); + if( Password != NULL ){ + strncpy( SecretKey, Password, MAX_PASSWORD_LEN ); + } + else { + strcpy( SecretKey, DEFAULT_PASSWORD ); + } + SecretKeyLength = strlen( SecretKey ); + + /* –¢ŒŸØ‚Ȃ̂ŁC‰Šúó‘Ô‚ÍOK‚É‚·‚é (‹­§ÄÝ’聨•Û‘¶‚É‚ð‰Â”\‚É‚·‚é)*/ + IsMasterPasswordError = PASSWORD_OK; +} + +/*----- ƒ}ƒXƒ^ƒpƒXƒ[ƒh‚̏ó‘Ԏ擾 ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* PASSWORD_OK : OK +* PASSWORD_UNMATCH : ƒpƒXƒ[ƒh•sˆê’v +* BAD_PASSWORD_HASH : ƒpƒXƒ[ƒhŠm”FŽ¸”s +*----------------------------------------------------------------------------*/ +int GetMasterPasswordStatus(void) +{ + return IsMasterPasswordError; +} + +/*----- ƒŒƒWƒXƒgƒŠ^INIƒtƒ@ƒCƒ‹‚̃}ƒXƒ^[ƒpƒXƒ[ƒh‚ÌŒŸØ‚ðs‚¤ ------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +int ValidateMasterPassword(void) +{ + void *hKey3; + int i; + + SetRegType(REGTYPE_INI); + if((i = OpenReg("FFFTP", &hKey3)) != SUCCESS) + { + if(AskForceIni() == NO) + { + SetRegType(REGTYPE_REG); + i = OpenReg("FFFTP", &hKey3); + } + } + if(i == SUCCESS){ + char checkbuf[48]; + int salt = 0; + + if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){ + SetHashSalt( salt ); + } + if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == SUCCESS ){ + switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){ + case 0: /* not match */ + IsMasterPasswordError = PASSWORD_UNMATCH; + break; + case 1: /* match */ + IsMasterPasswordError = PASSWORD_OK; + break; + case 2: /* invalid hash */ + default: + IsMasterPasswordError = BAD_PASSWORD_HASH; + break; + } + } + CloseReg(hKey3); + return YES; + } + return NO; +} + +/*----- ƒŒƒWƒXƒgƒŠ^INIƒtƒ@ƒCƒ‹‚ɐݒè’l‚ð•Û‘¶ --------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SaveRegistory(void) +{ + void *hKey3; + void *hKey4; + void *hKey5; + char Str[FMAX_PATH+1]; + int i; + int n; + HOSTDATA DefaultHost; + HOSTDATA Host; + HISTORYDATA Hist; + HISTORYDATA DefaultHist; + + if( GetMasterPasswordStatus() == PASSWORD_UNMATCH ){ + /* 2010.01.30 genta: ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ª•sˆê’v‚̏ꍇ‚Í•s—pˆÓ‚ɏ㏑‚«‚µ‚È‚¢ */ + return; + } + + SetRegType(RegType); + if(CreateReg("FFFTP", &hKey3) == SUCCESS) + { + char buf[48]; + int salt = GetTickCount(); + + WriteIntValueToReg(hKey3, "Version", VER_NUM); + WriteIntValueToReg(hKey3, "CredentialSalt", salt); + + SetHashSalt( salt ); + /* save password hash */ + CreatePasswordHash( SecretKey, SecretKeyLength, buf ); + WriteStringToReg(hKey3, "CredentialCheck", buf); + + if(CreateSubKey(hKey3, "Options", &hKey4) == SUCCESS) + { + WriteIntValueToReg(hKey4, "NoSave", SuppressSave); + + if(SuppressSave != YES) + { + WriteIntValueToReg(hKey4, "WinPosX", WinPosX); + WriteIntValueToReg(hKey4, "WinPosY", WinPosY); + WriteIntValueToReg(hKey4, "WinWidth", WinWidth); + WriteIntValueToReg(hKey4, "WinHeight", WinHeight); + WriteIntValueToReg(hKey4, "LocalWidth", LocalWidth); + WriteIntValueToReg(hKey4, "TaskHeight", TaskHeight); + WriteBinaryToReg(hKey4, "LocalColm", LocalTabWidth, sizeof(LocalTabWidth)); + WriteBinaryToReg(hKey4, "RemoteColm", RemoteTabWidth, sizeof(RemoteTabWidth)); + WriteIntValueToReg(hKey4, "SwCmd", Sizing); + + WriteStringToReg(hKey4, "UserMail", UserMailAdrs); + WriteStringToReg(hKey4, "Viewer", ViewerName[0]); + WriteStringToReg(hKey4, "Viewer2", ViewerName[1]); + WriteStringToReg(hKey4, "Viewer3", ViewerName[2]); + + WriteIntValueToReg(hKey4, "TrType", TransMode); + WriteIntValueToReg(hKey4, "Recv", RecvMode); + WriteIntValueToReg(hKey4, "Send", SendMode); + WriteIntValueToReg(hKey4, "Move", MoveMode); + WriteStringToReg(hKey4, "Path", DefaultLocalPath); + WriteIntValueToReg(hKey4, "Time", SaveTimeStamp); + WriteIntValueToReg(hKey4, "EOF", RmEOF); + WriteIntValueToReg(hKey4, "Scolon", VaxSemicolon); + + WriteIntValueToReg(hKey4, "RecvEx", ExistMode); + WriteIntValueToReg(hKey4, "SendEx", UpExistMode); + + WriteIntValueToReg(hKey4, "LFsort", LocalFileSort); + WriteIntValueToReg(hKey4, "LDsort", LocalDirSort); + WriteIntValueToReg(hKey4, "RFsort", RemoteFileSort); + WriteIntValueToReg(hKey4, "RDsort", RemoteDirSort); + WriteIntValueToReg(hKey4, "SortSave", SortSave); + + WriteIntValueToReg(hKey4, "ListType", ListType); + WriteIntValueToReg(hKey4, "Cache", CacheEntry); + WriteIntValueToReg(hKey4, "CacheSave", CacheSave); + WriteIntValueToReg(hKey4, "DotFile", DotFile); + WriteIntValueToReg(hKey4, "Dclick", DclickOpen); + + WriteIntValueToReg(hKey4, "ConS", ConnectOnStart); + WriteIntValueToReg(hKey4, "OldDlg", ConnectAndSet); + WriteIntValueToReg(hKey4, "RasClose", RasClose); + WriteIntValueToReg(hKey4, "RasNotify", RasCloseNotify); + WriteIntValueToReg(hKey4, "Qanony", QuickAnonymous); + WriteIntValueToReg(hKey4, "PassHist", PassToHist); + WriteIntValueToReg(hKey4, "SendQuit", SendQuit); + WriteIntValueToReg(hKey4, "NoRas", NoRasControl); + + WriteIntValueToReg(hKey4, "Debug", DebugConsole); + WriteIntValueToReg(hKey4, "WinPos", SaveWinPos); + WriteIntValueToReg(hKey4, "RegExp", FindMode); + WriteIntValueToReg(hKey4, "Reg", RegType); + + WriteMultiStringToReg(hKey4, "AsciiFile", AsciiExt); + WriteIntValueToReg(hKey4, "LowUp", FnameCnv); + WriteIntValueToReg(hKey4, "Tout", TimeOut); + + WriteMultiStringToReg(hKey4, "NoTrn", MirrorNoTrn); + WriteMultiStringToReg(hKey4, "NoDel", MirrorNoDel); + WriteIntValueToReg(hKey4, "MirFile", MirrorFnameCnv); + WriteIntValueToReg(hKey4, "MirUNot", MirUpDelNotify); + WriteIntValueToReg(hKey4, "MirDNot", MirDownDelNotify); + + MakeFontData(ListLogFont, ListFont, Str); + WriteStringToReg(hKey4, "ListFont", Str); + WriteIntValueToReg(hKey4, "ListHide", DispIgnoreHide); + WriteIntValueToReg(hKey4, "ListDrv", DispDrives); + + WriteStringToReg(hKey4, "FwallHost", FwallHost); + WriteStringToReg(hKey4, "FwallUser", FwallUser); + EncodePassword(FwallPass, Str); + WriteStringToReg(hKey4, "FwallPass", Str); + WriteIntValueToReg(hKey4, "FwallPort", FwallPort); + WriteIntValueToReg(hKey4, "FwallType", FwallType); + WriteIntValueToReg(hKey4, "FwallDef", FwallDefault); + WriteIntValueToReg(hKey4, "FwallSec", FwallSecurity); + WriteIntValueToReg(hKey4, "PasvDef", PasvDefault); + WriteIntValueToReg(hKey4, "FwallRes", FwallResolv); + WriteIntValueToReg(hKey4, "FwallLow", FwallLower); + WriteIntValueToReg(hKey4, "FwallDel", FwallDelimiter); + + WriteIntValueToReg(hKey4, "SndConSw", Sound[SND_CONNECT].On); + WriteIntValueToReg(hKey4, "SndTrnSw", Sound[SND_TRANS].On); + WriteIntValueToReg(hKey4, "SndErrSw", Sound[SND_ERROR].On); + WriteStringToReg(hKey4, "SndCon", Sound[SND_CONNECT].Fname); + WriteStringToReg(hKey4, "SndTrn", Sound[SND_TRANS].Fname); + WriteStringToReg(hKey4, "SndErr", Sound[SND_ERROR].Fname); + + WriteMultiStringToReg(hKey4, "DefAttr", DefAttrList); + + GetTempPath(FMAX_PATH, Str); + SaveStr(hKey4, "Tmp", TmpPath, Str); + + WriteBinaryToReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE)); + WriteBinaryToReg(hKey4, "Bdlg", &BmarkDlgSize, sizeof(SIZE)); + WriteBinaryToReg(hKey4, "Mdlg", &MirrorDlgSize, sizeof(SIZE)); + + WriteIntValueToReg(hKey4, "FAttrSw", FolderAttr); + WriteIntValueToReg(hKey4, "FAttr", FolderAttrNum); + + WriteIntValueToReg(hKey4, "HistNum", FileHist); + + /* Ver1.54aˆÈ‘O‚ÌŒ`Ž®‚̃qƒXƒgƒŠƒf[ƒ^‚͍폜 */ + DeleteValue(hKey4, "Hist"); + + /* ƒqƒXƒgƒŠ‚̐ݒè‚ð•Û‘¶ */ + CopyDefaultHistory(&DefaultHist); + n = 0; + for(i = AskHistoryNum(); i > 0; i--) + { + if(GetHistoryByNum(i-1, &Hist) == SUCCESS) + { + sprintf(Str, "History%d", n); + if(CreateSubKey(hKey4, Str, &hKey5) == SUCCESS) + { + SaveStr(hKey5, "HostAdrs", Hist.HostAdrs, DefaultHist.HostAdrs); + SaveStr(hKey5, "UserName", Hist.UserName, DefaultHist.UserName); + SaveStr(hKey5, "Account", Hist.Account, DefaultHist.Account); + SaveStr(hKey5, "LocalDir", Hist.LocalInitDir, NULL); + SaveStr(hKey5, "RemoteDir", Hist.RemoteInitDir, DefaultHist.RemoteInitDir); + SaveStr(hKey5, "Chmod", Hist.ChmodCmd, DefaultHist.ChmodCmd); + SaveStr(hKey5, "Nlst", Hist.LsName, DefaultHist.LsName); + SaveStr(hKey5, "Init", Hist.InitCmd, DefaultHist.InitCmd); + EncodePassword(Hist.PassWord, Str); + SaveStr(hKey5, "Password", Str, DefaultHist.PassWord); + SaveIntNum(hKey5, "Port", Hist.Port, DefaultHist.Port); + SaveIntNum(hKey5, "Kanji", Hist.KanjiCode, DefaultHist.KanjiCode); + SaveIntNum(hKey5, "KanaCnv", Hist.KanaCnv, DefaultHist.KanaCnv); + SaveIntNum(hKey5, "NameKanji", Hist.NameKanjiCode, DefaultHist.NameKanjiCode); + SaveIntNum(hKey5, "NameKana", Hist.NameKanaCnv, DefaultHist.NameKanaCnv); + SaveIntNum(hKey5, "Pasv", Hist.Pasv, DefaultHist.Pasv); + SaveIntNum(hKey5, "Fwall", Hist.FireWall, DefaultHist.FireWall); + SaveIntNum(hKey5, "List", Hist.ListCmdOnly, DefaultHist.ListCmdOnly); + SaveIntNum(hKey5, "NLST-R", Hist.UseNLST_R, DefaultHist.UseNLST_R); + SaveIntNum(hKey5, "Tzone", Hist.TimeZone, DefaultHist.TimeZone); + SaveIntNum(hKey5, "Type", Hist.HostType, DefaultHist.HostType); + SaveIntNum(hKey5, "Sync", Hist.SyncMove, DefaultHist.SyncMove); + SaveIntNum(hKey5, "Fpath", Hist.NoFullPath, DefaultHist.NoFullPath); + WriteBinaryToReg(hKey5, "Sort", &Hist.Sort, sizeof(Hist.Sort)); + SaveIntNum(hKey5, "Secu", Hist.Security, DefaultHist.Security); + WriteIntValueToReg(hKey5, "TrType", Hist.Type); + SaveIntNum(hKey5, "Dial", Hist.Dialup, DefaultHist.Dialup); + SaveIntNum(hKey5, "UseIt", Hist.DialupAlways, DefaultHist.DialupAlways); + SaveIntNum(hKey5, "Notify", Hist.DialupNotify, DefaultHist.DialupNotify); + SaveStr(hKey5, "DialTo", Hist.DialEntry, DefaultHist.DialEntry); + + CloseSubKey(hKey5); + n++; + } + } + } + WriteIntValueToReg(hKey4, "SavedHist", n); + + /* —]•ª‚ȃqƒXƒgƒŠ‚ª‚ ‚Á‚½‚çíœ */ + for(; n < 999; n++) + { + sprintf(Str, "History%d", n); + if(DeleteSubKey(hKey4, Str) != SUCCESS) + break; + } + + /* ƒzƒXƒg‚̐ݒè‚ð•Û‘¶ */ + CopyDefaultHost(&DefaultHost); + i = 0; + while(CopyHostFromList(i, &Host) == SUCCESS) + { + sprintf(Str, "Host%d", i); + if(CreateSubKey(hKey4, Str, &hKey5) == SUCCESS) + { +// SaveIntNum(hKey5, "Set", Host.Level, DefaultHost.Level); + WriteIntValueToReg(hKey5, "Set", Host.Level); + SaveStr(hKey5, "HostName", Host.HostName, DefaultHost.HostName); + if((Host.Level & SET_LEVEL_GROUP) == 0) + { + SaveStr(hKey5, "HostAdrs", Host.HostAdrs, DefaultHost.HostAdrs); + SaveStr(hKey5, "UserName", Host.UserName, DefaultHost.UserName); + SaveStr(hKey5, "Account", Host.Account, DefaultHost.Account); + SaveStr(hKey5, "LocalDir", Host.LocalInitDir, NULL); + SaveStr(hKey5, "RemoteDir", Host.RemoteInitDir, DefaultHost.RemoteInitDir); + SaveStr(hKey5, "Chmod", Host.ChmodCmd, DefaultHost.ChmodCmd); + SaveStr(hKey5, "Nlst", Host.LsName, DefaultHost.LsName); + SaveStr(hKey5, "Init", Host.InitCmd, DefaultHost.InitCmd); + + if(Host.Anonymous == NO) + EncodePassword(Host.PassWord, Str); + else + strcpy(Str, DefaultHost.PassWord); + SaveStr(hKey5, "Password", Str, DefaultHost.PassWord); + + SaveIntNum(hKey5, "Port", Host.Port, DefaultHost.Port); + SaveIntNum(hKey5, "Anonymous", Host.Anonymous, DefaultHost.Anonymous); + SaveIntNum(hKey5, "Kanji", Host.KanjiCode, DefaultHost.KanjiCode); + SaveIntNum(hKey5, "KanaCnv", Host.KanaCnv, DefaultHost.KanaCnv); + SaveIntNum(hKey5, "NameKanji", Host.NameKanjiCode, DefaultHost.NameKanjiCode); + SaveIntNum(hKey5, "NameKana", Host.NameKanaCnv, DefaultHost.NameKanaCnv); + SaveIntNum(hKey5, "Pasv", Host.Pasv, DefaultHost.Pasv); + SaveIntNum(hKey5, "Fwall", Host.FireWall, DefaultHost.FireWall); + SaveIntNum(hKey5, "List", Host.ListCmdOnly, DefaultHost.ListCmdOnly); + SaveIntNum(hKey5, "NLST-R", Host.UseNLST_R, DefaultHost.UseNLST_R); + SaveIntNum(hKey5, "Last", Host.LastDir, DefaultHost.LastDir); + SaveIntNum(hKey5, "Tzone", Host.TimeZone, DefaultHost.TimeZone); + SaveIntNum(hKey5, "Type", Host.HostType, DefaultHost.HostType); + SaveIntNum(hKey5, "Sync", Host.SyncMove, DefaultHost.SyncMove); + SaveIntNum(hKey5, "Fpath", Host.NoFullPath, DefaultHost.NoFullPath); + WriteBinaryToReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort)); + SaveIntNum(hKey5, "Secu", Host.Security, DefaultHost.Security); + + WriteMultiStringToReg(hKey5, "Bmarks", Host.BookMark); + + SaveIntNum(hKey5, "Dial", Host.Dialup, DefaultHost.Dialup); + SaveIntNum(hKey5, "UseIt", Host.DialupAlways, DefaultHost.DialupAlways); + SaveIntNum(hKey5, "Notify", Host.DialupNotify, DefaultHost.DialupNotify); + SaveStr(hKey5, "DialTo", Host.DialEntry, DefaultHost.DialEntry); + } + CloseSubKey(hKey5); + } + i++; + } + WriteIntValueToReg(hKey4, "SetNum", i); + + /* —]•ª‚ȃzƒXƒg‚̐ݒ肪‚ ‚Á‚½‚çíœ */ + for(; i < 998; i++) + { + sprintf(Str, "Host%d", i); + if(DeleteSubKey(hKey4, Str) != SUCCESS) + break; + } + + if((i = AskCurrentHost()) == HOSTNUM_NOENTRY) + i = 0; + WriteIntValueToReg(hKey4, "CurSet", i); + } + CloseSubKey(hKey4); + } + CloseReg(hKey3); + } + return; +} + +/*----- ƒŒƒWƒXƒgƒŠ^INIƒtƒ@ƒCƒ‹‚©‚çÝ’è’l‚ðŒÄ‚яo‚· --------------------------- +* +* ‚±‚̊֐”‚𕡐”‰ñŒÄ‚яo‚·‚ƁCƒzƒXƒgÝ’肪’ljÁ‚³‚ê‚éD +* +* Parameter +* ‚È‚µ +* +* Return Value +* YES: “ǂݏo‚µ¬Œ÷ +* NO: “ǂݏo‚µŽ¸”s(Ý’è–³‚µ) +*----------------------------------------------------------------------------*/ + +int LoadRegistory(void) +{ + void *hKey3; + void *hKey4; + void *hKey5; + int i; + int Sets; + char Str[256]; /* ASCII_EXT_LEN‚æ‚è‘å‚«‚¢Ž– */ + char *Pos; + char *Pos2; + HOSTDATA Host; + HISTORYDATA Hist; + int Sts; + int Version; + + Sts = NO; + + SetRegType(REGTYPE_INI); + if((i = OpenReg("FFFTP", &hKey3)) != SUCCESS) + { + if(AskForceIni() == NO) + { + SetRegType(REGTYPE_REG); + i = OpenReg("FFFTP", &hKey3); + } + } + + if(i == SUCCESS) + { + char checkbuf[48]; + int salt = 0; + Sts = YES; + + ReadIntValueFromReg(hKey3, "Version", &Version); + + if(OpenSubKey(hKey3, "Options", &hKey4) == SUCCESS) + { + ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX); + ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY); + ReadIntValueFromReg(hKey4, "WinWidth", &WinWidth); + ReadIntValueFromReg(hKey4, "WinHeight", &WinHeight); + ReadIntValueFromReg(hKey4, "LocalWidth", &LocalWidth); + /* «‹Œƒo[ƒWƒ‡ƒ“‚̃oƒO‘΍ô */ + LocalWidth = max1(0, LocalWidth); + ReadIntValueFromReg(hKey4, "TaskHeight", &TaskHeight); + /* «‹Œƒo[ƒWƒ‡ƒ“‚̃oƒO‘΍ô */ + TaskHeight = max1(0, TaskHeight); + ReadBinaryFromReg(hKey4, "LocalColm", &LocalTabWidth, sizeof(LocalTabWidth)); + ReadBinaryFromReg(hKey4, "RemoteColm", &RemoteTabWidth, sizeof(RemoteTabWidth)); + ReadIntValueFromReg(hKey4, "SwCmd", &Sizing); + + ReadStringFromReg(hKey4, "UserMail", UserMailAdrs, USER_MAIL_LEN+1); + ReadStringFromReg(hKey4, "Viewer", ViewerName[0], FMAX_PATH+1); + ReadStringFromReg(hKey4, "Viewer2", ViewerName[1], FMAX_PATH+1); + ReadStringFromReg(hKey4, "Viewer3", ViewerName[2], FMAX_PATH+1); + + ReadIntValueFromReg(hKey4, "TrType", &TransMode); + ReadIntValueFromReg(hKey4, "Recv", &RecvMode); + ReadIntValueFromReg(hKey4, "Send", &SendMode); + ReadIntValueFromReg(hKey4, "Move", &MoveMode); + ReadStringFromReg(hKey4, "Path", DefaultLocalPath, FMAX_PATH+1); + ReadIntValueFromReg(hKey4, "Time", &SaveTimeStamp); + ReadIntValueFromReg(hKey4, "EOF", &RmEOF); + ReadIntValueFromReg(hKey4, "Scolon", &VaxSemicolon); + + ReadIntValueFromReg(hKey4, "RecvEx", &ExistMode); + ReadIntValueFromReg(hKey4, "SendEx", &UpExistMode); + + ReadIntValueFromReg(hKey4, "LFsort", &LocalFileSort); + ReadIntValueFromReg(hKey4, "LDsort", &LocalDirSort); + ReadIntValueFromReg(hKey4, "RFsort", &RemoteFileSort); + ReadIntValueFromReg(hKey4, "RDsort", &RemoteDirSort); + ReadIntValueFromReg(hKey4, "SortSave", &SortSave); + + ReadIntValueFromReg(hKey4, "ListType", &ListType); + ReadIntValueFromReg(hKey4, "Cache", &CacheEntry); + ReadIntValueFromReg(hKey4, "CacheSave", &CacheSave); + ReadIntValueFromReg(hKey4, "DotFile", &DotFile); + ReadIntValueFromReg(hKey4, "Dclick", &DclickOpen); + + ReadIntValueFromReg(hKey4, "ConS", &ConnectOnStart); + ReadIntValueFromReg(hKey4, "OldDlg", &ConnectAndSet); + ReadIntValueFromReg(hKey4, "RasClose", &RasClose); + ReadIntValueFromReg(hKey4, "RasNotify", &RasCloseNotify); + ReadIntValueFromReg(hKey4, "Qanony", &QuickAnonymous); + ReadIntValueFromReg(hKey4, "PassHist", &PassToHist); + ReadIntValueFromReg(hKey4, "SendQuit", &SendQuit); + ReadIntValueFromReg(hKey4, "NoRas", &NoRasControl); + + ReadIntValueFromReg(hKey4, "Debug", &DebugConsole); + ReadIntValueFromReg(hKey4, "WinPos", &SaveWinPos); + ReadIntValueFromReg(hKey4, "RegExp", &FindMode); + ReadIntValueFromReg(hKey4, "Reg", &RegType); + + if(ReadMultiStringFromReg(hKey4, "AsciiFile", AsciiExt, ASCII_EXT_LEN+1) == FAIL) + { + /* ‹ŒASCIIƒ‚[ƒh‚ÌŠg’£Žq‚̐ݒè‚ðV‚µ‚¢‚à‚Ì‚É•ÏŠ· */ + ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1); + memset(AsciiExt, NUL, ASCII_EXT_LEN+1); + Pos = Str; + while(*Pos != NUL) + { + if((Pos2 = strchr(Pos, ';')) == NULL) + Pos2 = strchr(Pos, NUL); + if((Pos2 - Pos) > 0) + { + if((StrMultiLen(AsciiExt) + (Pos2 - Pos) + 2) >= ASCII_EXT_LEN) + break; + strcpy(AsciiExt + StrMultiLen(AsciiExt), "*."); + strncpy(AsciiExt + StrMultiLen(AsciiExt) - 1, Pos, (Pos2 - Pos)); + } + Pos = Pos2; + if(*Pos == ';') + Pos++; + } + } + + ReadIntValueFromReg(hKey4, "LowUp", &FnameCnv); + ReadIntValueFromReg(hKey4, "Tout", &TimeOut); + + ReadMultiStringFromReg(hKey4, "NoTrn", MirrorNoTrn, MIRROR_LEN+1); + ReadMultiStringFromReg(hKey4, "NoDel", MirrorNoDel, MIRROR_LEN+1); + ReadIntValueFromReg(hKey4, "MirFile", &MirrorFnameCnv); + ReadIntValueFromReg(hKey4, "MirUNot", &MirUpDelNotify); + ReadIntValueFromReg(hKey4, "MirDNot", &MirDownDelNotify); + + if(ReadStringFromReg(hKey4, "ListFont", Str, 256) == SUCCESS) + { + if(RestoreFontData(Str, &ListLogFont) == SUCCESS) + ListFont = CreateFontIndirect(&ListLogFont); + } + ReadIntValueFromReg(hKey4, "ListHide", &DispIgnoreHide); + ReadIntValueFromReg(hKey4, "ListDrv", &DispDrives); + + ReadStringFromReg(hKey4, "FwallHost", FwallHost, HOST_ADRS_LEN+1); + ReadStringFromReg(hKey4, "FwallUser", FwallUser, USER_NAME_LEN+1); + ReadStringFromReg(hKey4, "FwallPass", Str, 255); + DecodePassword(Str, FwallPass); + ReadIntValueFromReg(hKey4, "FwallPort", &FwallPort); + ReadIntValueFromReg(hKey4, "FwallType", &FwallType); + ReadIntValueFromReg(hKey4, "FwallDef", &FwallDefault); + ReadIntValueFromReg(hKey4, "FwallSec", &FwallSecurity); + ReadIntValueFromReg(hKey4, "PasvDef", &PasvDefault); + ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolv); + ReadIntValueFromReg(hKey4, "FwallLow", &FwallLower); + ReadIntValueFromReg(hKey4, "FwallDel", &FwallDelimiter); + + ReadIntValueFromReg(hKey4, "SndConSw", &Sound[SND_CONNECT].On); + ReadIntValueFromReg(hKey4, "SndTrnSw", &Sound[SND_TRANS].On); + ReadIntValueFromReg(hKey4, "SndErrSw", &Sound[SND_ERROR].On); + ReadStringFromReg(hKey4, "SndCon", Sound[SND_CONNECT].Fname, FMAX_PATH+1); + ReadStringFromReg(hKey4, "SndTrn", Sound[SND_TRANS].Fname, FMAX_PATH+1); + ReadStringFromReg(hKey4, "SndErr", Sound[SND_ERROR].Fname, FMAX_PATH+1); + + ReadMultiStringFromReg(hKey4, "DefAttr", DefAttrList, DEFATTRLIST_LEN+1); + + ReadStringFromReg(hKey4, "Tmp", TmpPath, FMAX_PATH+1); + + ReadBinaryFromReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE)); + ReadBinaryFromReg(hKey4, "Bdlg", &BmarkDlgSize, sizeof(SIZE)); + ReadBinaryFromReg(hKey4, "Mdlg", &MirrorDlgSize, sizeof(SIZE)); + + ReadIntValueFromReg(hKey4, "FAttrSw", &FolderAttr); + ReadIntValueFromReg(hKey4, "FAttr", &FolderAttrNum); + + ReadIntValueFromReg(hKey4, "NoSave", &SuppressSave); + + ReadIntValueFromReg(hKey4, "HistNum", &FileHist); +// ReadMultiStringFromReg(hKey4, "Hist", Hist, (FMAX_PATH+1)*HISTORY_MAX+1); + + /* ƒqƒXƒgƒŠ‚̐ݒè‚ð“ǂݍž‚Þ */ + Sets = 0; + ReadIntValueFromReg(hKey4, "SavedHist", &Sets); + + for(i = 0; i < Sets; i++) + { + sprintf(Str, "History%d", i); + if(OpenSubKey(hKey4, Str, &hKey5) == SUCCESS) + { + CopyDefaultHistory(&Hist); + + ReadStringFromReg(hKey5, "HostAdrs", Hist.HostAdrs, HOST_ADRS_LEN+1); + ReadStringFromReg(hKey5, "UserName", Hist.UserName, USER_NAME_LEN+1); + ReadStringFromReg(hKey5, "Account", Hist.Account, ACCOUNT_LEN+1); + ReadStringFromReg(hKey5, "LocalDir", Hist.LocalInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "RemoteDir", Hist.RemoteInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "Chmod", Hist.ChmodCmd, CHMOD_CMD_LEN+1); + ReadStringFromReg(hKey5, "Nlst", Hist.LsName, NLST_NAME_LEN+1); + ReadStringFromReg(hKey5, "Init", Hist.InitCmd, INITCMD_LEN+1); + ReadIntValueFromReg(hKey5, "Port", &Hist.Port); + ReadIntValueFromReg(hKey5, "Kanji", &Hist.KanjiCode); + ReadIntValueFromReg(hKey5, "KanaCnv", &Hist.KanaCnv); + ReadIntValueFromReg(hKey5, "NameKanji", &Hist.NameKanjiCode); + ReadIntValueFromReg(hKey5, "NameKana", &Hist.NameKanaCnv); + ReadIntValueFromReg(hKey5, "Pasv", &Hist.Pasv); + ReadIntValueFromReg(hKey5, "Fwall", &Hist.FireWall); + ReadIntValueFromReg(hKey5, "List", &Hist.ListCmdOnly); + ReadIntValueFromReg(hKey5, "NLST-R", &Hist.UseNLST_R); + ReadIntValueFromReg(hKey5, "Tzone", &Hist.TimeZone); + ReadIntValueFromReg(hKey5, "Type", &Hist.HostType); + ReadIntValueFromReg(hKey5, "Sync", &Hist.SyncMove); + ReadIntValueFromReg(hKey5, "Fpath", &Hist.NoFullPath); + ReadBinaryFromReg(hKey5, "Sort", &Hist.Sort, sizeof(Hist.Sort)); + ReadIntValueFromReg(hKey5, "Secu", &Hist.Security); + ReadIntValueFromReg(hKey5, "TrType", &Hist.Type); + strcpy(Str, ""); + ReadStringFromReg(hKey5, "Password", Str, 255); + DecodePassword(Str, Hist.PassWord); + ReadIntValueFromReg(hKey5, "Dial", &Hist.Dialup); + ReadIntValueFromReg(hKey5, "UseIt", &Hist.DialupAlways); + ReadIntValueFromReg(hKey5, "Notify", &Hist.DialupNotify); + ReadStringFromReg(hKey5, "DialTo", Hist.DialEntry, RAS_NAME_LEN+1); + + CloseSubKey(hKey5); + AddHistoryToHistory(&Hist); + } + } + + /* ƒzƒXƒg‚̐ݒè‚ð“ǂݍž‚Þ */ + Sets = 0; + ReadIntValueFromReg(hKey4, "SetNum", &Sets); + + for(i = 0; i < Sets; i++) + { + sprintf(Str, "Host%d", i); + if(OpenSubKey(hKey4, Str, &hKey5) == SUCCESS) + { + CopyDefaultHost(&Host); + /* ‰ºˆÊŒÝŠ·«‚Ì‚½‚ß */ + if(Version < VER_NUM) + { + Host.Pasv = NO; + Host.ListCmdOnly = NO; + } + ReadIntValueFromReg(hKey5, "Set", &Host.Level); + + ReadStringFromReg(hKey5, "HostName", Host.HostName, HOST_NAME_LEN+1); + ReadStringFromReg(hKey5, "HostAdrs", Host.HostAdrs, HOST_ADRS_LEN+1); + ReadStringFromReg(hKey5, "UserName", Host.UserName, USER_NAME_LEN+1); + ReadStringFromReg(hKey5, "Account", Host.Account, ACCOUNT_LEN+1); + ReadStringFromReg(hKey5, "LocalDir", Host.LocalInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "RemoteDir", Host.RemoteInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "Chmod", Host.ChmodCmd, CHMOD_CMD_LEN+1); + ReadStringFromReg(hKey5, "Nlst", Host.LsName, NLST_NAME_LEN+1); + ReadStringFromReg(hKey5, "Init", Host.InitCmd, INITCMD_LEN+1); + ReadIntValueFromReg(hKey5, "Port", &Host.Port); + ReadIntValueFromReg(hKey5, "Anonymous", &Host.Anonymous); + ReadIntValueFromReg(hKey5, "Kanji", &Host.KanjiCode); + ReadIntValueFromReg(hKey5, "KanaCnv", &Host.KanaCnv); + ReadIntValueFromReg(hKey5, "NameKanji", &Host.NameKanjiCode); + ReadIntValueFromReg(hKey5, "NameKana", &Host.NameKanaCnv); + ReadIntValueFromReg(hKey5, "Pasv", &Host.Pasv); + ReadIntValueFromReg(hKey5, "Fwall", &Host.FireWall); + ReadIntValueFromReg(hKey5, "List", &Host.ListCmdOnly); + ReadIntValueFromReg(hKey5, "NLST-R", &Host.UseNLST_R); + ReadIntValueFromReg(hKey5, "Last", &Host.LastDir); + ReadIntValueFromReg(hKey5, "Tzone", &Host.TimeZone); + ReadIntValueFromReg(hKey5, "Type", &Host.HostType); + ReadIntValueFromReg(hKey5, "Sync", &Host.SyncMove); + ReadIntValueFromReg(hKey5, "Fpath", &Host.NoFullPath); + ReadBinaryFromReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort)); + ReadIntValueFromReg(hKey5, "Secu", &Host.Security); + if(Host.Anonymous != YES) + { + strcpy(Str, ""); + ReadStringFromReg(hKey5, "Password", Str, 255); + DecodePassword(Str, Host.PassWord); + } + else + strcpy(Host.PassWord, UserMailAdrs); + + ReadMultiStringFromReg(hKey5, "Bmarks", Host.BookMark, BOOKMARK_SIZE); + + ReadIntValueFromReg(hKey5, "Dial", &Host.Dialup); + ReadIntValueFromReg(hKey5, "UseIt", &Host.DialupAlways); + ReadIntValueFromReg(hKey5, "Notify", &Host.DialupNotify); + ReadStringFromReg(hKey5, "DialTo", Host.DialEntry, RAS_NAME_LEN+1); + + CloseSubKey(hKey5); + + AddHostToList(&Host, -1, Host.Level); + } + } + + ReadIntValueFromReg(hKey4, "CurSet", &Sets); + SetCurrentHost(Sets); + + CloseSubKey(hKey4); + } + CloseReg(hKey3); + } + else + { + /*===== Å‰‚Ì‹N“®ŽžiÝ’肪–³‚¢) =====*/ + +#if 0 + strcpy(UserMailAdrs, ""); + strcpy(Str, ""); + if(InputDialogBox(mailadrs_dlg, HWND_DESKTOP, NULL, Str, USER_MAIL_LEN+1, &i, IDH_HELP_TOPIC_0000001) == YES) + strcpy(UserMailAdrs, Str); + + for(i = 0; i < SAMPLE_HOSTS; i++) + { + CopyDefaultHost(&Host); + Host.Level = Sample[i].Level; + strcpy(Host.PassWord, UserMailAdrs); + strcpy(Host.HostName, Sample[i].HostName); + strcpy(Host.HostAdrs, Sample[i].HostAdrs); + strcpy(Host.UserName, "anonymous"); + AddHostToList(&Host, -1, Host.Level); + } +#endif + } + return(Sts); +} + + +/*----- ‰B‚µƒhƒ‰ƒCƒuî•ñ‚ðŽæ“¾ ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* DWORD +* YES/NO=Ý’è–³‚µ +*----------------------------------------------------------------------------*/ + +DWORD LoadHideDriveListRegistory(void) +{ + HKEY hKey1; + HKEY hKey2; + HKEY hKey3; + HKEY hKey4; + HKEY hKey5; + HKEY hKey6; + DWORD Size; + DWORD Type; + DWORD Ret; + + Ret = 0; + if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hKey1) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey1, "Microsoft", 0, KEY_READ, &hKey2) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey2, "Windows", 0, KEY_READ, &hKey3) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey3, "CurrentVersion", 0, KEY_READ, &hKey4) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey4, "Policies", 0, KEY_READ, &hKey5) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey5, "Explorer", 0, KEY_READ, &hKey6) == ERROR_SUCCESS) + { + Size = sizeof(DWORD); + RegQueryValueEx(hKey6, "NoDrives", NULL, &Type, (BYTE *)&Ret, &Size); + RegCloseKey(hKey6); + } + RegCloseKey(hKey5); + } + RegCloseKey(hKey4); + } + RegCloseKey(hKey3); + } + RegCloseKey(hKey2); + } + RegCloseKey(hKey1); + } + return(Ret); +} + + +/*----- ƒŒƒWƒXƒgƒŠ‚̐ݒè’l‚ðƒNƒŠƒA -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ClearRegistory(void) +{ + HKEY hKey2; + HKEY hKey3; + HKEY hKey4; + DWORD Dispos; + char Str[20]; + int i; + + if(RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Sota", 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, NULL, &hKey2, &Dispos) == ERROR_SUCCESS) + { + if(RegCreateKeyEx(hKey2, "FFFTP", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey3, &Dispos) == ERROR_SUCCESS) + { + if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS) + { + for(i = 0; ; i++) + { + sprintf(Str, "Host%d", i); + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) + break; + } + for(i = 0; ; i++) + { + sprintf(Str, "History%d", i); + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) + break; + } + RegCloseKey(hKey4); + } + RegDeleteKey(hKey3, "Options"); + RegCloseKey(hKey3); + } + RegDeleteKey(hKey2, "FFFTP"); + RegCloseKey(hKey2); + } + return; +} + + +/*----- Ý’è‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶ -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SaveSettingsToFile(void) +{ + char Tmp[FMAX_PATH*2]; + char Fname[FMAX_PATH+1]; + + if(RegType == REGTYPE_REG) + { + strcpy(Fname, "FFFTP.reg"); + if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN287, "reg", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE) + { + sprintf(Tmp, "/e \x22%s\x22 HKEY_CURRENT_USER\\Software\\sota\\FFFTP", Fname); + if(ShellExecute(NULL, "open", "regedit", Tmp, ".", SW_SHOW) <= (HINSTANCE)32) + { + MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK); + } + } + } + else + { + strcpy(Fname, "FFFTP-Backup.ini"); + if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN288, "ini", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE) + { + CopyFile(AskIniFilePath(), Fname, FALSE); + } + } + return; +} + + +/*----- Ý’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³ ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒ[ƒh‚µ‚½‚©‚Ç‚¤‚© (YES/NO) +*----------------------------------------------------------------------------*/ + +int LoadSettingsFromFile(void) +{ + int Ret; + char Tmp[FMAX_PATH*2]; + char Fname[FMAX_PATH+1]; + + Ret = NO; + strcpy(Fname, ""); + if(SelectFile(GetMainHwnd(), Fname, MSGJPN291, MSGJPN290, "", OFN_FILEMUSTEXIST, 0) == TRUE) + { + if((strlen(Fname) >= 5) && (_stricmp(&Fname[strlen(Fname)-4], ".reg") == 0)) + { + sprintf(Tmp, "\x22%s\x22", Fname); + if(ShellExecute(NULL, "open", "regedit", Tmp, ".", SW_SHOW) <= (HINSTANCE)32) + { + MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK); + } + else + { + Ret = YES; + /* ƒŒƒWƒXƒgƒŠƒGƒfƒBƒ^‚ªI—¹‚·‚é‚Ì‚ð‘Ò‚Â */ +// WaitForSingleObject(Info.hProcess, INFINITE); + } + } + else if((strlen(Fname) >= 5) && (_stricmp(&Fname[strlen(Fname)-4], ".ini") == 0)) + { + CopyFile(Fname, AskIniFilePath(), FALSE); + Ret = YES; + } + else + MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK); + } + return(Ret); +} + + + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚É•¶Žš—ñ‚ðƒZ[ƒu -------------------------------- +* +* Parameter +* HKEY hKey : ƒŒƒWƒXƒgƒŠƒL[ +* char *Key : ƒL[–¼ +* char *Str : ƒZ[ƒu‚·‚镶Žš—ñ +* char *DefaultStr : ƒfƒtƒHƒ‹ƒg‚Ì•¶Žš—ñ +* +* Return Value +* ‚È‚µ +* +* Note +* •¶Žš—ñ‚ªƒfƒtƒHƒ‹ƒg‚Ì•¶Žš—ñ‚Æ“¯‚¶‚È‚çƒZ[ƒu‚µ‚È‚¢ +*----------------------------------------------------------------------------*/ + +static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr) +{ + if((DefaultStr != NULL) && (strcmp(Str, DefaultStr) == 0)) + DeleteValue(hKey, Key); + else + WriteStringToReg(hKey, Key, Str); + + return; +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ɐ”’l(INT)‚ðƒZ[ƒu ----------------------------- +* +* Parameter +* HKEY hKey : ƒŒƒWƒXƒgƒŠƒL[ +* char *Key : ƒL[–¼ +* int Num : ƒZ[ƒu‚·‚é’l +* int DefaultNum : ƒfƒtƒHƒ‹ƒg‚Ì’l +* +* Return Value +* ‚È‚µ +* +* Note +* ”’l‚ªƒfƒtƒHƒ‹ƒg‚Ì’l‚Æ“¯‚¶‚È‚çƒZ[ƒu‚µ‚È‚¢ +*----------------------------------------------------------------------------*/ + +static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum) +{ + if(Num == DefaultNum) + DeleteValue(hKey, Key); + else + WriteIntValueToReg(hKey, Key, Num); + + return; +} + + +/*----- LOGFONTƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·‚·‚é --------------------------------------- +* +* Parameter +* LOGFONT Font : ƒtƒHƒ“ƒgƒf[ƒ^ +* HFONT hFont : ƒtƒHƒ“ƒg‚̃nƒ“ƒhƒ‹ +* NULL = ƒfƒtƒHƒ‹ƒg‚̃tƒHƒ“ƒg +* char *Buf : ƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf) +{ + *Buf = NUL; + if(hFont != NULL) + sprintf(Buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d %s", + Font.lfHeight, Font.lfWidth, Font.lfEscapement, Font.lfOrientation, + Font.lfWeight, Font.lfItalic, Font.lfUnderline, Font.lfStrikeOut, + Font.lfCharSet, Font.lfOutPrecision, Font.lfClipPrecision, + Font.lfQuality, Font.lfPitchAndFamily, Font.lfFaceName); + return; +} + + +/*----- •¶Žš—ñ‚ðLOGFONTƒf[ƒ^‚É•ÏŠ·‚·‚é --------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* LOGFONT *Font : ƒtƒHƒ“ƒgƒf[ƒ^ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL=•ÏŠ·‚Å‚«‚È‚¢ +*----------------------------------------------------------------------------*/ + +static int RestoreFontData(char *Str, LOGFONT *Font) +{ + int i; + int Sts; + + Sts = FAIL; + if(sscanf(Str, "%d %d %d %d %d %d %d %d %d %d %d %d %d", + &(Font->lfHeight), &(Font->lfWidth), &(Font->lfEscapement), &(Font->lfOrientation), + &(Font->lfWeight), &(Font->lfItalic), &(Font->lfUnderline), &(Font->lfStrikeOut), + &(Font->lfCharSet), &(Font->lfOutPrecision), &(Font->lfClipPrecision), + &(Font->lfQuality), &(Font->lfPitchAndFamily)) == 13) + { + for(i = 13; i > 0; i--) + { + if((Str = strchr(Str, ' ')) == NULL) + break; + Str++; + } + if(i == 0) + { + strcpy(Font->lfFaceName, Str); + Sts = SUCCESS; + } + } + + if(Sts == FAIL) + memset(Font, NUL, sizeof(LOGFONT)); + + return(Sts); +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é ------------------------------------------------ +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void EncodePassword(char *Str, char *Buf) +{ + EncodePassword2( Str, Buf, SecretKey ); +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€) ------------------ +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EncodePasswordOriginal(char *Str, char *Buf) +{ + unsigned char *Get; + unsigned char *Put; + int Rnd; + int Ch; + + srand((unsigned)time(NULL)); + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + if( *Get == NUL ){ + *Put = NUL; + return; + } + + /* Ž¯•ÊŽq‚ðæ“ª‚É’u‚­ */ + Put[0] = '0'; + Put[1] = 'A'; + Put += 2; + + while(*Get != NUL) + { + Rnd = rand() % 3; + Ch = ((int)*Get++) << Rnd; + Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8); + *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF); + *Put++ = 0x40 | ((Ch >> 4) & 0xF); + if((*(Put-2) & 0x1) != 0) + *Put++ = (rand() % 62) + 0x40; + } + *Put = NUL; + return; +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€OKey) ---------------- +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EncodePassword2(char *Str, char *Buf, const char* Key) +{ + unsigned char *Get; + unsigned char *Put; + int Rnd; + int Ch; + + /* 2010.01.31 genta Key */ + unsigned char *KeyHead = (unsigned char *)Key; + unsigned char *KeyEnd = KeyHead + strlen(KeyHead); + unsigned char *KeyCurrent = KeyHead; + + srand((unsigned)time(NULL)); + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + if( *Get == NUL ){ + *Put = NUL; + return; + } + + /* Ž¯•ÊŽq‚ðæ“ª‚É’u‚­ */ + Put[0] = '0'; + Put[1] = 'B'; + Put += 2; + + while(*Get != NUL) + { + Rnd = rand() % 3; + Ch = ((int)(*Get++ ^ *KeyCurrent)) << Rnd; + Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8); + *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF); + *Put++ = 0x40 | ((Ch >> 4) & 0xF); + if((*(Put-2) & 0x1) != 0) + *Put++ = (rand() % 62) + 0x40; + + /* 2010.01.31 genta Key */ + if( ++KeyCurrent == KeyEnd ){ + KeyCurrent = KeyHead; + } + } + *Put = NUL; + return; +} + + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­ ---------------------------------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DecodePassword(char *Str, char *Buf) +{ + unsigned char *Get; + unsigned char *Put; + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + if( *Get == NUL ){ + *Put = NUL; + } + else if( 0x40 <= *Get && *Get < 0x80 ){ + /* Original algorithm */ + DecodePasswordOriginal( Str, Buf ); + } + else if( strncmp( Get, "0A", 2 ) == 0 ){ + DecodePasswordOriginal( Str + 2, Buf ); + } + else if( strncmp( Get, "0B", 2 ) == 0 ){ + DecodePassword2( Str + 2, Buf, SecretKey ); + } + else { + // unknown encoding + *Put = NUL; + return; + } +} + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€) ------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void DecodePasswordOriginal(char *Str, char *Buf) +{ + unsigned char *Get; + unsigned char *Put; + int Rnd; + int Ch; + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + while(*Get != NUL) + { + Rnd = ((unsigned int)*Get >> 4) & 0x3; + Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4); + Ch <<= 8; + if((*Get & 0x1) != 0) + Get++; + Get += 2; + Ch >>= Rnd; + Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF); + *Put++ = Ch; + } + *Put = NUL; + return; +} + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€OKey) ------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void DecodePassword2(char *Str, char *Buf, const char* Key) +{ + int Rnd; + int Ch; + unsigned char *Get = (unsigned char *)Str; + unsigned char *Put = (unsigned char *)Buf; + + /* 2010.01.31 genta Key */ + unsigned char *KeyHead = (unsigned char *)Key; + unsigned char *KeyEnd = KeyHead + strlen(KeyHead); + unsigned char *KeyCurrent = KeyHead; + + while(*Get != NUL) + { + Rnd = ((unsigned int)*Get >> 4) & 0x3; + Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4); + Ch <<= 8; + if((*Get & 0x1) != 0) + Get++; + Get += 2; + Ch >>= Rnd; + Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF); + *Put++ = Ch ^ *KeyCurrent; + + /* 2010.01.31 genta Key */ + if( ++KeyCurrent == KeyEnd ){ + KeyCurrent = KeyHead; + } + } + *Put = NUL; + return; +} + + +/*===== ƒŒƒWƒXƒgƒŠ‚ÆINIƒtƒ@ƒCƒ‹‚̃AƒNƒZƒXˆ— ============*/ + + +/*===== INIƒtƒ@ƒCƒ‹—p‚̃ŒƒWƒXƒgƒŠƒf[ƒ^ =====*/ + +typedef struct regdatatbl { + char KeyName[80+1]; /* ƒL[–¼ */ + char ValTbl[REG_SECT_MAX]; /* ’l‚̃e[ƒuƒ‹ */ + int ValLen; /* ’lƒf[ƒ^‚̃oƒCƒg” */ + int Mode; /* ƒL[‚̃‚[ƒh */ + struct regdatatbl *Next; +} REGDATATBL; + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL WriteOutRegToFile(REGDATATBL *Pos); +static int ReadInReg(char *Name, REGDATATBL **Handle); +static int StrCatOut(char *Src, int Len, char *Dst); +static int StrReadIn(char *Src, int Max, char *Dst); +static char *ScanValue(void *Handle, char *Name); + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static int TmpRegType; + + + +/*----- ƒŒƒWƒXƒgƒŠ‚̃^ƒCƒv‚ðÝ’è‚·‚é ------------------------------------------ +* +* Parameter +* int Type : ƒ^ƒCƒv (REGTYPE_xxx) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static void SetRegType(int Type) +{ + TmpRegType = Type; + return; +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ðƒI[ƒvƒ“‚·‚éi“ǂݍž‚݁j----------------------- +* +* Parameter +* char *Name : ƒŒƒWƒXƒgƒŠ–¼ +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int OpenReg(char *Name, void **Handle) +{ + int Sts; + char Tmp[FMAX_PATH+1]; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + strcpy(Tmp, "Software\\Sota\\"); + strcat(Tmp, Name); + if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((Sts = ReadInReg(Name, (REGDATATBL **)Handle)) == SUCCESS) + ((REGDATATBL *)(*Handle))->Mode = 0; + } + return(Sts); +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ðì¬‚·‚éi‘‚«ž‚݁j--------------------------- +* +* Parameter +* char *Name : ƒŒƒWƒXƒgƒŠ–¼ +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CreateReg(char *Name, void **Handle) +{ + int Sts; + char Tmp[FMAX_PATH+1]; + DWORD Dispos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + strcpy(Tmp, "Software\\Sota\\"); + strcat(Tmp, Name); + if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((*Handle = malloc(sizeof(REGDATATBL))) != NULL) + { + strcpy(((REGDATATBL *)(*Handle))->KeyName, Name); + ((REGDATATBL *)(*Handle))->ValLen = 0; + ((REGDATATBL *)(*Handle))->Next = NULL; + ((REGDATATBL *)(*Handle))->Mode = 1; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ðƒNƒ[ƒY‚·‚é ---------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CloseReg(void *Handle) +{ + REGDATATBL *Pos; + REGDATATBL *Next; + FILE *Strm; + + if(TmpRegType == REGTYPE_REG) + { + RegCloseKey(Handle); + + /* INIƒtƒ@ƒCƒ‹‚ðíœ */ + if((Strm = fopen(AskIniFilePath(), "rt")) != NULL) + { + fclose(Strm); + MoveFileToTrashCan(AskIniFilePath()); + } + } + else + { + if(((REGDATATBL *)Handle)->Mode == 1) + { + if(WriteOutRegToFile(Handle) == TRUE) + { +// /* ƒŒƒWƒXƒgƒŠ‚ðƒNƒŠƒA */ +// ClearRegistory(); + } + } + /* ƒe[ƒuƒ‹‚ðíœ */ + Pos = Handle; + while(Pos != NULL) + { + Next = Pos->Next; + free(Pos); + Pos = Next; + } + } + return(SUCCESS); +} + + +/*----- ƒŒƒWƒXƒgƒŠî•ñ‚ðINIƒtƒ@ƒCƒ‹‚ɏ‘‚«ž‚Þ --------------------------------- +* +* Parameter +* REGDATATBL *Pos : ƒŒƒWƒXƒgƒŠƒf[ƒ^ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static BOOL WriteOutRegToFile(REGDATATBL *Pos) +{ + FILE *Strm; + char *Disp; + BOOL Ret; + + Ret = FALSE; + if((Strm = fopen(AskIniFilePath(), "wt")) != NULL) + { + fprintf(Strm, MSGJPN239); + while(Pos != NULL) + { + fprintf(Strm, "\n[%s]\n", Pos->KeyName); + + Disp = Pos->ValTbl; + while(Disp < (Pos->ValTbl + Pos->ValLen)) + { + fprintf(Strm, "%s\n", Disp); + Disp = Disp + strlen(Disp) + 1; + } + Pos = Pos->Next; + } + fclose(Strm); + Ret = TRUE; + } + else + MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK); + + return(Ret); +} + + +/*----- INIƒtƒ@ƒCƒ‹‚©‚烌ƒWƒXƒgƒŠî•ñ‚ð“ǂݍž‚Þ ------------------------------- +* +* Parameter +* char *Name : –¼‘O +* void *Handle : ƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadInReg(char *Name, REGDATATBL **Handle) +{ + FILE *Strm; + char *Buf; + char *Tmp; + char *Data; + REGDATATBL *New; + REGDATATBL *Pos; + int Sts; + + Sts = FAIL; + *Handle = NULL; + + if((Strm = fopen(AskIniFilePath(), "rt")) != NULL) + { + if((Buf = malloc(REG_SECT_MAX)) != NULL) + { + while(fgets(Buf, REG_SECT_MAX, Strm) != NULL) + { + if(*Buf != '#') + { + if((Tmp = strchr(Buf, '\n')) != NULL) + *Tmp = NUL; + + if(*Buf == '[') + { + if((New = malloc(sizeof(REGDATATBL))) != NULL) + { + if((Tmp = strchr(Buf, ']')) != NULL) + *Tmp = NUL; + strcpy(New->KeyName, Buf+1); + New->ValLen = 0; + New->Next = NULL; + Data = New->ValTbl; + } + if(*Handle == NULL) + *Handle = New; + else + { + Pos = *Handle; + while(Pos->Next != NULL) + Pos = Pos->Next; + Pos->Next = New; + } + } + else if(strlen(Buf) > 0) + { + strcpy(Data, Buf); + Data += strlen(Buf) + 1; + New->ValLen += strlen(Buf) + 1; + } + } + } + Sts = SUCCESS; + free(Buf); + } + fclose(Strm); + } + return(Sts); +} + + +/*----- ƒTƒuƒL[‚ðƒI[ƒvƒ“‚·‚é ------------------------------------------------ +* +* Parameter +* void *Parent : e‚̃nƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int OpenSubKey(void *Parent, char *Name, void **Handle) +{ + int Sts; + char Key[80]; + REGDATATBL *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + strcpy(Key, ((REGDATATBL *)Parent)->KeyName); + strcat(Key, "\\"); + strcat(Key, Name); + Pos = Parent; + while(Pos != NULL) + { + if(strcmp(Pos->KeyName, Key) == 0) + { + *Handle = Pos; + Sts = SUCCESS; + break; + } + Pos = Pos->Next; + } + } + return(Sts); +} + + +/*----- ƒTƒuƒL[‚ðì¬‚·‚é ---------------------------------------------------- +* +* Parameter +* void *Parent : e‚̃nƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CreateSubKey(void *Parent, char *Name, void **Handle) +{ + int Sts; + DWORD Dispos; + REGDATATBL *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((*Handle = malloc(sizeof(REGDATATBL))) != NULL) + { + strcpy(((REGDATATBL *)(*Handle))->KeyName, ((REGDATATBL *)Parent)->KeyName); + strcat(((REGDATATBL *)(*Handle))->KeyName, "\\"); + strcat(((REGDATATBL *)(*Handle))->KeyName, Name); + + ((REGDATATBL *)(*Handle))->ValLen = 0; + ((REGDATATBL *)(*Handle))->Next = NULL; + + Pos = (REGDATATBL *)Parent; + while(Pos->Next != NULL) + Pos = Pos->Next; + Pos->Next = *Handle; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒTƒuƒL[‚ðƒNƒ[ƒY‚·‚é ------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CloseSubKey(void *Handle) +{ + if(TmpRegType == REGTYPE_REG) + RegCloseKey(Handle); + else + { + /* Nothing */ + } + return(SUCCESS); +} + + +/*----- ƒTƒuƒL[‚ðíœ‚·‚é ---------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int DeleteSubKey(void *Handle, char *Name) +{ + int Sts; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + Sts = FAIL; + } + return(Sts); +} + + +/*----- ’l‚ðíœ‚·‚é ---------------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int DeleteValue(void *Handle, char *Name) +{ + int Sts; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + Sts = FAIL; + } + return(Sts); +} + + +/*----- INT’l‚ð“ǂݍž‚Þ ------------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* int *Value : INT’l‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadIntValueFromReg(void *Handle, char *Name, int *Value) +{ + int Sts; + DWORD Size; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + Size = sizeof(int); + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + *Value = atoi(Pos); + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- INT’l‚ð‘‚«ž‚Þ ------------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* int Value : INT’l +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteIntValueToReg(void *Handle, char *Name, int Value) +{ + REGDATATBL *Pos; + char *Data; + char Tmp[20]; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int)); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + sprintf(Tmp, "%d", Value); + strcat(Data, Tmp); + Pos->ValLen += strlen(Data) + 1; + } + return(SUCCESS); +} + + +/*----- •¶Žš—ñ‚ð“ǂݍž‚Þ ------------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str : •¶Žš—ñ‚ð•Ô‚·ƒ[ƒN +* DWORD Size : Å‘åƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS) + { + if(*(Str + Size - 1) != NUL) + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + Size = min1(Size-1, strlen(Pos)); + Size = StrReadIn(Pos, Size, Str); + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- •¶Žš—ñ‚ð‘‚«ž‚Þ ------------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str :•¶Žš—ñ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteStringToReg(void *Handle, char *Name, char *Str) +{ + REGDATATBL *Pos; + char *Data; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + Pos->ValLen += strlen(Data); + Data = Pos->ValTbl + Pos->ValLen; + Pos->ValLen += StrCatOut(Str, strlen(Str), Data) + 1; + } + return(SUCCESS); +} + + +/*----- ƒ}ƒ‹ƒ`•¶Žš—ñ‚ð“ǂݍž‚Þ ------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str : •¶Žš—ñ‚ð•Ô‚·ƒ[ƒN +* DWORD Size : Å‘åƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Size) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS) + { + if(*(Str + Size - 1) != NUL) + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + Size = min1(Size-1, strlen(Pos)); + Size = StrReadIn(Pos, Size, Str); + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒ}ƒ‹ƒ`•¶Žš—ñ‚ð‘‚«ž‚Þ ------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str : •¶Žš—ñ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteMultiStringToReg(void *Handle, char *Name, char *Str) +{ + REGDATATBL *Pos; + char *Data; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + Pos->ValLen += strlen(Data); + Data = Pos->ValTbl + Pos->ValLen; + Pos->ValLen += StrCatOut(Str, StrMultiLen(Str), Data) + 1; + } + return(SUCCESS); +} + + +/*----- ƒoƒCƒiƒŠ‚ð“ǂݍž‚Þ----------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void *Bin : ƒoƒCƒiƒŠ‚ð•Ô‚·ƒ[ƒN +* DWORD Size : Å‘åƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + Size = min1(Size, strlen(Pos)); + Size = StrReadIn(Pos, Size, Bin); + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒoƒCƒiƒŠ‚ð‘‚«ž‚Þ ---------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void *Bin : ƒoƒCƒiƒŠ +* int Len : ’·‚³ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len) +{ + REGDATATBL *Pos; + char *Data; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + Pos->ValLen += strlen(Data); + Data = Pos->ValTbl + Pos->ValLen; + Pos->ValLen += StrCatOut(Bin, Len, Data) + 1; + } + return(SUCCESS); +} + + +/*----- •¶Žš—ñ‚ðƒoƒbƒtƒ@‚ɒljÁ‘‚«ž‚Ý‚·‚é ------------------------------------ +* +* Parameter +* char *Src : •¶Žš—ñ +* int len : •¶Žš—ñ‚Ì’·‚³ +* char *Dst : ‘‚«ž‚Ý‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* int ’ljÁ‚µ‚½ƒoƒCƒg” +*----------------------------------------------------------------------------*/ + +static int StrCatOut(char *Src, int Len, char *Dst) +{ + int Count; + + Dst += strlen(Dst); + Count = 0; + for(; Len > 0; Len--) + { + if(*Src == '\\') + { + *Dst++ = '\\'; + *Dst++ = '\\'; + Count += 2; + } + else if((*Src >= 0x20) && (*Src <= 0x7E)) + { + *Dst++ = *Src; + Count++; + } + else + { + sprintf(Dst, "\\%02X", *(unsigned char *)Src); + Dst += 3; + Count += 3; + } + Src++; + } + *Dst = NUL; + return(Count); +} + + +/*----- •¶Žš—ñ‚ðƒoƒbƒtƒ@‚ɓǂݍž‚Þ -------------------------------------------- +* +* Parameter +* char *Src : •¶Žš—ñ +* int Max : Å‘åƒTƒCƒY +* char *Dst : ‘‚«ž‚Ý‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* int “ǂݍž‚ñ‚¾ƒoƒCƒg” +*----------------------------------------------------------------------------*/ + +static int StrReadIn(char *Src, int Max, char *Dst) +{ + int Count; + int Tmp; + + Count = 0; + while(*Src != NUL) + { + if(Count >= Max) + break; + + if(*Src == '\\') + { + Src++; + if(*Src == '\\') + *Dst = '\\'; + else + { + sscanf(Src, "%02x", &Tmp); + *Dst = Tmp; + Src++; + } + } + else + *Dst = *Src; + + Count++; + Dst++; + Src++; + } + return(Count); +} + + +/*----- ’l‚ðŒŸõ‚·‚é ---------------------------------------------------------- +* +* Parameter +* char *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* +* Return Value +* char *’lƒf[ƒ^‚̐擪 +* NULL=Žw’è‚Ì–¼‘O‚Ì’l‚ªŒ©‚‚©‚ç‚È‚¢ +*----------------------------------------------------------------------------*/ + +static char *ScanValue(void *Handle, char *Name) +{ + REGDATATBL *Cur; + char *Pos; + char *Ret; + + Ret = NULL; + Cur = Handle; + Pos = Cur->ValTbl; + while(Pos < (Cur->ValTbl + Cur->ValLen)) + { + if((strncmp(Name, Pos, strlen(Name)) == 0) && + (*(Pos + strlen(Name)) == '=')) + { + Ret = Pos + strlen(Name) + 1; + break; + } + Pos += strlen(Pos) + 1; + } + return(Ret); +} + + +/*----------- ƒpƒXƒ[ƒh‚̑Ó–«‚ðŠm”F‚·‚é ------------------------------------ +* +* Parameter +* char *Password: ƒpƒXƒ[ƒh•¶Žš—ñ +* char *HashStr: SHA-1ƒnƒbƒVƒ…•¶Žš—ñ +* +* Return Value +* int 0 •sˆê’v +* 1: ˆê’v +* 2: ˆÙí +*----------------------------------------------------------------------------*/ +int CheckPasswordValidity( char* Password, int length, const char* HashStr ) +{ + ulong hash1[5]; + ulong hash2[5]; + + int i, j; + + const char* p = HashStr; + + /* ‹ó•¶Žš—ñ‚͈ê’v‚µ‚½‚±‚Æ‚É‚·‚é */ + if( HashStr[0] == NUL ) return 1; + + /* Hash‚ðƒ`ƒFƒbƒN‚·‚é‚·‚é*/ + if( strlen(HashStr) != 40 ) return 2; + + /* Hash‚ðƒfƒR[ƒh‚·‚é*/ + for( i = 0; i < 5; i++ ){ + ulong decode = 0; + for( j = 0; j < 8; j++ ){ + if( *p < 0x40 || 0x40 + 15 < *p ){ + return 2; + } + decode = (decode << 4 ) + (*p - 0x40); + ++p; + } + hash1[i] = decode; + } + + /* Password ‚ðƒnƒbƒVƒ…‚·‚é */ + sha_memory( Password, length, hash2 ); + + if( memcmp( (char*)hash1, (char*)hash2, sizeof( hash1 )) == 0 ){ + return 1; + } + return 0; +} + +/*----------- ƒpƒXƒ[ƒh‚̑Ó–«ƒ`ƒFƒbƒN‚Ì‚½‚ß‚Ì•¶Žš—ñ‚ðì¬‚·‚é ------------ +* +* Parameter +* char *Password: ƒpƒXƒ[ƒh•¶Žš—ñ +* char *Str: SHA-1ƒnƒbƒVƒ…•¶Žš—ñŠi”[êŠ (41bytesˆÈã) +* +* Return Value +* None +*----------------------------------------------------------------------------*/ +void CreatePasswordHash( char* Password, int length, char* HashStr ) +{ + ulong hash[5]; + int i, j; + unsigned char *p = (unsigned char *)HashStr; + + sha_memory( Password, length, hash ); + + for( i = 0; i < 5; i++ ){ + ulong rest = hash[i]; + for( j = 0; j < 8; j++ ){ + *p++ = (unsigned char)((rest & 0xf0000000) >> 28) + '@'; + rest <<= 4; + } + } + *p = NUL; +} + +void SetHashSalt( DWORD salt ) +{ + unsigned char* pos = &SecretKey[strlen(SecretKey) + 1]; + *pos++ = ( salt >> 24 ) & 0xff; + *pos++ = ( salt >> 16 ) & 0xff; + *pos++ = ( salt >> 8 ) & 0xff; + *pos++ = ( salt ) & 0xff; + + SecretKeyLength = strlen( SecretKey ) + 5; +} diff --git a/OleDragDrop.c b/OleDragDrop.c new file mode 100644 index 0000000..29ee82e --- /dev/null +++ b/OleDragDrop.c @@ -0,0 +1,814 @@ +/************************************************************************** + + OleDragDrop.c + + (C) Copyright 1996-2002 By Tomoaki Nakashima. All right reserved. + http://www.nakka.com/ + nakka@nakka.com + +**************************************************************************/ + +/************************************************************************** + Include Files +**************************************************************************/ + +#define _INC_OLE +#include +#undef _INC_OLE + +#include +#include + +#include "OleDragDrop.h" + + +/* Clipboard format ‚©‚ç Type of storage medium ‚ðŽæ“¾ */ +static DWORD FormatToTymed(const UINT cfFormat) +{ + switch(cfFormat) + { + case CF_BITMAP: + return TYMED_GDI; + + case CF_METAFILEPICT: + return TYMED_MFPICT; + + case CF_ENHMETAFILE: + return TYMED_ENHMF; + } + return TYMED_HGLOBAL; +} + + +/****************************************************************************** + + IDropTarget + +******************************************************************************/ + +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_QueryInterface(LPDROPTARGET pThis, REFIID riid, LPVOID *ppvObject); +static ULONG STDMETHODCALLTYPE OLE_IDropTarget_AddRef(LPDROPTARGET pThis); +static ULONG STDMETHODCALLTYPE OLE_IDropTarget_Release(LPDROPTARGET pThis); +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_DragEnter(LPDROPTARGET pThis, LPDATAOBJECT pdo, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect); +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_DragOver(LPDROPTARGET pThis, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect); +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_DragLeave(LPDROPTARGET pThis); +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_Drop(LPDROPTARGET pThis, LPDATAOBJECT pdo, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect); +static HRESULT APIPRIVATE OLE_IDropTarget_Internal_SendMessage(LPDROPTARGET pThis, UINT uNotify, LPDATAOBJECT pdo, DWORD grfKeyState, POINTL *ppt, LPDWORD pdwEffect); +static HRESULT APIPRIVATE DropTarget_GetData(LPDATAOBJECT pdo, UINT cfFormat, LPSTGMEDIUM psm); +static HRESULT APIPRIVATE DropTarget_QueryGetData(LPDATAOBJECT pdo, UINT cfFormat); + +/* IDropTarget Virtual Table */ +static IDropTargetVtbl dtv = { + OLE_IDropTarget_QueryInterface, + OLE_IDropTarget_AddRef, + OLE_IDropTarget_Release, + OLE_IDropTarget_DragEnter, + OLE_IDropTarget_DragOver, + OLE_IDropTarget_DragLeave, + OLE_IDropTarget_Drop +}; + +typedef struct _IDROPTARGET_INTERNAL{ + LPVOID lpVtbl; + ULONG m_refCnt; + HWND hWnd; + UINT uCallbackMessage; + UINT *cFormat; + int cfcnt; + IDROPTARGET_NOTIFY dtn; +}IDROPTARGET_INTERNAL , *LPIDROPTARGET_INTERNAL; + +/* OLE‚̃hƒƒbƒvƒ^[ƒQƒbƒg‚Æ‚µ‚Ä“o˜^‚·‚é */ +BOOL APIPRIVATE OLE_IDropTarget_RegisterDragDrop(HWND hWnd, UINT uCallbackMessage, UINT *cFormat, int cfcnt) +{ + static IDROPTARGET_INTERNAL *pdti; + + pdti = GlobalAlloc(GPTR, sizeof(IDROPTARGET_INTERNAL)); + if(pdti == NULL){ + return FALSE; + } + pdti->lpVtbl = (LPVOID)&dtv; + pdti->m_refCnt = 0; + pdti->hWnd = hWnd; /* ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒEƒBƒ“ƒhƒE */ + pdti->uCallbackMessage = uCallbackMessage; /* ƒƒbƒZ[ƒW */ + pdti->cFormat = (UINT *)GlobalAlloc(GPTR, sizeof(UINT) * cfcnt); /* ‘Ήž‚µ‚Ä‚¢‚éƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg */ + if(pdti->cFormat == NULL){ + GlobalFree(pdti); + return FALSE; + } + CopyMemory(pdti->cFormat, cFormat, sizeof(UINT) * cfcnt); + pdti->cfcnt = cfcnt; /* ƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚̐” */ + return (S_OK == RegisterDragDrop(hWnd, (LPDROPTARGET)pdti)); +} + +/* OLE‚̃hƒƒbƒvƒ^[ƒQƒbƒg‚ð‰ðœ‚·‚é */ +void APIPRIVATE OLE_IDropTarget_RevokeDragDrop(HWND hWnd) +{ + RevokeDragDrop(hWnd); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_QueryInterface(LPDROPTARGET pThis, REFIID riid, PVOID *ppvObject) +{ + //—v‹‚³‚ꂽIID‚Æ“¯‚¶ê‡‚̓IƒuƒWƒFƒNƒg‚ð•Ô‚· + if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDropTarget)){ + *ppvObject = (LPVOID)pThis; + ((LPUNKNOWN)*ppvObject)->lpVtbl->AddRef((LPUNKNOWN)*ppvObject); + return S_OK; + } + *ppvObject = NULL; + return ResultFromScode(E_NOINTERFACE); +} + +static ULONG STDMETHODCALLTYPE OLE_IDropTarget_AddRef(LPDROPTARGET pThis) +{ + CONST LPIDROPTARGET_INTERNAL pdti = (LPIDROPTARGET_INTERNAL)pThis; + + /* reference count‚ðƒCƒ“ƒNƒŠƒƒ“ƒg‚·‚é */ + pdti->m_refCnt++; + return pdti->m_refCnt; +} + +static ULONG STDMETHODCALLTYPE OLE_IDropTarget_Release(LPDROPTARGET pThis) +{ + CONST LPIDROPTARGET_INTERNAL pdti = (LPIDROPTARGET_INTERNAL)pThis; + + /* reference count‚ðƒfƒNƒŠƒƒ“ƒg‚·‚é */ + pdti->m_refCnt--; + + /* reference count‚ª 0 ‚É‚È‚Á‚½ê‡‚̓IƒuƒWƒFƒNƒg‚̉ð•ú‚ðs‚¤ */ + if(pdti->m_refCnt == 0L){ + if(pdti->cFormat != NULL){ + GlobalFree(pdti->cFormat); + } + GlobalFree(pdti); + return 0L; + } + return pdti->m_refCnt; +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_DragEnter(LPDROPTARGET pThis, LPDATAOBJECT pdo, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) +{ + return OLE_IDropTarget_Internal_SendMessage(pThis, IDROPTARGET_NOTIFY_DRAGENTER, pdo, grfKeyState, &pt, pdwEffect); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_DragOver(LPDROPTARGET pThis, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) +{ + return OLE_IDropTarget_Internal_SendMessage(pThis, IDROPTARGET_NOTIFY_DRAGOVER, NULL, grfKeyState, &pt, pdwEffect); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_DragLeave(LPDROPTARGET pThis) +{ + return OLE_IDropTarget_Internal_SendMessage(pThis, IDROPTARGET_NOTIFY_DRAGLEAVE, NULL, 0, NULL, NULL); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropTarget_Drop(LPDROPTARGET pThis, LPDATAOBJECT pdo, DWORD grfKeyState, POINTL pt, LPDWORD pdwEffect) +{ + return OLE_IDropTarget_Internal_SendMessage(pThis, IDROPTARGET_NOTIFY_DROP, pdo, grfKeyState, &pt, pdwEffect); +} + +static HRESULT APIPRIVATE OLE_IDropTarget_Internal_SendMessage(LPDROPTARGET pThis, UINT uNotify, LPDATAOBJECT pdo, DWORD grfKeyState, POINTL *ppt, LPDWORD pdwEffect) +{ + CONST LPIDROPTARGET_INTERNAL pdti = (LPIDROPTARGET_INTERNAL)pThis; + CONST LPIDROPTARGET_NOTIFY pdtn = &(pdti->dtn); + STGMEDIUM sm; + UINT cfFormat = 0; + int i; + + if(pdo){ + /* ‘Ήž‚µ‚Ä‚¢‚éƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚ª‚ ‚é‚©’²‚ׂé */ + for(i = 0;i < pdti->cfcnt;i++){ + if(DropTarget_QueryGetData(pdo, pdti->cFormat[i]) == S_OK){ + cfFormat = pdti->cFormat[i]; + break; + } + } + /* ƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚©‚çƒf[ƒ^‚ðŽæ“¾‚·‚é */ + if(cfFormat != 0){ + if (DropTarget_GetData(pdo, cfFormat, &sm) != S_OK){ + cfFormat = 0; + } + } + } + pdtn->ppt = ppt; /* ƒ}ƒEƒXƒ|ƒCƒ“ƒ^‚̈ʒu */ + pdtn->grfKeyState = grfKeyState; /* ƒL[Aƒ}ƒEƒXƒ{ƒ^ƒ“‚̏ó‘Ô */ + pdtn->cfFormat = cfFormat; /* ƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg */ + pdtn->hMem = sm.hGlobal; /* ŽÀƒf[ƒ^ */ + pdtn->pdo = pdo; /* IDataObject */ + + /* ƒEƒBƒ“ƒhƒE‚ɃCƒxƒ“ƒg‚ð’Ê’m‚·‚é */ + SendMessage(pdti->hWnd, pdti->uCallbackMessage, (WPARAM)uNotify, (LPARAM)pdtn); + + /* ƒNƒŠƒbƒvƒ{[ƒhŒ`Ž®‚̃f[ƒ^‚̉ð•ú */ + if(cfFormat){ + ReleaseStgMedium(&sm); + } + + /* Œø‰Ê‚̐ݒè */ + if(pdwEffect){ + *pdwEffect &= pdtn->dwEffect; + + if((*pdwEffect & DROPEFFECT_MOVE) && (*pdwEffect & DROPEFFECT_COPY)){ + *pdwEffect ^= DROPEFFECT_COPY; + pdtn->dwEffect ^= DROPEFFECT_COPY; + } + } + return S_OK; +} + +static HRESULT APIPRIVATE DropTarget_GetData(LPDATAOBJECT pdo, UINT cfFormat, LPSTGMEDIUM psm) +{ + FORMATETC fmt; + + /* IDataObject‚ɃNƒŠƒbƒvƒ{[ƒhŒ`Ž®‚̃f[ƒ^‚ð—v‹‚·‚é */ + fmt.cfFormat = cfFormat; + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = FormatToTymed(cfFormat); + return pdo->lpVtbl->GetData(pdo, &fmt, psm); +} + +static HRESULT APIPRIVATE DropTarget_QueryGetData(LPDATAOBJECT pdo, UINT cfFormat) +{ + FORMATETC fmt; + + /* IDataObject‚ÉŽw’è‚̃NƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚ª‘¶Ý‚·‚é‚©–â‚¢‡‚킹‚é */ + fmt.cfFormat = cfFormat; + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = FormatToTymed(cfFormat); + return pdo->lpVtbl->QueryGetData(pdo, &fmt); +} + + +/****************************************************************************** + + IEnumFORMATETC + +******************************************************************************/ + +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_QueryInterface(LPENUMFORMATETC lpThis, REFIID riid, LPVOID FAR* lplpvObj); +static ULONG STDMETHODCALLTYPE OLE_IEnumFORMATETC_AddRef(LPENUMFORMATETC lpThis); +static ULONG STDMETHODCALLTYPE OLE_IEnumFORMATETC_Release(LPENUMFORMATETC lpThis); +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Next(LPENUMFORMATETC lpThis, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched); +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Skip(LPENUMFORMATETC lpThis, ULONG celt); +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Reset(LPENUMFORMATETC lpThis); +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Clone(LPENUMFORMATETC lpThis, IEnumFORMATETC **ppenum); + +/* IEnumFORMATETC Virtual Table */ +static IEnumFORMATETCVtbl efv = { + OLE_IEnumFORMATETC_QueryInterface, + OLE_IEnumFORMATETC_AddRef, + OLE_IEnumFORMATETC_Release, + OLE_IEnumFORMATETC_Next, + OLE_IEnumFORMATETC_Skip, + OLE_IEnumFORMATETC_Reset, + OLE_IEnumFORMATETC_Clone +}; + +typedef struct _IENUMFORMATETC_INTERNAL{ + LPVOID lpVtbl; + ULONG m_refCnt; + LPUNKNOWN m_pUnknownObj; + ULONG m_currElement; + ULONG m_numFormats; + LPFORMATETC m_formatList; +}IENUMFORMATETC_INTERNAL , *LPIENUMFORMATETC_INTERNAL; + +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_QueryInterface(LPENUMFORMATETC lpThis, REFIID riid, LPVOID FAR* lplpvObj) +{ + //—v‹‚³‚ꂽIID‚Æ“¯‚¶ê‡‚̓IƒuƒWƒFƒNƒg‚ð•Ô‚· + if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumFORMATETC)){ + *lplpvObj = (LPVOID) lpThis; + ((LPUNKNOWN)*lplpvObj)->lpVtbl->AddRef(((LPUNKNOWN)*lplpvObj)); + return S_OK; + } + *lplpvObj = NULL; + return ResultFromScode(E_NOINTERFACE); +} + +static ULONG STDMETHODCALLTYPE OLE_IEnumFORMATETC_AddRef(LPENUMFORMATETC lpThis) +{ + CONST LPIENUMFORMATETC_INTERNAL pefi = (LPIENUMFORMATETC_INTERNAL)lpThis; + + /* reference count‚ðƒCƒ“ƒNƒŠƒƒ“ƒg‚·‚é */ + pefi->m_refCnt++; + /* eƒIƒuƒWƒFƒNƒg‚Ìreference count‚ð‰Á‚¦‚é */ + pefi->m_pUnknownObj->lpVtbl->AddRef(pefi->m_pUnknownObj); + return pefi->m_refCnt; +} + +static ULONG STDMETHODCALLTYPE OLE_IEnumFORMATETC_Release(LPENUMFORMATETC lpThis) +{ + CONST LPIENUMFORMATETC_INTERNAL pefi = (LPIENUMFORMATETC_INTERNAL)lpThis; + + /* reference count‚ðƒfƒNƒŠƒƒ“ƒg‚·‚é */ + pefi->m_refCnt--; + /* eƒIƒuƒWƒFƒNƒg‚Ìreference count‚ðŒ¸‚ç‚· */ + pefi->m_pUnknownObj->lpVtbl->Release(pefi->m_pUnknownObj); + + /* reference count‚ª 0 ‚É‚È‚Á‚½ê‡‚̓IƒuƒWƒFƒNƒg‚̉ð•ú‚ðs‚¤ */ + if(pefi->m_refCnt == 0L){ + if(pefi->m_formatList != NULL){ + GlobalFree(pefi->m_formatList); + } + GlobalFree(pefi); + return 0L; + } + return pefi->m_refCnt; +} + +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Next(LPENUMFORMATETC lpThis, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) +{ + ULONG i; + ULONG cReturn=0L; + LPIENUMFORMATETC_INTERNAL lpefi = ((LPIENUMFORMATETC_INTERNAL)lpThis); + + if(pceltFetched){ + *pceltFetched = 0L; + } + if(lpefi->m_formatList == NULL){ + return ResultFromScode(S_FALSE); + } + + if(rgelt == NULL){ + if(celt == 1){ + return ResultFromScode(S_FALSE); + }else{ + return ResultFromScode(E_POINTER); + } + } + + if(lpefi->m_currElement >= lpefi->m_numFormats){ + return ResultFromScode(S_FALSE); + } + + for(i = 0;i < celt && lpefi->m_currElement < lpefi->m_numFormats;i++, lpefi->m_currElement++){ + *rgelt = lpefi->m_formatList[lpefi->m_currElement]; + rgelt++; + } + + if(pceltFetched != NULL){ + *pceltFetched = i; + } + return S_OK; + +} + +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Skip(LPENUMFORMATETC lpThis, ULONG celt) +{ + LPIENUMFORMATETC_INTERNAL lpefi = ((LPIENUMFORMATETC_INTERNAL)lpThis); + + lpefi->m_currElement += celt; + + if(lpefi->m_currElement > lpefi->m_numFormats){ + lpefi->m_currElement = lpefi->m_numFormats; + return ResultFromScode(S_FALSE); + } + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Reset(LPENUMFORMATETC lpThis) +{ + LPIENUMFORMATETC_INTERNAL lpefi = ((LPIENUMFORMATETC_INTERNAL)lpThis); + + lpefi->m_currElement = 0L; + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE OLE_IEnumFORMATETC_Clone(LPENUMFORMATETC lpThis, IEnumFORMATETC **ppenum) +{ + LPIENUMFORMATETC_INTERNAL pNew; + LPIENUMFORMATETC_INTERNAL lpefi = ((LPIENUMFORMATETC_INTERNAL)lpThis); + UINT i; + + /* IEnumFORMATETC‚ðì¬‚·‚é */ + pNew = GlobalAlloc(GPTR, sizeof(IENUMFORMATETC_INTERNAL)); + if(pNew == NULL){ + return ResultFromScode(E_OUTOFMEMORY); + } + pNew->lpVtbl = (LPVOID)&efv; + pNew->m_refCnt = 0; + pNew->m_currElement = 0; + + pNew->m_pUnknownObj = lpefi->m_pUnknownObj; + pNew->m_numFormats = lpefi->m_numFormats; + + /* ƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚̃ŠƒXƒg‚ðƒRƒs[‚·‚é */ + pNew->m_formatList = GlobalAlloc(GPTR, sizeof(FORMATETC) * pNew->m_numFormats); + if(pNew->m_formatList != NULL){ + for(i = 0;i < pNew->m_numFormats;i++){ + pNew->m_formatList[i] = lpefi->m_formatList[i]; + } + } + + *ppenum = (struct IEnumFORMATETC *)pNew; + if(pNew == NULL){ + return ResultFromScode(E_OUTOFMEMORY); + } + ((LPENUMFORMATETC)pNew)->lpVtbl->AddRef(((LPENUMFORMATETC)pNew)); + pNew->m_currElement = lpefi->m_currElement; + return S_OK; +} + + +/****************************************************************************** + + IDataObject + +******************************************************************************/ + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_QueryInterface(LPDATAOBJECT lpThis, REFIID riid, LPVOID FAR *lplpvObj); +static ULONG STDMETHODCALLTYPE OLE_IDataObject_AddRef(LPDATAOBJECT lpThis); +static ULONG STDMETHODCALLTYPE OLE_IDataObject_Release(LPDATAOBJECT lpThis); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_GetData(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, STGMEDIUM *pmedium); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_GetDataHere(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, STGMEDIUM *pmedium); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_QueryGetData(LPDATAOBJECT lpThis, FORMATETC *pFormatetc); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_GetCanonicalFormatEtc(LPDATAOBJECT lpThis, FORMATETC *pFormatetcIn, FORMATETC *pFormatetcOut); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_SetData(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, STGMEDIUM *pmedium, BOOL fRelease); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_EnumFormatEtc(LPDATAOBJECT lpThis, DWORD dwDirection, IEnumFORMATETC **ppenumFormatetc); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_DAdvise(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_DUnadvise(LPDATAOBJECT lpThis, DWORD dwConnection); +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_EnumDAdvise(LPDATAOBJECT lpThis, IEnumSTATDATA **ppenumAdvise); + +/* IDataObject Virtual Table */ +static IDataObjectVtbl dov = { + OLE_IDataObject_QueryInterface, + OLE_IDataObject_AddRef, + OLE_IDataObject_Release, + OLE_IDataObject_GetData, + OLE_IDataObject_GetDataHere, + OLE_IDataObject_QueryGetData, + OLE_IDataObject_GetCanonicalFormatEtc, + OLE_IDataObject_SetData, + OLE_IDataObject_EnumFormatEtc, + OLE_IDataObject_DAdvise, + OLE_IDataObject_DUnadvise, + OLE_IDataObject_EnumDAdvise +}; + +typedef struct _IDATAOBJECT_INTERNAL{ + LPVOID lpVtbl; + ULONG m_refCnt; + UINT m_numTypes; + UINT m_maxTypes; + FORMATETC *m_typeList; + HWND hWnd; + UINT uCallbackMessage; +}IDATAOBJECT_INTERNAL , *LPIDATAOBJECT_INTERNAL; + + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_QueryInterface(LPDATAOBJECT lpThis, REFIID riid, LPVOID FAR *lplpvObj) +{ + //—v‹‚³‚ꂽIID‚Æ“¯‚¶ê‡‚̓IƒuƒWƒFƒNƒg‚ð•Ô‚· + if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDataObject)){ + *lplpvObj = lpThis; + ((LPUNKNOWN)*lplpvObj)->lpVtbl->AddRef(((LPUNKNOWN)*lplpvObj)); + return S_OK; + } + *lplpvObj = NULL; + return ResultFromScode(E_NOINTERFACE); +} + +static ULONG STDMETHODCALLTYPE OLE_IDataObject_AddRef(LPDATAOBJECT lpThis) +{ + CONST LPIDATAOBJECT_INTERNAL pdoi = (LPIDATAOBJECT_INTERNAL)lpThis; + + /* reference count‚ðƒCƒ“ƒNƒŠƒƒ“ƒg‚·‚é */ + pdoi->m_refCnt++; + return pdoi->m_refCnt; +} + +static ULONG STDMETHODCALLTYPE OLE_IDataObject_Release(LPDATAOBJECT lpThis) +{ + CONST LPIDATAOBJECT_INTERNAL pdoi = (LPIDATAOBJECT_INTERNAL)lpThis; + + /* reference count‚ðƒfƒNƒŠƒƒ“ƒg‚·‚é */ + pdoi->m_refCnt--; + + /* reference count‚ª 0 ‚É‚È‚Á‚½ê‡‚̓IƒuƒWƒFƒNƒg‚̉ð•ú‚ðs‚¤ */ + if(pdoi->m_refCnt == 0L){ + if(pdoi->m_typeList != NULL){ + GlobalFree(pdoi->m_typeList); + } + GlobalFree(pdoi); + return 0L; + } + return pdoi->m_refCnt; +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_GetData(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, STGMEDIUM *pmedium) +{ + CONST LPIDATAOBJECT_INTERNAL pdoi = (LPIDATAOBJECT_INTERNAL)lpThis; + HGLOBAL hMem; + UINT i; + + /* —v‹‚³‚ꂽƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚ª‘¶Ý‚·‚é‚©’²‚ׂé */ + for(i = 0;i < pdoi->m_numTypes;i++){ + if(pdoi->m_typeList[i].cfFormat == pFormatetc->cfFormat){ + break; + } + } + if(i == pdoi->m_numTypes){ + /* —v‹‚³‚ꂽƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚ðƒTƒ|[ƒg‚µ‚Ä‚È‚¢ê‡ */ + return ResultFromScode(DV_E_FORMATETC); + } + + // ƒ}ƒEƒX‚̃hƒ‰ƒbƒO’†‚Í WM_GETDATA ‚ð‘—‚ç‚È‚¢‚悤‚É‚·‚éB(2007.9.3 yutaka) + if (GetAsyncKeyState(VK_LBUTTON) & 0x8000 || + GetAsyncKeyState(VK_RBUTTON) & 0x8000) { + return ResultFromScode(DV_E_FORMATETC); + } + + /* ƒEƒBƒ“ƒhƒE‚Ƀf[ƒ^‚Ì—v‹‚ðs‚¤ */ + SendMessage(pdoi->hWnd, pdoi->uCallbackMessage, (WPARAM)pdoi->m_typeList[i].cfFormat, (LPARAM)&hMem); + if(hMem == NULL){ + return ResultFromScode(STG_E_MEDIUMFULL); + } + pmedium->hGlobal = hMem; + pmedium->tymed = FormatToTymed(pFormatetc->cfFormat); + pmedium->pUnkForRelease = NULL; + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_GetDataHere(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, STGMEDIUM *pmedium) +{ + return ResultFromScode(E_NOTIMPL); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_QueryGetData(LPDATAOBJECT lpThis, FORMATETC *pFormatetc) +{ + CONST LPIDATAOBJECT_INTERNAL pdoi = (LPIDATAOBJECT_INTERNAL)lpThis; + UINT i; + + /* —v‹‚³‚ꂽƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚ª‘¶Ý‚·‚é‚©’²‚ׂé */ + for(i = 0;i < pdoi->m_numTypes;i++){ + if(pdoi->m_typeList[i].cfFormat == pFormatetc->cfFormat){ + return S_OK; + } + } + return ResultFromScode(DV_E_FORMATETC); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_GetCanonicalFormatEtc(LPDATAOBJECT lpThis, FORMATETC *pFormatetcIn, FORMATETC *pFormatetcOut) +{ + return ResultFromScode(E_NOTIMPL); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_SetData(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, STGMEDIUM *pmedium, BOOL fRelease) +{ + return ResultFromScode(E_NOTIMPL); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_EnumFormatEtc(LPDATAOBJECT lpThis, DWORD dwDirection, IEnumFORMATETC **ppenumFormatetc) +{ + CONST LPIDATAOBJECT_INTERNAL pdoi = (LPIDATAOBJECT_INTERNAL)lpThis; + static IENUMFORMATETC_INTERNAL *pefi; + UINT i; + + if(ppenumFormatetc == NULL){ + return ResultFromScode(E_INVALIDARG); + } + + if(dwDirection != DATADIR_GET){ + *ppenumFormatetc = NULL; + return ResultFromScode(E_NOTIMPL); + } + + /* IEnumFORMATETC‚ðì¬‚·‚é */ + pefi = GlobalAlloc(GPTR, sizeof(IENUMFORMATETC_INTERNAL)); + if(pefi == NULL){ + return E_OUTOFMEMORY; + } + pefi->lpVtbl = (LPVOID)&efv; + pefi->m_refCnt = 0; + pefi->m_currElement = 0; + pefi->m_pUnknownObj = (struct IUnknown *)lpThis; + pefi->m_numFormats = pdoi->m_numTypes; + + /* ƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚̃ŠƒXƒg‚ðƒRƒs[‚·‚é */ + pefi->m_formatList = GlobalAlloc(GPTR, sizeof(FORMATETC) * pefi->m_numFormats); + if(pefi->m_formatList != NULL){ + for(i = 0;i < pefi->m_numFormats;i++){ + pefi->m_formatList[i] = pdoi->m_typeList[i]; + } + } + + ((LPENUMFORMATETC)pefi)->lpVtbl->AddRef(((LPENUMFORMATETC)pefi)); + + *ppenumFormatetc = (struct IEnumFORMATETC *)pefi; + if(*ppenumFormatetc == NULL){ + return E_OUTOFMEMORY; + } + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_DAdvise(LPDATAOBJECT lpThis, FORMATETC *pFormatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) +{ + return ResultFromScode(OLE_E_ADVISENOTSUPPORTED); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_DUnadvise(LPDATAOBJECT lpThis, DWORD dwConnection) +{ + return ResultFromScode(OLE_E_NOCONNECTION); +} + +static HRESULT STDMETHODCALLTYPE OLE_IDataObject_EnumDAdvise(LPDATAOBJECT lpThis, IEnumSTATDATA **ppenumAdvise) +{ + return ResultFromScode(OLE_E_ADVISENOTSUPPORTED); +} + + +/****************************************************************************** + + IDropSource + +******************************************************************************/ + +static HRESULT STDMETHODCALLTYPE OLE_IDropSource_QueryInterface(LPDROPSOURCE lpThis, REFIID riid, LPVOID FAR* lplpvObj); +static ULONG STDMETHODCALLTYPE OLE_IDropSource_AddRef(LPDROPSOURCE lpThis); +static ULONG STDMETHODCALLTYPE OLE_IDropSource_Release(LPDROPSOURCE lpThis); +static HRESULT STDMETHODCALLTYPE OLE_IDropSource_QueryContinueDrag(LPDROPSOURCE lpThis, BOOL fEscapePressed, DWORD grfKeyState); +static HRESULT STDMETHODCALLTYPE OLE_IDropSource_GiveFeedback(LPDROPSOURCE lpThis, DWORD dwEffect); + +/* IDropSource Virtual Table */ +static IDropSourceVtbl dsv = { + OLE_IDropSource_QueryInterface, + OLE_IDropSource_AddRef, + OLE_IDropSource_Release, + OLE_IDropSource_QueryContinueDrag, + OLE_IDropSource_GiveFeedback, +}; + +typedef struct _IDROPSOURCE_INTERNAL{ + LPVOID lpVtbl; + ULONG m_refCnt; + DWORD m_keyState; + DWORD m_button; + HWND m_hWnd; + UINT m_uCallbackDragOverMessage; +}IDROPSOURCE_INTERNAL , *LPIDROPSOURCE_INTERNAL; + +static HRESULT STDMETHODCALLTYPE OLE_IDropSource_QueryInterface(LPDROPSOURCE lpThis, REFIID riid, LPVOID FAR *lplpvObj) +{ + //—v‹‚³‚ꂽIID‚Æ“¯‚¶ê‡‚̓IƒuƒWƒFƒNƒg‚ð•Ô‚· + if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDropSource)){ + *lplpvObj = (LPVOID) lpThis; + ((LPUNKNOWN)*lplpvObj)->lpVtbl->AddRef(((LPUNKNOWN)*lplpvObj)); + return S_OK; + } + *lplpvObj = NULL; + return ResultFromScode(E_NOINTERFACE); + +} + +static ULONG STDMETHODCALLTYPE OLE_IDropSource_AddRef(LPDROPSOURCE lpThis) +{ + CONST LPIDROPSOURCE_INTERNAL pdsi = (LPIDROPSOURCE_INTERNAL)lpThis; + + /* reference count‚ðƒCƒ“ƒNƒŠƒƒ“ƒg‚·‚é */ + pdsi->m_refCnt++; + return pdsi->m_refCnt; +} + +static ULONG STDMETHODCALLTYPE OLE_IDropSource_Release(LPDROPSOURCE lpThis) +{ + CONST LPIDROPSOURCE_INTERNAL pdsi = (LPIDROPSOURCE_INTERNAL)lpThis; + + /* reference count‚ðƒfƒNƒŠƒƒ“ƒg‚·‚é */ + pdsi->m_refCnt--; + + /* reference count‚ª 0 ‚É‚È‚Á‚½ê‡‚̓IƒuƒWƒFƒNƒg‚̉ð•ú‚ðs‚¤ */ + if(pdsi->m_refCnt == 0L){ + GlobalFree(pdsi); + return 0L; + } + return pdsi->m_refCnt; +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropSource_QueryContinueDrag(LPDROPSOURCE lpThis, BOOL fEscapePressed, DWORD grfKeyState) +{ + CONST LPIDROPSOURCE_INTERNAL pdsi = (LPIDROPSOURCE_INTERNAL)lpThis; + + if(fEscapePressed){ + /* ƒGƒXƒP[ƒv‚ª‰Ÿ‚³‚ꂽê‡‚̓Lƒƒƒ“ƒZƒ‹‚É‚·‚é */ + return ResultFromScode(DRAGDROP_S_CANCEL); + } + + // Mouse over‚Ì’Ê’m (yutaka) + SendMessage(pdsi->m_hWnd, pdsi->m_uCallbackDragOverMessage, 0, 0); + + /* Žw’è‚̃L[‚âƒ}ƒEƒX‚ª—£‚³‚ꂽê‡‚̓hƒƒbƒv‚É‚·‚é */ + if(pdsi->m_button == 0){ + if(grfKeyState != pdsi->m_keyState){ + return ResultFromScode(DRAGDROP_S_DROP); + } + }else{ + if(!(grfKeyState & pdsi->m_button)){ + return ResultFromScode(DRAGDROP_S_DROP); + } + } + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE OLE_IDropSource_GiveFeedback(LPDROPSOURCE lpThis, DWORD dwEffect) +{ + return ResultFromScode(DRAGDROP_S_USEDEFAULTCURSORS); +} + +/* ƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚ÌŠJŽn */ +int APIPRIVATE OLE_IDropSource_Start(HWND hWnd, UINT uCallbackMessage, UINT uCallbackDragOverMessage, UINT *ClipFormtList, int cfcnt, int Effect) +{ + static IDATAOBJECT_INTERNAL *pdoi; + static IDROPSOURCE_INTERNAL *pdsi; + DWORD lpdwEffect; + DWORD keyState; + int i; + int ret; + + /* IDataObject‚̍쐬 */ + pdoi = GlobalAlloc(GPTR, sizeof(IDATAOBJECT_INTERNAL)); + if(pdoi == NULL){ + return -1; + } + pdoi->lpVtbl = (LPVOID)&dov; + pdoi->m_refCnt = 0; + pdoi->m_numTypes = cfcnt; + pdoi->m_maxTypes = cfcnt; + /* —LŒø‚ȃNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚ðÝ’è‚·‚é */ + pdoi->m_typeList = GlobalAlloc(GPTR, sizeof(FORMATETC) * cfcnt); + if(pdoi->m_typeList == NULL){ + GlobalFree(pdoi); + return -1; + } + for(i = 0;i < cfcnt;i++){ + pdoi->m_typeList[i].cfFormat = ClipFormtList[i]; + pdoi->m_typeList[i].ptd = NULL; + pdoi->m_typeList[i].dwAspect = DVASPECT_CONTENT; + pdoi->m_typeList[i].lindex = -1; + pdoi->m_typeList[i].tymed = FormatToTymed(ClipFormtList[i]); + } + pdoi->hWnd = hWnd; + pdoi->uCallbackMessage = uCallbackMessage; + ((LPDATAOBJECT)pdoi)->lpVtbl->AddRef((LPDATAOBJECT)pdoi); + + /* IDropSource‚̍쐬 */ + pdsi = GlobalAlloc(GPTR, sizeof(IDROPSOURCE_INTERNAL)); + if(pdsi == NULL){ + /* IDataObject‚ð‰ð•ú‚·‚é */ + ((LPDATAOBJECT)pdoi)->lpVtbl->Release((LPDATAOBJECT)pdoi); + return -1; + } + pdsi->lpVtbl = (LPVOID)&dsv; + pdsi->m_refCnt = 0; + pdsi->m_hWnd = hWnd; // yutaka + pdsi->m_uCallbackDragOverMessage = uCallbackDragOverMessage; + + /* —LŒø‚ȃL[‚ƃ}ƒEƒX‚̏ó‘Ô */ + if(GetKeyState(VK_RBUTTON) & 0x8000){ + pdsi->m_button = MK_RBUTTON; + }else{ + pdsi->m_button = MK_LBUTTON; + } + + /* Œ»Ý‚̃L[‚ƃ}ƒEƒX‚̏ó‘Ô */ + keyState = 0; + if(GetKeyState(VK_SHIFT) & 0x8000){ + keyState |= MK_SHIFT; + } + if(GetKeyState(VK_CONTROL) & 0x8000){ + keyState |= MK_CONTROL; + } + if(GetKeyState(VK_MENU) & 0x8000){ + keyState |= MK_ALT; + } + if(GetKeyState(VK_LBUTTON) & 0x8000){ + keyState |= MK_LBUTTON; + } + if(GetKeyState(VK_MBUTTON) & 0x8000){ + keyState |= MK_MBUTTON; + } + if(GetKeyState(VK_RBUTTON) & 0x8000){ + keyState |= MK_RBUTTON; + } + pdsi->m_keyState = keyState; + ((LPDROPSOURCE)pdsi)->lpVtbl->AddRef((LPDROPSOURCE)pdsi); + + lpdwEffect = 0; + + /* ƒhƒ‰ƒbƒO&ƒhƒƒbƒv‚ÌŠJŽn */ + ret = DoDragDrop((LPDATAOBJECT)pdoi, (LPDROPSOURCE)pdsi, Effect, &lpdwEffect); + + /* IDataObject‚ð‰ð•ú‚·‚é */ + ((LPDATAOBJECT)pdoi)->lpVtbl->Release((LPDATAOBJECT)pdoi); + /* IDropSource‚ð‰ð•ú‚·‚é */ + ((LPDROPSOURCE)pdsi)->lpVtbl->Release((LPDROPSOURCE)pdsi); + + if(ret == DRAGDROP_S_DROP){ + /* ƒhƒƒbƒvæ‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ªÝ’肵‚½Œø‰Ê‚ð•Ô‚· */ + return lpdwEffect; + } + return -1; +} +/* End of source */ diff --git a/OleDragDrop.h b/OleDragDrop.h new file mode 100644 index 0000000..1fbea01 --- /dev/null +++ b/OleDragDrop.h @@ -0,0 +1,72 @@ +/************************************************************************** + + OleDragDrop.h + + (C) Copyright 1996-2002 By Tomoaki Nakashima. All right reserved. + http://www.nakka.com/ + nakka@nakka.com + +**************************************************************************/ + +#ifndef _INC_OLEDRAGDROP +#define _INC_OLEDRAGDROP + +#define IDROPTARGET_NOTIFY_DRAGENTER 0 +#define IDROPTARGET_NOTIFY_DRAGOVER 1 +#define IDROPTARGET_NOTIFY_DRAGLEAVE 2 +#define IDROPTARGET_NOTIFY_DROP 3 + +typedef struct _IDROPTARGET_NOTIFY{ + POINTL *ppt; //ƒ}ƒEƒX‚̈ʒu + DWORD dwEffect; //ƒhƒ‰ƒbƒO‘€ì‚ŁAƒhƒ‰ƒbƒO‚³‚ê‚é‘Ώۂŋ–‚³‚ê‚éŒø‰Ê + DWORD grfKeyState; //ƒL[‚̏ó‘Ô + UINT cfFormat; //ƒhƒƒbƒv‚³‚ê‚éƒf[ƒ^‚̃NƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg + HANDLE hMem; //ƒhƒƒbƒv‚³‚ê‚éƒf[ƒ^ + LPVOID pdo; //IDataObject +}IDROPTARGET_NOTIFY , *LPIDROPTARGET_NOTIFY; + + + + +//DragTarget +BOOL APIPRIVATE OLE_IDropTarget_RegisterDragDrop(HWND hWnd, UINT uCallbackMessage, UINT *cFormat, int cfcnt); + +//ƒhƒ‰ƒbƒO&ƒhƒƒbƒv‚̃^[ƒQƒbƒg‚Æ‚µ‚Ä“o˜^‚µ‚Ü‚·B + +//[ˆø”] +// ƒhƒ‰ƒbƒO&ƒhƒƒbƒv‘€ì‚ªs‚í‚ꂽ‚Æ‚«‚ÉŽw’è‚̃EƒBƒ“ƒhƒE‚ÌŽw’è‚̃ƒbƒZ[ƒW‚É’Ê’m‚³‚ê‚Ü‚·B +// wParam ‚É‘€ì‚ÌŽí—Þ(IDROPTARGET_NOTIFY_)‚ªÝ’肳‚ê‚Ä‚¢‚Ü‚·B +// lParam ‚É IDROPTARGET_NOTIFY \‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ªÝ’肳‚ê‚Ä‚¢‚Ü‚·B + +// cFormat ‚Í Žó‚¯Žæ‚邱‚Æ‚ª‰Â”\‚ȃNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚̃ŠƒXƒg‚ðŽw’肵‚Ü‚·B +// cfcnt ‚̓NƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚Ì”z—ñ‚Ì—v‘f”‚ðŽw’肵‚Ü‚·B + +void APIPRIVATE OLE_IDropTarget_RevokeDragDrop(HWND hWnd); + +//ƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚̃^[ƒQƒbƒg‚ð‰ðœ‚µ‚Ü‚·B + + + + +//DropSource +int APIPRIVATE OLE_IDropSource_Start(HWND hWnd, UINT uCallbackMessage, UINT uCallbackDragOverMessage, UINT *ClipFormtList, int cfcnt, int Effect); + +//ƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚ðŠJŽn‚·‚é‚Æ‚«‚ÉŽw’肵‚Ü‚·B +//ƒhƒ‰ƒbƒO•ƒhƒƒbƒv‘€ì‚ÍŽ©“®“I‚ɍs‚í‚ê‚Ü‚·‚ªAƒf[ƒ^‚ª•K—v‚ÈŽž‚́AŽw’è‚̃EƒBƒ“ƒhƒEƒƒbƒZ[ƒW‚Ńf[ƒ^—v‹‚ðs‚¢‚Ü‚·B + +//[ˆø”] +// hWnd ‚É uCallbackMessage ‚ð‘—‚Á‚ăf[ƒ^‚Ì—v‹‚ðs‚¢‚Ü‚·B +// ‚±‚ÌŽž wParam ‚É—v‹‚·‚éƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚Ì’l‚ª“ü‚Á‚Ä‚¢‚Ü‚·B +// ƒvƒƒOƒ‰ƒ€‚Í *(HANDLE *)lParam ‚Ƀf[ƒ^‚ðÝ’肵‚Ä•Ô‚µ‚Ü‚·B(NULL‚Å‚à‰Â) + +// ClipFormtList ‚̓Tƒ|[ƒg‚µ‚Ä‚¢‚éƒNƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚Ì”z—ñ‚ðŽw’肵‚Ü‚·B +// cfcnt ‚̓NƒŠƒbƒvƒ{[ƒhƒtƒH[ƒ}ƒbƒg‚Ì”z—ñ‚Ì—v‘f”‚ðŽw’肵‚Ü‚·B + +// Effect ‚Í ƒhƒ‰ƒbƒO‘€ì‚Ńhƒ‰ƒbƒO‚³‚ê‚é‘Ώۂŋ–‚³‚ê‚éŒø‰Ê‚Ì‘g‚ݍ‡‚킹‚ðŽw’肵‚Ü‚·B + +//[–ß‚è’l] +//ƒhƒƒbƒv‚ªs‚í‚ꂽê‡‚́Aƒhƒƒbƒvæ‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ªÝ’肵‚½Œø‰Ê‚ð•Ô‚µ‚Ü‚·B +//ƒLƒƒƒ“ƒZƒ‹‚âƒGƒ‰[‚̏ꍇ‚Í -1 ‚ð•Ô‚µ‚Ü‚·B + + +#endif diff --git a/Resource/FFFTP.APS b/Resource/FFFTP.APS new file mode 100644 index 0000000000000000000000000000000000000000..ecdaab3e064b567f620d05c9819cd69cab67d3a7 GIT binary patch literal 149812 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ĵ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 literal 0 HcmV?d00001 diff --git a/Resource/bitmap1.bmp b/Resource/bitmap1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3712b37914c78850c2f03897338f3f550d548586 GIT binary patch literal 502 zcma)2I}Ur39t35G``xb{ypr~|V0 zi|e!C!p%`(BNKE>2Kqx$M5Y=;y?=9aRoK9mL;uyBZ?vpqR|)t&<>#Tyx>4p<+0;Me zo5GE0S?;07{$br5`Rid2eYp?vqpo}TXA^nWr4R0{{lIQSM^j}j26poAB0H^vj*DcX LPkhroMfr&jccslE2!^qe8J@j-2?hQvupQ#zTA%q?1t4b c57OsUFzuzWlHMEX8vMD;uHE@JJX|!OXNstYa#m0OlOOB47a$0IApigX literal 0 HcmV?d00001 diff --git a/Resource/ffftp.exe.manifest b/Resource/ffftp.exe.manifest new file mode 100644 index 0000000..c423876 --- /dev/null +++ b/Resource/ffftp.exe.manifest @@ -0,0 +1,23 @@ + + + +FFFTP + + + + + + + diff --git a/Resource/icon1.ico b/Resource/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..4044308c6a96c4717d12a7cb3ac4f75b335fe43e GIT binary patch literal 16158 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 x_VZ>oj(#0}fsb$CZvAc{{hr{A9nx% literal 0 HcmV?d00001 diff --git a/Resource/list_bmp.bmp b/Resource/list_bmp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e4a80ae8280e54a4c5c3a0d8634f7dc1bf4b8ede GIT binary patch literal 638 zcmZ`$I}XAy3^fR;AcT4i&cTkvQ94ne63W=IYfiw*mbFJ>gDt%0#-aS&#xKutUhHJE zJx@h#55LCPVXQDFGJ_YHr*$Q7&WYd`=LUesRQkRLav|z3F>;21k0CgptV3Kf^WM0I zv0&I?Q@q(O-VUAk)tkDxX8$UN6(>o ZEf3**d~a3X7B`o{_2L`o)Prr5TPD#p->F(hMf$QCL7;PEt=t}(El@TM;2(F8tK zfseU&+TEvFfLK~pzd#G<@15{j{n?cYNPkhgy4*3Vzw15t_RA?v&$oWz?&I;iLlb!a YOTKU@9<8miHVuJ=vW%v|@(%|W-}V@kBLDyZ literal 0 HcmV?d00001 diff --git a/Resource/nodrop_c.cur b/Resource/nodrop_c.cur new file mode 100644 index 0000000000000000000000000000000000000000..a299255d66209c718ea626df08800226377ae317 GIT binary patch literal 326 zcmZ{eF%E)26h!AQBv_cB7KXxv4V5Ky7Q|hV!b6#`vF1?3lMqi}NwML(E3ram@~4<& zUOpf|kP?WUa{~4Nj_zCq?T(zi%s1!3%=7ZsL_Lrs4i*B}7tn4&8)-<^M#xr+%T9|b z)1t1lxIMHeLQPp{C|nt|h1)!*t!H@Fg4_@PHKfda#M}kUhM0q%$GB_8)HF7Qvgft3 eO^giYwPqlh}>lArPP{@4_sEP_9;;wAe!0%3-C2OEp#*V2kV{ z2`Qr0y14$%@aIaFj5viyD-K2S4teIx4DbH>+rK|JlRs#G;k$X_+>hud?x~GW^Su2y zYNpQd=cd!7Xz9B9`+Kw|TKjWts~%rI8lnl`Ufj3cWH1=~96}R<2O4TJpU*l_X>V)C zX>>Roj_7&&#rk8B5yXsT-Q@E-<{F!|ecaqf7jdG z9cXQ!-Kzc29}M1rn-Lm0z&me#pyhNNk8xi<4a+bW0=Qn?fJ<%x*E}L~P1v;Tr9H-J zzluwz6=_pFII|Y*+t}_`!bKc_uYi(4^((IDj|lT8xbT~R`Hh{99=HajFDoYE7XUy) zDcor7BOc6=1y}FxZUe5XRom{3umqdX0UMHeD%u9wZesk*7Jo}N$GG0;+^o^w$|m|1 zS6_VHp5hu0NBps0uK?>0+JUH&k&Z9SiWqU`1%wuG^4$?G=Y-2Olc;mXSqN`qe201O zqJ;!>CBh0mMs?-wW)D_k)qzS@6;D>)A>ao}xSi*@>=+{UVU8vWEgzG)^qZ!Ilv`PfonJtU*wnCeT?5x=Vjnf3K~}AxsESR z?2NGY@kY1+*qp@SlDhFs7IR+J`jPUh)D6|czsNKAB9g7ne;HTH{Y7$pxV>dp{FC_N zFv0~}snD1F+Ap~;PWY-w6E2Y=IMN9!guRL{%l%dBM#(R-YiSP8xC%Z`GMLE)fwc{~ zl<5$MI9TV<{Y5=Aj}oe2Cn;0i7XlXb>beC)l87q1C)&Dx#9jEb6ZnV&fn5i2`<<>h|6l~3SH z?;C)rxb%}6pZH>i3{xB~wTfd{k{K;#&%9lX28E%Sqe-A⋘}8`>VT`6E3c05E#nHK;>EYDP3oKgqqyc90s)nI+^)sO!z)os~*DPFUgv_anI>rBhu*R4Fi Ks&hd4Kjjk^WXVMU literal 0 HcmV?d00001 diff --git a/Resource_eng/FFFTP-eng.aps b/Resource_eng/FFFTP-eng.aps new file mode 100644 index 0000000000000000000000000000000000000000..72defe17f03f82738acef8a25d2b26dad10cb1f4 GIT binary patch literal 156748 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 F|33-_T_pej literal 0 HcmV?d00001 diff --git a/Resource_eng/FFFTP-eng.rc b/Resource_eng/FFFTP-eng.rc new file mode 100644 index 0000000..65f486e --- /dev/null +++ b/Resource_eng/FFFTP-eng.rc @@ -0,0 +1,2152 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// “ú–{Œê resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_OLEDRAG DIALOGEX 0, 0, 30, 13 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Transfering" +FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 400, 0, 0x80 +BEGIN +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_OLEDRAG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 23 + TOPMARGIN, 7 + BOTTOMMARGIN, 6 + END +END +#endif // APSTUDIO_INVOKED + +#endif // “ú–{Œê resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// ‰pŒê (•Ä‘) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +down_exist_dlg DIALOG 0, 0, 234, 109 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION +CAPTION "Download" +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "&Overwrite existing file",DOWN_EXIST_OVW,"Button",BS_AUTORADIOBUTTON | WS_GROUP,7,39,99,10 + CONTROL "Overwrite if download file is &newer",DOWN_EXIST_NEW, + "Button",BS_AUTORADIOBUTTON,7,51,123,10 + CONTROL "&Resume",DOWN_EXIST_RESUME,"Button",BS_AUTORADIOBUTTON,7,63,99,10 + CONTROL "&Skip",DOWN_EXIST_IGNORE,"Button",BS_AUTORADIOBUTTON,7,75,99,10 + LTEXT "To download with a different name, modify the filename and click Overwrite existing file.",-1,133,38,94,39 + DEFPUSHBUTTON "OK",IDOK,13,91,50,14,WS_GROUP + PUSHBUTTON "&Do All",IDOK_ALL,68,91,50,14 + PUSHBUTTON "&Cancel All",IDCANCEL,123,91,50,14 + PUSHBUTTON "&Help",9,178,91,41,14 + LTEXT "Filename already exists on local disk. Download?",-1,7,7,184,8 + EDITTEXT DOWN_EXIST_NAME,7,20,220,12,ES_AUTOHSCROLL +END + +chmod_dlg DIALOG 0, 0, 171, 109 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Permission" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Current Permission :",-1,61,74,61,8 + EDITTEXT PERM_NOW,124,72,25,12,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Owner",-1,7,7,48,58 + CONTROL "Read",PERM_O_READ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,21,31,10 + CONTROL "Write",PERM_O_WRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,35,31,10 + CONTROL "Execute",PERM_O_EXEC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,50,39,10 + GROUPBOX "Group",-1,61,7,48,58 + CONTROL "Read",PERM_G_READ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,21,31,10 + CONTROL "Write",PERM_G_WRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,35,31,10 + CONTROL "Execute",PERM_G_EXEC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,49,39,10 + GROUPBOX "Others",-1,116,8,48,58 + CONTROL "Read",PERM_A_READ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,22,31,10 + CONTROL "Write",PERM_A_WRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,36,31,10 + CONTROL "Execute",PERM_A_EXEC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,51,39,10 + CONTROL "",-1,"Static",SS_BLACKFRAME,57,69,106,18 + DEFPUSHBUTTON "OK",IDOK,7,92,48,14 + PUSHBUTTON "Cancel",IDCANCEL,61,92,48,14 + PUSHBUTTON "Help",9,116,92,48,14 +END + +about_dlg DIALOGEX 0, 0, 195, 209 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About FFFTP" +FONT 9, "MS Sans Serif", 0, 0, 0x0 +BEGIN + DEFPUSHBUTTON "OK",IDOK,72,188,50,14 + ICON ffftp,-1,7,4,20,20 + CTEXT "FFFTP Ver 1.97b",-1,50,11,90,8 + CTEXT "FFFTP is freeware",-1,7,173,181,8 + CTEXT "Copyright(C) 1997-2010 Sota && cooperators",-1,7,25,181,8 + CTEXT "",ABOUT_JRE,7,57,181,8 + EDITTEXT ABOUT_URL,7,40,181,12,ES_CENTER | ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + CTEXT "OLE D&&D by Yutaka Hirata-san, nakka-san\nIn site file mover by Hirata-san\nAny issues by miau-san\nMaster Password by Gengen-san\nAES encryption by Moca-san\n\nI had cooperation of many other one.",-1,7,106,181,59 + CTEXT "AES program code :\nCopyright (c) 1998-2008, Brian Gladman, Worcester, UK.\nAll rights reserved.",-1,7,74,181,27 +END + +bmark_dlg DIALOG 0, 0, 222, 109 +STYLE DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Bookmarks" +FONT 9, "MS Sans Serif" +BEGIN + LISTBOX BMARK_LIST,7,7,152,75,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "&Close",IDOK,91,90,50,14 + PUSHBUTTON "Chan&ge",BMARK_JUMP,27,90,50,14 + PUSHBUTTON "&New...",BMARK_NEW,165,7,50,14 + PUSHBUTTON "&Modify...",BMARK_SET,165,26,50,14 + PUSHBUTTON "&Delete...",BMARK_DEL,165,45,50,14 + PUSHBUTTON "U&p",BMARK_UP,165,65,23,14 + PUSHBUTTON "Do&wn",BMARK_DOWN,192,65,23,14 + SCROLLBAR BMARK_SIZEGRIP,212,96,10,13,SBS_BOTTOMALIGN | SBS_VERT | SBS_SIZEGRIP + PUSHBUTTON "&Help",9,165,90,50,14 +END + +def_attr_dlg DIALOG 0, 0, 123, 69 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Default Permission" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&Filename",-1,7,7,49,8 + EDITTEXT DEFATTR_FNAME,7,18,47,12,ES_AUTOHSCROLL + LTEXT "->",-1,58,20,8,8 + LTEXT "&Permission",-1,71,7,40,8 + EDITTEXT DEFATTR_ATTR,71,18,31,12,ES_AUTOHSCROLL | ES_NUMBER + PUSHBUTTON "...",DEFATTR_ATTR_BR,102,18,13,12 + LTEXT "(example: 644)",-1,53,35,51,8 + DEFPUSHBUTTON "OK",IDOK,7,48,50,14 + PUSHBUTTON "Cancel",IDCANCEL,66,48,50,14 +END + +opt_fire_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Firewall &Type",-1,7,7,90,8 + COMBOBOX FIRE_TYPE,7,16,197,104,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "Firewall &Hostname",-1,7,32,80,8 + EDITTEXT FIRE_HOST,7,42,150,12,ES_AUTOHSCROLL + LTEXT "&Port",-1,168,32,36,8 + EDITTEXT FIRE_PORT,169,41,35,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Firewall &Username",-1,7,56,72,8 + EDITTEXT FIRE_USER,7,65,70,12,ES_AUTOHSCROLL + LTEXT "Firewall P&assword",-1,81,56,70,8 + EDITTEXT FIRE_PASS,81,65,70,12,ES_PASSWORD | ES_AUTOHSCROLL + LTEXT "&Security",-1,7,80,63,8 + COMBOBOX FIRE_SECURITY,7,89,57,75,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "Use SOCKS se&rver to search for hosts",FIRE_RESOLV, + "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,71,83,139,10 + CONTROL "Use l&owercase OPEN/SITE commands",FIRE_LOWER,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,71,96,139,10 + CONTROL "Us&e the firewall for undefined hosts",FIRE_USEIT, + "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,109,197,10 + CONTROL "Use PAS&V mode for undefined hosts",FIRE_PASV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,122,197,10 + LTEXT "Replace @ by",-1,154,55,50,8 + EDITTEXT FIRE_DELIMIT,154,65,35,12,ES_AUTOHSCROLL +END + +hostlist_dlg DIALOG 0, 0, 222, 120 +STYLE DS_LOCALEDIT | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Host List" +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "Tree1",HOST_LIST,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,7,6,152,89 + DEFPUSHBUTTON "&Connect",IDOK,27,102,50,14 + PUSHBUTTON "C&lose",IDCANCEL,91,102,50,14 + PUSHBUTTON "New &Host...",HOST_NEW,165,6,50,14 + PUSHBUTTON "New &Group...",HOST_FOLDER,165,22,50,14 + PUSHBUTTON "&Modify...",HOST_SET,165,38,50,14 + PUSHBUTTON "Co&py",HOST_COPY,165,54,50,14 + PUSHBUTTON "&Delete...",HOST_DEL,165,70,50,14 + PUSHBUTTON "Up",HOST_UP,165,86,22,14 + PUSHBUTTON "Down",HOST_DOWN,193,86,22,14 + SCROLLBAR HOST_SIZEGRIP,212,106,10,13,SBS_BOTTOMALIGN | SBS_VERT | SBS_SIZEGRIP + PUSHBUTTON "Help",9,165,102,50,14 +END + +hostname_dlg DIALOG 0, 0, 187, 93 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Quick Connect" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&Host Name/Address",-1,7,6,130,8 + COMBOBOX QHOST_HOST,7,16,173,86,CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "&Username",-1,7,34,57,8 + EDITTEXT QHOST_USER,7,44,80,12,ES_AUTOHSCROLL + LTEXT "&Password/Phrase",-1,99,34,87,8 + EDITTEXT QHOST_PASS,99,44,80,12,ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "Use &Firewall",QHOST_FWALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,61,75,10 + CONTROL "Use PAS&V mode",QHOST_PASV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,84,61,83,10 + DEFPUSHBUTTON "OK",IDOK,36,75,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,75,50,14 +END + +hset_adv2_dlg DIALOG 0, 0, 207, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "Use &LIST command to get file list",HSET_LISTCMD,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,7,131,10 + CONTROL "Use &NLST -R for high-speed recursive search",HSET_NLST_R, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,21,167,10 + CONTROL "&Do not use full path to access files",HSET_FULLPATH, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,35,148,10 + LTEXT "&Permissions Change Command",-1,7,51,110,8 + EDITTEXT HSET_CHMOD_CMD,7,61,62,12,ES_AUTOHSCROLL + PUSHBUTTON "Default",HSET_CHMOD_NOR,70,61,28,13 + LTEXT "&Host Type",-1,7,80,69,8 + COMBOBOX HSET_HOSTTYPE,7,90,71,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "NLST &Filename/Option",-1,7,109,89,8 + EDITTEXT HSET_LS_FNAME,7,119,62,12,ES_AUTOHSCROLL + PUSHBUTTON "Delault",HSET_LS_FNAME_NOR,70,119,28,13 +END + +hset_adv_dlg DIALOG 0, 0, 207, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "Use &Firewall",HSET_FIREWALL,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,7,92,10 + CONTROL "Use PAS&V mode",HSET_PASV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,22,92,10 + CONTROL "S&ync. folder movement",HSET_SYNCMOVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,93,10 + LTEXT "&Port",-1,7,56,54,8 + EDITTEXT HSET_PORT,7,66,22,12,ES_AUTOHSCROLL | ES_NUMBER + PUSHBUTTON "Default",HSET_PORT_NOR,30,66,28,13 + LTEXT "&Account",-1,7,87,65,8 + EDITTEXT HSET_ACCOUNT,7,97,62,12,ES_AUTOHSCROLL + LTEXT "Host &Timezone",-1,103,7,81,8 + COMBOBOX HSET_TIMEZONE,103,17,83,102,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "&Security",-1,103,35,72,8 + COMBOBOX HSET_SECURITY,103,45,83,75,CBS_DROPDOWNLIST | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "&Commands After Connection",-1,103,65,97,8 + EDITTEXT HSET_INITCMD,103,76,92,30,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN +END + +hset_code_dlg DIALOGEX 0, 0, 207, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif", 0, 0, 0x0 +BEGIN + GROUPBOX "&Japanese Kanji Code",-1,7,7,98,70,WS_GROUP + CONTROL "No conversion (S-JIS)",HSET_NO_CNV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,12,21,91,10 + CONTROL "JIS",HSET_JIS_CNV,"Button",BS_AUTORADIOBUTTON,12,33,41,10 + CONTROL "EUC",HSET_EUC_CNV,"Button",BS_AUTORADIOBUTTON,12,45,41,10 + CONTROL "Hankaku to Zenkaku",HSET_HANCNV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,12,62,90,10 + GROUPBOX "&Filename Kanji Code",-1,107,7,97,104,WS_GROUP + CONTROL "SHIFT-JIS",HSET_FN_NO_CNV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,111,21,65,10 + CONTROL "JIS",HSET_FN_JIS_CNV,"Button",BS_AUTORADIOBUTTON,111,33,70,10 + CONTROL "EUC",HSET_FN_EUC_CNV,"Button",BS_AUTORADIOBUTTON,111,45,41,10 + CONTROL "Samba-HEX",HSET_FN_SMH_CNV,"Button",BS_AUTORADIOBUTTON,111,57,66,10 + CONTROL "Samba-CAP",HSET_FN_SMC_CNV,"Button",BS_AUTORADIOBUTTON,111,69,64,10 + CONTROL "UTF-8N",HSET_FN_UTF8N_CNV,"Button",BS_AUTORADIOBUTTON,111,81,63,10 + CONTROL "Hankaku to Zenkaku",HSET_FN_HANCNV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,111,96,91,10 +END + +hset_dialup_dlg DIALOG 0, 0, 207, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "&Use Dialup Connection",HSET_DIALUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,110,10 + LTEXT "&Dialup Setting",-1,19,23,97,8 + COMBOBOX HSET_DIALENTRY,19,33,181,101,CBS_DROPDOWNLIST | CBS_SORT | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + CONTROL "&Reconnect if another dialup is active",HSET_DIALUSETHIS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,53,181,10 + CONTROL "&Notify before reconnecting",HSET_DIALNOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,31,67,116,10 +END + +hset_main_dlg DIALOG 0, 0, 207, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Profile &Name",-1,7,7,94,8 + EDITTEXT HSET_HOST,7,17,94,12,ES_AUTOHSCROLL + LTEXT "&Host Name/Address",-1,107,7,73,8 + EDITTEXT HSET_ADRS,106,17,94,12,ES_AUTOHSCROLL + LTEXT "&Username",-1,7,35,60,8 + EDITTEXT HSET_USER,7,45,66,12,ES_AUTOHSCROLL + LTEXT "&Password/Phrase",-1,79,35,94,8 + EDITTEXT HSET_PASS,79,45,64,12,ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "An&onymous",HSET_ANONYMOUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,47,50,10 + LTEXT "Initial &Local Folder",-1,7,63,89,8 + EDITTEXT HSET_LOCAL,7,73,137,12,ES_AUTOHSCROLL + PUSHBUTTON "...",HSET_LOCAL_BR,145,73,12,14 + LTEXT "Initial Ho&st Folder",-1,7,91,94,8 + EDITTEXT HSET_REMOTE,7,101,137,12,ES_AUTOHSCROLL + PUSHBUTTON "Current Folder",HSET_REMOTE_CUR,145,101,55,14 + CONTROL "Use last &accessed folder as default",HSET_LASTDIR, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,122,193,10 +END + +account_dlg DIALOG 0, 0, 187, 42 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Account" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,24,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,24,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,164,30,16,8 +END + +chdir_br_dlg DIALOG 0, 0, 187, 43 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Folder" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,8,159,12,ES_AUTOHSCROLL + PUSHBUTTON "...",INP_BROUSE,167,7,13,14 + DEFPUSHBUTTON "OK",IDOK,36,25,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,25,50,14 +END + +bmark_edit_dlg DIALOG 0, 0, 187, 83 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Bookmark" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&Local Folder",-1,7,7,173,8 + EDITTEXT BEDIT_LOCAL,7,17,173,12,ES_AUTOHSCROLL + LTEXT "&Host Folder",-1,7,37,173,8 + EDITTEXT BEDIT_REMOTE,7,47,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,65,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,65,50,14 +END + +chdir_dlg DIALOG 0, 0, 187, 43 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Folder" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,25,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,25,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,164,31,16,8 +END + +cwderr_dlg DIALOG 0, 0, 155, 57 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Error" +FONT 9, "MS Sans Serif" +BEGIN + PUSHBUTTON "STOP",IDCANCEL,51,36,50,14 + CTEXT "Cannot move to subfolder.",-1,7,7,141,8 + CTEXT "Stop processing.",-1,7,20,141,8 +END + +delete_dlg DIALOG 0, 0, 209, 55 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&Delete",IDOK,7,37,45,14 + PUSHBUTTON "&Cancel",DELETE_NO,57,37,44,14 + PUSHBUTTON "Delete &All",DELETE_ALL,107,37,45,14 + PUSHBUTTON "Ca&ncel All",IDCANCEL,157,37,45,14 + LTEXT "",DELETE_TEXT,7,19,195,8,SS_NOPREFIX + LTEXT "Delete following file?",-1,7,7,167,8 +END + +dial_dlg DIALOG 0, 0, 159, 37 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Cancel",IDCANCEL,54,19,50,14 + CTEXT "",DIAL_STATUS,7,6,145,8,SS_NOPREFIX +END + +dial_password_dlg DIALOG 0, 0, 171, 85 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Enter Username and Password for Dialup",-1,7,4,157,9 + RTEXT "&Username",-1,14,23,45,8 + EDITTEXT RASPASS_USER,62,19,95,14,ES_AUTOHSCROLL + RTEXT "&Password",-1,14,43,45,8 + EDITTEXT RASPASS_PASS,62,41,95,14,ES_PASSWORD | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,24,63,50,14 + PUSHBUTTON "Cancel",IDCANCEL,96,63,50,14 +END + +diskfull_dlg DIALOG 0, 0, 159, 42 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "FFFTP:Error" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Cencal this File",IDOK,13,24,66,14 + PUSHBUTTON "Cencel All",IDCANCEL,95,24,50,14 + CTEXT "Disk is full",-1,7,6,145,10 +END + +downerr_dlg DIALOGEX 0, 0, 159, 65 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION +CAPTION "FFFTP:Error" +FONT 9, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Cancel this File",IDOK,7,47,82,14 + PUSHBUTTON "Cancel All",IDCANCEL,102,47,50,14 + LTEXT "Cannot download following file :",-1,7,4,138,10 + LTEXT "",UPDOWN_ERR_FNAME,7,16,145,8,SS_NOPREFIX + EDITTEXT UPDOWN_ERR_MSG,7,29,145,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_STATICEDGE +END + +opt_misc_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "&Save window position",MISC_WINPOS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,173,10 + CONTROL "&Cache file list (activate on next start)",MISC_CACHE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,21,196,10 + RTEXT "&No. of cache files",IDC_STATIC,23,35,87,8 + EDITTEXT MISC_BUFNUM,115,33,24,14,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",MISC_BUFNUM_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS,139,33,9,14 + LTEXT "(1 to 99)",IDC_STATIC,152,37,28,8 + CONTROL "S&ave cache",MISC_CACHE_SAVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,51,116,10 + LTEXT "&Folder for cache files / temporary files",IDC_STATIC,7,64,158,8 + EDITTEXT MISC_CACHEDIR,7,74,155,12,ES_AUTOHSCROLL + PUSHBUTTON "...",MISC_CACHEDIR_BR,163,74,13,13 + PUSHBUTTON "Default",MISC_CACHEDIR_DEF,177,74,26,13 + CONTROL "Sa&ve settings to the ffftp.ini file, instead of the registry",MISC_REGTYPE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,92,173,10 + CONTROL "Debug",MISC_DEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,123,40,10 +END + +downname_dlg DIALOG 0, 0, 187, 42 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Download File" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,6,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,24,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,24,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,164,30,16,8 +END + +exit_dlg DIALOG 0, 0, 143, 64 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Exit" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Cancel",IDCANCEL,14,46,50,14 + PUSHBUTTON "Force Exit",IDOK,78,46,50,14 + LTEXT "File transfer is now in progress.\n\nPlease quit FFFTP after the file transfer done.",-1,7,7,129,35 +END + +FILEOPENORD_1 DIALOG 109, 35, 165, 134 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Open" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&Folder",-1,7,6,92,9 + LISTBOX lst2,7,32,92,68,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "&Drive",stc4,7,104,92,9 + COMBOBOX cmb2,7,114,92,68,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,105,6,50,14,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,105,24,50,14,WS_GROUP + PUSHBUTTON "&Help",psh15,105,46,50,14,WS_GROUP + CONTROL "&Read Only",chx1,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,105,68,50,12 + LISTBOX lst1,102,99,20,20,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | NOT WS_VISIBLE | WS_VSCROLL + LTEXT "File &Name:",stc3,121,83,12,10,NOT WS_VISIBLE + EDITTEXT edt1,104,83,12,12,ES_AUTOHSCROLL | ES_OEMCONVERT | NOT WS_VISIBLE | NOT WS_TABSTOP + LTEXT "List Files of &Type:",stc2,127,99,12,9,NOT WS_VISIBLE + COMBOBOX cmb1,107,115,16,36,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | NOT WS_VISIBLE | WS_BORDER | WS_VSCROLL + LTEXT "",stc1,9,18,88,8 +END + +filesize_dlg DIALOG 0, 0, 131, 76 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "File Size" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,42,55,50,14 + CTEXT "",FSIZE_SIZE,7,18,117,8 + CTEXT "",FSIZE_TITLE,7,7,117,8 + CTEXT "Including all files in subfolder.",-1,7,30,117,19,SS_CENTERIMAGE | SS_SUNKEN +END + +filesize_notify_dlg DIALOG 0, 0, 155, 70 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "File Size" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,23,49,50,14 + PUSHBUTTON "Cancel",IDCANCEL,82,49,50,14 + CONTROL "&Calcualte only the selected files.",FSNOTIFY_SEL_ONLY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,33,141,10 + CTEXT "",FSNOTIFY_TITLE,7,7,142,8 + CTEXT "( This may take a few minutes. )",FSNOTIFY_TITLE,7,19,141,8 +END + +filter_dlg DIALOG 0, 0, 187, 79 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Filter" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Use semicolons to delineate multiple filters.\n (Example *.txt;*.log)\nFile transfer is also affected by this filter setting.",-1,13,29,167,27 + EDITTEXT FILTER_STR,7,8,147,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,7,61,41,14 + PUSHBUTTON "All",FILTER_NOR,51,61,41,14 + PUSHBUTTON "Cancel",IDCANCEL,95,61,41,14 + PUSHBUTTON "Help",9,139,61,41,14 +END + +find_dlg DIALOG 0, 0, 187, 56 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + CONTROL "Regular Expression",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,24,121,10 + DEFPUSHBUTTON "OK",IDOK,36,38,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,38,50,14 +END + +forcerename_dlg DIALOG 0, 0, 187, 67 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Download" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,29,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,31,49,50,14 + PUSHBUTTON "Cancel",IDCANCEL,104,49,50,14 + LTEXT "Invalid character specified in filename.\nRename the file.",IDC_STATIC,7,7,173,16 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,172,55,8,8 +END + +fname_in_dlg DIALOG 0, 0, 86, 44 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,72,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,7,26,33,14 + PUSHBUTTON "Cancel",IDCANCEL,46,26,33,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,71,23,8,10 +END + +group_dlg DIALOG 0, 0, 187, 42 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Group Name" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,24,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,24,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,164,30,16,8 +END + +hostconnect_dlg DIALOG 0, 0, 166, 106 +STYLE DS_LOCALEDIT | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Host List" +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "Tree1",HOST_LIST,"SysTreeView32",TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_FULLROWSELECT | WS_BORDER | WS_TABSTOP,7,6,152,75 + DEFPUSHBUTTON "&Connect",IDOK,20,88,50,14 + PUSHBUTTON "Cl&ose",IDCANCEL,96,88,50,14 + SCROLLBAR HOST_SIZEGRIP,156,92,10,13,SBS_BOTTOMALIGN | SBS_VERT | SBS_SIZEGRIP + PUSHBUTTON "?????(&N)...",HOST_NEW,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "????????(&G)...",HOST_FOLDER,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "????(&M)...",HOST_SET,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "???(&C)",HOST_COPY,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "??(&D)...",HOST_DEL,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "?",HOST_UP,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "?",HOST_DOWN,153,88,6,14,NOT WS_VISIBLE | WS_DISABLED +END + +hostdel_dlg DIALOG 0, 0, 134, 39 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Delete Host" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&Yes",IDOK,11,21,50,14 + PUSHBUTTON "&No",IDCANCEL,73,21,50,14 + LTEXT "Delete this host?",-1,7,6,120,10 +END + +groupdel_dlg DIALOG 0, 0, 135, 47 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Delete Group" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&Yes",IDOK,11,29,50,14 + PUSHBUTTON "&No",IDCANCEL,73,29,50,14 + LTEXT "Delete this group and all hosts in the group?",-1,7,6,121,18 +END + +mailadrs_dlg DIALOG 0, 0, 187, 89 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION +CAPTION "FFFTP" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,13,71,50,14 + PUSHBUTTON "Cancel",IDCANCEL,68,71,50,14 + PUSHBUTTON "Help",9,123,71,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,172,61,8,8 + LTEXT "Enter ypur mail address.\nThis address is used for the anonymous FTP password.",-1,16,25,164,26 + LTEXT "You can reenter mail address at the Option dialog.",-1,16,54,164,10 +END + +mirror_down_dlg DIALOG 0, 0, 215, 155 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Mirroring Download" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&Display Transfer Files",MIRRORUP_DISP,9,134,85,14 + PUSHBUTTON "Cancel",IDCANCEL,106,134,50,14 + PUSHBUTTON "Help",9,168,134,36,14 + LTEXT "",-1,7,19,201,78,SS_SUNKEN | NOT WS_GROUP + LTEXT "The following processes are required:\n\n *Copy some files from the host to the local disk.\n\n *Delete some files from the local disk.",-1,35,26,166,64 + CTEXT "Mirror Download",-1,7,7,201,8 + CTEXT "*** DOWNLOAD ***",-1,7,105,201,8 + LTEXT "Confirm?",-1,42,121,166,8 + ICON notify,-1,12,34,20,20 +END + +mirror_notify_dlg DIALOG 0, 0, 174, 171 +STYLE DS_LOCALEDIT | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Mirror Upload" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Copy/Delete following files",-1,7,6,160,8 + LISTBOX MIRROR_LIST,7,16,160,78,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Start Now",IDOK,7,153,50,14 + PUSHBUTTON "Cancel",IDCANCEL,62,153,50,14 + SCROLLBAR MIRROR_SIZEGRIP,164,158,10,13,SBS_BOTTOMALIGN | SBS_VERT | SBS_SIZEGRIP + PUSHBUTTON "Help",9,117,153,50,14 + PUSHBUTTON "Remove from List",MIRROR_DEL,111,96,56,14,NOT WS_TABSTOP + LTEXT "",MIRROR_COPYNUM,7,115,160,8 + LTEXT "",MIRROR_MAKENUM,7,126,160,8 + LTEXT "",MIRROR_DELNUM,7,137,160,8 +END + +mirror_up_dlg DIALOG 0, 0, 215, 135 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Mirror Upload" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Display Transfer Files",MIRRORUP_DISP,54,114,82,14 + PUSHBUTTON "Start Now",IDOK,7,114,43,14 + PUSHBUTTON "Cancel",IDCANCEL,140,114,36,14 + PUSHBUTTON "Help",9,180,114,27,14 + LTEXT "",-1,7,20,201,76,SS_SUNKEN | NOT WS_GROUP + LTEXT "The following processes are required:\n\n *Copy some files from the local disk to the host.\n\n *Delete some files from the host.\n\nClick Display Transfer Files to confirm the files copied/deleted.",-1,35,26,166,66 + CTEXT "Mirror Upload",-1,7,7,201,8 + LTEXT "Confirm?",-1,37,102,171,8 + ICON notify,-1,12,46,20,20 +END + +mirrordown_notify_dlg DIALOG 0, 0, 174, 171 +STYLE DS_LOCALEDIT | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +CAPTION "Mirror Download" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Copy/Delete following files",-1,7,6,92,8 + LISTBOX MIRROR_LIST,7,16,160,78,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Start Now",IDOK,7,153,50,14 + PUSHBUTTON "Cancel",IDCANCEL,62,153,50,14 + SCROLLBAR MIRROR_SIZEGRIP,164,158,10,13,SBS_BOTTOMALIGN | SBS_VERT | SBS_SIZEGRIP + PUSHBUTTON "Help",9,117,153,50,14 + PUSHBUTTON "Remove from List",MIRROR_DEL,111,96,56,14,NOT WS_TABSTOP + LTEXT "",MIRROR_COPYNUM,7,115,160,8 + LTEXT "",MIRROR_MAKENUM,7,126,160,8 + LTEXT "",MIRROR_DELNUM,7,137,160,8 +END + +mkdir_dlg DIALOG 0, 0, 187, 58 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,21,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,40,50,14 + PUSHBUTTON "Cancel",IDCANCEL,102,40,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,167,40,13,10 + LTEXT "Enter new folder name:",-1,7,7,160,8 +END + +noresume_dlg DIALOG 0, 0, 191, 47 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION +CAPTION "FFFTP:Error" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Yes",IDOK,10,29,45,14 + PUSHBUTTON "Cancel This File",IDCANCEL,65,29,59,14 + PUSHBUTTON "Cancel All",RESUME_CANCEL_ALL,134,29,45,14 + LTEXT "This host doesn't support Resume command.\nOverwrite existing file?",-1,7,4,177,17 +END + +opt_connect_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "&Display Host List dialog at startup",CONNECT_CONNECT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,173,10 + CONTROL "Show &Edit button in Host List dialog",CONNECT_OLDDLG, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,22,173,10 + CONTROL "&Close dialup connection (RAS) at program exit",CONNECT_RASCLOSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,196,10 + CONTROL "Co&nfirm before closing dialup connection",CONNECT_CLOSE_NOTIFY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,27,52,161,10 + RTEXT "Recently connected &host list",-1,17,68,93,8 + EDITTEXT CONNECT_HIST,113,66,17,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",CONNECT_HIST_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,130,65,9,14 + LTEXT "(0 to 20 entries)",-1,143,68,53,8 + CONTROL "&Save password in history",CONNECT_HIST_PASS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,82,129,10 + CONTROL "&Use anonymous FTP for quick connect",CONNECT_QUICK_ANONY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,95,196,10 + CONTROL "Send &QUIT command at disconnect",CONNECT_SENDQUIT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,109,173,10 + CONTROL "Do not control dialup (&RAS) connection",CONNECT_NORAS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,122,173,10 +END + +opt_disp_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + PUSHBUTTON "&Change",DISP_FONT_BR,167,7,36,14,WS_GROUP + LTEXT "",-1,7,7,159,14,SS_NOPREFIX | SS_SUNKEN + LTEXT "Font :",-1,9,11,29,8 + LTEXT "",DISP_FONT,40,11,123,8,SS_NOPREFIX + CONTROL "Do not display &hidden files/folders",DISP_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,30,172,10 + LTEXT "If this box is checked, hidden files/folders are not transferred during Mirror operations.",-1,29,44,167,27,SS_SUNKEN + CONTROL "&Display drives in the file list",DISP_DRIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,76,172,10 +END + +opt_mirror_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Files Not Transferred",-1,7,7,95,85,WS_GROUP + LISTBOX MIRROR_NOTRN_LIST,12,20,50,69,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add...",MIRROR_NOTRN_ADD,66,20,31,14 + PUSHBUTTON "Delete",MIRROR_NOTRN_DEL,66,37,31,14 + LTEXT "Folder names are also OK",-1,65,56,33,33,SS_SUNKEN + GROUPBOX "Files Not Deleted",-1,108,7,95,86,WS_GROUP + LISTBOX MIRROR_NODEL_LIST,113,20,50,69,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add...",MIRROR_NODEL_ADD,167,20,31,14 + PUSHBUTTON "Delete...",MIRROR_NODEL_DEL,167,37,31,14 + LTEXT "Folder names are also OK",-1,166,56,33,33,SS_SUNKEN + CONTROL "&Convert filenames to lowercase",MIRROR_LOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,97,174,10 + CONTROL "Confirm deletions during Mirror &Upload",MIRROR_UPDEL_NOTIFY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,111,174,10 + CONTROL "Confirm deletions during Mirror &Download",MIRROR_DOWNDEL_NOTIFY, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,125,174,10 +END + +opt_notify_dlg DIALOGEX 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif", 0, 0, 0x0 +BEGIN + GROUPBOX "If File Already Exists",-1,7,7,196,67,WS_GROUP + GROUPBOX "Download",-1,11,20,188,24,WS_GROUP + CONTROL "&Overwrite",NOTIFY_D_OVW,"Button",BS_AUTORADIOBUTTON | WS_GROUP,19,30,50,10 + CONTROL "&Confirm",NOTIFY_D_DLG,"Button",BS_AUTORADIOBUTTON,80,30,94,10 + GROUPBOX "Upload",-1,11,47,188,23,WS_GROUP + CONTROL "O&verwrite",NOTIFY_U_OVW,"Button",BS_AUTORADIOBUTTON | WS_GROUP,19,57,48,10 + CONTROL "Co&nfirm",NOTIFY_U_DLG,"Button",BS_AUTORADIOBUTTON,80,57,106,10 + GROUPBOX "On Double-click",-1,7,78,196,23,WS_GROUP + CONTROL "O&pen",NOTIFY_OPEN,"Button",BS_AUTORADIOBUTTON | WS_GROUP,19,88,53,10 + CONTROL "Down&load",NOTIFY_DOWNLOAD,"Button",BS_AUTORADIOBUTTON,80,88,102,10 + GROUPBOX "In Server File Move function",-1,7,106,196,26,WS_GROUP + CONTROL "No Confirm",NOTIFY_M_NODLG,"Button",BS_AUTORADIOBUTTON | WS_GROUP,19,118,56,10 + CONTROL "Confirm",NOTIFY_M_DLG,"Button",BS_AUTORADIOBUTTON,80,118,56,10 + CONTROL "Disable",NOTIFY_M_DISABLE,"Button",BS_AUTORADIOBUTTON,141,118,56,10 +END + +opt_sound_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "Play *.wav file at successful &connection",SOUND_CONNECT, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,9,196,10 + EDITTEXT SOUND_CONNECT_WAV,31,22,116,12,ES_AUTOHSCROLL + PUSHBUTTON "...",SOUND_CONNECT_BR,148,21,13,13 + PUSHBUTTON "Test",SOUND_CONNECT_TEST,166,21,37,13 + CONTROL "Play *.wav file when &transfer is complete",SOUND_TRANS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,42,196,10 + EDITTEXT SOUND_TRANS_WAV,31,55,116,12,ES_AUTOHSCROLL + PUSHBUTTON "...",SOUND_TRANS_BR,148,55,13,13 + PUSHBUTTON "Test",SOUND_TRANS_TEST,166,55,37,13 + CONTROL "Play *.wav file at &error",SOUND_ERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,75,196,10 + EDITTEXT SOUND_ERROR_WAV,31,88,116,12,ES_AUTOHSCROLL + PUSHBUTTON "...",SOUND_ERROR_BR,148,88,13,13 + PUSHBUTTON "Test",SOUND_ERROR_TEST,166,88,37,13 +END + +opt_tool_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Viewer &1",-1,7,7,39,8 + EDITTEXT TOOL_EDITOR1,7,18,183,12,ES_AUTOHSCROLL + PUSHBUTTON "...",TOOL_EDITOR1_BR,191,18,12,13 + LTEXT "Viewer &2",-1,7,63,39,8 + EDITTEXT TOOL_EDITOR2,7,74,183,12,ES_AUTOHSCROLL + PUSHBUTTON "...",TOOL_EDITOR2_BR,191,74,12,13 + LTEXT "Viewer &3",-1,7,93,39,8 + EDITTEXT TOOL_EDITOR3,7,104,183,12,ES_AUTOHSCROLL + PUSHBUTTON "...",TOOL_EDITOR3_BR,191,104,12,13 + LTEXT "Unassociated files will be opened in Viewer 1.",-1,19,33,184,27,SS_SUNKEN + LTEXT "Use Viewer 2 and 3 by right-clicking with the mouse.",-1,14,124,184,8 +END + +opt_trmode1_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Transfer mode",-1,7,7,93,56 + CONTROL "Always &ASCII mode",TRMODE_ASCII,"Button",BS_AUTORADIOBUTTON | WS_GROUP,13,19,85,10 + CONTROL "Always &BINARY mode",TRMODE_BIN,"Button",BS_AUTORADIOBUTTON,13,33,84,10 + CONTROL "&Filename dependent",TRMODE_AUTO,"Button",BS_AUTORADIOBUTTON,13,47,78,10 + GROUPBOX "ASCII mode Filenames",-1,104,7,99,84,WS_GROUP + LISTBOX TRMODE_EXT_LIST,109,19,53,67,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "A&dd...",TRMODE_ADD,167,19,31,14 + PUSHBUTTON "Delete",TRMODE_DEL,167,38,31,14 + CONTROL "&Remove EOF for ASCII mode upload",TRMODE_EOF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,94,196,10 + CONTROL "Re&tain file date/time on download",TRMODE_TIME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,108,196,10 + LTEXT "->",-1,98,49,8,8 + CONTROL "Truncate filename before &semicolon on download",TRMODE_SEMICOLON, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,122,196,10 +END + +forcepasschange_dlg DIALOG 0, 0, 211, 64 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Force reset of master password" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "All the registered FTP passwords will be invalidated if you forcely set a new master password.\r\nAre you sure you want to set a new password?",-1,7,7,196,36 + DEFPUSHBUTTON "Yes",IDOK,48,42,50,14 + PUSHBUTTON "No",IDCANCEL,112,42,50,14 +END + +opt_trmode2_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Filename",-1,7,7,196,69 + CONTROL "Convert to &lowercase",TRMODE2_LOWER,"Button",BS_AUTORADIOBUTTON | WS_GROUP,13,18,143,10 + CONTROL "Convert to &uppercase",TRMODE2_UPPER,"Button",BS_AUTORADIOBUTTON,13,30,143,10 + CONTROL "&No conversion",TRMODE2_NOCNV,"Button",BS_AUTORADIOBUTTON,13,42,143,10 + LTEXT "&Timeout",-1,7,80,131,8 + EDITTEXT TRMODE2_TIMEOUT,7,90,26,14,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",TRMODE2_TIMEOUT_SPN,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,33,90,9,14 + LTEXT "(0 to 300sec: 0=No timeout)",-1,45,94,107,8 + LTEXT "&Default local folder",-1,7,108,196,8 + EDITTEXT TRMODE2_LOCAL,7,118,182,12,ES_AUTOHSCROLL + PUSHBUTTON "...",TRMODE2_LOCAL_BR,190,118,13,13 + LTEXT "Mirror Upload/Download settings are on the Mirror tab.",-1,18,56,181,17,SS_SUNKEN +END + +opt_trmode3_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "List1",TRMODE3_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,13,20,78,78 + PUSHBUTTON "&Add",TRMODE3_ADD,95,20,31,14 + PUSHBUTTON "Delete",TRMODE3_DEL,95,38,31,14 + GROUPBOX "Default Upload File Permission",-1,7,7,124,96 + CONTROL "Set default upload &folder permission",TRMODE3_FOLDER, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,109,182,10 + EDITTEXT TRMODE3_FOLDER_ATTR,60,123,29,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Permission",-1,23,123,33,8 +END + +opt_user_dlg DIALOG 0, 0, 211, 139 +STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&Mail address",-1,7,7,59,8 + EDITTEXT USER_ADRS,7,18,196,12,ES_AUTOHSCROLL + LTEXT "This address is used for the anonymous FTP password.",-1,28,36,169,18,SS_SUNKEN +END + +otp_calc_dlg DIALOG 0, 0, 187, 104 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Generate One-time Password" +FONT 9, "MS Sans Serif" +BEGIN + RTEXT "&Challenge",-1,7,10,50,8 + EDITTEXT OTPCALC_KEY,61,7,119,12,ES_AUTOHSCROLL + RTEXT "&Pass phrase",-1,7,26,50,8 + EDITTEXT OTPCALC_PASS,61,23,119,12,ES_PASSWORD | ES_AUTOHSCROLL + RTEXT "&Response",-1,7,42,50,8 + EDITTEXT OTPCALC_RES,61,39,119,12,ES_AUTOHSCROLL | ES_READONLY + GROUPBOX "Algorithm",-1,37,54,143,23 + CONTROL "MD&4, S/KEY",OTPCALC_MD4,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,44,64,56,10 + CONTROL "MD&5",OTPCALC_MD5,"Button",BS_AUTORADIOBUTTON,103,64,32,10 + CONTROL "SHA-&1",OTPCALC_SHA1,"Button",BS_AUTORADIOBUTTON,140,64,37,10 + DEFPUSHBUTTON "Generate",IDOK,10,83,50,14,WS_GROUP + PUSHBUTTON "Exit",IDCANCEL,68,83,50,14 + PUSHBUTTON "Help",9,126,83,50,14 +END + +otp_notify_dlg DIALOG 0, 0, 141, 60 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "One-time Password" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,45,39,50,14 + LTEXT "Sequence number becomes less than 10. Please change sequence.",-1,7,7,127,24 +END + +passwd_dlg DIALOG 0, 0, 187, 43 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Password/Pass phrase" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_PASSWORD | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,25,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,25,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,164,31,16,8 +END + +newmasterpasswd_dlg DIALOGEX 0, 0, 187, 43 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Enter new master password" +FONT 9, "MS Sans Serif", 0, 0, 0x0 +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,25,25,43,14 + PUSHBUTTON "Cancel",IDCANCEL,72,25,43,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,172,31,8,8 + PUSHBUTTON "Help",IDHELP,118,25,43,14 +END + +rasnotify_dlg DIALOG 0, 0, 158, 46 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "FFFTP" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Yes",IDOK,23,25,50,14 + PUSHBUTTON "No",IDCANCEL,86,25,50,14 + CTEXT "Disconnect dialup?",-1,7,7,144,8 +END + +rasreconnect_dlg DIALOG 0, 0, 159, 67 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "FFFTP" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "Yes",IDOK,16,46,50,14 + PUSHBUTTON "Keep Connection",IDCANCEL,76,46,66,14 + LTEXT "Disconnect current connection and reconnect dialup?",-1,7,7,145,16 +END + +re_passwd_dlg DIALOG 0, 0, 187, 62 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Password" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,27,173,12,ES_PASSWORD | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,36,44,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,44,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,164,50,16,8 + LTEXT "Cannot login.\nEnter correct password.",-1,7,7,173,19 +END + +reginit_dlg DIALOG 0, 0, 155, 83 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Erase All Settings" +FONT 9, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "No",IDCANCEL,41,45,71,31 + PUSHBUTTON "Yes",IDOK,125,62,23,14,NOT WS_TABSTOP + LTEXT "Erase ALL settings including Host settings.",-1,7,7,141,17 + CTEXT "Are you sure?",-1,7,29,141,8 +END + +rename_dlg DIALOG 0, 0, 187, 69 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT RENAME_NEW,7,34,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,9,51,50,14 + PUSHBUTTON "Cancel",IDCANCEL,68,51,50,14 + PUSHBUTTON "&Stop",RENAME_STOP,128,51,50,14 + LTEXT "",RENAME_TEXT,7,21,173,8,SS_NOPREFIX + LTEXT "Enter new name",-1,7,7,133,8 +END + +savepass_dlg DIALOG 0, 0, 146, 50 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Save Password" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "Save correct password to host setting?",-1,7,7,132,17 + DEFPUSHBUTTON "Yes",IDOK,17,29,50,14 + PUSHBUTTON "No",IDCANCEL,78,29,50,14 +END + +sel_local_dlg DIALOG 0, 0, 187, 106 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Select File (Local)" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&File to select",-1,7,7,109,8 + EDITTEXT SEL_FNAME,7,17,173,12,ES_AUTOHSCROLL + CONTROL "&Regular expression",SEL_REGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,34,160,10 + CONTROL "Do not select if the host file is &newer.",SEL_NOOLD, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,47,160,10 + CONTROL "Do not select if the host file is &older.",SEL_NONEW, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,60,160,10 + CONTROL "Do not select if the same file &resides in the host.",SEL_NOEXIST, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,73,160,10 + DEFPUSHBUTTON "OK",IDOK,10,88,50,14 + PUSHBUTTON "Cancel",IDCANCEL,68,88,50,14 + PUSHBUTTON "Help",9,126,88,50,14 +END + +sel_remote_dlg DIALOG 0, 0, 187, 106 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Select File (Host)" +FONT 9, "MS Sans Serif" +BEGIN + LTEXT "&File to select",-1,7,7,109,8 + EDITTEXT SEL_FNAME,7,17,173,12,ES_AUTOHSCROLL + CONTROL "&Regular expression",SEL_REGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,34,160,10 + CONTROL "Do not select if the local file is &newer.",SEL_NOOLD, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,47,160,10 + CONTROL "Do not select if the local file is &older.",SEL_NONEW, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,60,160,10 + CONTROL "Do not select if the same file &resides in the local.",SEL_NOEXIST, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,73,160,10 + DEFPUSHBUTTON "OK",IDOK,10,88,50,14 + PUSHBUTTON "Cancel",IDCANCEL,68,88,50,14 + PUSHBUTTON "Help",9,126,88,50,14 +END + +somecmd_dlg DIALOG 0, 0, 187, 61 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Specify Command" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,10,43,50,14 + PUSHBUTTON "Cancel",IDCANCEL,68,43,50,14 + PUSHBUTTON "Help",9,126,43,50,14 + LTEXT "Some commands cannot be specified here. See help for details.",-1,7,24,173,15 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,171,30,9,8 +END + +sort_dlg DIALOG 0, 0, 187, 197 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Sort" +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Local",-1,7,7,81,150 + GROUPBOX "&File",-1,10,17,74,80,WS_GROUP + CONTROL "Name order",SORT_LFILE_NAME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,30,66,10 + CONTROL "Extension order",SORT_LFILE_EXT,"Button",BS_AUTORADIOBUTTON,15,42,66,10 + CONTROL "Size order",SORT_LFILE_SIZE,"Button",BS_AUTORADIOBUTTON,15,55,66,10 + CONTROL "Date order",SORT_LFILE_DATE,"Button",BS_AUTORADIOBUTTON,15,68,66,10 + CONTROL "Reverse",SORT_LFILE_REV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,81,66,10 + GROUPBOX "F&older",-1,10,100,74,52,WS_GROUP + CONTROL "Name order",SORT_LDIR_NAME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,112,66,10 + CONTROL "Date order",SORT_LDIR_DATE,"Button",BS_AUTORADIOBUTTON,15,124,66,10 + CONTROL "Reverse",SORT_LDIR_REV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,137,66,10 + GROUPBOX "Host",-1,98,7,82,150 + GROUPBOX "F&ile",-1,102,17,74,80,WS_GROUP + CONTROL "Name order",SORT_RFILE_NAME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,107,30,66,10 + CONTROL "Extension order",SORT_RFILE_EXT,"Button",BS_AUTORADIOBUTTON,107,42,66,10 + CONTROL "Size order",SORT_RFILE_SIZE,"Button",BS_AUTORADIOBUTTON,107,55,66,10 + CONTROL "Date order",SORT_RFILE_DATE,"Button",BS_AUTORADIOBUTTON,107,68,66,10 + CONTROL "Reverse",SORT_RFILE_REV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,107,81,66,10 + GROUPBOX "Fo&lder",-1,102,100,74,52,WS_GROUP + CONTROL "Name order",SORT_RDIR_NAME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,107,112,66,10 + CONTROL "Extention order",SORT_RDIR_DATE,"Button",BS_AUTORADIOBUTTON,107,124,66,10 + CONTROL "Reverse",SORT_RDIR_REV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,107,137,66,10 + CONTROL "Save sort setting on each host",SORT_SAVEHOST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,164,156,10 + DEFPUSHBUTTON "OK",IDOK,11,179,50,14 + PUSHBUTTON "Cancel",IDCANCEL,69,179,50,14 + PUSHBUTTON "Help",9,127,179,50,14 +END + +transfer_dlg DIALOG 0, 0, 199, 91 +STYLE DS_SETFONT | DS_MODALFRAME | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +FONT 9, "MS Sans Serif" +BEGIN + PUSHBUTTON "Cancel this File",IDCANCEL,7,73,62,14 + PUSHBUTTON "Cancel from Next",TRANS_STOP_NEXT,78,73,62,14 + PUSHBUTTON "Cancel All",TRANS_STOP_ALL,150,73,42,14 + LTEXT "Host :",-1,7,5,27,8 + LTEXT "",TRANS_REMOTE,45,5,147,8,SS_NOPREFIX + LTEXT "Local :",-1,7,18,27,8 + LTEXT "",TRANS_LOCAL,45,18,147,8,SS_NOPREFIX + LTEXT "Status :",-1,7,44,27,8 + LTEXT "",TRANS_STATUS,45,44,147,8 + CONTROL "Progress1",TRANS_TIME_BAR,"msctls_progress32",0x0,7,58,185,9 + LTEXT "Mode :",-1,7,31,27,8 + LTEXT "",TRANS_MODE,45,31,51,8 + LTEXT "Kanji Code :",-1,98,31,39,8 + LTEXT "",TRANS_KANJI,140,31,52,8 +END + +up_exist_dlg DIALOG 0, 0, 234, 119 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION +CAPTION "Upload" +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "&Overwrite existing file",UP_EXIST_OVW,"Button",BS_AUTORADIOBUTTON | WS_GROUP,8,38,99,10 + CONTROL "Overwrite if upload file is &newer",UP_EXIST_NEW,"Button",BS_AUTORADIOBUTTON,7,50,118,10 + CONTROL "&Resume",UP_EXIST_RESUME,"Button",BS_AUTORADIOBUTTON,7,62,99,10 + CONTROL "Rename &by the host",UP_EXIST_UNIQUE,"Button",BS_AUTORADIOBUTTON,7,74,99,10 + CONTROL "&Skip",UP_EXIST_IGNORE,"Button",BS_AUTORADIOBUTTON,7,86,99,10 + LTEXT "To upload with a different name, modify the filename and click Overwrite existing file.",-1,129,39,98,41 + DEFPUSHBUTTON "OK",IDOK,13,101,50,14,WS_GROUP + PUSHBUTTON "&Do All",IDOK_ALL,68,101,50,14 + PUSHBUTTON "&Cancel All",IDCANCEL,123,101,50,14 + PUSHBUTTON "&Help",9,178,101,41,14 + LTEXT "Filename already exists on host. Upload?",-1,7,7,184,8 + EDITTEXT UP_EXIST_NAME,7,20,220,12,ES_AUTOHSCROLL +END + +updown_as_dlg DIALOG 0, 0, 187, 69 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT UPDOWNAS_NEW,7,34,173,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,35,51,50,14 + PUSHBUTTON "Cancel",UPDOWNAS_STOP,101,51,50,14 + LTEXT "",UPDOWNAS_TEXT,7,21,173,8,SS_NOPREFIX + LTEXT "Enter new name",-1,7,7,133,8 +END + +uperr_dlg DIALOGEX 0, 0, 159, 67 +STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION +CAPTION "FFFTP:Error" +FONT 9, "MS Sans Serif", 0, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Cancel this File",IDOK,7,49,82,14 + PUSHBUTTON "Cancel All",IDCANCEL,102,49,50,14 + LTEXT "Cannot upload following file.",-1,7,4,137,10 + LTEXT "",UPDOWN_ERR_FNAME,7,17,145,8,SS_NOPREFIX + EDITTEXT UPDOWN_ERR_MSG,7,32,153,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER,WS_EX_STATICEDGE +END + +username_dlg DIALOG 0, 0, 187, 58 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "User Name" +FONT 9, "MS Sans Serif" +BEGIN + EDITTEXT INP_INPSTR,7,7,173,12,ES_AUTOHSCROLL + CONTROL "Anonymous(&A)",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,25,73,10 + DEFPUSHBUTTON "OK",IDOK,36,40,50,14 + PUSHBUTTON "Cancel",IDCANCEL,101,40,50,14 +END + +move_notify_dlg DIALOGEX 0, 0, 201, 82 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Move Files/Folders" +FONT 9, "MS Sans Serif", 400, 0, 0x0 +BEGIN + DEFPUSHBUTTON "Yes",IDOK,44,61,50,14 + PUSHBUTTON "No",IDCANCEL,107,61,50,14 + LTEXT "Move selected files/folders to the",-1,7,7,187,8 + LTEXT "static",COMMON_TEXT,7,20,187,8 + LTEXT "folder. Are you sure?",-1,7,33,187,8 + LTEXT "(Not a copy. It's a move.)",-1,7,47,187,8 +END + +masterpasswd_dlg DIALOGEX 65535, 65535, 187, 56 +STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION +CAPTION "FFFTP" +FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x0 +BEGIN + LTEXT "Enter master password",-1,7,7,153,8 + EDITTEXT INP_INPSTR,7,19,173,12,ES_PASSWORD | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,13,36,50,14 + PUSHBUTTON "Cancel",IDCANCEL,68,36,50,14 + PUSHBUTTON "Help",IDHELP,123,36,50,14 + CONTROL "",INP_ANONYMOUS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,173,39,8,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + down_exist_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 227 + TOPMARGIN, 7 + BOTTOMMARGIN, 105 + END + + chmod_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 164 + TOPMARGIN, 7 + BOTTOMMARGIN, 106 + END + + about_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 188 + TOPMARGIN, 4 + BOTTOMMARGIN, 202 + END + + bmark_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 215 + TOPMARGIN, 7 + BOTTOMMARGIN, 104 + END + + def_attr_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 116 + TOPMARGIN, 7 + BOTTOMMARGIN, 62 + END + + opt_fire_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + hostlist_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 215 + TOPMARGIN, 6 + BOTTOMMARGIN, 116 + END + + hostname_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + TOPMARGIN, 6 + BOTTOMMARGIN, 89 + END + + hset_adv2_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + hset_adv_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + hset_code_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + hset_dialup_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + hset_main_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + account_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 38 + END + + chdir_br_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + END + + bmark_edit_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 79 + END + + chdir_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + END + + cwderr_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 50 + END + + delete_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 202 + TOPMARGIN, 7 + BOTTOMMARGIN, 51 + END + + dial_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 152 + TOPMARGIN, 4 + BOTTOMMARGIN, 33 + END + + dial_password_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 164 + TOPMARGIN, 4 + BOTTOMMARGIN, 78 + END + + diskfull_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 152 + TOPMARGIN, 4 + BOTTOMMARGIN, 38 + END + + downerr_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 152 + TOPMARGIN, 4 + BOTTOMMARGIN, 61 + END + + opt_misc_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + downname_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 6 + BOTTOMMARGIN, 38 + END + + exit_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 136 + TOPMARGIN, 7 + BOTTOMMARGIN, 60 + END + + filesize_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 124 + TOPMARGIN, 7 + BOTTOMMARGIN, 69 + END + + filesize_notify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 63 + END + + filter_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 75 + END + + find_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 52 + END + + forcerename_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 63 + END + + fname_in_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 79 + TOPMARGIN, 7 + BOTTOMMARGIN, 40 + END + + group_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 38 + END + + hostconnect_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 159 + TOPMARGIN, 6 + BOTTOMMARGIN, 102 + END + + hostdel_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 127 + TOPMARGIN, 4 + BOTTOMMARGIN, 35 + END + + groupdel_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 128 + TOPMARGIN, 4 + BOTTOMMARGIN, 43 + END + + mailadrs_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 85 + END + + mirror_down_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 148 + END + + mirror_notify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 167 + TOPMARGIN, 6 + BOTTOMMARGIN, 167 + END + + mirror_up_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 208 + TOPMARGIN, 7 + BOTTOMMARGIN, 128 + END + + mirrordown_notify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 167 + TOPMARGIN, 6 + BOTTOMMARGIN, 167 + END + + mkdir_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 54 + END + + noresume_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 184 + TOPMARGIN, 4 + BOTTOMMARGIN, 43 + END + + opt_connect_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + opt_disp_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + opt_mirror_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 135 + END + + opt_notify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + opt_sound_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + opt_tool_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 132 + END + + opt_trmode1_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 135 + END + + forcepasschange_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 139 + TOPMARGIN, 7 + BOTTOMMARGIN, 43 + END + + opt_trmode2_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 135 + END + + opt_trmode3_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 135 + END + + opt_user_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 204 + TOPMARGIN, 7 + BOTTOMMARGIN, 134 + END + + otp_calc_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 97 + END + + otp_notify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 134 + TOPMARGIN, 7 + BOTTOMMARGIN, 53 + END + + passwd_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + END + + newmasterpasswd_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + END + + rasnotify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 151 + TOPMARGIN, 7 + BOTTOMMARGIN, 39 + END + + rasreconnect_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 152 + TOPMARGIN, 7 + BOTTOMMARGIN, 60 + END + + re_passwd_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 58 + END + + reginit_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 76 + END + + rename_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 65 + END + + savepass_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 139 + TOPMARGIN, 7 + BOTTOMMARGIN, 43 + END + + sel_local_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 102 + END + + sel_remote_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 102 + END + + somecmd_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 57 + END + + sort_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 193 + END + + transfer_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 192 + TOPMARGIN, 5 + BOTTOMMARGIN, 87 + END + + up_exist_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 227 + TOPMARGIN, 7 + BOTTOMMARGIN, 115 + END + + updown_as_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 65 + END + + uperr_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 152 + TOPMARGIN, 4 + BOTTOMMARGIN, 63 + END + + username_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 54 + END + + move_notify_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 194 + TOPMARGIN, 7 + BOTTOMMARGIN, 75 + END + + masterpasswd_dlg, DIALOG + BEGIN + BOTTOMMARGIN, 50 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +1 RT_MANIFEST "ffftp.exe.manifest" + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +ffftp ICON "icon1.ico" +notify ICON "icon2.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +main_toolbar_bmp BITMAP "toolbar1.bmp" +remote_toolbar_bmp BITMAP "main_too.bmp" +dirattr_bmp BITMAP "list_bmp.bmp" +hlist_bmp BITMAP "bitmap1.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +main_menu MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Connect...\tCtrl+C", MENU_CONNECT + MENUITEM "&Quick Connect...\tCtrl+Q", MENU_QUICK + MENUITEM "&Disconnect", MENU_DISCONNECT + MENUITEM SEPARATOR + MENUITEM "&Host Setting...", MENU_SET_CONNECT + POPUP "&Settings" + BEGIN + MENUITEM "Import Settings from &WS_FTP.INI...", MENU_IMPORT_WS + MENUITEM "&Save Settings to File...", MENU_REGSAVE + MENUITEM "&Load Settings from File...", MENU_REGLOAD + MENUITEM "Change &Master password...", MENU_CHANGEPASSWD + MENUITEM SEPARATOR + MENUITEM "Clear All Settings...", MENU_REGINIT + END + MENUITEM SEPARATOR + MENUITEM "E&xit", MENU_EXIT + END + POPUP "&Commands" + BEGIN + MENUITEM "&Download\tCtrl+D", MENU_DOWNLOAD + MENUITEM "&Upload\tCtrl+U", MENU_UPLOAD + MENUITEM "D&ownload As...", MENU_DOWNLOAD_AS + MENUITEM "U&pload As...", MENU_UPLOAD_AS + MENUITEM "Change &Filename && Download...", MENU_DOWNLOAD_NAME + MENUITEM "Download &as File", MENU_DOWNLOAD_AS_FILE + MENUITEM SEPARATOR + MENUITEM "&Mirror Upload...\tCtrl+Shift+U", MENU_MIRROR_UPLOAD + MENUITEM "File &size...", MENU_FILESIZE + MENUITEM "Mirror Down&load...\tCtrl+Shift+D", MENU_MIRROR_DOWNLOAD + MENUITEM SEPARATOR + MENUITEM "D&elete\tDel", MENU_DELETE + MENUITEM "&Rename...\tCtrl+N", MENU_RENAME + MENUITEM "Permissio&ns...\tCtrl+T", MENU_CHMOD + MENUITEM "Ne&w Folder...\tCtrl+K", MENU_MKDIR + MENUITEM "Specify &command...", MENU_SOMECMD + MENUITEM SEPARATOR + MENUITEM "Synchronize Folder Mo&vement", MENU_SYNC + END + POPUP "&Bookmarks" + BEGIN + MENUITEM "Add &Host folder", MENU_BMARK_ADD + MENUITEM "Add &Local folder", MENU_BMARK_ADD_LOCAL + MENUITEM "Add &Both Host && Local folders", MENU_BMARK_ADD_BOTH + MENUITEM "&Edit Bookmarks...\tCtrl+B", MENU_BMARK_EDIT + MENUITEM SEPARATOR + END + POPUP "&View" + BEGIN + MENUITEM "F&ilter...\tCtrl+Y", MENU_FILTER + MENUITEM SEPARATOR + MENUITEM "&Find...\tCtrl+F", MENU_FIND + MENUITEM "Find &Next\tF3", MENU_FINDNEXT + MENUITEM SEPARATOR + MENUITEM "&Select...\tCtrl+S", MENU_SELECT + MENUITEM "Select &All/None\tCtrl+A", MENU_SELECT_ALL + MENUITEM SEPARATOR + POPUP "Displa&y" + BEGIN + MENUITEM "&List", MENU_LIST + MENUITEM "&Details", MENU_REPORT + END + MENUITEM "S&ort...", MENU_SORT + MENUITEM "Display files with leading &dot", MENU_DOTFILE + MENUITEM SEPARATOR + MENUITEM "Display File &List in Viewer", MENU_DIRINFO + MENUITEM "Display Lo&g in Viewer", MENU_TASKINFO + MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", MENU_REFRESH + END + POPUP "&Tools" + BEGIN + MENUITEM "&One-Time Password Calculation...", MENU_OTPCALC + END + POPUP "&Options" + BEGIN + MENUITEM "&Settings...", MENU_OPTION + END + POPUP "&Help" + BEGIN + MENUITEM "&Contents\tF1", MENU_HELP + MENUITEM "&Q&&A (Connect to Internet)", MENU_HELP_TROUBLE + MENUITEM SEPARATOR + MENUITEM "&About FFFTP...", MENU_ABOUT + END +END + +dummy_menu MENU +BEGIN + POPUP "dummy" + BEGIN + MENUITEM "Go up (host)", MENU_REMOTE_UPDIR + MENUITEM "Go up (local)", MENU_LOCAL_UPDIR + MENUITEM "Go up (both)", MENU_UPDIR + MENUITEM "COMBO_LOCAL", COMBO_LOCAL + MENUITEM "COMBO REMOTE", COMBO_REMOTE + MENUITEM "Text Mode", MENU_TEXT + MENUITEM "Binary Mode", MENU_BINARY + MENUITEM "Auto Mode", MENU_AUTO + MENUITEM "Refresh (local)", REFRESH_LOCAL + MENUITEM "Refresh (remote)", REFRESH_REMOTE + MENUITEM "CHDIR(remote)", MENU_REMOTE_CHDIR + MENUITEM "CHDIR(local)", MENU_LOCAL_CHDIR + MENUITEM "KANJI EUC", MENU_KNJ_EUC + MENUITEM "KANJI JIS", MENU_KNJ_JIS + MENUITEM "KANJI NONE", MENU_KNJ_NONE + MENUITEM "Double click", MENU_DCLICK + MENUITEM "Kana henkan", MENU_KANACNV + MENUITEM "Open 1", MENU_OPEN1 + MENUITEM "Open 2", MENU_OPEN2 + MENUITEM "Open 3", MENU_OPEN3 + MENUITEM "Connect", MENU_CONNECT_NUM + MENUITEM "HIst 1", MENU_HIST_1 + MENUITEM "Hist 2", MENU_HIST_2 + MENUITEM "Hist 3", MENU_HIST_3 + MENUITEM "Hist 4", MENU_HIST_4 + MENUITEM "Hist 5", MENU_HIST_5 + MENUITEM "Hist 6", MENU_HIST_6 + MENUITEM "Hist 7", MENU_HIST_7 + MENUITEM "Hist 8", MENU_HIST_8 + MENUITEM "Hist 9", MENU_HIST_9 + MENUITEM "Hist 10 ", MENU_HIST_10 + MENUITEM "Hist 11", MENU_HIST_11 + MENUITEM "Hist 12", MENU_HIST_12 + MENUITEM "Hist 13", MENU_HIST_13 + MENUITEM "Hist 14", MENU_HIST_14 + MENUITEM "Hist 15", MENU_HIST_15 + MENUITEM "Hist 16", MENU_HIST_16 + MENUITEM "Hist 17", MENU_HIST_17 + MENUITEM "Hist 18", MENU_HIST_18 + MENUITEM "Hist 19", MENU_HIST_19 + MENUITEM "Hist 20", MENU_HIST_20 + MENUITEM "Auto exit", MENU_AUTO_EXIT + MENUITEM "Stop", MENU_ABORT + MENUITEM "URL to clipboard", MENU_URL_COPY + MENUITEM "Download all", MENU_DOWNLOAD_ALL + MENUITEM "Upload all", MENU_UPLOAD_ALL + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +resize_lr_csr CURSOR "cursor1.cur" +resize_ud_csr CURSOR "cursor2.cur" +drag_csr CURSOR "drag_csr.cur" +nodrop_csr CURSOR "nodrop_c.cur" + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,97,2,0 + PRODUCTVERSION 1,97,2,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "041104b0" + BEGIN + VALUE "Comments", "This software is Free Software" + VALUE "CompanyName", " Sota" + VALUE "FileDescription", "FFFTP" + VALUE "FileVersion", "1, 97, 2, 0" + VALUE "InternalName", "FFFTP" + VALUE "LegalCopyright", "Copyright (C) 1997-2010 Sota & cooperators" + VALUE "OriginalFilename", "FFFTP.exe" + VALUE "ProductName", "FFFTP" + VALUE "ProductVersion", "1, 97, 2, 0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x411, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +ffftp_accel ACCELERATORS +BEGIN + VK_APPS, MENU_APPKEY, VIRTKEY, NOINVERT + "B", MENU_BMARK_EDIT, VIRTKEY, CONTROL, NOINVERT + "T", MENU_CHMOD, VIRTKEY, CONTROL, NOINVERT + VK_RETURN, MENU_CHMOD, VIRTKEY, ALT, NOINVERT + "C", MENU_CONNECT, VIRTKEY, CONTROL, NOINVERT + VK_RETURN, MENU_DCLICK, VIRTKEY, NOINVERT + VK_DELETE, MENU_DELETE, VIRTKEY, NOINVERT + "D", MENU_DOWNLOAD, VIRTKEY, CONTROL, NOINVERT + "Y", MENU_FILTER, VIRTKEY, CONTROL, NOINVERT + "F", MENU_FIND, VIRTKEY, CONTROL, NOINVERT + VK_F3, MENU_FINDNEXT, VIRTKEY, NOINVERT + VK_F1, MENU_HELP, VIRTKEY, NOINVERT + "D", MENU_MIRROR_DOWNLOAD, VIRTKEY, SHIFT, CONTROL, NOINVERT + "U", MENU_MIRROR_UPLOAD, VIRTKEY, SHIFT, CONTROL, NOINVERT + "K", MENU_MKDIR, VIRTKEY, CONTROL, NOINVERT + "Q", MENU_QUICK, VIRTKEY, CONTROL, NOINVERT + VK_F5, MENU_REFRESH, VIRTKEY, NOINVERT + "N", MENU_RENAME, VIRTKEY, CONTROL, NOINVERT + VK_F2, MENU_RENAME, VIRTKEY, NOINVERT + "S", MENU_SELECT, VIRTKEY, CONTROL, NOINVERT + "A", MENU_SELECT_ALL, VIRTKEY, CONTROL, NOINVERT + VK_BACK, MENU_UPDIR, VIRTKEY, NOINVERT + "U", MENU_UPLOAD, VIRTKEY, CONTROL, NOINVERT + "M", MENU_XFRMODE, VIRTKEY, CONTROL, NOINVERT + VK_F10, MENU_APPKEY, VIRTKEY, SHIFT, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Toolbar +// + +main_toolbar_bmp TOOLBAR 16, 16 +BEGIN + BUTTON ID_BUTTON40084 + BUTTON ID_BUTTON40085 + BUTTON ID_BUTTON40086 + BUTTON ID_BUTTON40087 + BUTTON ID_BUTTON40088 + BUTTON ID_BUTTON40089 + BUTTON ID_BUTTON40090 + BUTTON ID_BUTTON40091 + BUTTON ID_BUTTON40092 + BUTTON ID_BUTTON40093 + BUTTON ID_BUTTON40094 + BUTTON ID_BUTTON40095 + BUTTON ID_BUTTON40096 + BUTTON ID_BUTTON40097 + BUTTON ID_BUTTON40098 + BUTTON ID_BUTTON40099 + BUTTON ID_BUTTON40100 + BUTTON ID_BUTTON40101 + BUTTON ID_BUTTON40102 + BUTTON ID_BUTTON40103 + BUTTON ID_BUTTON40104 + BUTTON ID_BUTTON40105 + BUTTON ID_BUTTON40106 + BUTTON ID_BUTTON40107 + BUTTON ID_BUTTON40122 + BUTTON ID_BUTTON40125 + BUTTON ID_BUTTON40156 +END + +remote_toolbar_bmp TOOLBAR 16, 16 +BEGIN + BUTTON ID_BUTTON40108 + BUTTON ID_BUTTON40109 +END + +#endif // ‰pŒê (•Ä‘) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Resource_eng/Thumbs.db b/Resource_eng/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..bbc883beaf559d349c29dd884cbea961158c9575 GIT binary patch literal 8704 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 literal 0 HcmV?d00001 diff --git a/Resource_eng/bitmap1.bmp b/Resource_eng/bitmap1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3712b37914c78850c2f03897338f3f550d548586 GIT binary patch literal 502 zcma)2I}Ur39t35G``xb{ypr~|V0 zi|e!C!p%`(BNKE>2Kqx$M5Y=;y?=9aRoK9mL;uyBZ?vpqR|)t&<>#Tyx>4p<+0;Me zo5GE0S?;07{$br5`Rid2eYp?vqpo}TXA^nWr4R0{{lIQSM^j}j26poAB0H^vj*DcX LPkhroMfr&jccslE2!^qe8J@j-2?hQvupQ#zTA%q?1t4b c57OsUFzuzWlHMEX8vMD;uHE@JJX|!OXNstYa#m0OlOOB47a$0IApigX literal 0 HcmV?d00001 diff --git a/Resource_eng/ffftp.exe.manifest b/Resource_eng/ffftp.exe.manifest new file mode 100644 index 0000000..c423876 --- /dev/null +++ b/Resource_eng/ffftp.exe.manifest @@ -0,0 +1,23 @@ + + + +FFFTP + + + + + + + diff --git a/Resource_eng/icon1.ico b/Resource_eng/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..4044308c6a96c4717d12a7cb3ac4f75b335fe43e GIT binary patch literal 16158 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 x_VZ>oj(#0}fsb$CZvAc{{hr{A9nx% literal 0 HcmV?d00001 diff --git a/Resource_eng/list_bmp.bmp b/Resource_eng/list_bmp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e4a80ae8280e54a4c5c3a0d8634f7dc1bf4b8ede GIT binary patch literal 638 zcmZ`$I}XAy3^fR;AcT4i&cTkvQ94ne63W=IYfiw*mbFJ>gDt%0#-aS&#xKutUhHJE zJx@h#55LCPVXQDFGJ_YHr*$Q7&WYd`=LUesRQkRLav|z3F>;21k0CgptV3Kf^WM0I zv0&I?Q@q(O-VUAk)tkDxX8$UN6(>o ZEf3**d~a3X7B`o{_2L`o)Prr5TPD#p->F(hMf$QCL7;PEt=t}(El@TM;2(F8tK zfseU&+TEvFfLK~pzd#G<@15{j{n?cYNPkhgy4*3Vzw15t_RA?v&$oWz?&I;iLlb!a YOTKU@9<8miHVuJ=vW%v|@(%|W-}V@kBLDyZ literal 0 HcmV?d00001 diff --git a/Resource_eng/nodrop_c.cur b/Resource_eng/nodrop_c.cur new file mode 100644 index 0000000000000000000000000000000000000000..a299255d66209c718ea626df08800226377ae317 GIT binary patch literal 326 zcmZ{eF%E)26h!AQBv_cB7KXxv4V5Ky7Q|hV!b6#`vF1?3lMqi}NwML(E3ram@~4<& zUOpf|kP?WUa{~4Nj_zCq?T(zi%s1!3%=7ZsL_Lrs4i*B}7tn4&8)-<^M#xr+%T9|b z)1t1lxIMHeLQPp{C|nt|h1)!*t!H@Fg4_@PHKfda#M}kUhM0q%$GB_8)HF7Qvgft3 eO^giYwPqlh}>lArPP{@4_sEP_9;;wAe!0%3-C2OEp#*V2kV{ z2`Qr0y14$%@aIaFj5viyD-K2S4teIx4DbH>+rK|JlRs#G;k$X_+>hud?x~GW^Su2y zYNpQd=cd!7Xz9B9`+Kw|TKjWts~%rI8lnl`Ufj3cWH1=~96}R<2O4TJpU*l_X>V)C zX>>Roj_7&&#rk8B5yXsT-Q@E-<{F!|ecaqf7jdG z9cXQ!-Kzc29}M1rn-Lm0z&me#pyhNNk8xi<4a+bW0=Qn?fJ<%x*E}L~P1v;Tr9H-J zzluwz6=_pFII|Y*+t}_`!bKc_uYi(4^((IDj|lT8xbT~R`Hh{99=HajFDoYE7XUy) zDcor7BOc6=1y}FxZUe5XRom{3umqdX0UMHeD%u9wZesk*7Jo}N$GG0;+^o^w$|m|1 zS6_VHp5hu0NBps0uK?>0+JUH&k&Z9SiWqU`1%wuG^4$?G=Y-2Olc;mXSqN`qe201O zqJ;!>CBh0mMs?-wW)D_k)qzS@6;D>)A>ao}xSi*@>=+{UVU8vWEgzG)^qZ!Ilv`PfonJtU*wnCeT?5x=Vjnf3K~}AxsESR z?2NGY@kY1+*qp@SlDhFs7IR+J`jPUh)D6|czsNKAB9g7ne;HTH{Y7$pxV>dp{FC_N zFv0~}snD1F+Ap~;PWY-w6E2Y=IMN9!guRL{%l%dBM#(R-YiSP8xC%Z`GMLE)fwc{~ zl<5$MI9TV<{Y5=Aj}oe2Cn;0i7XlXb>beC)l87q1C)&Dx#9jEb6ZnV&fn5i2`<<>h|6l~3SH z?;C)rxb%}6pZH>i3{xB~wTfd{k{K;#&%9lX28E%Sqe-A⋘}8`>VT`6E3c05E#nHK;>EYDP3oKgqqyc90s)nI+^)sO!z)os~*DPFUgv_anI>rBhu*R4Fi Ks&hd4Kjjk^WXVMU literal 0 HcmV?d00001 diff --git a/SourceCode.txt b/SourceCode.txt new file mode 100644 index 0000000..11ef82d --- /dev/null +++ b/SourceCode.txt @@ -0,0 +1,3 @@ + +ŠJ”­ŠÂ‹«‚Í Microsoft Visual Studio .NET 2010 ‚ðŽg—p‚µ‚Ä‚¢‚Ü‚·B + diff --git a/aes.h b/aes.h new file mode 100644 index 0000000..a0d7d21 --- /dev/null +++ b/aes.h @@ -0,0 +1,205 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 + + This file contains the definitions required to use AES in C. See aesopt.h + for optimisation details. +*/ + +#ifndef _AES_H +#define _AES_H + +#include + +/* This include is used to find 8 & 32 bit unsigned integer types */ +#include "brg_types.h" + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#define AES_128 /* if a fast 128 bit key scheduler is needed */ +#define AES_192 /* if a fast 192 bit key scheduler is needed */ +#define AES_256 /* if a fast 256 bit key scheduler is needed */ +#define AES_VAR /* if variable key size scheduler is needed */ +#define AES_MODES /* if support is needed for modes */ + +/* The following must also be set in assembler files if being used */ + +#define AES_ENCRYPT /* if support for encryption is needed */ +#define AES_DECRYPT /* if support for decryption is needed */ +#define AES_REV_DKS /* define to reverse decryption key schedule */ + +#define AES_BLOCK_SIZE 16 /* the AES block size in bytes */ +#define N_COLS 4 /* the number of columns in the state */ + +/* The key schedule length is 11, 13 or 15 16-byte blocks for 128, */ +/* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes */ +/* or 44, 52 or 60 32-bit words. */ + +#if defined( AES_VAR ) || defined( AES_256 ) +#define KS_LENGTH 60 +#elif defined( AES_192 ) +#define KS_LENGTH 52 +#else +#define KS_LENGTH 44 +#endif + +#define AES_RETURN INT_RETURN + +/* the character array 'inf' in the following structures is used */ +/* to hold AES context information. This AES code uses cx->inf.b[0] */ +/* to hold the number of rounds multiplied by 16. The other three */ +/* elements can be used by code that implements additional modes */ + +typedef union +{ uint_32t l; + uint_8t b[4]; +} aes_inf; + +typedef struct +{ uint_32t ks[KS_LENGTH]; + aes_inf inf; +} aes_encrypt_ctx; + +typedef struct +{ uint_32t ks[KS_LENGTH]; + aes_inf inf; +} aes_decrypt_ctx; + +/* This routine must be called before first use if non-static */ +/* tables are being used */ + +AES_RETURN aes_init(void); + +/* Key lengths in the range 16 <= key_len <= 32 are given in bytes, */ +/* those in the range 128 <= key_len <= 256 are given in bits */ + +#if defined( AES_ENCRYPT ) + +#if defined( AES_128 ) || defined( AES_VAR) +AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]); +#endif + +#if defined( AES_192 ) || defined( AES_VAR) +AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]); +#endif + +#if defined( AES_256 ) || defined( AES_VAR) +AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]); +#endif + +#if defined( AES_VAR ) +AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]); +#endif + +AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]); + +#endif + +#if defined( AES_DECRYPT ) + +#if defined( AES_128 ) || defined( AES_VAR) +AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]); +#endif + +#if defined( AES_192 ) || defined( AES_VAR) +AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]); +#endif + +#if defined( AES_256 ) || defined( AES_VAR) +AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]); +#endif + +#if defined( AES_VAR ) +AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]); +#endif + +AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]); + +#endif + +#if defined( AES_MODES ) + +/* Multiple calls to the following subroutines for multiple block */ +/* ECB, CBC, CFB, OFB and CTR mode encryption can be used to handle */ +/* long messages incremantally provided that the context AND the iv */ +/* are preserved between all such calls. For the ECB and CBC modes */ +/* each individual call within a series of incremental calls must */ +/* process only full blocks (i.e. len must be a multiple of 16) but */ +/* the CFB, OFB and CTR mode calls can handle multiple incremental */ +/* calls of any length. Each mode is reset when a new AES key is */ +/* set but ECB and CBC operations can be reset without setting a */ +/* new key by setting a new IV value. To reset CFB, OFB and CTR */ +/* without setting the key, aes_mode_reset() must be called and the */ +/* IV must be set. NOTE: All these calls update the IV on exit so */ +/* this has to be reset if a new operation with the same IV as the */ +/* previous one is required (or decryption follows encryption with */ +/* the same IV array). */ + +AES_RETURN aes_test_alignment_detection(unsigned int n); + +AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_encrypt_ctx cx[1]); + +AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_decrypt_ctx cx[1]); + +AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_encrypt_ctx cx[1]); + +AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_decrypt_ctx cx[1]); + +AES_RETURN aes_mode_reset(aes_encrypt_ctx cx[1]); + +AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx cx[1]); + +AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx cx[1]); + +#define aes_ofb_encrypt aes_ofb_crypt +#define aes_ofb_decrypt aes_ofb_crypt + +AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx cx[1]); + +typedef void cbuf_inc(unsigned char *cbuf); + +#define aes_ctr_encrypt aes_ctr_crypt +#define aes_ctr_decrypt aes_ctr_crypt + +AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx cx[1]); + +#endif + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/aes_modes.c b/aes_modes.c new file mode 100644 index 0000000..ceabdb1 --- /dev/null +++ b/aes_modes.c @@ -0,0 +1,945 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 + + These subroutines implement multiple block AES modes for ECB, CBC, CFB, + OFB and CTR encryption, The code provides support for the VIA Advanced + Cryptography Engine (ACE). + + NOTE: In the following subroutines, the AES contexts (ctx) must be + 16 byte aligned if VIA ACE is being used +*/ + +#include +#include + +#include "aesopt.h" + +#if defined( AES_MODES ) +#if defined(__cplusplus) +extern "C" +{ +#endif + +#if defined( _MSC_VER ) && ( _MSC_VER > 800 ) +#pragma intrinsic(memcpy) +#endif + +#define BFR_BLOCKS 8 + +/* These values are used to detect long word alignment in order to */ +/* speed up some buffer operations. This facility may not work on */ +/* some machines so this define can be commented out if necessary */ + +#define FAST_BUFFER_OPERATIONS + +#define lp32(x) ((uint_32t*)(x)) + +#if defined( USE_VIA_ACE_IF_PRESENT ) + +#include "aes_via_ace.h" + +#pragma pack(16) + +aligned_array(unsigned long, enc_gen_table, 12, 16) = NEH_ENC_GEN_DATA; +aligned_array(unsigned long, enc_load_table, 12, 16) = NEH_ENC_LOAD_DATA; +aligned_array(unsigned long, enc_hybrid_table, 12, 16) = NEH_ENC_HYBRID_DATA; +aligned_array(unsigned long, dec_gen_table, 12, 16) = NEH_DEC_GEN_DATA; +aligned_array(unsigned long, dec_load_table, 12, 16) = NEH_DEC_LOAD_DATA; +aligned_array(unsigned long, dec_hybrid_table, 12, 16) = NEH_DEC_HYBRID_DATA; + +/* NOTE: These control word macros must only be used after */ +/* a key has been set up because they depend on key size */ + +#if NEH_KEY_TYPE == NEH_LOAD +#define kd_adr(c) ((uint_8t*)(c)->ks) +#elif NEH_KEY_TYPE == NEH_GENERATE +#define kd_adr(c) ((uint_8t*)(c)->ks + (c)->inf.b[0]) +#else +#define kd_adr(c) ((uint_8t*)(c)->ks + ((c)->inf.b[0] == 160 ? 160 : 0)) +#endif + +#else + +#define aligned_array(type, name, no, stride) type name[no] +#define aligned_auto(type, name, no, stride) type name[no] + +#endif + +#if defined( _MSC_VER ) && _MSC_VER > 1200 + +#define via_cwd(cwd, ty, dir, len) \ + unsigned long* cwd = (dir##_##ty##_table + ((len - 128) >> 4)) + +#else + +#define via_cwd(cwd, ty, dir, len) \ + aligned_auto(unsigned long, cwd, 4, 16); \ + cwd[1] = cwd[2] = cwd[3] = 0; \ + cwd[0] = neh_##dir##_##ty##_key(len) + +#endif + +/* test the code for detecting and setting pointer alignment */ + +AES_RETURN aes_test_alignment_detection(unsigned int n) /* 4 <= n <= 16 */ +{ uint_8t p[16]; + uint_32t i, count_eq = 0, count_neq = 0; + + if(n < 4 || n > 16) + return EXIT_FAILURE; + + for(i = 0; i < n; ++i) + { + uint_8t *qf = ALIGN_FLOOR(p + i, n), + *qh = ALIGN_CEIL(p + i, n); + + if(qh == qf) + ++count_eq; + else if(qh == qf + n) + ++count_neq; + else + return EXIT_FAILURE; + } + return (count_eq != 1 || count_neq != n - 1 ? EXIT_FAILURE : EXIT_SUCCESS); +} + +AES_RETURN aes_mode_reset(aes_encrypt_ctx ctx[1]) +{ + ctx->inf.b[2] = 0; + return EXIT_SUCCESS; +} + +AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_encrypt_ctx ctx[1]) +{ int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint_8t *ksp = (uint_8t*)(ctx->ks); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_ecb_op5(ksp, cwd, ibuf, obuf, nb); + } + else + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_ecb_op5(ksp, cwd, ip, op, m); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + return EXIT_SUCCESS; + } + +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) + while(nb--) + { + if(aes_encrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_decrypt_ctx ctx[1]) +{ int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint_8t *ksp = kd_adr(ctx); + via_cwd(cwd, hybrid, dec, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_ecb_op5(ksp, cwd, ibuf, obuf, nb); + } + else + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_ecb_op5(ksp, cwd, ip, op, m); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + return EXIT_SUCCESS; + } + +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) + while(nb--) + { + if(aes_decrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_encrypt_ctx ctx[1]) +{ int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint_8t *ksp = (uint_8t*)(ctx->ks), *ivp = iv; + aligned_auto(uint_8t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 ) && !ALIGN_OFFSET( iv, 16 )) + { + via_cbc_op7(ksp, cwd, ibuf, obuf, nb, ivp, ivp); + } + else + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cbc_op7(ksp, cwd, ip, op, m, ivp, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + if(iv != ivp) + memcpy(iv, ivp, AES_BLOCK_SIZE); + + return EXIT_SUCCESS; + } + +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(nb--) + { + lp32(iv)[0] ^= lp32(ibuf)[0]; + lp32(iv)[1] ^= lp32(ibuf)[1]; + lp32(iv)[2] ^= lp32(ibuf)[2]; + lp32(iv)[3] ^= lp32(ibuf)[3]; + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + memcpy(obuf, iv, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + else +# endif + while(nb--) + { + iv[ 0] ^= ibuf[ 0]; iv[ 1] ^= ibuf[ 1]; + iv[ 2] ^= ibuf[ 2]; iv[ 3] ^= ibuf[ 3]; + iv[ 4] ^= ibuf[ 4]; iv[ 5] ^= ibuf[ 5]; + iv[ 6] ^= ibuf[ 6]; iv[ 7] ^= ibuf[ 7]; + iv[ 8] ^= ibuf[ 8]; iv[ 9] ^= ibuf[ 9]; + iv[10] ^= ibuf[10]; iv[11] ^= ibuf[11]; + iv[12] ^= ibuf[12]; iv[13] ^= ibuf[13]; + iv[14] ^= ibuf[14]; iv[15] ^= ibuf[15]; + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + memcpy(obuf, iv, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_decrypt_ctx ctx[1]) +{ unsigned char tmp[AES_BLOCK_SIZE]; + int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint_8t *ksp = kd_adr(ctx), *ivp = iv; + aligned_auto(uint_8t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, dec, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 ) && !ALIGN_OFFSET( iv, 16 )) + { + via_cbc_op6(ksp, cwd, ibuf, obuf, nb, ivp); + } + else + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cbc_op6(ksp, cwd, ip, op, m, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + if(iv != ivp) + memcpy(iv, ivp, AES_BLOCK_SIZE); + + return EXIT_SUCCESS; + } +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(nb--) + { + memcpy(tmp, ibuf, AES_BLOCK_SIZE); + if(aes_decrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + lp32(obuf)[0] ^= lp32(iv)[0]; + lp32(obuf)[1] ^= lp32(iv)[1]; + lp32(obuf)[2] ^= lp32(iv)[2]; + lp32(obuf)[3] ^= lp32(iv)[3]; + memcpy(iv, tmp, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + else +# endif + while(nb--) + { + memcpy(tmp, ibuf, AES_BLOCK_SIZE); + if(aes_decrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + obuf[ 0] ^= iv[ 0]; obuf[ 1] ^= iv[ 1]; + obuf[ 2] ^= iv[ 2]; obuf[ 3] ^= iv[ 3]; + obuf[ 4] ^= iv[ 4]; obuf[ 5] ^= iv[ 5]; + obuf[ 6] ^= iv[ 6]; obuf[ 7] ^= iv[ 7]; + obuf[ 8] ^= iv[ 8]; obuf[ 9] ^= iv[ 9]; + obuf[10] ^= iv[10]; obuf[11] ^= iv[11]; + obuf[12] ^= iv[12]; obuf[13] ^= iv[13]; + obuf[14] ^= iv[14]; obuf[15] ^= iv[15]; + memcpy(iv, tmp, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx ctx[1]) +{ int cnt = 0, b_pos = (int)ctx->inf.b[2], nb; + + if(b_pos) /* complete any partial block */ + { + while(b_pos < AES_BLOCK_SIZE && cnt < len) + { + *obuf++ = (iv[b_pos++] ^= *ibuf++); + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + if((nb = (len - cnt) >> 4) != 0) /* process whole blocks */ + { +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { int m; + uint_8t *ksp = (uint_8t*)(ctx->ks), *ivp = iv; + aligned_auto(uint_8t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_cfb_op7(ksp, cwd, ibuf, obuf, nb, ivp, ivp); + ibuf += nb * AES_BLOCK_SIZE; + obuf += nb * AES_BLOCK_SIZE; + cnt += nb * AES_BLOCK_SIZE; + } + else /* input, output or both are unaligned */ + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb), nb -= m; + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cfb_op7(ksp, cwd, ip, op, m, ivp, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + cnt += m * AES_BLOCK_SIZE; + } + } + + if(ivp != iv) + memcpy(iv, ivp, AES_BLOCK_SIZE); + } +#else +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + lp32(obuf)[0] = lp32(iv)[0] ^= lp32(ibuf)[0]; + lp32(obuf)[1] = lp32(iv)[1] ^= lp32(ibuf)[1]; + lp32(obuf)[2] = lp32(iv)[2] ^= lp32(ibuf)[2]; + lp32(obuf)[3] = lp32(iv)[3] ^= lp32(ibuf)[3]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } + else +# endif + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + obuf[ 0] = iv[ 0] ^= ibuf[ 0]; obuf[ 1] = iv[ 1] ^= ibuf[ 1]; + obuf[ 2] = iv[ 2] ^= ibuf[ 2]; obuf[ 3] = iv[ 3] ^= ibuf[ 3]; + obuf[ 4] = iv[ 4] ^= ibuf[ 4]; obuf[ 5] = iv[ 5] ^= ibuf[ 5]; + obuf[ 6] = iv[ 6] ^= ibuf[ 6]; obuf[ 7] = iv[ 7] ^= ibuf[ 7]; + obuf[ 8] = iv[ 8] ^= ibuf[ 8]; obuf[ 9] = iv[ 9] ^= ibuf[ 9]; + obuf[10] = iv[10] ^= ibuf[10]; obuf[11] = iv[11] ^= ibuf[11]; + obuf[12] = iv[12] ^= ibuf[12]; obuf[13] = iv[13] ^= ibuf[13]; + obuf[14] = iv[14] ^= ibuf[14]; obuf[15] = iv[15] ^= ibuf[15]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } +#endif + } + + while(cnt < len) + { + if(!b_pos && aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(cnt < len && b_pos < AES_BLOCK_SIZE) + { + *obuf++ = (iv[b_pos++] ^= *ibuf++); + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + ctx->inf.b[2] = (uint_8t)b_pos; + return EXIT_SUCCESS; +} + +AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx ctx[1]) +{ int cnt = 0, b_pos = (int)ctx->inf.b[2], nb; + + if(b_pos) /* complete any partial block */ + { uint_8t t; + + while(b_pos < AES_BLOCK_SIZE && cnt < len) + { + t = *ibuf++; + *obuf++ = t ^ iv[b_pos]; + iv[b_pos++] = t; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + if((nb = (len - cnt) >> 4) != 0) /* process whole blocks */ + { +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { int m; + uint_8t *ksp = (uint_8t*)(ctx->ks), *ivp = iv; + aligned_auto(uint_8t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, dec, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_cfb_op6(ksp, cwd, ibuf, obuf, nb, ivp); + ibuf += nb * AES_BLOCK_SIZE; + obuf += nb * AES_BLOCK_SIZE; + cnt += nb * AES_BLOCK_SIZE; + } + else /* input, output or both are unaligned */ + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb), nb -= m; + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) /* input buffer is not aligned */ + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cfb_op6(ksp, cwd, ip, op, m, ivp); + + if(op != obuf) /* output buffer is not aligned */ + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + cnt += m * AES_BLOCK_SIZE; + } + } + + if(ivp != iv) + memcpy(iv, ivp, AES_BLOCK_SIZE); + } +#else +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) &&!ALIGN_OFFSET( iv, 4 )) + while(cnt + AES_BLOCK_SIZE <= len) + { uint_32t t; + + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + t = lp32(ibuf)[0], lp32(obuf)[0] = t ^ lp32(iv)[0], lp32(iv)[0] = t; + t = lp32(ibuf)[1], lp32(obuf)[1] = t ^ lp32(iv)[1], lp32(iv)[1] = t; + t = lp32(ibuf)[2], lp32(obuf)[2] = t ^ lp32(iv)[2], lp32(iv)[2] = t; + t = lp32(ibuf)[3], lp32(obuf)[3] = t ^ lp32(iv)[3], lp32(iv)[3] = t; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } + else +# endif + while(cnt + AES_BLOCK_SIZE <= len) + { uint_8t t; + + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + t = ibuf[ 0], obuf[ 0] = t ^ iv[ 0], iv[ 0] = t; + t = ibuf[ 1], obuf[ 1] = t ^ iv[ 1], iv[ 1] = t; + t = ibuf[ 2], obuf[ 2] = t ^ iv[ 2], iv[ 2] = t; + t = ibuf[ 3], obuf[ 3] = t ^ iv[ 3], iv[ 3] = t; + t = ibuf[ 4], obuf[ 4] = t ^ iv[ 4], iv[ 4] = t; + t = ibuf[ 5], obuf[ 5] = t ^ iv[ 5], iv[ 5] = t; + t = ibuf[ 6], obuf[ 6] = t ^ iv[ 6], iv[ 6] = t; + t = ibuf[ 7], obuf[ 7] = t ^ iv[ 7], iv[ 7] = t; + t = ibuf[ 8], obuf[ 8] = t ^ iv[ 8], iv[ 8] = t; + t = ibuf[ 9], obuf[ 9] = t ^ iv[ 9], iv[ 9] = t; + t = ibuf[10], obuf[10] = t ^ iv[10], iv[10] = t; + t = ibuf[11], obuf[11] = t ^ iv[11], iv[11] = t; + t = ibuf[12], obuf[12] = t ^ iv[12], iv[12] = t; + t = ibuf[13], obuf[13] = t ^ iv[13], iv[13] = t; + t = ibuf[14], obuf[14] = t ^ iv[14], iv[14] = t; + t = ibuf[15], obuf[15] = t ^ iv[15], iv[15] = t; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } +#endif + } + + while(cnt < len) + { uint_8t t; + + if(!b_pos && aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(cnt < len && b_pos < AES_BLOCK_SIZE) + { + t = *ibuf++; + *obuf++ = t ^ iv[b_pos]; + iv[b_pos++] = t; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + ctx->inf.b[2] = (uint_8t)b_pos; + return EXIT_SUCCESS; +} + +AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx ctx[1]) +{ int cnt = 0, b_pos = (int)ctx->inf.b[2], nb; + + if(b_pos) /* complete any partial block */ + { + while(b_pos < AES_BLOCK_SIZE && cnt < len) + { + *obuf++ = iv[b_pos++] ^ *ibuf++; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + if((nb = (len - cnt) >> 4) != 0) /* process whole blocks */ + { +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { int m; + uint_8t *ksp = (uint_8t*)(ctx->ks), *ivp = iv; + aligned_auto(uint_8t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_ofb_op6(ksp, cwd, ibuf, obuf, nb, ivp); + ibuf += nb * AES_BLOCK_SIZE; + obuf += nb * AES_BLOCK_SIZE; + cnt += nb * AES_BLOCK_SIZE; + } + else /* input, output or both are unaligned */ + { aligned_auto(uint_8t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint_8t *ip, *op; + + while(nb) + { + m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb), nb -= m; + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_ofb_op6(ksp, cwd, ip, op, m, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + cnt += m * AES_BLOCK_SIZE; + } + } + + if(ivp != iv) + memcpy(iv, ivp, AES_BLOCK_SIZE); + } +#else +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + lp32(obuf)[0] = lp32(iv)[0] ^ lp32(ibuf)[0]; + lp32(obuf)[1] = lp32(iv)[1] ^ lp32(ibuf)[1]; + lp32(obuf)[2] = lp32(iv)[2] ^ lp32(ibuf)[2]; + lp32(obuf)[3] = lp32(iv)[3] ^ lp32(ibuf)[3]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } + else +# endif + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + obuf[ 0] = iv[ 0] ^ ibuf[ 0]; obuf[ 1] = iv[ 1] ^ ibuf[ 1]; + obuf[ 2] = iv[ 2] ^ ibuf[ 2]; obuf[ 3] = iv[ 3] ^ ibuf[ 3]; + obuf[ 4] = iv[ 4] ^ ibuf[ 4]; obuf[ 5] = iv[ 5] ^ ibuf[ 5]; + obuf[ 6] = iv[ 6] ^ ibuf[ 6]; obuf[ 7] = iv[ 7] ^ ibuf[ 7]; + obuf[ 8] = iv[ 8] ^ ibuf[ 8]; obuf[ 9] = iv[ 9] ^ ibuf[ 9]; + obuf[10] = iv[10] ^ ibuf[10]; obuf[11] = iv[11] ^ ibuf[11]; + obuf[12] = iv[12] ^ ibuf[12]; obuf[13] = iv[13] ^ ibuf[13]; + obuf[14] = iv[14] ^ ibuf[14]; obuf[15] = iv[15] ^ ibuf[15]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } +#endif + } + + while(cnt < len) + { + if(!b_pos && aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(cnt < len && b_pos < AES_BLOCK_SIZE) + { + *obuf++ = iv[b_pos++] ^ *ibuf++; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + ctx->inf.b[2] = (uint_8t)b_pos; + return EXIT_SUCCESS; +} + +#define BFR_LENGTH (BFR_BLOCKS * AES_BLOCK_SIZE) + +AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx ctx[1]) +{ unsigned char *ip; + int i, blen, b_pos = (int)(ctx->inf.b[2]); + +#if defined( USE_VIA_ACE_IF_PRESENT ) + aligned_auto(uint_8t, buf, BFR_LENGTH, 16); + if(ctx->inf.b[1] == 0xff && ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; +#else + uint_8t buf[BFR_LENGTH]; +#endif + + if(b_pos) + { + memcpy(buf, cbuf, AES_BLOCK_SIZE); + if(aes_ecb_encrypt(buf, buf, AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(b_pos < AES_BLOCK_SIZE && len) + { + *obuf++ = *ibuf++ ^ buf[b_pos++]; + --len; + } + + if(len) + ctr_inc(cbuf), b_pos = 0; + } + + while(len) + { + blen = (len > BFR_LENGTH ? BFR_LENGTH : len), len -= blen; + + for(i = 0, ip = buf; i < (blen >> 4); ++i) + { + memcpy(ip, cbuf, AES_BLOCK_SIZE); + ctr_inc(cbuf); + ip += AES_BLOCK_SIZE; + } + + if(blen & (AES_BLOCK_SIZE - 1)) + memcpy(ip, cbuf, AES_BLOCK_SIZE), i++; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + if(ctx->inf.b[1] == 0xff) + { + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + via_ecb_op5((ctx->ks), cwd, buf, buf, i); + } + else +#endif + if(aes_ecb_encrypt(buf, buf, i * AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + i = 0; ip = buf; +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( ip, 4 )) + while(i + AES_BLOCK_SIZE <= blen) + { + lp32(obuf)[0] = lp32(ibuf)[0] ^ lp32(ip)[0]; + lp32(obuf)[1] = lp32(ibuf)[1] ^ lp32(ip)[1]; + lp32(obuf)[2] = lp32(ibuf)[2] ^ lp32(ip)[2]; + lp32(obuf)[3] = lp32(ibuf)[3] ^ lp32(ip)[3]; + i += AES_BLOCK_SIZE; + ip += AES_BLOCK_SIZE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + else +#endif + while(i + AES_BLOCK_SIZE <= blen) + { + obuf[ 0] = ibuf[ 0] ^ ip[ 0]; obuf[ 1] = ibuf[ 1] ^ ip[ 1]; + obuf[ 2] = ibuf[ 2] ^ ip[ 2]; obuf[ 3] = ibuf[ 3] ^ ip[ 3]; + obuf[ 4] = ibuf[ 4] ^ ip[ 4]; obuf[ 5] = ibuf[ 5] ^ ip[ 5]; + obuf[ 6] = ibuf[ 6] ^ ip[ 6]; obuf[ 7] = ibuf[ 7] ^ ip[ 7]; + obuf[ 8] = ibuf[ 8] ^ ip[ 8]; obuf[ 9] = ibuf[ 9] ^ ip[ 9]; + obuf[10] = ibuf[10] ^ ip[10]; obuf[11] = ibuf[11] ^ ip[11]; + obuf[12] = ibuf[12] ^ ip[12]; obuf[13] = ibuf[13] ^ ip[13]; + obuf[14] = ibuf[14] ^ ip[14]; obuf[15] = ibuf[15] ^ ip[15]; + i += AES_BLOCK_SIZE; + ip += AES_BLOCK_SIZE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + + while(i++ < blen) + *obuf++ = *ibuf++ ^ ip[b_pos++]; + } + + ctx->inf.b[2] = (uint_8t)b_pos; + return EXIT_SUCCESS; +} + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/aes_via_ace.h b/aes_via_ace.h new file mode 100644 index 0000000..13f2016 --- /dev/null +++ b/aes_via_ace.h @@ -0,0 +1,529 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/20077 +*/ + +#ifndef AES_VIA_ACE_H +#define AES_VIA_ACE_H + +#if defined( _MSC_VER ) +# define INLINE __inline +#elif defined( __GNUC__ ) +# define INLINE static inline +#else +# error VIA ACE requires Microsoft or GNU C +#endif + +#define NEH_GENERATE 1 +#define NEH_LOAD 2 +#define NEH_HYBRID 3 + +#define MAX_READ_ATTEMPTS 1000 + +/* VIA Nehemiah RNG and ACE Feature Mask Values */ + +#define NEH_CPU_IS_VIA 0x00000001 +#define NEH_CPU_READ 0x00000010 +#define NEH_CPU_MASK 0x00000011 + +#define NEH_RNG_PRESENT 0x00000004 +#define NEH_RNG_ENABLED 0x00000008 +#define NEH_ACE_PRESENT 0x00000040 +#define NEH_ACE_ENABLED 0x00000080 +#define NEH_RNG_FLAGS (NEH_RNG_PRESENT | NEH_RNG_ENABLED) +#define NEH_ACE_FLAGS (NEH_ACE_PRESENT | NEH_ACE_ENABLED) +#define NEH_FLAGS_MASK (NEH_RNG_FLAGS | NEH_ACE_FLAGS) + +/* VIA Nehemiah Advanced Cryptography Engine (ACE) Control Word Values */ + +#define NEH_GEN_KEY 0x00000000 /* generate key schedule */ +#define NEH_LOAD_KEY 0x00000080 /* load schedule from memory */ +#define NEH_ENCRYPT 0x00000000 /* encryption */ +#define NEH_DECRYPT 0x00000200 /* decryption */ +#define NEH_KEY128 0x00000000+0x0a /* 128 bit key */ +#define NEH_KEY192 0x00000400+0x0c /* 192 bit key */ +#define NEH_KEY256 0x00000800+0x0e /* 256 bit key */ + +#define NEH_ENC_GEN (NEH_ENCRYPT | NEH_GEN_KEY) +#define NEH_DEC_GEN (NEH_DECRYPT | NEH_GEN_KEY) +#define NEH_ENC_LOAD (NEH_ENCRYPT | NEH_LOAD_KEY) +#define NEH_DEC_LOAD (NEH_DECRYPT | NEH_LOAD_KEY) + +#define NEH_ENC_GEN_DATA {\ + NEH_ENC_GEN | NEH_KEY128, 0, 0, 0,\ + NEH_ENC_GEN | NEH_KEY192, 0, 0, 0,\ + NEH_ENC_GEN | NEH_KEY256, 0, 0, 0 } + +#define NEH_ENC_LOAD_DATA {\ + NEH_ENC_LOAD | NEH_KEY128, 0, 0, 0,\ + NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\ + NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 } + +#define NEH_ENC_HYBRID_DATA {\ + NEH_ENC_GEN | NEH_KEY128, 0, 0, 0,\ + NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\ + NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 } + +#define NEH_DEC_GEN_DATA {\ + NEH_DEC_GEN | NEH_KEY128, 0, 0, 0,\ + NEH_DEC_GEN | NEH_KEY192, 0, 0, 0,\ + NEH_DEC_GEN | NEH_KEY256, 0, 0, 0 } + +#define NEH_DEC_LOAD_DATA {\ + NEH_DEC_LOAD | NEH_KEY128, 0, 0, 0,\ + NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\ + NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 } + +#define NEH_DEC_HYBRID_DATA {\ + NEH_DEC_GEN | NEH_KEY128, 0, 0, 0,\ + NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\ + NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 } + +#define neh_enc_gen_key(x) ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) : \ + (x) == 192 ? (NEH_ENC_GEN | NEH_KEY192) : (NEH_ENC_GEN | NEH_KEY256)) + +#define neh_enc_load_key(x) ((x) == 128 ? (NEH_ENC_LOAD | NEH_KEY128) : \ + (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256)) + +#define neh_enc_hybrid_key(x) ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) : \ + (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256)) + +#define neh_dec_gen_key(x) ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) : \ + (x) == 192 ? (NEH_DEC_GEN | NEH_KEY192) : (NEH_DEC_GEN | NEH_KEY256)) + +#define neh_dec_load_key(x) ((x) == 128 ? (NEH_DEC_LOAD | NEH_KEY128) : \ + (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256)) + +#define neh_dec_hybrid_key(x) ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) : \ + (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256)) + +#if defined( _MSC_VER ) && ( _MSC_VER > 1200 ) +#define aligned_auto(type, name, no, stride) __declspec(align(stride)) type name[no] +#else +#define aligned_auto(type, name, no, stride) \ + unsigned char _##name[no * sizeof(type) + stride]; \ + type *name = (type*)(16 * ((((unsigned long)(_##name)) + stride - 1) / stride)) +#endif + +#if defined( _MSC_VER ) && ( _MSC_VER > 1200 ) +#define aligned_array(type, name, no, stride) __declspec(align(stride)) type name[no] +#elif defined( __GNUC__ ) +#define aligned_array(type, name, no, stride) type name[no] __attribute__ ((aligned(stride))) +#else +#define aligned_array(type, name, no, stride) type name[no] +#endif + +/* VIA ACE codeword */ + +static unsigned char via_flags = 0; + +#if defined ( _MSC_VER ) && ( _MSC_VER > 800 ) + +#define NEH_REKEY __asm pushfd __asm popfd +#define NEH_AES __asm _emit 0xf3 __asm _emit 0x0f __asm _emit 0xa7 +#define NEH_ECB NEH_AES __asm _emit 0xc8 +#define NEH_CBC NEH_AES __asm _emit 0xd0 +#define NEH_CFB NEH_AES __asm _emit 0xe0 +#define NEH_OFB NEH_AES __asm _emit 0xe8 +#define NEH_RNG __asm _emit 0x0f __asm _emit 0xa7 __asm _emit 0xc0 + +INLINE int has_cpuid(void) +{ char ret_value; + __asm + { pushfd /* save EFLAGS register */ + mov eax,[esp] /* copy it to eax */ + mov edx,0x00200000 /* CPUID bit position */ + xor eax,edx /* toggle the CPUID bit */ + push eax /* attempt to set EFLAGS to */ + popfd /* the new value */ + pushfd /* get the new EFLAGS value */ + pop eax /* into eax */ + xor eax,[esp] /* xor with original value */ + and eax,edx /* has CPUID bit changed? */ + setne al /* set to 1 if we have been */ + mov ret_value,al /* able to change it */ + popfd /* restore original EFLAGS */ + } + return (int)ret_value; +} + +INLINE int is_via_cpu(void) +{ char ret_value; + __asm + { xor eax,eax /* use CPUID to get vendor */ + cpuid /* identity string */ + xor eax,eax /* is it "CentaurHauls" ? */ + sub ebx,0x746e6543 /* 'Cent' */ + or eax,ebx + sub edx,0x48727561 /* 'aurH' */ + or eax,edx + sub ecx,0x736c7561 /* 'auls' */ + or eax,ecx + sete al /* set to 1 if it is VIA ID */ + mov dl,NEH_CPU_READ /* mark CPU type as read */ + or dl,al /* & store result in flags */ + mov [via_flags],dl /* set VIA detected flag */ + mov ret_value,al /* able to change it */ + } + return (int)ret_value; +} + +INLINE int read_via_flags(void) +{ char ret_value = 0; + __asm + { + mov eax,0xC0000000 /* Centaur extended CPUID */ + cpuid + mov edx,0xc0000001 /* >= 0xc0000001 if support */ + cmp eax,edx /* for VIA extended feature */ + jnae no_rng /* flags is available */ + mov eax,edx /* read Centaur extended */ + cpuid /* feature flags */ + mov eax,NEH_FLAGS_MASK /* mask out and save */ + and eax,edx /* the RNG and ACE flags */ + or [via_flags],al /* present & enabled flags */ + mov ret_value,al /* able to change it */ +no_rng: + } + return (int)ret_value; +} + +INLINE unsigned int via_rng_in(void *buf) +{ char ret_value = 0x1f; + __asm + { + push edi + mov edi,buf /* input buffer address */ + xor edx,edx /* try to fetch 8 bytes */ + NEH_RNG /* do RNG read operation */ + and ret_value,al /* count of bytes returned */ + pop edi + } + return (int)ret_value; +} + +INLINE void via_ecb_op5( + const void *k, const void *c, const void *s, void *d, int l) +{ __asm + { + NEH_REKEY + mov ebx, (k) + mov edx, (c) + mov esi, (s) + mov edi, (d) + mov ecx, (l) + NEH_ECB + } +} + +INLINE void via_cbc_op6( + const void *k, const void *c, const void *s, void *d, int l, void *v) +{ __asm + { + NEH_REKEY + mov ebx, (k) + mov edx, (c) + mov esi, (s) + mov edi, (d) + mov ecx, (l) + mov eax, (v) + NEH_CBC + } +} + +INLINE void via_cbc_op7( + const void *k, const void *c, const void *s, void *d, int l, void *v, void *w) +{ __asm + { + NEH_REKEY + mov ebx, (k) + mov edx, (c) + mov esi, (s) + mov edi, (d) + mov ecx, (l) + mov eax, (v) + NEH_CBC + mov esi, eax + mov edi, (w) + movsd + movsd + movsd + movsd + } +} + +INLINE void via_cfb_op6( + const void *k, const void *c, const void *s, void *d, int l, void *v) +{ __asm + { + NEH_REKEY + mov ebx, (k) + mov edx, (c) + mov esi, (s) + mov edi, (d) + mov ecx, (l) + mov eax, (v) + NEH_CFB + } +} + +INLINE void via_cfb_op7( + const void *k, const void *c, const void *s, void *d, int l, void *v, void *w) +{ __asm + { + NEH_REKEY + mov ebx, (k) + mov edx, (c) + mov esi, (s) + mov edi, (d) + mov ecx, (l) + mov eax, (v) + NEH_CFB + mov esi, eax + mov edi, (w) + movsd + movsd + movsd + movsd + } +} + +INLINE void via_ofb_op6( + const void *k, const void *c, const void *s, void *d, int l, void *v) +{ __asm + { + NEH_REKEY + mov ebx, (k) + mov edx, (c) + mov esi, (s) + mov edi, (d) + mov ecx, (l) + mov eax, (v) + NEH_OFB + } +} + +#elif defined( __GNUC__ ) + +#define NEH_REKEY asm("pushfl\n popfl\n\t") +#define NEH_ECB asm(".byte 0xf3, 0x0f, 0xa7, 0xc8\n\t") +#define NEH_CBC asm(".byte 0xf3, 0x0f, 0xa7, 0xd0\n\t") +#define NEH_CFB asm(".byte 0xf3, 0x0f, 0xa7, 0xe0\n\t") +#define NEH_OFB asm(".byte 0xf3, 0x0f, 0xa7, 0xe8\n\t") +#define NEH_RNG asm(".byte 0x0f, 0xa7, 0xc0\n\t"); + +INLINE int has_cpuid(void) +{ int val; + asm("pushfl\n\t"); + asm("movl 0(%esp),%eax\n\t"); + asm("xor $0x00200000,%eax\n\t"); + asm("pushl %eax\n\t"); + asm("popfl\n\t"); + asm("pushfl\n\t"); + asm("popl %eax\n\t"); + asm("xorl 0(%esp),%edx\n\t"); + asm("andl $0x00200000,%eax\n\t"); + asm("movl %%eax,%0\n\t" : "=m" (val)); + asm("popfl\n\t"); + return val ? 1 : 0; +} + +INLINE int is_via_cpu(void) +{ int val; + asm("xorl %eax,%eax\n\t"); + asm("cpuid\n\t"); + asm("xorl %eax,%eax\n\t"); + asm("subl $0x746e6543,%ebx\n\t"); + asm("orl %ebx,%eax\n\t"); + asm("subl $0x48727561,%edx\n\t"); + asm("orl %edx,%eax\n\t"); + asm("subl $0x736c7561,%ecx\n\t"); + asm("orl %ecx,%eax\n\t"); + asm("movl %%eax,%0\n\t" : "=m" (val)); + val = (val ? 0 : 1); + via_flags = (val | NEH_CPU_READ); + return val; +} + +INLINE int read_via_flags(void) +{ unsigned char val; + asm("movl $0xc0000000,%eax\n\t"); + asm("cpuid\n\t"); + asm("movl $0xc0000001,%edx\n\t"); + asm("cmpl %edx,%eax\n\t"); + asm("setae %al\n\t"); + asm("movb %%al,%0\n\t" : "=m" (val)); + if(!val) return 0; + asm("movl $0xc0000001,%eax\n\t"); + asm("cpuid\n\t"); + asm("movb %%dl,%0\n\t" : "=m" (val)); + val &= NEH_FLAGS_MASK; + via_flags |= val; + return (int) val; +} + +INLINE int via_rng_in(void *buf) +{ int val; + asm("pushl %edi\n\t"); + asm("movl %0,%%edi\n\t" : : "m" (buf)); + asm("xorl %edx,%edx\n\t"); + NEH_RNG + asm("andl $0x0000001f,%eax\n\t"); + asm("movl %%eax,%0\n\t" : "=m" (val)); + asm("popl %edi\n\t"); + return val; +} + +INLINE volatile void via_ecb_op5( + const void *k, const void *c, const void *s, void *d, int l) +{ + NEH_REKEY; + asm("movl %0, %%ebx\n\t" : : "m" (k)); + asm("movl %0, %%edx\n\t" : : "m" (c)); + asm("movl %0, %%esi\n\t" : : "m" (s)); + asm("movl %0, %%edi\n\t" : : "m" (d)); + asm("movl %0, %%ecx\n\t" : : "m" (l)); + NEH_ECB; +} + +INLINE volatile void via_cbc_op6( + const void *k, const void *c, const void *s, void *d, int l, void *v) +{ + NEH_REKEY; + asm("movl %0, %%ebx\n\t" : : "m" (k)); + asm("movl %0, %%edx\n\t" : : "m" (c)); + asm("movl %0, %%esi\n\t" : : "m" (s)); + asm("movl %0, %%edi\n\t" : : "m" (d)); + asm("movl %0, %%ecx\n\t" : : "m" (l)); + asm("movl %0, %%eax\n\t" : : "m" (v)); + NEH_CBC; +} + +INLINE volatile void via_cbc_op7( + const void *k, const void *c, const void *s, void *d, int l, void *v, void *w) +{ + NEH_REKEY; + asm("movl %0, %%ebx\n\t" : : "m" (k)); + asm("movl %0, %%edx\n\t" : : "m" (c)); + asm("movl %0, %%esi\n\t" : : "m" (s)); + asm("movl %0, %%edi\n\t" : : "m" (d)); + asm("movl %0, %%ecx\n\t" : : "m" (l)); + asm("movl %0, %%eax\n\t" : : "m" (v)); + NEH_CBC; + asm("movl %eax,%esi\n\t"); + asm("movl %0, %%edi\n\t" : : "m" (w)); + asm("movsl; movsl; movsl; movsl\n\t"); +} + +INLINE volatile void via_cfb_op6( + const void *k, const void *c, const void *s, void *d, int l, void *v) +{ + NEH_REKEY; + asm("movl %0, %%ebx\n\t" : : "m" (k)); + asm("movl %0, %%edx\n\t" : : "m" (c)); + asm("movl %0, %%esi\n\t" : : "m" (s)); + asm("movl %0, %%edi\n\t" : : "m" (d)); + asm("movl %0, %%ecx\n\t" : : "m" (l)); + asm("movl %0, %%eax\n\t" : : "m" (v)); + NEH_CFB; +} + +INLINE volatile void via_cfb_op7( + const void *k, const void *c, const void *s, void *d, int l, void *v, void *w) +{ + NEH_REKEY; + asm("movl %0, %%ebx\n\t" : : "m" (k)); + asm("movl %0, %%edx\n\t" : : "m" (c)); + asm("movl %0, %%esi\n\t" : : "m" (s)); + asm("movl %0, %%edi\n\t" : : "m" (d)); + asm("movl %0, %%ecx\n\t" : : "m" (l)); + asm("movl %0, %%eax\n\t" : : "m" (v)); + NEH_CFB; + asm("movl %eax,%esi\n\t"); + asm("movl %0, %%edi\n\t" : : "m" (w)); + asm("movsl; movsl; movsl; movsl\n\t"); +} + +INLINE volatile void via_ofb_op6( + const void *k, const void *c, const void *s, void *d, int l, void *v) +{ + NEH_REKEY; + asm("movl %0, %%ebx\n\t" : : "m" (k)); + asm("movl %0, %%edx\n\t" : : "m" (c)); + asm("movl %0, %%esi\n\t" : : "m" (s)); + asm("movl %0, %%edi\n\t" : : "m" (d)); + asm("movl %0, %%ecx\n\t" : : "m" (l)); + asm("movl %0, %%eax\n\t" : : "m" (v)); + NEH_OFB; +} + +#else +#error VIA ACE is not available with this compiler +#endif + +INLINE int via_ace_test(void) +{ + return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_ACE_FLAGS) == NEH_ACE_FLAGS); +} + +#define VIA_ACE_AVAILABLE (((via_flags & NEH_ACE_FLAGS) == NEH_ACE_FLAGS) \ + || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_ace_test()) + +INLINE int via_rng_test(void) +{ + return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_RNG_FLAGS) == NEH_RNG_FLAGS); +} + +#define VIA_RNG_AVAILABLE (((via_flags & NEH_RNG_FLAGS) == NEH_RNG_FLAGS) \ + || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_rng_test()) + +INLINE int read_via_rng(void *buf, int count) +{ int nbr, max_reads, lcnt = count; + unsigned char *p, *q; + aligned_auto(unsigned char, bp, 64, 16); + + if(!VIA_RNG_AVAILABLE) + return 0; + + do + { + max_reads = MAX_READ_ATTEMPTS; + do + nbr = via_rng_in(bp); + while + (nbr == 0 && --max_reads); + + lcnt -= nbr; + p = (unsigned char*)buf; q = bp; + while(nbr--) + *p++ = *q++; + } + while + (lcnt && max_reads); + + return count - lcnt; +} + +#endif diff --git a/aescrypt.c b/aescrypt.c new file mode 100644 index 0000000..1fe1b5a --- /dev/null +++ b/aescrypt.c @@ -0,0 +1,301 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 +*/ + +#include "aesopt.h" +#include "aestab.h" + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#define si(y,x,k,c) (s(y,c) = word_in(x, c) ^ (k)[c]) +#define so(y,x,c) word_out(y, c, s(x,c)) + +#if defined(ARRAYS) +#define locals(y,x) x[4],y[4] +#else +#define locals(y,x) x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3 +#endif + +#define l_copy(y, x) s(y,0) = s(x,0); s(y,1) = s(x,1); \ + s(y,2) = s(x,2); s(y,3) = s(x,3); +#define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3) +#define state_out(y,x) so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3) +#define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3) + +#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) + +/* Visual C++ .Net v7.1 provides the fastest encryption code when using + Pentium optimiation with small code but this is poor for decryption + so we need to control this with the following VC++ pragmas +*/ + +#if defined( _MSC_VER ) && !defined( _WIN64 ) +#pragma optimize( "s", on ) +#endif + +/* Given the column (c) of the output state variable, the following + macros give the input state variables which are needed in its + computation for each row (r) of the state. All the alternative + macros give the same end values but expand into different ways + of calculating these values. In particular the complex macro + used for dynamically variable block sizes is designed to expand + to a compile time constant whenever possible but will expand to + conditional clauses on some branches (I am grateful to Frank + Yellin for this construction) +*/ + +#define fwd_var(x,r,c)\ + ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\ + : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\ + : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\ + : ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))) + +#if defined(FT4_SET) +#undef dec_fmvars +#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c)) +#elif defined(FT1_SET) +#undef dec_fmvars +#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(f,n),fwd_var,rf1,c)) +#else +#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ fwd_mcol(no_table(x,t_use(s,box),fwd_var,rf1,c))) +#endif + +#if defined(FL4_SET) +#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c)) +#elif defined(FL1_SET) +#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(f,l),fwd_var,rf1,c)) +#else +#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(s,box),fwd_var,rf1,c)) +#endif + +AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]) +{ uint_32t locals(b0, b1); + const uint_32t *kp; +#if defined( dec_fmvars ) + dec_fmvars; /* declare variables for fwd_mcol() if needed */ +#endif + + if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 ) + return EXIT_FAILURE; + + kp = cx->ks; + state_in(b0, in, kp); + +#if (ENC_UNROLL == FULL) + + switch(cx->inf.b[0]) + { + case 14 * 16: + round(fwd_rnd, b1, b0, kp + 1 * N_COLS); + round(fwd_rnd, b0, b1, kp + 2 * N_COLS); + kp += 2 * N_COLS; + case 12 * 16: + round(fwd_rnd, b1, b0, kp + 1 * N_COLS); + round(fwd_rnd, b0, b1, kp + 2 * N_COLS); + kp += 2 * N_COLS; + case 10 * 16: + round(fwd_rnd, b1, b0, kp + 1 * N_COLS); + round(fwd_rnd, b0, b1, kp + 2 * N_COLS); + round(fwd_rnd, b1, b0, kp + 3 * N_COLS); + round(fwd_rnd, b0, b1, kp + 4 * N_COLS); + round(fwd_rnd, b1, b0, kp + 5 * N_COLS); + round(fwd_rnd, b0, b1, kp + 6 * N_COLS); + round(fwd_rnd, b1, b0, kp + 7 * N_COLS); + round(fwd_rnd, b0, b1, kp + 8 * N_COLS); + round(fwd_rnd, b1, b0, kp + 9 * N_COLS); + round(fwd_lrnd, b0, b1, kp +10 * N_COLS); + } + +#else + +#if (ENC_UNROLL == PARTIAL) + { uint_32t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd) + { + kp += N_COLS; + round(fwd_rnd, b1, b0, kp); + kp += N_COLS; + round(fwd_rnd, b0, b1, kp); + } + kp += N_COLS; + round(fwd_rnd, b1, b0, kp); +#else + { uint_32t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd) + { + kp += N_COLS; + round(fwd_rnd, b1, b0, kp); + l_copy(b0, b1); + } +#endif + kp += N_COLS; + round(fwd_lrnd, b0, b1, kp); + } +#endif + + state_out(out, b0); + return EXIT_SUCCESS; +} + +#endif + +#if ( FUNCS_IN_C & DECRYPTION_IN_C) + +/* Visual C++ .Net v7.1 provides the fastest encryption code when using + Pentium optimiation with small code but this is poor for decryption + so we need to control this with the following VC++ pragmas +*/ + +#if defined( _MSC_VER ) && !defined( _WIN64 ) +#pragma optimize( "t", on ) +#endif + +/* Given the column (c) of the output state variable, the following + macros give the input state variables which are needed in its + computation for each row (r) of the state. All the alternative + macros give the same end values but expand into different ways + of calculating these values. In particular the complex macro + used for dynamically variable block sizes is designed to expand + to a compile time constant whenever possible but will expand to + conditional clauses on some branches (I am grateful to Frank + Yellin for this construction) +*/ + +#define inv_var(x,r,c)\ + ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\ + : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\ + : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\ + : ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))) + +#if defined(IT4_SET) +#undef dec_imvars +#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c)) +#elif defined(IT1_SET) +#undef dec_imvars +#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(i,n),inv_var,rf1,c)) +#else +#define inv_rnd(y,x,k,c) (s(y,c) = inv_mcol((k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c))) +#endif + +#if defined(IL4_SET) +#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c)) +#elif defined(IL1_SET) +#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(i,l),inv_var,rf1,c)) +#else +#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c)) +#endif + +/* This code can work with the decryption key schedule in the */ +/* order that is used for encrytpion (where the 1st decryption */ +/* round key is at the high end ot the schedule) or with a key */ +/* schedule that has been reversed to put the 1st decryption */ +/* round key at the low end of the schedule in memory (when */ +/* AES_REV_DKS is defined) */ + +#ifdef AES_REV_DKS +#define key_ofs 0 +#define rnd_key(n) (kp + n * N_COLS) +#else +#define key_ofs 1 +#define rnd_key(n) (kp - n * N_COLS) +#endif + +AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]) +{ uint_32t locals(b0, b1); +#if defined( dec_imvars ) + dec_imvars; /* declare variables for inv_mcol() if needed */ +#endif + const uint_32t *kp; + + if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 ) + return EXIT_FAILURE; + + kp = cx->ks + (key_ofs ? (cx->inf.b[0] >> 2) : 0); + state_in(b0, in, kp); + +#if (DEC_UNROLL == FULL) + + kp = cx->ks + (key_ofs ? 0 : (cx->inf.b[0] >> 2)); + switch(cx->inf.b[0]) + { + case 14 * 16: + round(inv_rnd, b1, b0, rnd_key(-13)); + round(inv_rnd, b0, b1, rnd_key(-12)); + case 12 * 16: + round(inv_rnd, b1, b0, rnd_key(-11)); + round(inv_rnd, b0, b1, rnd_key(-10)); + case 10 * 16: + round(inv_rnd, b1, b0, rnd_key(-9)); + round(inv_rnd, b0, b1, rnd_key(-8)); + round(inv_rnd, b1, b0, rnd_key(-7)); + round(inv_rnd, b0, b1, rnd_key(-6)); + round(inv_rnd, b1, b0, rnd_key(-5)); + round(inv_rnd, b0, b1, rnd_key(-4)); + round(inv_rnd, b1, b0, rnd_key(-3)); + round(inv_rnd, b0, b1, rnd_key(-2)); + round(inv_rnd, b1, b0, rnd_key(-1)); + round(inv_lrnd, b0, b1, rnd_key( 0)); + } + +#else + +#if (DEC_UNROLL == PARTIAL) + { uint_32t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd) + { + kp = rnd_key(1); + round(inv_rnd, b1, b0, kp); + kp = rnd_key(1); + round(inv_rnd, b0, b1, kp); + } + kp = rnd_key(1); + round(inv_rnd, b1, b0, kp); +#else + { uint_32t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd) + { + kp = rnd_key(1); + round(inv_rnd, b1, b0, kp); + l_copy(b0, b1); + } +#endif + kp = rnd_key(1); + round(inv_lrnd, b0, b1, kp); + } +#endif + + state_out(out, b0); + return EXIT_SUCCESS; +} + +#endif + +#if defined(__cplusplus) +} +#endif diff --git a/aeskey.c b/aeskey.c new file mode 100644 index 0000000..4964861 --- /dev/null +++ b/aeskey.c @@ -0,0 +1,555 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 +*/ + +#include "aesopt.h" +#include "aestab.h" + +#ifdef USE_VIA_ACE_IF_PRESENT +# include "aes_via_ace.h" +#endif + +#if defined(__cplusplus) +extern "C" +{ +#endif + +/* Initialise the key schedule from the user supplied key. The key + length can be specified in bytes, with legal values of 16, 24 + and 32, or in bits, with legal values of 128, 192 and 256. These + values correspond with Nk values of 4, 6 and 8 respectively. + + The following macros implement a single cycle in the key + schedule generation process. The number of cycles needed + for each cx->n_col and nk value is: + + nk = 4 5 6 7 8 + ------------------------------ + cx->n_col = 4 10 9 8 7 7 + cx->n_col = 5 14 11 10 9 9 + cx->n_col = 6 19 15 12 11 11 + cx->n_col = 7 21 19 16 13 14 + cx->n_col = 8 29 23 19 17 14 +*/ + +#if defined( REDUCE_CODE_SIZE ) +# define ls_box ls_sub + uint_32t ls_sub(const uint_32t t, const uint_32t n); +# define inv_mcol im_sub + uint_32t im_sub(const uint_32t x); +# ifdef ENC_KS_UNROLL +# undef ENC_KS_UNROLL +# endif +# ifdef DEC_KS_UNROLL +# undef DEC_KS_UNROLL +# endif +#endif + +#if (FUNCS_IN_C & ENC_KEYING_IN_C) + +#if defined(AES_128) || defined( AES_VAR ) + +#define ke4(k,i) \ +{ k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \ + k[4*(i)+5] = ss[1] ^= ss[0]; \ + k[4*(i)+6] = ss[2] ^= ss[1]; \ + k[4*(i)+7] = ss[3] ^= ss[2]; \ +} + +AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]) +{ uint_32t ss[4]; + + cx->ks[0] = ss[0] = word_in(key, 0); + cx->ks[1] = ss[1] = word_in(key, 1); + cx->ks[2] = ss[2] = word_in(key, 2); + cx->ks[3] = ss[3] = word_in(key, 3); + +#ifdef ENC_KS_UNROLL + ke4(cx->ks, 0); ke4(cx->ks, 1); + ke4(cx->ks, 2); ke4(cx->ks, 3); + ke4(cx->ks, 4); ke4(cx->ks, 5); + ke4(cx->ks, 6); ke4(cx->ks, 7); + ke4(cx->ks, 8); +#else + { uint_32t i; + for(i = 0; i < 9; ++i) + ke4(cx->ks, i); + } +#endif + ke4(cx->ks, 9); + cx->inf.l = 0; + cx->inf.b[0] = 10 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_192) || defined( AES_VAR ) + +#define kef6(k,i) \ +{ k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \ + k[6*(i)+ 7] = ss[1] ^= ss[0]; \ + k[6*(i)+ 8] = ss[2] ^= ss[1]; \ + k[6*(i)+ 9] = ss[3] ^= ss[2]; \ +} + +#define ke6(k,i) \ +{ kef6(k,i); \ + k[6*(i)+10] = ss[4] ^= ss[3]; \ + k[6*(i)+11] = ss[5] ^= ss[4]; \ +} + +AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]) +{ uint_32t ss[6]; + + cx->ks[0] = ss[0] = word_in(key, 0); + cx->ks[1] = ss[1] = word_in(key, 1); + cx->ks[2] = ss[2] = word_in(key, 2); + cx->ks[3] = ss[3] = word_in(key, 3); + cx->ks[4] = ss[4] = word_in(key, 4); + cx->ks[5] = ss[5] = word_in(key, 5); + +#ifdef ENC_KS_UNROLL + ke6(cx->ks, 0); ke6(cx->ks, 1); + ke6(cx->ks, 2); ke6(cx->ks, 3); + ke6(cx->ks, 4); ke6(cx->ks, 5); + ke6(cx->ks, 6); +#else + { uint_32t i; + for(i = 0; i < 7; ++i) + ke6(cx->ks, i); + } +#endif + kef6(cx->ks, 7); + cx->inf.l = 0; + cx->inf.b[0] = 12 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_256) || defined( AES_VAR ) + +#define kef8(k,i) \ +{ k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \ + k[8*(i)+ 9] = ss[1] ^= ss[0]; \ + k[8*(i)+10] = ss[2] ^= ss[1]; \ + k[8*(i)+11] = ss[3] ^= ss[2]; \ +} + +#define ke8(k,i) \ +{ kef8(k,i); \ + k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \ + k[8*(i)+13] = ss[5] ^= ss[4]; \ + k[8*(i)+14] = ss[6] ^= ss[5]; \ + k[8*(i)+15] = ss[7] ^= ss[6]; \ +} + +AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]) +{ uint_32t ss[8]; + + cx->ks[0] = ss[0] = word_in(key, 0); + cx->ks[1] = ss[1] = word_in(key, 1); + cx->ks[2] = ss[2] = word_in(key, 2); + cx->ks[3] = ss[3] = word_in(key, 3); + cx->ks[4] = ss[4] = word_in(key, 4); + cx->ks[5] = ss[5] = word_in(key, 5); + cx->ks[6] = ss[6] = word_in(key, 6); + cx->ks[7] = ss[7] = word_in(key, 7); + +#ifdef ENC_KS_UNROLL + ke8(cx->ks, 0); ke8(cx->ks, 1); + ke8(cx->ks, 2); ke8(cx->ks, 3); + ke8(cx->ks, 4); ke8(cx->ks, 5); +#else + { uint_32t i; + for(i = 0; i < 6; ++i) + ke8(cx->ks, i); + } +#endif + kef8(cx->ks, 6); + cx->inf.l = 0; + cx->inf.b[0] = 14 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined( AES_VAR ) + +AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]) +{ + switch(key_len) + { + case 16: case 128: return aes_encrypt_key128(key, cx); + case 24: case 192: return aes_encrypt_key192(key, cx); + case 32: case 256: return aes_encrypt_key256(key, cx); + default: return EXIT_FAILURE; + } +} + +#endif + +#endif + +#if (FUNCS_IN_C & DEC_KEYING_IN_C) + +/* this is used to store the decryption round keys */ +/* in forward or reverse order */ + +#ifdef AES_REV_DKS +#define v(n,i) ((n) - (i) + 2 * ((i) & 3)) +#else +#define v(n,i) (i) +#endif + +#if DEC_ROUND == NO_TABLES +#define ff(x) (x) +#else +#define ff(x) inv_mcol(x) +#if defined( dec_imvars ) +#define d_vars dec_imvars +#endif +#endif + +#if defined(AES_128) || defined( AES_VAR ) + +#define k4e(k,i) \ +{ k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \ + k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \ + k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \ + k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \ +} + +#if 1 + +#define kdf4(k,i) \ +{ ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \ + ss[1] = ss[1] ^ ss[3]; \ + ss[2] = ss[2] ^ ss[3]; \ + ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \ + ss[i % 4] ^= ss[4]; \ + ss[4] ^= k[v(40,(4*(i)))]; k[v(40,(4*(i))+4)] = ff(ss[4]); \ + ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \ + ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \ + ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \ +} + +#define kd4(k,i) \ +{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \ + ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \ + k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \ + k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \ + k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \ + k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \ +} + +#define kdl4(k,i) \ +{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \ + k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \ + k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \ + k[v(40,(4*(i))+6)] = ss[0]; \ + k[v(40,(4*(i))+7)] = ss[1]; \ +} + +#else + +#define kdf4(k,i) \ +{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \ + ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \ + ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \ + ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \ +} + +#define kd4(k,i) \ +{ ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \ + ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \ + ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \ + ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \ + ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \ +} + +#define kdl4(k,i) \ +{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \ + ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \ + ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \ + ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \ +} + +#endif + +AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]) +{ uint_32t ss[5]; +#if defined( d_vars ) + d_vars; +#endif + cx->ks[v(40,(0))] = ss[0] = word_in(key, 0); + cx->ks[v(40,(1))] = ss[1] = word_in(key, 1); + cx->ks[v(40,(2))] = ss[2] = word_in(key, 2); + cx->ks[v(40,(3))] = ss[3] = word_in(key, 3); + +#ifdef DEC_KS_UNROLL + kdf4(cx->ks, 0); kd4(cx->ks, 1); + kd4(cx->ks, 2); kd4(cx->ks, 3); + kd4(cx->ks, 4); kd4(cx->ks, 5); + kd4(cx->ks, 6); kd4(cx->ks, 7); + kd4(cx->ks, 8); kdl4(cx->ks, 9); +#else + { uint_32t i; + for(i = 0; i < 10; ++i) + k4e(cx->ks, i); +#if !(DEC_ROUND == NO_TABLES) + for(i = N_COLS; i < 10 * N_COLS; ++i) + cx->ks[i] = inv_mcol(cx->ks[i]); +#endif + } +#endif + cx->inf.l = 0; + cx->inf.b[0] = 10 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_192) || defined( AES_VAR ) + +#define k6ef(k,i) \ +{ k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \ + k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \ + k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \ + k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \ +} + +#define k6e(k,i) \ +{ k6ef(k,i); \ + k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \ + k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \ +} + +#define kdf6(k,i) \ +{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \ + ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \ + ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \ + ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \ + ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \ + ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \ +} + +#define kd6(k,i) \ +{ ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \ + ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \ + ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \ + ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \ + ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \ + ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \ + ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \ +} + +#define kdl6(k,i) \ +{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \ + ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \ + ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \ + ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \ +} + +AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]) +{ uint_32t ss[7]; +#if defined( d_vars ) + d_vars; +#endif + cx->ks[v(48,(0))] = ss[0] = word_in(key, 0); + cx->ks[v(48,(1))] = ss[1] = word_in(key, 1); + cx->ks[v(48,(2))] = ss[2] = word_in(key, 2); + cx->ks[v(48,(3))] = ss[3] = word_in(key, 3); + +#ifdef DEC_KS_UNROLL + cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4)); + cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5)); + kdf6(cx->ks, 0); kd6(cx->ks, 1); + kd6(cx->ks, 2); kd6(cx->ks, 3); + kd6(cx->ks, 4); kd6(cx->ks, 5); + kd6(cx->ks, 6); kdl6(cx->ks, 7); +#else + cx->ks[v(48,(4))] = ss[4] = word_in(key, 4); + cx->ks[v(48,(5))] = ss[5] = word_in(key, 5); + { uint_32t i; + + for(i = 0; i < 7; ++i) + k6e(cx->ks, i); + k6ef(cx->ks, 7); +#if !(DEC_ROUND == NO_TABLES) + for(i = N_COLS; i < 12 * N_COLS; ++i) + cx->ks[i] = inv_mcol(cx->ks[i]); +#endif + } +#endif + cx->inf.l = 0; + cx->inf.b[0] = 12 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_256) || defined( AES_VAR ) + +#define k8ef(k,i) \ +{ k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \ + k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \ + k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \ + k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \ +} + +#define k8e(k,i) \ +{ k8ef(k,i); \ + k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \ + k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \ + k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \ + k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \ +} + +#define kdf8(k,i) \ +{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \ + ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \ + ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \ + ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \ + ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \ + ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \ + ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \ + ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \ +} + +#define kd8(k,i) \ +{ ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \ + ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \ + ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \ + ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \ + ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \ + ss[8] = ls_box(ss[3],0); \ + ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \ + ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \ + ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \ + ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \ +} + +#define kdl8(k,i) \ +{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \ + ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \ + ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \ + ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \ +} + +AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]) +{ uint_32t ss[9]; +#if defined( d_vars ) + d_vars; +#endif + cx->ks[v(56,(0))] = ss[0] = word_in(key, 0); + cx->ks[v(56,(1))] = ss[1] = word_in(key, 1); + cx->ks[v(56,(2))] = ss[2] = word_in(key, 2); + cx->ks[v(56,(3))] = ss[3] = word_in(key, 3); + +#ifdef DEC_KS_UNROLL + cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4)); + cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5)); + cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6)); + cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7)); + kdf8(cx->ks, 0); kd8(cx->ks, 1); + kd8(cx->ks, 2); kd8(cx->ks, 3); + kd8(cx->ks, 4); kd8(cx->ks, 5); + kdl8(cx->ks, 6); +#else + cx->ks[v(56,(4))] = ss[4] = word_in(key, 4); + cx->ks[v(56,(5))] = ss[5] = word_in(key, 5); + cx->ks[v(56,(6))] = ss[6] = word_in(key, 6); + cx->ks[v(56,(7))] = ss[7] = word_in(key, 7); + { uint_32t i; + + for(i = 0; i < 6; ++i) + k8e(cx->ks, i); + k8ef(cx->ks, 6); +#if !(DEC_ROUND == NO_TABLES) + for(i = N_COLS; i < 14 * N_COLS; ++i) + cx->ks[i] = inv_mcol(cx->ks[i]); +#endif + } +#endif + cx->inf.l = 0; + cx->inf.b[0] = 14 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined( AES_VAR ) + +AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]) +{ + switch(key_len) + { + case 16: case 128: return aes_decrypt_key128(key, cx); + case 24: case 192: return aes_decrypt_key192(key, cx); + case 32: case 256: return aes_decrypt_key256(key, cx); + default: return EXIT_FAILURE; + } +} + +#endif + +#endif + +#if defined(__cplusplus) +} +#endif diff --git a/aesopt.h b/aesopt.h new file mode 100644 index 0000000..29ac5ac --- /dev/null +++ b/aesopt.h @@ -0,0 +1,746 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 + + This file contains the compilation options for AES (Rijndael) and code + that is common across encryption, key scheduling and table generation. + + OPERATION + + These source code files implement the AES algorithm Rijndael designed by + Joan Daemen and Vincent Rijmen. This version is designed for the standard + block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24 + and 32 bytes). + + This version is designed for flexibility and speed using operations on + 32-bit words rather than operations on bytes. It can be compiled with + either big or little endian internal byte order but is faster when the + native byte order for the processor is used. + + THE CIPHER INTERFACE + + The cipher interface is implemented as an array of bytes in which lower + AES bit sequence indexes map to higher numeric significance within bytes. + + uint_8t (an unsigned 8-bit type) + uint_32t (an unsigned 32-bit type) + struct aes_encrypt_ctx (structure for the cipher encryption context) + struct aes_decrypt_ctx (structure for the cipher decryption context) + AES_RETURN the function return type + + C subroutine calls: + + AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]); + AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]); + AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]); + AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, + const aes_encrypt_ctx cx[1]); + + AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]); + AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]); + AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]); + AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, + const aes_decrypt_ctx cx[1]); + + IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that + you call aes_init() before AES is used so that the tables are initialised. + + C++ aes class subroutines: + + Class AESencrypt for encryption + + Construtors: + AESencrypt(void) + AESencrypt(const unsigned char *key) - 128 bit key + Members: + AES_RETURN key128(const unsigned char *key) + AES_RETURN key192(const unsigned char *key) + AES_RETURN key256(const unsigned char *key) + AES_RETURN encrypt(const unsigned char *in, unsigned char *out) const + + Class AESdecrypt for encryption + Construtors: + AESdecrypt(void) + AESdecrypt(const unsigned char *key) - 128 bit key + Members: + AES_RETURN key128(const unsigned char *key) + AES_RETURN key192(const unsigned char *key) + AES_RETURN key256(const unsigned char *key) + AES_RETURN decrypt(const unsigned char *in, unsigned char *out) const +*/ + +#if !defined( _AESOPT_H ) +#define _AESOPT_H + +#if defined( __cplusplus ) +#include "aescpp.h" +#else +#include "aes.h" +#endif + +/* PLATFORM SPECIFIC INCLUDES */ + +#include "brg_endian.h" + +/* CONFIGURATION - THE USE OF DEFINES + + Later in this section there are a number of defines that control the + operation of the code. In each section, the purpose of each define is + explained so that the relevant form can be included or excluded by + setting either 1's or 0's respectively on the branches of the related + #if clauses. The following local defines should not be changed. +*/ + +#define ENCRYPTION_IN_C 1 +#define DECRYPTION_IN_C 2 +#define ENC_KEYING_IN_C 4 +#define DEC_KEYING_IN_C 8 + +#define NO_TABLES 0 +#define ONE_TABLE 1 +#define FOUR_TABLES 4 +#define NONE 0 +#define PARTIAL 1 +#define FULL 2 + +/* --- START OF USER CONFIGURED OPTIONS --- */ + +/* 1. BYTE ORDER WITHIN 32 BIT WORDS + + The fundamental data processing units in Rijndael are 8-bit bytes. The + input, output and key input are all enumerated arrays of bytes in which + bytes are numbered starting at zero and increasing to one less than the + number of bytes in the array in question. This enumeration is only used + for naming bytes and does not imply any adjacency or order relationship + from one byte to another. When these inputs and outputs are considered + as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to + byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte. + In this implementation bits are numbered from 0 to 7 starting at the + numerically least significant end of each byte (bit n represents 2^n). + + However, Rijndael can be implemented more efficiently using 32-bit + words by packing bytes into words so that bytes 4*n to 4*n+3 are placed + into word[n]. While in principle these bytes can be assembled into words + in any positions, this implementation only supports the two formats in + which bytes in adjacent positions within words also have adjacent byte + numbers. This order is called big-endian if the lowest numbered bytes + in words have the highest numeric significance and little-endian if the + opposite applies. + + This code can work in either order irrespective of the order used by the + machine on which it runs. Normally the internal byte order will be set + to the order of the processor on which the code is to be run but this + define can be used to reverse this in special situations + + WARNING: Assembler code versions rely on PLATFORM_BYTE_ORDER being set. + This define will hence be redefined later (in section 4) if necessary +*/ + +#if 1 +# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER +#elif 0 +# define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN +#elif 0 +# define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN +#else +# error The algorithm byte order is not defined +#endif + +/* 2. VIA ACE SUPPORT */ + +#if defined( __GNUC__ ) && defined( __i386__ ) \ + || defined( _WIN32 ) && defined( _M_IX86 ) \ + && !(defined( _WIN64 ) || defined( _WIN32_WCE ) || defined( _MSC_VER ) && ( _MSC_VER <= 800 )) +# define VIA_ACE_POSSIBLE +#endif + +/* Define this option if support for the VIA ACE is required. This uses + inline assembler instructions and is only implemented for the Microsoft, + Intel and GCC compilers. If VIA ACE is known to be present, then defining + ASSUME_VIA_ACE_PRESENT will remove the ordinary encryption/decryption + code. If USE_VIA_ACE_IF_PRESENT is defined then VIA ACE will be used if + it is detected (both present and enabled) but the normal AES code will + also be present. + + When VIA ACE is to be used, all AES encryption contexts MUST be 16 byte + aligned; other input/output buffers do not need to be 16 byte aligned + but there are very large performance gains if this can be arranged. + VIA ACE also requires the decryption key schedule to be in reverse + order (which later checks below ensure). +*/ + +#if 1 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT ) +# define USE_VIA_ACE_IF_PRESENT +#endif + +#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT ) +# define ASSUME_VIA_ACE_PRESENT +# endif + +/* 3. ASSEMBLER SUPPORT + + This define (which can be on the command line) enables the use of the + assembler code routines for encryption, decryption and key scheduling + as follows: + + ASM_X86_V1C uses the assembler (aes_x86_v1.asm) with large tables for + encryption and decryption and but with key scheduling in C + ASM_X86_V2 uses assembler (aes_x86_v2.asm) with compressed tables for + encryption, decryption and key scheduling + ASM_X86_V2C uses assembler (aes_x86_v2.asm) with compressed tables for + encryption and decryption and but with key scheduling in C + ASM_AMD64_C uses assembler (aes_amd64.asm) with compressed tables for + encryption and decryption and but with key scheduling in C + + Change one 'if 0' below to 'if 1' to select the version or define + as a compilation option. +*/ + +#if 0 && !defined( ASM_X86_V1C ) +# define ASM_X86_V1C +#elif 0 && !defined( ASM_X86_V2 ) +# define ASM_X86_V2 +#elif 0 && !defined( ASM_X86_V2C ) +# define ASM_X86_V2C +#elif 0 && !defined( ASM_AMD64_C ) +# define ASM_AMD64_C +#endif + +#if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \ + && !defined( _M_IX86 ) || defined( ASM_AMD64_C ) && !defined( _M_X64 ) +# error Assembler code is only available for x86 and AMD64 systems +#endif + +/* 4. FAST INPUT/OUTPUT OPERATIONS. + + On some machines it is possible to improve speed by transferring the + bytes in the input and output arrays to and from the internal 32-bit + variables by addressing these arrays as if they are arrays of 32-bit + words. On some machines this will always be possible but there may + be a large performance penalty if the byte arrays are not aligned on + the normal word boundaries. On other machines this technique will + lead to memory access errors when such 32-bit word accesses are not + properly aligned. The option SAFE_IO avoids such problems but will + often be slower on those machines that support misaligned access + (especially so if care is taken to align the input and output byte + arrays on 32-bit word boundaries). If SAFE_IO is not defined it is + assumed that access to byte arrays as if they are arrays of 32-bit + words will not cause problems when such accesses are misaligned. +*/ +#if 1 && !defined( _MSC_VER ) +# define SAFE_IO +#endif + +/* 5. LOOP UNROLLING + + The code for encryption and decrytpion cycles through a number of rounds + that can be implemented either in a loop or by expanding the code into a + long sequence of instructions, the latter producing a larger program but + one that will often be much faster. The latter is called loop unrolling. + There are also potential speed advantages in expanding two iterations in + a loop with half the number of iterations, which is called partial loop + unrolling. The following options allow partial or full loop unrolling + to be set independently for encryption and decryption +*/ +#if 1 +# define ENC_UNROLL FULL +#elif 0 +# define ENC_UNROLL PARTIAL +#else +# define ENC_UNROLL NONE +#endif + +#if 1 +# define DEC_UNROLL FULL +#elif 0 +# define DEC_UNROLL PARTIAL +#else +# define DEC_UNROLL NONE +#endif + +#if 1 +# define ENC_KS_UNROLL +#endif + +#if 1 +# define DEC_KS_UNROLL +#endif + +/* 6. FAST FINITE FIELD OPERATIONS + + If this section is included, tables are used to provide faster finite + field arithmetic (this has no effect if FIXED_TABLES is defined). +*/ +#if 1 +# define FF_TABLES +#endif + +/* 7. INTERNAL STATE VARIABLE FORMAT + + The internal state of Rijndael is stored in a number of local 32-bit + word varaibles which can be defined either as an array or as individual + names variables. Include this section if you want to store these local + varaibles in arrays. Otherwise individual local variables will be used. +*/ +#if 1 +# define ARRAYS +#endif + +/* 8. FIXED OR DYNAMIC TABLES + + When this section is included the tables used by the code are compiled + statically into the binary file. Otherwise the subroutine aes_init() + must be called to compute them before the code is first used. +*/ +#if 1 && !(defined( _MSC_VER ) && ( _MSC_VER <= 800 )) +# define FIXED_TABLES +#endif + +/* 9. MASKING OR CASTING FROM LONGER VALUES TO BYTES + + In some systems it is better to mask longer values to extract bytes + rather than using a cast. This option allows this choice. +*/ +#if 0 +# define to_byte(x) ((uint_8t)(x)) +#else +# define to_byte(x) ((x) & 0xff) +#endif + +/* 10. TABLE ALIGNMENT + + On some sytsems speed will be improved by aligning the AES large lookup + tables on particular boundaries. This define should be set to a power of + two giving the desired alignment. It can be left undefined if alignment + is not needed. This option is specific to the Microsft VC++ compiler - + it seems to sometimes cause trouble for the VC++ version 6 compiler. +*/ + +#if 1 && defined( _MSC_VER ) && ( _MSC_VER >= 1300 ) +# define TABLE_ALIGN 32 +#endif + +/* 11. REDUCE CODE AND TABLE SIZE + + This replaces some expanded macros with function calls if AES_ASM_V2 or + AES_ASM_V2C are defined +*/ + +#if 1 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) +# define REDUCE_CODE_SIZE +#endif + +/* 12. TABLE OPTIONS + + This cipher proceeds by repeating in a number of cycles known as 'rounds' + which are implemented by a round function which can optionally be speeded + up using tables. The basic tables are each 256 32-bit words, with either + one or four tables being required for each round function depending on + how much speed is required. The encryption and decryption round functions + are different and the last encryption and decrytpion round functions are + different again making four different round functions in all. + + This means that: + 1. Normal encryption and decryption rounds can each use either 0, 1 + or 4 tables and table spaces of 0, 1024 or 4096 bytes each. + 2. The last encryption and decryption rounds can also use either 0, 1 + or 4 tables and table spaces of 0, 1024 or 4096 bytes each. + + Include or exclude the appropriate definitions below to set the number + of tables used by this implementation. +*/ + +#if 1 /* set tables for the normal encryption round */ +# define ENC_ROUND FOUR_TABLES +#elif 0 +# define ENC_ROUND ONE_TABLE +#else +# define ENC_ROUND NO_TABLES +#endif + +#if 1 /* set tables for the last encryption round */ +# define LAST_ENC_ROUND FOUR_TABLES +#elif 0 +# define LAST_ENC_ROUND ONE_TABLE +#else +# define LAST_ENC_ROUND NO_TABLES +#endif + +#if 1 /* set tables for the normal decryption round */ +# define DEC_ROUND FOUR_TABLES +#elif 0 +# define DEC_ROUND ONE_TABLE +#else +# define DEC_ROUND NO_TABLES +#endif + +#if 1 /* set tables for the last decryption round */ +# define LAST_DEC_ROUND FOUR_TABLES +#elif 0 +# define LAST_DEC_ROUND ONE_TABLE +#else +# define LAST_DEC_ROUND NO_TABLES +#endif + +/* The decryption key schedule can be speeded up with tables in the same + way that the round functions can. Include or exclude the following + defines to set this requirement. +*/ +#if 1 +# define KEY_SCHED FOUR_TABLES +#elif 0 +# define KEY_SCHED ONE_TABLE +#else +# define KEY_SCHED NO_TABLES +#endif + +/* ---- END OF USER CONFIGURED OPTIONS ---- */ + +/* VIA ACE support is only available for VC++ and GCC */ + +#if !defined( _MSC_VER ) && !defined( __GNUC__ ) +# if defined( ASSUME_VIA_ACE_PRESENT ) +# undef ASSUME_VIA_ACE_PRESENT +# endif +# if defined( USE_VIA_ACE_IF_PRESENT ) +# undef USE_VIA_ACE_IF_PRESENT +# endif +#endif + +#if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT ) +# define USE_VIA_ACE_IF_PRESENT +#endif + +#if defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS ) +# define AES_REV_DKS +#endif + +/* Assembler support requires the use of platform byte order */ + +#if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \ + && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER) +# undef ALGORITHM_BYTE_ORDER +# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER +#endif + +/* In this implementation the columns of the state array are each held in + 32-bit words. The state array can be held in various ways: in an array + of words, in a number of individual word variables or in a number of + processor registers. The following define maps a variable name x and + a column number c to the way the state array variable is to be held. + The first define below maps the state into an array x[c] whereas the + second form maps the state into a number of individual variables x0, + x1, etc. Another form could map individual state colums to machine + register names. +*/ + +#if defined( ARRAYS ) +# define s(x,c) x[c] +#else +# define s(x,c) x##c +#endif + +/* This implementation provides subroutines for encryption, decryption + and for setting the three key lengths (separately) for encryption + and decryption. Since not all functions are needed, masks are set + up here to determine which will be implemented in C +*/ + +#if !defined( AES_ENCRYPT ) +# define EFUNCS_IN_C 0 +#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \ + || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) +# define EFUNCS_IN_C ENC_KEYING_IN_C +#elif !defined( ASM_X86_V2 ) +# define EFUNCS_IN_C ( ENCRYPTION_IN_C | ENC_KEYING_IN_C ) +#else +# define EFUNCS_IN_C 0 +#endif + +#if !defined( AES_DECRYPT ) +# define DFUNCS_IN_C 0 +#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \ + || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) +# define DFUNCS_IN_C DEC_KEYING_IN_C +#elif !defined( ASM_X86_V2 ) +# define DFUNCS_IN_C ( DECRYPTION_IN_C | DEC_KEYING_IN_C ) +#else +# define DFUNCS_IN_C 0 +#endif + +#define FUNCS_IN_C ( EFUNCS_IN_C | DFUNCS_IN_C ) + +/* END OF CONFIGURATION OPTIONS */ + +#define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2)) + +/* Disable or report errors on some combinations of options */ + +#if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES +# undef LAST_ENC_ROUND +# define LAST_ENC_ROUND NO_TABLES +#elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES +# undef LAST_ENC_ROUND +# define LAST_ENC_ROUND ONE_TABLE +#endif + +#if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE +# undef ENC_UNROLL +# define ENC_UNROLL NONE +#endif + +#if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES +# undef LAST_DEC_ROUND +# define LAST_DEC_ROUND NO_TABLES +#elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES +# undef LAST_DEC_ROUND +# define LAST_DEC_ROUND ONE_TABLE +#endif + +#if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE +# undef DEC_UNROLL +# define DEC_UNROLL NONE +#endif + +#if defined( bswap32 ) +# define aes_sw32 bswap32 +#elif defined( bswap_32 ) +# define aes_sw32 bswap_32 +#else +# define brot(x,n) (((uint_32t)(x) << n) | ((uint_32t)(x) >> (32 - n))) +# define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00)) +#endif + +/* upr(x,n): rotates bytes within words by n positions, moving bytes to + higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word + + WARNING: The definitions given here are intended only for use with + unsigned variables and with shift counts that are compile + time constants +*/ + +#if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN ) +# define upr(x,n) (((uint_32t)(x) << (8 * (n))) | ((uint_32t)(x) >> (32 - 8 * (n)))) +# define ups(x,n) ((uint_32t) (x) << (8 * (n))) +# define bval(x,n) to_byte((x) >> (8 * (n))) +# define bytes2word(b0, b1, b2, b3) \ + (((uint_32t)(b3) << 24) | ((uint_32t)(b2) << 16) | ((uint_32t)(b1) << 8) | (b0)) +#endif + +#if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN ) +# define upr(x,n) (((uint_32t)(x) >> (8 * (n))) | ((uint_32t)(x) << (32 - 8 * (n)))) +# define ups(x,n) ((uint_32t) (x) >> (8 * (n))) +# define bval(x,n) to_byte((x) >> (24 - 8 * (n))) +# define bytes2word(b0, b1, b2, b3) \ + (((uint_32t)(b0) << 24) | ((uint_32t)(b1) << 16) | ((uint_32t)(b2) << 8) | (b3)) +#endif + +#if defined( SAFE_IO ) +# define word_in(x,c) bytes2word(((const uint_8t*)(x)+4*c)[0], ((const uint_8t*)(x)+4*c)[1], \ + ((const uint_8t*)(x)+4*c)[2], ((const uint_8t*)(x)+4*c)[3]) +# define word_out(x,c,v) { ((uint_8t*)(x)+4*c)[0] = bval(v,0); ((uint_8t*)(x)+4*c)[1] = bval(v,1); \ + ((uint_8t*)(x)+4*c)[2] = bval(v,2); ((uint_8t*)(x)+4*c)[3] = bval(v,3); } +#elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER ) +# define word_in(x,c) (*((uint_32t*)(x)+(c))) +# define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = (v)) +#else +# define word_in(x,c) aes_sw32(*((uint_32t*)(x)+(c))) +# define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = aes_sw32(v)) +#endif + +/* the finite field modular polynomial and elements */ + +#define WPOLY 0x011b +#define BPOLY 0x1b + +/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ + +#define m1 0x80808080 +#define m2 0x7f7f7f7f +#define gf_mulx(x) ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY)) + +/* The following defines provide alternative definitions of gf_mulx that might + give improved performance if a fast 32-bit multiply is not available. Note + that a temporary variable u needs to be defined where gf_mulx is used. + +#define gf_mulx(x) (u = (x) & m1, u |= (u >> 1), ((x) & m2) << 1) ^ ((u >> 3) | (u >> 6)) +#define m4 (0x01010101 * BPOLY) +#define gf_mulx(x) (u = (x) & m1, ((x) & m2) << 1) ^ ((u - (u >> 7)) & m4) +*/ + +/* Work out which tables are needed for the different options */ + +#if defined( ASM_X86_V1C ) +# if defined( ENC_ROUND ) +# undef ENC_ROUND +# endif +# define ENC_ROUND FOUR_TABLES +# if defined( LAST_ENC_ROUND ) +# undef LAST_ENC_ROUND +# endif +# define LAST_ENC_ROUND FOUR_TABLES +# if defined( DEC_ROUND ) +# undef DEC_ROUND +# endif +# define DEC_ROUND FOUR_TABLES +# if defined( LAST_DEC_ROUND ) +# undef LAST_DEC_ROUND +# endif +# define LAST_DEC_ROUND FOUR_TABLES +# if defined( KEY_SCHED ) +# undef KEY_SCHED +# define KEY_SCHED FOUR_TABLES +# endif +#endif + +#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C ) +# if ENC_ROUND == ONE_TABLE +# define FT1_SET +# elif ENC_ROUND == FOUR_TABLES +# define FT4_SET +# else +# define SBX_SET +# endif +# if LAST_ENC_ROUND == ONE_TABLE +# define FL1_SET +# elif LAST_ENC_ROUND == FOUR_TABLES +# define FL4_SET +# elif !defined( SBX_SET ) +# define SBX_SET +# endif +#endif + +#if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C ) +# if DEC_ROUND == ONE_TABLE +# define IT1_SET +# elif DEC_ROUND == FOUR_TABLES +# define IT4_SET +# else +# define ISB_SET +# endif +# if LAST_DEC_ROUND == ONE_TABLE +# define IL1_SET +# elif LAST_DEC_ROUND == FOUR_TABLES +# define IL4_SET +# elif !defined(ISB_SET) +# define ISB_SET +# endif +#endif + +#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) +# if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C)) +# if KEY_SCHED == ONE_TABLE +# if !defined( FL1_SET ) && !defined( FL4_SET ) +# define LS1_SET +# endif +# elif KEY_SCHED == FOUR_TABLES +# if !defined( FL4_SET ) +# define LS4_SET +# endif +# elif !defined( SBX_SET ) +# define SBX_SET +# endif +# endif +# if (FUNCS_IN_C & DEC_KEYING_IN_C) +# if KEY_SCHED == ONE_TABLE +# define IM1_SET +# elif KEY_SCHED == FOUR_TABLES +# define IM4_SET +# elif !defined( SBX_SET ) +# define SBX_SET +# endif +# endif +#endif + +/* generic definitions of Rijndael macros that use tables */ + +#define no_table(x,box,vf,rf,c) bytes2word( \ + box[bval(vf(x,0,c),rf(0,c))], \ + box[bval(vf(x,1,c),rf(1,c))], \ + box[bval(vf(x,2,c),rf(2,c))], \ + box[bval(vf(x,3,c),rf(3,c))]) + +#define one_table(x,op,tab,vf,rf,c) \ + ( tab[bval(vf(x,0,c),rf(0,c))] \ + ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \ + ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \ + ^ op(tab[bval(vf(x,3,c),rf(3,c))],3)) + +#define four_tables(x,tab,vf,rf,c) \ + ( tab[0][bval(vf(x,0,c),rf(0,c))] \ + ^ tab[1][bval(vf(x,1,c),rf(1,c))] \ + ^ tab[2][bval(vf(x,2,c),rf(2,c))] \ + ^ tab[3][bval(vf(x,3,c),rf(3,c))]) + +#define vf1(x,r,c) (x) +#define rf1(r,c) (r) +#define rf2(r,c) ((8+r-c)&3) + +/* perform forward and inverse column mix operation on four bytes in long word x in */ +/* parallel. NOTE: x must be a simple variable, NOT an expression in these macros. */ + +#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) + +#if defined( FM4_SET ) /* not currently used */ +# define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0) +#elif defined( FM1_SET ) /* not currently used */ +# define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0) +#else +# define dec_fmvars uint_32t g2 +# define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1)) +#endif + +#if defined( IM4_SET ) +# define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0) +#elif defined( IM1_SET ) +# define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0) +#else +# define dec_imvars uint_32t g2, g4, g9 +# define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \ + (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1)) +#endif + +#if defined( FL4_SET ) +# define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c) +#elif defined( LS4_SET ) +# define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c) +#elif defined( FL1_SET ) +# define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c) +#elif defined( LS1_SET ) +# define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c) +#else +# define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c) +#endif + +#endif + +#if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET ) +# define ISB_SET +#endif + +#endif diff --git a/aestab.c b/aestab.c new file mode 100644 index 0000000..27f740b --- /dev/null +++ b/aestab.c @@ -0,0 +1,398 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 +*/ + +#define DO_TABLES + +#include "aes.h" +#include "aesopt.h" + +#if defined(FIXED_TABLES) + +#define sb_data(w) {\ + w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\ + w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\ + w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\ + w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\ + w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\ + w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\ + w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\ + w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\ + w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\ + w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\ + w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\ + w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\ + w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\ + w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\ + w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\ + w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\ + w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\ + w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\ + w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\ + w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\ + w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\ + w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\ + w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\ + w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\ + w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\ + w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\ + w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\ + w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\ + w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\ + w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\ + w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\ + w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) } + +#define isb_data(w) {\ + w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\ + w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\ + w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\ + w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\ + w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\ + w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\ + w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\ + w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\ + w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\ + w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\ + w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\ + w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\ + w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\ + w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\ + w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\ + w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\ + w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\ + w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\ + w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\ + w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\ + w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\ + w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\ + w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\ + w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\ + w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\ + w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\ + w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\ + w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\ + w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\ + w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\ + w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\ + w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) } + +#define mm_data(w) {\ + w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\ + w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\ + w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\ + w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\ + w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\ + w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\ + w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\ + w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\ + w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\ + w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\ + w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\ + w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\ + w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\ + w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\ + w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\ + w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\ + w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\ + w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\ + w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\ + w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\ + w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\ + w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\ + w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\ + w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\ + w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\ + w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\ + w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\ + w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\ + w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\ + w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\ + w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\ + w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) } + +#define rc_data(w) {\ + w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\ + w(0x1b), w(0x36) } + +#define h0(x) (x) + +#define w0(p) bytes2word(p, 0, 0, 0) +#define w1(p) bytes2word(0, p, 0, 0) +#define w2(p) bytes2word(0, 0, p, 0) +#define w3(p) bytes2word(0, 0, 0, p) + +#define u0(p) bytes2word(f2(p), p, p, f3(p)) +#define u1(p) bytes2word(f3(p), f2(p), p, p) +#define u2(p) bytes2word(p, f3(p), f2(p), p) +#define u3(p) bytes2word(p, p, f3(p), f2(p)) + +#define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p)) +#define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p)) +#define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p)) +#define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p)) + +#endif + +#if defined(FIXED_TABLES) || !defined(FF_TABLES) + +#define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY)) +#define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY)) +#define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \ + ^ (((x>>5) & 4) * WPOLY)) +#define f3(x) (f2(x) ^ x) +#define f9(x) (f8(x) ^ x) +#define fb(x) (f8(x) ^ f2(x) ^ x) +#define fd(x) (f8(x) ^ f4(x) ^ x) +#define fe(x) (f8(x) ^ f4(x) ^ f2(x)) + +#else + +#define f2(x) ((x) ? pow[log[x] + 0x19] : 0) +#define f3(x) ((x) ? pow[log[x] + 0x01] : 0) +#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0) +#define fb(x) ((x) ? pow[log[x] + 0x68] : 0) +#define fd(x) ((x) ? pow[log[x] + 0xee] : 0) +#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0) + +#endif + +#include "aestab.h" + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#if defined(FIXED_TABLES) + +/* implemented in case of wrong call for fixed tables */ + +AES_RETURN aes_init(void) +{ + return EXIT_SUCCESS; +} + +#else /* Generate the tables for the dynamic table option */ + +#if defined(FF_TABLES) + +#define gf_inv(x) ((x) ? pow[ 255 - log[x]] : 0) + +#else + +/* It will generally be sensible to use tables to compute finite + field multiplies and inverses but where memory is scarse this + code might sometimes be better. But it only has effect during + initialisation so its pretty unimportant in overall terms. +*/ + +/* return 2 ^ (n - 1) where n is the bit number of the highest bit + set in x with x in the range 1 < x < 0x00000200. This form is + used so that locals within fi can be bytes rather than words +*/ + +static uint_8t hibit(const uint_32t x) +{ uint_8t r = (uint_8t)((x >> 1) | (x >> 2)); + + r |= (r >> 2); + r |= (r >> 4); + return (r + 1) >> 1; +} + +/* return the inverse of the finite field element x */ + +static uint_8t gf_inv(const uint_8t x) +{ uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; + + if(x < 2) + return x; + + for( ; ; ) + { + if(n1) + while(n2 >= n1) /* divide polynomial p2 by p1 */ + { + n2 /= n1; /* shift smaller polynomial left */ + p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */ + v2 ^= v1 * n2; /* shift accumulated value and */ + n2 = hibit(p2); /* add into result */ + } + else + return v1; + + if(n2) /* repeat with values swapped */ + while(n1 >= n2) + { + n1 /= n2; + p1 ^= p2 * n1; + v1 ^= v2 * n1; + n1 = hibit(p1); + } + else + return v2; + } +} + +#endif + +/* The forward and inverse affine transformations used in the S-box */ +uint_8t fwd_affine(const uint_8t x) +{ uint_32t w = x; + w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4); + return 0x63 ^ ((w ^ (w >> 8)) & 0xff); +} + +uint_8t inv_affine(const uint_8t x) +{ uint_32t w = x; + w = (w << 1) ^ (w << 3) ^ (w << 6); + return 0x05 ^ ((w ^ (w >> 8)) & 0xff); +} + +static int init = 0; + +AES_RETURN aes_init(void) +{ uint_32t i, w; + +#if defined(FF_TABLES) + + uint_8t pow[512], log[256]; + + if(init) + return EXIT_SUCCESS; + /* log and power tables for GF(2^8) finite field with + WPOLY as modular polynomial - the simplest primitive + root is 0x03, used here to generate the tables + */ + + i = 0; w = 1; + do + { + pow[i] = (uint_8t)w; + pow[i + 255] = (uint_8t)w; + log[w] = (uint_8t)i++; + w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0); + } + while (w != 1); + +#else + if(init) + return EXIT_SUCCESS; +#endif + + for(i = 0, w = 1; i < RC_LENGTH; ++i) + { + t_set(r,c)[i] = bytes2word(w, 0, 0, 0); + w = f2(w); + } + + for(i = 0; i < 256; ++i) + { uint_8t b; + + b = fwd_affine(gf_inv((uint_8t)i)); + w = bytes2word(f2(b), b, b, f3(b)); + +#if defined( SBX_SET ) + t_set(s,box)[i] = b; +#endif + +#if defined( FT1_SET ) /* tables for a normal encryption round */ + t_set(f,n)[i] = w; +#endif +#if defined( FT4_SET ) + t_set(f,n)[0][i] = w; + t_set(f,n)[1][i] = upr(w,1); + t_set(f,n)[2][i] = upr(w,2); + t_set(f,n)[3][i] = upr(w,3); +#endif + w = bytes2word(b, 0, 0, 0); + +#if defined( FL1_SET ) /* tables for last encryption round (may also */ + t_set(f,l)[i] = w; /* be used in the key schedule) */ +#endif +#if defined( FL4_SET ) + t_set(f,l)[0][i] = w; + t_set(f,l)[1][i] = upr(w,1); + t_set(f,l)[2][i] = upr(w,2); + t_set(f,l)[3][i] = upr(w,3); +#endif + +#if defined( LS1_SET ) /* table for key schedule if t_set(f,l) above is*/ + t_set(l,s)[i] = w; /* not of the required form */ +#endif +#if defined( LS4_SET ) + t_set(l,s)[0][i] = w; + t_set(l,s)[1][i] = upr(w,1); + t_set(l,s)[2][i] = upr(w,2); + t_set(l,s)[3][i] = upr(w,3); +#endif + + b = gf_inv(inv_affine((uint_8t)i)); + w = bytes2word(fe(b), f9(b), fd(b), fb(b)); + +#if defined( IM1_SET ) /* tables for the inverse mix column operation */ + t_set(i,m)[b] = w; +#endif +#if defined( IM4_SET ) + t_set(i,m)[0][b] = w; + t_set(i,m)[1][b] = upr(w,1); + t_set(i,m)[2][b] = upr(w,2); + t_set(i,m)[3][b] = upr(w,3); +#endif + +#if defined( ISB_SET ) + t_set(i,box)[i] = b; +#endif +#if defined( IT1_SET ) /* tables for a normal decryption round */ + t_set(i,n)[i] = w; +#endif +#if defined( IT4_SET ) + t_set(i,n)[0][i] = w; + t_set(i,n)[1][i] = upr(w,1); + t_set(i,n)[2][i] = upr(w,2); + t_set(i,n)[3][i] = upr(w,3); +#endif + w = bytes2word(b, 0, 0, 0); +#if defined( IL1_SET ) /* tables for last decryption round */ + t_set(i,l)[i] = w; +#endif +#if defined( IL4_SET ) + t_set(i,l)[0][i] = w; + t_set(i,l)[1][i] = upr(w,1); + t_set(i,l)[2][i] = upr(w,2); + t_set(i,l)[3][i] = upr(w,3); +#endif + } + init = 1; + return EXIT_SUCCESS; +} + +#endif + +#if defined(__cplusplus) +} +#endif + diff --git a/aestab.h b/aestab.h new file mode 100644 index 0000000..5254f7e --- /dev/null +++ b/aestab.h @@ -0,0 +1,180 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 + + This file contains the code for declaring the tables needed to implement + AES. The file aesopt.h is assumed to be included before this header file. + If there are no global variables, the definitions here can be used to put + the AES tables in a structure so that a pointer can then be added to the + AES context to pass them to the AES routines that need them. If this + facility is used, the calling program has to ensure that this pointer is + managed appropriately. In particular, the value of the t_dec(in,it) item + in the table structure must be set to zero in order to ensure that the + tables are initialised. In practice the three code sequences in aeskey.c + that control the calls to aes_init() and the aes_init() routine itself will + have to be changed for a specific implementation. If global variables are + available it will generally be preferable to use them with the precomputed + FIXED_TABLES option that uses static global tables. + + The following defines can be used to control the way the tables + are defined, initialised and used in embedded environments that + require special features for these purposes + + the 't_dec' construction is used to declare fixed table arrays + the 't_set' construction is used to set fixed table values + the 't_use' construction is used to access fixed table values + + 256 byte tables: + + t_xxx(s,box) => forward S box + t_xxx(i,box) => inverse S box + + 256 32-bit word OR 4 x 256 32-bit word tables: + + t_xxx(f,n) => forward normal round + t_xxx(f,l) => forward last round + t_xxx(i,n) => inverse normal round + t_xxx(i,l) => inverse last round + t_xxx(l,s) => key schedule table + t_xxx(i,m) => key schedule table + + Other variables and tables: + + t_xxx(r,c) => the rcon table +*/ + +#if !defined( _AESTAB_H ) +#define _AESTAB_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#define t_dec(m,n) t_##m##n +#define t_set(m,n) t_##m##n +#define t_use(m,n) t_##m##n + +#if defined(FIXED_TABLES) +# if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ )) +/* make tables far data to avoid using too much DGROUP space (PG) */ +# define CONST const far +# else +# define CONST const +# endif +#else +# define CONST +#endif + +#if defined(DO_TABLES) +# define EXTERN +#else +# define EXTERN extern +#endif + +#if defined(_MSC_VER) && defined(TABLE_ALIGN) +#define ALIGN __declspec(align(TABLE_ALIGN)) +#else +#define ALIGN +#endif + +#if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 ) +# define XP_DIR __cdecl +#else +# define XP_DIR +#endif + +#if defined(DO_TABLES) && defined(FIXED_TABLES) +#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] = b(e) +#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) } +EXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH] = rc_data(w0); +#else +#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] +#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] +EXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH]; +#endif + +#if defined( SBX_SET ) + d_1(uint_8t, t_dec(s,box), sb_data, h0); +#endif +#if defined( ISB_SET ) + d_1(uint_8t, t_dec(i,box), isb_data, h0); +#endif + +#if defined( FT1_SET ) + d_1(uint_32t, t_dec(f,n), sb_data, u0); +#endif +#if defined( FT4_SET ) + d_4(uint_32t, t_dec(f,n), sb_data, u0, u1, u2, u3); +#endif + +#if defined( FL1_SET ) + d_1(uint_32t, t_dec(f,l), sb_data, w0); +#endif +#if defined( FL4_SET ) + d_4(uint_32t, t_dec(f,l), sb_data, w0, w1, w2, w3); +#endif + +#if defined( IT1_SET ) + d_1(uint_32t, t_dec(i,n), isb_data, v0); +#endif +#if defined( IT4_SET ) + d_4(uint_32t, t_dec(i,n), isb_data, v0, v1, v2, v3); +#endif + +#if defined( IL1_SET ) + d_1(uint_32t, t_dec(i,l), isb_data, w0); +#endif +#if defined( IL4_SET ) + d_4(uint_32t, t_dec(i,l), isb_data, w0, w1, w2, w3); +#endif + +#if defined( LS1_SET ) +#if defined( FL1_SET ) +#undef LS1_SET +#else + d_1(uint_32t, t_dec(l,s), sb_data, w0); +#endif +#endif + +#if defined( LS4_SET ) +#if defined( FL4_SET ) +#undef LS4_SET +#else + d_4(uint_32t, t_dec(l,s), sb_data, w0, w1, w2, w3); +#endif +#endif + +#if defined( IM1_SET ) + d_1(uint_32t, t_dec(i,m), mm_data, v0); +#endif +#if defined( IM4_SET ) + d_4(uint_32t, t_dec(i,m), mm_data, v0, v1, v2, v3); +#endif + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/bookmark.c b/bookmark.c new file mode 100644 index 0000000..e50ed74 --- /dev/null +++ b/bookmark.c @@ -0,0 +1,610 @@ +/*============================================================================= +* +* ƒuƒbƒNƒ}[ƒN +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define WINVER 0x400 + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static int AddBookMark(char *Path); +static int GetBothPath(char *Str, char **Path1, char **Path2); +static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); + +/*===== ŠO•”ŽQÆ =====*/ + +extern HWND hHelpWin; + +/* Ý’è’l */ +extern HFONT ListFont; /* ƒŠƒXƒgƒ{ƒbƒNƒX‚̃tƒHƒ“ƒg */ +extern SIZE BmarkDlgSize; + + + +/*----- ƒuƒbƒNƒ}[ƒN‚ðƒNƒŠƒA‚·‚é ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ClearBookMark(void) +{ + HMENU hMenu; + + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU); + while(GetMenuItemCount(hMenu) > DEFAULT_BMARK_ITEM) + DeleteMenu(hMenu, DEFAULT_BMARK_ITEM, MF_BYPOSITION); + return; +} + + +/*----- ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðƒuƒbƒNƒ}[ƒN‚ɒljÁ ------------------------------ +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AddCurDirToBookMark(int Win) +{ + char Buf[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1]; + + if(Win == WIN_LOCAL) + { + strcpy(Buf, BMARK_MARK_LOCAL); + AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH); + } + else if(Win == WIN_REMOTE) + { + strcpy(Buf, BMARK_MARK_REMOTE); + AskRemoteCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH); + } + else + { + strcpy(Buf, BMARK_MARK_BOTH); + AskLocalCurDir(Buf + BMARK_MARK_LEN, FMAX_PATH); + strcat(Buf, BMARK_SEP); + AskRemoteCurDir(Buf + strlen(Buf), FMAX_PATH); + } + AddBookMark(Buf); + return; +} + + +/*----- ƒuƒbƒNƒ}[ƒN‚ɃpƒX‚ð“o˜^‚·‚é ------------------------------------------ +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int AddBookMark(char *Path) +{ + HMENU hMenu; + int MarkID; + int Sts; + + Sts = FAIL; + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU); + MarkID = (GetMenuItemCount(hMenu) - DEFAULT_BMARK_ITEM) + MENU_BMARK_TOP; + if(AppendMenu(hMenu, MF_STRING, MarkID, Path) == TRUE) + Sts = SUCCESS; + return(Sts); +} + + +/*----- Žw’è‚ÌID‚ðŽ‚ÂƒuƒbƒNƒ}[ƒN‚̃pƒX‚ð•Ô‚· -------------------------------- +* +* Parameter +* int MarkID : ID +* char *Local : ƒ[ƒJƒ‹‘¤‚̃pƒX‚ð•Ô‚·ƒoƒbƒtƒ@ +* char *Remote : ƒŠƒ‚[ƒg‘¤‚̃pƒX‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX (BMARK_TYPE_xxx) +*----------------------------------------------------------------------------*/ + +int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max) +{ + HMENU hMenu; + MENUITEMINFO mInfo; + int Sts; + char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1]; + char *Path1; + char *Path2; + int Num; + + memset(Local, NUL, Max); + memset(Remote, NUL, Max); + + Sts = BMARK_TYPE_NONE; + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU); + + mInfo.cbSize = sizeof(MENUITEMINFO); + mInfo.fMask = MIIM_TYPE; + mInfo.dwTypeData = Tmp; + mInfo.cch = BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN; + if(GetMenuItemInfo(hMenu, MarkID, FALSE, &mInfo) == TRUE) + { + Num = GetBothPath(Tmp, &Path1, &Path2); + if(strncmp(Tmp, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0) + { + Sts = BMARK_TYPE_LOCAL; + strncpy(Local, Path1, Max-1); + } + else if(strncmp(Tmp, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0) + { + Sts = BMARK_TYPE_REMOTE; + strncpy(Remote, Path1, Max-1); + } + else if(strncmp(Tmp, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) + { + if(Num == 2) + { + strncpy(Local, Path1, Max-1); + strncpy(Remote, Path2, Max-1); + Sts = BMARK_TYPE_BOTH; + } + } + } + return(Sts); +} + + +/*----- ƒuƒbƒNƒ}[ƒN‚Ì•¶Žš—ñ‚©‚ç‚Q‚‚̃pƒX‚ðŽæ‚èo‚· -------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char **Local : ƒ[ƒJƒ‹‘¤‚̃pƒX‚̐擪‚ð•Ô‚·ƒ[ƒN +* char **Remote : ƒŠƒ‚[ƒg‘¤‚̃pƒX‚̐擪‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒpƒX‚̌” (1 or 2) +* +* Note +* Str‚Ì“à—e‚ð‘‚«Š·‚¦‚é +*----------------------------------------------------------------------------*/ + +static int GetBothPath(char *Str, char **Path1, char **Path2) +{ + char *Pos; + int Ret; + + Ret = 1; + *Path1 = Str + BMARK_MARK_LEN; + + Pos = _mbsstr(Str, BMARK_SEP); + if(Pos != NULL) + { + Ret = 2; + *Pos = NUL; + *Path2 = Pos + BMARK_SEP_LEN; + } + return(Ret); +} + + +/*----- ƒuƒbƒNƒ}[ƒN‚ðÚ‘±’†‚̃zƒXƒgƒŠƒXƒg‚É•Û‘¶‚·‚é -------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SaveBookMark(void) +{ + HMENU hMenu; + MENUITEMINFO mInfo; + int i; + int Cnt; + char *Buf; + char *Pos; + int Len; + char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1]; + int CurHost; + + if(AskConnecting() == YES) + { + if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY) + { + if((Buf = malloc(BOOKMARK_SIZE)) != NULL) + { + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU); + + Pos = Buf; + Len = 0; + Cnt = GetMenuItemCount(hMenu); + for(i = DEFAULT_BMARK_ITEM; i < Cnt; i++) + { + mInfo.cbSize = sizeof(MENUITEMINFO); + mInfo.fMask = MIIM_TYPE; + mInfo.dwTypeData = Tmp; + mInfo.cch = FMAX_PATH; + if(GetMenuItemInfo(hMenu, i, TRUE, &mInfo) == TRUE) + { + if(Len + strlen(Tmp) + 2 <= BOOKMARK_SIZE) + { + strcpy(Pos, Tmp); + Pos += strlen(Tmp) + 1; + Len += strlen(Tmp) + 1; + } + } + } + + if(Pos == Buf) + { + memset(Buf, NUL, 2); + Len = 2; + } + else + { + *Pos = NUL; + Len++; + } + + SetHostBookMark(CurHost, Buf, Len); + + free(Buf); + } + } + } + return; +} + + +/*----- ƒzƒXƒgƒŠƒXƒg‚©‚çƒuƒbƒNƒ}[ƒN‚ð“ǂݍž‚Þ -------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void LoadBookMark(void) +{ + char *Buf; + char *Pos; + int CurHost; + char Tmp[FMAX_PATH + BMARK_MARK_LEN + 1]; + + if(AskConnecting() == YES) + { + if((CurHost = AskCurrentHost()) != HOSTNUM_NOENTRY) + { + if((Buf = AskHostBookMark(CurHost)) != NULL) + { + ClearBookMark(); + Pos = Buf; + while(*Pos != NUL) + { + /* ‹ŒƒtƒH[ƒ}ƒbƒg‚Ì‚½‚߂̏ˆ— */ + /* iƒpƒX‚É"L"‚â"H"‚ª‚‚¢‚Ä‚È‚¢•¨j */ + if((strncmp(Pos, BMARK_MARK_LOCAL, BMARK_MARK_LEN) != 0) && + (strncmp(Pos, BMARK_MARK_REMOTE, BMARK_MARK_LEN) != 0) && + (strncmp(Pos, BMARK_MARK_BOTH, BMARK_MARK_LEN) != 0)) + { + strcpy(Tmp, BMARK_MARK_REMOTE); + strcat(Tmp, Pos); + AddBookMark(Tmp); + } + else + AddBookMark(Pos); + + Pos += strlen(Pos) + 1; + } + } + } + } + return; +} + + +/*----- ƒuƒbƒNƒ}[ƒN•ÒWƒEƒCƒ“ƒhƒE -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ƒXƒe[ƒ^ƒX (YES=ŽÀs/NO=ŽæÁ) +*----------------------------------------------------------------------------*/ + +int EditBookMark(void) +{ + int Sts; + + Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(bmark_dlg), GetMainHwnd(), EditBookMarkProc); + return(Sts); +} + + +/*----- ƒuƒbƒNƒ}[ƒN•ÒWƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK EditBookMarkProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + HMENU hMenu; + MENUITEMINFO mInfo; + int Cur; + int Max; + char Tmp[BMARK_MARK_LEN + FMAX_PATH * 2 + BMARK_SEP_LEN + 1]; + + static DIALOGSIZE DlgSize = { + { BMARK_NEW, BMARK_SET, BMARK_DEL, BMARK_DOWN, BMARK_UP, IDHELP, BMARK_SIZEGRIP, -1 }, + { IDOK, BMARK_JUMP, BMARK_SIZEGRIP, -1 }, + { BMARK_LIST, -1 }, + { 0, 0 }, + { 0, 0 } + }; + + switch (message) + { + case WM_INITDIALOG : + if(ListFont != NULL) + SendDlgItemMessage(hDlg, BMARK_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), BMARK_SUB_MENU); + Max = GetMenuItemCount(hMenu); + for(Cur = DEFAULT_BMARK_ITEM; Cur < Max; Cur++) + { + mInfo.cbSize = sizeof(MENUITEMINFO); + mInfo.fMask = MIIM_TYPE; + mInfo.dwTypeData = Tmp; + mInfo.cch = FMAX_PATH; + if(GetMenuItemInfo(hMenu, Cur, TRUE, &mInfo) == TRUE) + SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp); + } + DlgSizeInit(hDlg, &DlgSize, &BmarkDlgSize); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case BMARK_JUMP : + if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(Cur+MENU_BMARK_TOP, 0), 0); + /* ‚±‚±‚É break ‚Í‚È‚¢ */ + + case IDCANCEL : + case IDOK : + ClearBookMark(); + Max = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0); + for(Cur = 0; Cur < Max; Cur++) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp); + AddBookMark(Tmp); + } + AskDlgSize(hDlg, &DlgSize, &BmarkDlgSize); + EndDialog(hDlg, YES); + break; + + case BMARK_SET : + if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp); + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, Cur, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0); + } + } + break; + + case BMARK_NEW : + strcpy(Tmp, ""); + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(bmark_edit_dlg), hDlg, BookMarkEditCallBack, (LPARAM)Tmp) == YES) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp); + Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) - 1; + SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0); + } + break; + + case BMARK_DEL : + if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0); + if(Cur >= SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)) + Cur = max1(0, SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1); + if(SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0) > 0) + SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0); + } + break; + + case BMARK_UP : + if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + { + if(Cur > 0) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, --Cur, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0); + } + } + break; + + case BMARK_DOWN : + if((Cur = SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + { + if(Cur < SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETCOUNT, 0, 0)-1) + { + SendDlgItemMessage(hDlg, BMARK_LIST, LB_GETTEXT, Cur, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_DELETESTRING, Cur, 0); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_INSERTSTRING, ++Cur, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, BMARK_LIST, LB_SETCURSEL, Cur, 0); + } + } + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000019); + break; + } + return(TRUE); + + case WM_SIZING : + DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam); + return(TRUE); + + } + return(FALSE); +} + + +/*----- ƒuƒbƒNƒ}[ƒN“ü—̓_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK BookMarkEditCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static char *Str; + char *Path1; + char *Path2; + char Local[FMAX_PATH+1]; + char Remote[FMAX_PATH+1]; + int Num; + + switch (iMessage) + { + case WM_INITDIALOG : + Str = (char *)lParam; + SendDlgItemMessage(hDlg, BEDIT_LOCAL, EM_LIMITTEXT, FMAX_PATH-1, 0); + SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_LIMITTEXT, FMAX_PATH-1, 0); + if(strlen(Str) > BMARK_MARK_LEN) + { + Num = GetBothPath(Str, &Path1, &Path2); + if(strncmp(Str, BMARK_MARK_LOCAL, BMARK_MARK_LEN) == 0) + SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1); + else if(strncmp(Str, BMARK_MARK_REMOTE, BMARK_MARK_LEN) == 0) + { + SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path1); + /* ƒzƒXƒg‘¤‚ɃJ[ƒ\ƒ‹‚ðˆÚ“®‚µ‚Ä‚¨‚­ */ + SetFocus(GetDlgItem(hDlg, BEDIT_REMOTE)); + SendDlgItemMessage(hDlg, BEDIT_REMOTE, EM_SETSEL, 0, -1); + return(FALSE); + } + else if((strncmp(Str, BMARK_MARK_BOTH, BMARK_MARK_LEN) == 0) && (Num == 2)) + { + SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_SETTEXT, 0, (LPARAM)Path1); + SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_SETTEXT, 0, (LPARAM)Path2); + } + } + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, BEDIT_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Local); + SendDlgItemMessage(hDlg, BEDIT_REMOTE, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Remote); + if(strlen(Local) > 0) + { + if(strlen(Remote) > 0) + { + /* —¼•û */ + strcpy(Str, BMARK_MARK_BOTH); + strcat(Str, Local); + strcat(Str, BMARK_SEP); + strcat(Str, Remote); + } + else + { + /* ƒ[ƒJƒ‹‚Ì‚Ý */ + strcpy(Str, BMARK_MARK_LOCAL); + strcat(Str, Local); + } + EndDialog(hDlg, YES); + } + else if(strlen(Remote) > 0) + { + /* ƒzƒXƒg‚Ì‚Ý */ + strcpy(Str, BMARK_MARK_REMOTE); + strcat(Str, Remote); + EndDialog(hDlg, YES); + } + else + EndDialog(hDlg, NO); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + } + return(TRUE); + } + return(FALSE); +} + + diff --git a/brg_endian.h b/brg_endian.h new file mode 100644 index 0000000..1c1d091 --- /dev/null +++ b/brg_endian.h @@ -0,0 +1,133 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 +*/ + +#ifndef _BRG_ENDIAN_H +#define _BRG_ENDIAN_H + +#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ +#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ + +/* Include files where endian defines and byteswap functions may reside */ +#if defined( __sun ) +# include +#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ ) +# include +#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \ + defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ ) +# include +#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ ) +# if !defined( __MINGW32__ ) && !defined( _AIX ) +# include +# if !defined( __BEOS__ ) +# include +# endif +# endif +#endif + +/* Now attempt to set the define for platform byte order using any */ +/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */ +/* seem to encompass most endian symbol definitions */ + +#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN ) +# if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( BIG_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( LITTLE_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN ) +# if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( _BIG_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( _LITTLE_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN ) +# if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( __BIG_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( __LITTLE_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ ) +# if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__ +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__ +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( __BIG_ENDIAN__ ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( __LITTLE_ENDIAN__ ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +/* if the platform byte order could not be determined, then try to */ +/* set this define using common machine defines */ +#if !defined(PLATFORM_BYTE_ORDER) + +#if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \ + defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \ + defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \ + defined( vax ) || defined( vms ) || defined( VMS ) || \ + defined( __VMS ) || defined( _M_X64 ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN + +#elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \ + defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \ + defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \ + defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \ + defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \ + defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \ + defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN + +#elif 0 /* **** EDIT HERE IF NECESSARY **** */ +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#elif 0 /* **** EDIT HERE IF NECESSARY **** */ +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#else +# error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order +#endif + +#endif + +#endif diff --git a/brg_types.h b/brg_types.h new file mode 100644 index 0000000..b758e86 --- /dev/null +++ b/brg_types.h @@ -0,0 +1,226 @@ +/* + --------------------------------------------------------------------------- + Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. + + LICENSE TERMS + + The redistribution and use of this software (with or without changes) + is allowed without the payment of fees or royalties provided that: + + 1. source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + 2. binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation; + + 3. the name of the copyright holder is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explicit or implied warranties + in respect of its properties, including, but not limited to, correctness + and/or fitness for purpose. + --------------------------------------------------------------------------- + Issue Date: 20/12/2007 + + The unsigned integer types defined here are of the form uint_t where + is the length of the type; for example, the unsigned 32-bit type is + 'uint_32t'. These are NOT the same as the 'C99 integer types' that are + defined in the inttypes.h and stdint.h headers since attempts to use these + types have shown that support for them is still highly variable. However, + since the latter are of the form uint_t, a regular expression search + and replace (in VC++ search on 'uint_{:z}t' and replace with 'uint\1_t') + can be used to convert the types used here to the C99 standard types. +*/ + +#ifndef _BRG_TYPES_H +#define _BRG_TYPES_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#include + +#if defined( _MSC_VER ) && ( _MSC_VER >= 1300 ) +# include +# define ptrint_t intptr_t +#elif defined( __ECOS__ ) +# define intptr_t unsigned int +# define ptrint_t intptr_t +#elif defined( __GNUC__ ) && ( __GNUC__ >= 3 ) +# include +# define ptrint_t intptr_t +#else +# define ptrint_t int +#endif + +#ifndef BRG_UI8 +# define BRG_UI8 +# if UCHAR_MAX == 255u + typedef unsigned char uint_8t; +# else +# error Please define uint_8t as an 8-bit unsigned integer type in brg_types.h +# endif +#endif + +#ifndef BRG_UI16 +# define BRG_UI16 +# if USHRT_MAX == 65535u + typedef unsigned short uint_16t; +# else +# error Please define uint_16t as a 16-bit unsigned short type in brg_types.h +# endif +#endif + +#ifndef BRG_UI32 +# define BRG_UI32 +# if UINT_MAX == 4294967295u +# define li_32(h) 0x##h##u + typedef unsigned int uint_32t; +# elif ULONG_MAX == 4294967295u +# define li_32(h) 0x##h##ul + typedef unsigned long uint_32t; +# elif defined( _CRAY ) +# error This code needs 32-bit data types, which Cray machines do not provide +# else +# error Please define uint_32t as a 32-bit unsigned integer type in brg_types.h +# endif +#endif + +#ifndef BRG_UI64 +# if defined( __BORLANDC__ ) && !defined( __MSDOS__ ) +# define BRG_UI64 +# define li_64(h) 0x##h##ui64 + typedef unsigned __int64 uint_64t; +# elif defined( _MSC_VER ) && ( _MSC_VER < 1300 ) /* 1300 == VC++ 7.0 */ +# define BRG_UI64 +# define li_64(h) 0x##h##ui64 + typedef unsigned __int64 uint_64t; +# elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful +# define BRG_UI64 +# define li_64(h) 0x##h##ull + typedef unsigned long long uint_64t; +# elif defined( __MVS__ ) +# define BRG_UI64 +# define li_64(h) 0x##h##ull + typedef unsigned int long long uint_64t; +# elif defined( UINT_MAX ) && UINT_MAX > 4294967295u +# if UINT_MAX == 18446744073709551615u +# define BRG_UI64 +# define li_64(h) 0x##h##u + typedef unsigned int uint_64t; +# endif +# elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u +# if ULONG_MAX == 18446744073709551615ul +# define BRG_UI64 +# define li_64(h) 0x##h##ul + typedef unsigned long uint_64t; +# endif +# elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u +# if ULLONG_MAX == 18446744073709551615ull +# define BRG_UI64 +# define li_64(h) 0x##h##ull + typedef unsigned long long uint_64t; +# endif +# elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u +# if ULONG_LONG_MAX == 18446744073709551615ull +# define BRG_UI64 +# define li_64(h) 0x##h##ull + typedef unsigned long long uint_64t; +# endif +# endif +#endif + +#if !defined( BRG_UI64 ) +# if defined( NEED_UINT_64T ) +# error Please define uint_64t as an unsigned 64 bit type in brg_types.h +# endif +#endif + +#ifndef RETURN_VALUES +# define RETURN_VALUES +# if defined( DLL_EXPORT ) +# if defined( _MSC_VER ) || defined ( __INTEL_COMPILER ) +# define VOID_RETURN __declspec( dllexport ) void __stdcall +# define INT_RETURN __declspec( dllexport ) int __stdcall +# elif defined( __GNUC__ ) +# define VOID_RETURN __declspec( __dllexport__ ) void +# define INT_RETURN __declspec( __dllexport__ ) int +# else +# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers +# endif +# elif defined( DLL_IMPORT ) +# if defined( _MSC_VER ) || defined ( __INTEL_COMPILER ) +# define VOID_RETURN __declspec( dllimport ) void __stdcall +# define INT_RETURN __declspec( dllimport ) int __stdcall +# elif defined( __GNUC__ ) +# define VOID_RETURN __declspec( __dllimport__ ) void +# define INT_RETURN __declspec( __dllimport__ ) int +# else +# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers +# endif +# elif defined( __WATCOMC__ ) +# define VOID_RETURN void __cdecl +# define INT_RETURN int __cdecl +# else +# define VOID_RETURN void +# define INT_RETURN int +# endif +#endif + +/* These defines are used to detect and set the memory alignment of pointers. + Note that offsets are in bytes. + + ALIGN_OFFSET(x,n) return the positive or zero offset of + the memory addressed by the pointer 'x' + from an address that is aligned on an + 'n' byte boundary ('n' is a power of 2) + + ALIGN_FLOOR(x,n) return a pointer that points to memory + that is aligned on an 'n' byte boundary + and is not higher than the memory address + pointed to by 'x' ('n' is a power of 2) + + ALIGN_CEIL(x,n) return a pointer that points to memory + that is aligned on an 'n' byte boundary + and is not lower than the memory address + pointed to by 'x' ('n' is a power of 2) +*/ + +#define ALIGN_OFFSET(x,n) (((ptrint_t)(x)) & ((n) - 1)) +#define ALIGN_FLOOR(x,n) ((uint_8t*)(x) - ( ((ptrint_t)(x)) & ((n) - 1))) +#define ALIGN_CEIL(x,n) ((uint_8t*)(x) + (-((ptrint_t)(x)) & ((n) - 1))) + +/* These defines are used to declare buffers in a way that allows + faster operations on longer variables to be used. In all these + defines 'size' must be a power of 2 and >= 8. NOTE that the + buffer size is in bytes but the type length is in bits + + UNIT_TYPEDEF(x,size) declares a variable 'x' of length + 'size' bits + + BUFR_TYPEDEF(x,size,bsize) declares a buffer 'x' of length 'bsize' + bytes defined as an array of variables + each of 'size' bits (bsize must be a + multiple of size / 8) + + UNIT_CAST(x,size) casts a variable to a type of + length 'size' bits + + UPTR_CAST(x,size) casts a pointer to a pointer to a + varaiable of length 'size' bits +*/ + +#define UI_TYPE(size) uint_##size##t +#define UNIT_TYPEDEF(x,size) typedef UI_TYPE(size) x +#define BUFR_TYPEDEF(x,size,bsize) typedef UI_TYPE(size) x[bsize / (size >> 3)] +#define UNIT_CAST(x,size) ((UI_TYPE(size) )(x)) +#define UPTR_CAST(x,size) ((UI_TYPE(size)*)(x)) + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/cache.c b/cache.c new file mode 100644 index 0000000..c68b1b6 --- /dev/null +++ b/cache.c @@ -0,0 +1,495 @@ +/*============================================================================= +* +* ƒtƒ@ƒCƒ‹ˆê——ƒLƒƒƒbƒVƒ… +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "common.h" +#include "resource.h" + + + + +static BOOL CALLBACK CountPrevFfftpWindowsProc(HWND hWnd, LPARAM lParam); + + + +/*===== ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚̃Xƒgƒ‰ƒNƒ`ƒƒ =====*/ + +typedef struct { + time_t Time; /* ƒŠƒXƒg‚É“o˜^‚µ‚½ŽžŠÔ */ + char HostAdrs[HOST_ADRS_LEN+1]; /* ƒzƒXƒg‚̃AƒhƒŒƒX */ + char UserName[USER_NAME_LEN+1]; /* ƒ†[ƒU–¼ */ + char Path[FMAX_PATH+1]; /* ƒpƒX–¼ */ +} CACHELIST; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static CACHELIST *RemoteCache = NULL; /* ƒLƒƒƒbƒVƒ…ƒf[ƒ^ */ +static int TmpCacheEntry = 0; /* ƒLƒƒƒbƒVƒ…‚³‚ê‚Ä‚¢‚éƒf[ƒ^‚̐” */ +static int LastNum; /* Œ»Ý•\Ž¦‚µ‚Ä‚¢‚éƒf[ƒ^‚̔ԍ† */ +static int ProgNum; /* FFFTP‚Ì‹N“®”ԍ† */ + + +/*----- ƒtƒ@ƒCƒ‹ˆê——ƒLƒƒƒbƒVƒ…‚ðì¬‚·‚é -------------------------------------- +* +* Parameter +* int Num : ƒLƒƒƒbƒVƒ…‰Â”\ŒÂ” +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int MakeCacheBuf(int Num) +{ + int Sts; + int i; + + Sts = SUCCESS; + if(Num > 0) + { + Sts = FAIL; + if((RemoteCache = malloc(sizeof(CACHELIST) * Num)) != NULL) + { + TmpCacheEntry = Num; + for(i = 0; i < TmpCacheEntry; i++) + ClearCache(i); + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——ƒLƒƒƒbƒVƒ…‚ðíœ‚·‚é -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteCacheBuf(void) +{ + if(RemoteCache != NULL) + free(RemoteCache); + RemoteCache = NULL; + TmpCacheEntry = 0; + return; +} + + +/*----- ƒpƒX‚ªƒLƒƒƒbƒVƒ…‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------------ +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* int ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚̔ԍ† +* -1 = ƒLƒƒƒbƒVƒ…‚³‚ê‚Ä‚¢‚È‚¢ +*----------------------------------------------------------------------------*/ + +int AskCached(char *Path) +{ + int Ret; + int i; + CACHELIST *Pos; + + Ret = -1; + if(TmpCacheEntry > 0) + { + Pos = RemoteCache; + for(i = 0; i < TmpCacheEntry; i++) + { + if((_stricmp(AskHostAdrs(), Pos->HostAdrs) == 0) && + (strcmp(AskHostUserName(), Pos->UserName) == 0) && + (strcmp(Path, Pos->Path) == 0)) + { + time(&(Pos->Time)); /* Refresh */ + Ret = i; +// DoPrintf("Filelist cache found. (%d)", Ret); + break; + } + Pos++; + } + } + return(Ret); +} + + +/*----- –¢Žg—p‚̃LƒƒƒbƒVƒ…ƒf[ƒ^”ԍ†‚ð•Ô‚· ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int –¢Žg—p‚̃LƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† +* +* Note +* –¢Žg—p‚Ì•¨‚ª–³‚¢Žž‚́Aˆê”Ԍ¢‚à‚̂ɏ㏑‚«‚·‚é +*----------------------------------------------------------------------------*/ + +int AskFreeCache(void) +{ + int Ret; + int i; + time_t Oldest; + CACHELIST *Pos; + + Ret = 0; + if(TmpCacheEntry > 0) + { + Oldest = 0; + Ret = -1; + Pos = RemoteCache; + for(i = 0; i < TmpCacheEntry; i++) + { + if(strlen(Pos->Path) == 0) + { + Ret = i; + break; + } + else + { + if((Ret == -1) || (Pos->Time < Oldest)) + { + Oldest = Pos->Time; + Ret = i; + } + } + Pos++; + } + } +// DoPrintf("Set filelist cache. (%d)", Ret); + return(Ret); +} + + +/*----- ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚ðƒZƒbƒg‚·‚é ------------------------------------------ +* +* Parameter +* int Num : ƒLƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* Œ»ÝÚ‘±’†‚̃zƒXƒg–¼‚ðŽg—p‚·‚é +*----------------------------------------------------------------------------*/ + +void SetCache(int Num, char *Path) +{ + if(TmpCacheEntry > 0) + { + strcpy((RemoteCache + Num)->HostAdrs, AskHostAdrs()); + strcpy((RemoteCache + Num)->UserName, AskHostUserName()); + strcpy((RemoteCache + Num)->Path, Path); + time(&((RemoteCache + Num)->Time)); + } + return; +} + + +/*----- ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚ðƒNƒŠƒA‚·‚é ------------------------------------------ +* +* Parameter +* int Num : ƒLƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ClearCache(int Num) +{ + if(TmpCacheEntry > 0) + { + strcpy((RemoteCache + Num)->HostAdrs, ""); + strcpy((RemoteCache + Num)->UserName, ""); + strcpy((RemoteCache + Num)->Path, ""); + (RemoteCache + Num)->Time = 0; + } + return; +} + + +/*----- Œ»Ý•\Ž¦’†‚̃LƒƒƒbƒVƒ…ƒf[ƒ^”ԍ†‚ð•Ô‚· -------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒLƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† +*----------------------------------------------------------------------------*/ + +int AskCurrentFileListNum(void) +{ + return(LastNum); +} + + +/*----- Œ»Ý•\Ž¦’†‚̃LƒƒƒbƒVƒ…ƒf[ƒ^”ԍ†‚ðƒZƒbƒg‚·‚é -------------------------- +* +* Parameter +* int Num : ƒLƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetCurrentFileListNum(int Num) +{ + LastNum = Num; +} + + +/*----- ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚ð•Û‘¶‚·‚é -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚»‚Ì‚à‚̂̓tƒ@ƒCƒ‹‚É‚È‚Á‚Ä‚¢‚é‚̂ŁA‚±‚±‚ł̓Cƒ“ƒfƒbƒN +* ƒXƒtƒ@ƒCƒ‹‚ðì¬‚·‚éB +* ‚Ü‚½A•s—v‚ȃtƒ@ƒCƒ‹‚͍폜‚·‚éB +*----------------------------------------------------------------------------*/ + +void SaveCache(void) +{ + char Buf[FMAX_PATH+1]; + FILE *fd; + CACHELIST *Pos; + int i; + + if(ProgNum == 0) /* Å‰‚̃Cƒ“ƒXƒ^ƒ“ƒX‚¾‚¯‚ªƒLƒƒƒbƒVƒ…‚ð•Û‘¶‚Å‚«‚é */ + { + if(TmpCacheEntry > 0) + { + strcpy(Buf, AskTmpFilePath()); + SetYenTail(Buf); + strcat(Buf, "_ffftp.idx"); + if((fd = fopen(Buf, "wt"))!=NULL) + { + Pos = RemoteCache; + for(i = 0; i < TmpCacheEntry; i++) + { + if(strlen(Pos->Path) != 0) + fprintf(fd, "%s %s %s %ld\n", Pos->HostAdrs, Pos->UserName, Pos->Path, Pos->Time); + Pos++; + } + fclose(fd); + } + } + } + else + DeleteCache(); + + MakeCacheFileName(998, Buf); + _unlink(Buf); + + MakeCacheFileName(999, Buf); + _unlink(Buf); + + return; +} + + +/*----- ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚ð“ǂݍž‚Þ -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void LoadCache(void) +{ + char Buf[FMAX_PATH+1]; + FILE *fd; + CACHELIST *Pos; + int Num; + + if(ProgNum == 0) /* Å‰‚̃Cƒ“ƒXƒ^ƒ“ƒX‚¾‚¯‚ªƒLƒƒƒbƒVƒ…‚ð•Û‘¶‚Å‚«‚é */ + { + if(TmpCacheEntry > 0) + { + strcpy(Buf, AskTmpFilePath()); + SetYenTail(Buf); + strcat(Buf, "_ffftp.idx"); + if((fd = fopen(Buf, "rt"))!=NULL) + { + Pos = RemoteCache; + Num = 0; + while(Num < TmpCacheEntry) + { + if(fgets(Buf, FMAX_PATH, fd) == NULL) + break; + + if(sscanf(Buf, "%s %s %s %ld\n", Pos->HostAdrs, Pos->UserName, Pos->Path, &(Pos->Time)) == 4) + { + Pos++; + Num++; + } + else + ClearCache(Num); + } + fclose(fd); + } + } + } + return; +} + + +/*----- ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚ð‘S‚č폜‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteCache(void) +{ + char Buf[FMAX_PATH+1]; + int i; + + if(ProgNum == 0) + { + strcpy(Buf, AskTmpFilePath()); + SetYenTail(Buf); + strcat(Buf, "_ffftp.idx"); + _unlink(Buf); + } + + for(i = 0; i <= TmpCacheEntry; i++) + { + MakeCacheFileName(i, Buf); + _unlink(Buf); + } + + MakeCacheFileName(998, Buf); + _unlink(Buf); + + MakeCacheFileName(999, Buf); + _unlink(Buf); + + return; +} + + +/*----- ƒLƒƒƒbƒVƒ…‚̃tƒ@ƒCƒ‹–¼‚ðì¬‚·‚é -------------------------------------- +* +* Parameter +* int Num : ƒLƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† +* char *Buf : ƒtƒ@ƒCƒ‹–¼‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MakeCacheFileName(int Num, char *Buf) +{ + char Prog[10]; + char *Pos; + + strcpy(Buf, AskTmpFilePath()); + SetYenTail(Buf); + Pos = strchr(Buf, NUL); + + strcpy(Prog, ""); + if(ProgNum > 0) + sprintf(Prog, ".%d", ProgNum); + + sprintf(Pos, "_ffftp.%03d%s", Num, Prog); + return; +} + + +/*----- ‹N“®‚µ‚Ä‚¢‚éFFFTP‚̐”‚𐔂¦‚é ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +* +* Note +* ŒÂ”‚ÍProgNum‚ÉŠi”[‚·‚é +*----------------------------------------------------------------------------*/ + +void CountPrevFfftpWindows(void) +{ + ProgNum = 0; + EnumWindows(CountPrevFfftpWindowsProc, 0); + return; +} + + +/*----- ‹N“®‚µ‚Ä‚¢‚éFFFTP‚̐”‚𐔂¦‚éƒR[ƒ‹ƒoƒbƒN------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* LPARAM lParam : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK CountPrevFfftpWindowsProc(HWND hWnd, LPARAM lParam) +{ + char Buf[FMAX_PATH+1]; + + if(GetClassName(hWnd, Buf, FMAX_PATH) > 0) + { + if(strcmp(Buf, "FFFTPWin") == 0) + ProgNum++; + } + return(TRUE); +} + + + diff --git a/clipboard.c b/clipboard.c new file mode 100644 index 0000000..b02130b --- /dev/null +++ b/clipboard.c @@ -0,0 +1,79 @@ +/*============================================================================= +* +* ƒNƒŠƒbƒvƒ{[ƒhŠÖŒW +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + + +/*----- •¶Žš—ñ‚ðƒNƒŠƒbƒvƒ{[ƒh‚ɃRƒs[ ---------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +int CopyStrToClipBoard(char *Str) +{ + int Sts; + void *gBuf; + HGLOBAL hGlobal; + + Sts = FAIL; + if(OpenClipboard(GetMainHwnd())) + { + if(EmptyClipboard()) + { + if((hGlobal = GlobalAlloc(GHND, strlen(Str)+1)) != NULL) + { + if((gBuf = GlobalLock(hGlobal)) != NULL) + { + strcpy(gBuf, Str); + + GlobalUnlock(hGlobal); + SetClipboardData(CF_TEXT, hGlobal); + Sts = SUCCESS; + } + } + } + CloseClipboard(); + } + return(Sts); +} + + diff --git a/codecnv.c b/codecnv.c new file mode 100644 index 0000000..006e843 --- /dev/null +++ b/codecnv.c @@ -0,0 +1,1679 @@ +/*============================================================================= +* +* Š¿ŽšƒR[ƒh•ÏŠ·^‰üsƒR[ƒh•ÏŠ· +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + + +#define CONV_ASCII 0 /* ASCII•¶Žšˆ—’† */ +#define CONV_KANJI 1 /* Š¿Žšˆ—’† */ +#define CONV_KANA 2 /* ”¼ŠpƒJƒ^ƒJƒiˆ—’† */ + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put); +static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put); +static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put); +static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put); +static int HanKataToZen(char Ch); +static int AskDakuon(char Ch, char Daku); + +static int CheckOnSJIS(uchar *Pos, uchar *Btm); +static int CheckOnEUC(uchar *Pos, uchar *Btm); +static int ConvertIBMExtendedChar(int code); + + + +#if 0 +/*----- Š¿ŽšƒR[ƒh•ÏŠ·‚̃eƒXƒgƒvƒƒOƒ‰ƒ€ ------------------------------------*/ + +void CodeCnvTest(void) +{ + #define BUFBUF 43 + #define BUFBUF2 BUFBUF+3 + + CODECONVINFO cInfo; + char Buf[BUFBUF]; + char Buf2[BUFBUF2]; + FILE *Strm1; + FILE *Strm2; + int Byte; + int Continue; + +// DoPrintf("---START ZEN"); + + Strm1 = fopen("in.txt", "rb"); + Strm2 = fopen("out_zen.txt", "wb"); + + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = YES; + + + while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0) + { + cInfo.Str = Buf; + cInfo.StrLen = Byte; + cInfo.Buf = Buf2; + cInfo.BufSize = BUFBUF2; + +// DoPrintf("READ %d", Byte); + + do + { +// Continue = ConvEUCtoSJIS(&cInfo); +// Continue = ConvJIStoSJIS(&cInfo); +// Continue = ConvSJIStoEUC(&cInfo); +// Continue = ConvSJIStoJIS(&cInfo); + Continue = ConvSMBtoSJIS(&cInfo); +// Continue = ConvSJIStoSMB_HEX(&cInfo); +// Continue = ConvSJIStoSMB_CAP(&cInfo); + + fwrite(Buf2, cInfo.OutLen, 1, Strm2); +// DoPrintf("WRITE %d", cInfo.OutLen); + + } + while(Continue == YES); + } + + cInfo.Buf = Buf2; + cInfo.BufSize = BUFBUF2; + FlushRestData(&cInfo); + fwrite(Buf2, cInfo.OutLen, 1, Strm2); +// DoPrintf("WRITE %d", cInfo.OutLen); + + + fclose(Strm1); + fclose(Strm2); + + +// DoPrintf("---START HAN"); + + Strm1 = fopen("in.txt", "rb"); + Strm2 = fopen("out_han.txt", "wb"); + + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = NO; + + + while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0) + { + cInfo.Str = Buf; + cInfo.StrLen = Byte; + cInfo.Buf = Buf2; + cInfo.BufSize = BUFBUF2; + +// DoPrintf("READ %d", Byte); + + do + { +// Continue = ConvEUCtoSJIS(&cInfo); +// Continue = ConvJIStoSJIS(&cInfo); +// Continue = ConvSJIStoEUC(&cInfo); +// Continue = ConvSJIStoJIS(&cInfo); + Continue = ConvSMBtoSJIS(&cInfo); +// Continue = ConvSJIStoSMB_HEX(&cInfo); +// Continue = ConvSJIStoSMB_CAP(&cInfo); + fwrite(Buf2, cInfo.OutLen, 1, Strm2); +// DoPrintf("WRITE %d", cInfo.OutLen); + + } + while(Continue == YES); + } + + cInfo.Buf = Buf2; + cInfo.BufSize = BUFBUF2; + FlushRestData(&cInfo); + fwrite(Buf2, cInfo.OutLen, 1, Strm2); +// DoPrintf("WRITE %d", cInfo.OutLen); + + fclose(Strm1); + fclose(Strm2); + +// DoPrintf("---END"); + + return; +} +#endif + + + +#if 0 +/*----- ‰üsƒR[ƒh•ÏŠ·‚̃eƒXƒgƒvƒƒOƒ‰ƒ€ ------------------------------------*/ + +void TermCodeCnvTest(void) +{ + #define BUFBUF 10 + #define BUFBUF2 BUFBUF + + TERMCODECONVINFO cInfo; + char Buf[BUFBUF]; + char Buf2[BUFBUF2]; + FILE *Strm1; + FILE *Strm2; + int Byte; + int Continue; + +// DoPrintf("---START"); + + Strm1 = fopen("in.txt", "rb"); + Strm2 = fopen("out.txt", "wb"); + + InitTermCodeConvInfo(&cInfo); + + while((Byte = fread(Buf, 1, BUFBUF, Strm1)) != 0) + { + cInfo.Str = Buf; + cInfo.StrLen = Byte; + cInfo.Buf = Buf2; + cInfo.BufSize = BUFBUF2; + +// DoPrintf("READ %d", Byte); + + do + { + Continue = ConvTermCodeToCRLF(&cInfo); + + fwrite(Buf2, cInfo.OutLen, 1, Strm2); +// DoPrintf("WRITE %d", cInfo.OutLen); + + } + while(Continue == YES); + } + + cInfo.Buf = Buf2; + cInfo.BufSize = BUFBUF2; + FlushRestTermCodeConvData(&cInfo); + fwrite(Buf2, cInfo.OutLen, 1, Strm2); +// DoPrintf("WRITE %d", cInfo.OutLen); + + fclose(Strm1); + fclose(Strm2); + +// DoPrintf("---END"); + + return; +} +#endif + + + + + + + + + + + + +/*----- ‰üsƒR[ƒh•ÏŠ·î•ñ‚ð‰Šú‰» -------------------------------------------- +* +* Parameter +* TERMCODECONVINFO *cInfo : ‰üsƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo) +{ + cInfo->Term = 0; + return; +} + + +/*----- ‰üsƒR[ƒh•ÏŠ·‚ÌŽc‚èî•ñ‚ðo—Í ---------------------------------------- +* +* Parameter +* TERMCODECONVINFO *cInfo : ‰üsƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (=NO) +* +* Note +* ‰üsƒR[ƒh•ÏŠ·‚̍Ōã‚ɌĂԎ– +*----------------------------------------------------------------------------*/ + +int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo) +{ + char *Put; + + Put = cInfo->Buf; + + if(cInfo->Term == 0x0D) + *Put++ = 0x0A; + + cInfo->OutLen = Put - cInfo->Buf; + + return(NO); +} + + +/*----- ‰üsƒR[ƒh‚ðCRLF‚É•ÏŠ· ------------------------------------------------- +* +* Parameter +* TERMCODECONVINFO *cInfo : ‰üsƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +*----------------------------------------------------------------------------*/ + +int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo) +{ + char *Str; + char *Put; + char *Limit; + int Continue; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 1; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if(*Str == 0x0D) + { + if(cInfo->Term == 0x0D) + *Put++ = 0x0A; + *Put++ = 0x0D; + cInfo->Term = *Str++; + } + else + { + if(*Str == 0x0A) + { + if(cInfo->Term != 0x0D) + *Put++ = 0x0D; + } + else + { + if(cInfo->Term == 0x0D) + *Put++ = 0x0A; + } + cInfo->Term = 0; + *Put++ = *Str++; + } + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- Š¿ŽšƒR[ƒh•ÏŠ·î•ñ‚ð‰Šú‰» -------------------------------------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void InitCodeConvInfo(CODECONVINFO *cInfo) +{ + cInfo->KanaCnv = YES; + + cInfo->EscProc = 0; + cInfo->KanjiMode = CONV_ASCII; + cInfo->KanjiFst = 0; + cInfo->KanaPrev = 0; + cInfo->KanaProc = NULL; + return; +} + + +/*----- Š¿ŽšƒR[ƒh•ÏŠ·‚ÌŽc‚èî•ñ‚ðo—Í ---------------------------------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (=NO) +* +* Note +* Š¿ŽšƒR[ƒh•ÏŠ·‚̍Ōã‚ɌĂԎ– +*----------------------------------------------------------------------------*/ + +int FlushRestData(CODECONVINFO *cInfo) +{ + char *Put; + + Put = cInfo->Buf; + + if(cInfo->KanaProc != NULL) + Put = (cInfo->KanaProc)(cInfo, 0, Put); + + if(cInfo->KanjiFst != 0) + *Put++ = cInfo->KanjiFst; + if(cInfo->EscProc >= 1) + *Put++ = cInfo->EscCode[0]; + if(cInfo->EscProc == 2) + *Put++ = cInfo->EscCode[1]; + + cInfo->OutLen = Put - cInfo->Buf; + + return(NO); +} + + +/*----- EUCŠ¿ŽšƒR[ƒh‚ðSHIFT-JISŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +*----------------------------------------------------------------------------*/ + +int ConvEUCtoSJIS(CODECONVINFO *cInfo) +{ + int Kcode; + char *Str; + char *Put; + char *Limit; + int Continue; + + cInfo->KanaProc = &ConvEUCtoSJISkanaProc; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 2; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if((*Str & 0x80) != 0) + { + if(cInfo->KanjiFst == 0) + cInfo->KanjiFst = *Str++; + else + { + if((uchar)cInfo->KanjiFst == (uchar)0x8E) /* ”¼ŠpƒJƒ^ƒJƒi */ + { + Put = ConvEUCtoSJISkanaProc(cInfo, *Str++, Put); + } + else + { + Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put); + + Kcode = _mbcjistojms(((cInfo->KanjiFst & 0x7F) * 0x100) + (*Str++ & 0x7F)); + *Put++ = HIGH8(Kcode); + *Put++ = LOW8(Kcode); + } + cInfo->KanjiFst = 0; + } + } + else + { + Put = ConvEUCtoSJISkanaProc(cInfo, 0, Put); + + if(cInfo->KanjiFst != 0) + { + *Put++ = cInfo->KanjiFst; + cInfo->KanjiFst = 0; + } + *Put++ = *Str++; + } + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- EUC-->SHIFT-JISŠ¿ŽšƒR[ƒh‚É•ÏŠ·‚Ì”¼ŠpƒJƒ^ƒJƒi‚̏ˆ— ------------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* char Dt : •¶Žš +* char *Put : ƒf[ƒ^ƒZƒbƒgˆÊ’u +* +* Return Value +* char *ŽŸ‚̃f[ƒ^ƒZƒbƒgˆÊ’u +*----------------------------------------------------------------------------*/ + +static char *ConvEUCtoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put) +{ + int Kcode; + int Daku; + + if(cInfo->KanaCnv == NO) + { + if(Dt != 0) + *Put++ = Dt; + } + else + { + if(cInfo->KanaPrev != 0) + { + Daku = AskDakuon(cInfo->KanaPrev, Dt); + + Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku; + *Put++ = HIGH8(Kcode); + *Put++ = LOW8(Kcode); + + if(Daku == 0) + cInfo->KanaPrev = Dt; + else + cInfo->KanaPrev = 0; + } + else + cInfo->KanaPrev = Dt; + } + return(Put); +} + + +/*----- JISŠ¿ŽšƒR[ƒh‚ðSHIFT-JISŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +* +* ƒGƒXƒP[ƒvƒR[ƒh‚́AŽŸ‚Ì‚à‚̂ɑΉž‚µ‚Ä‚¢‚é +* Š¿ŽšŠJŽn $B $@ +* ”¼ŠpƒJƒiŠJŽn (I +* Š¿ŽšI—¹ (B (J (H +*----------------------------------------------------------------------------*/ + +int ConvJIStoSJIS(CODECONVINFO *cInfo) +{ + int Kcode; + char *Str; + char *Put; + char *Limit; + int Continue; + + cInfo->KanaProc = &ConvJIStoSJISkanaProc; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 3; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if(cInfo->EscProc == 0) + { + if(*Str == 0x1B) + { + if(cInfo->KanjiFst != 0) + { + *Put++ = cInfo->KanjiFst; + cInfo->KanjiFst = 0; + } + Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); + + cInfo->EscCode[cInfo->EscProc] = *Str++; + cInfo->EscProc++; + } + else + { + if(cInfo->KanjiMode == CONV_KANA) + { + if(cInfo->KanjiFst != 0) + { + *Put++ = cInfo->KanjiFst; + cInfo->KanjiFst = 0; + } + + if((*Str >= 0x21) && (*Str <= 0x5F)) + { + Put = ConvJIStoSJISkanaProc(cInfo, *Str++, Put); + } + else + { + Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); + *Put++ = *Str++; + } + } + else if(cInfo->KanjiMode == CONV_KANJI) + { + Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); + if((*Str >= 0x21) && (*Str <= 0x7E)) + { + if(cInfo->KanjiFst == 0) + cInfo->KanjiFst = *Str++; + else + { + Kcode = _mbcjistojms((cInfo->KanjiFst * 0x100) + *Str++); + *Put++ = HIGH8(Kcode); + *Put++ = LOW8(Kcode); + cInfo->KanjiFst = 0; + } + } + else + { + if(cInfo->KanjiFst == 0) + *Put++ = *Str++; + else + { + *Put++ = cInfo->KanjiFst; + *Put++ = *Str++; + cInfo->KanjiFst = 0; + } + } + } + else + { + Put = ConvJIStoSJISkanaProc(cInfo, 0, Put); + *Put++ = *Str++; + } + } + } + else if(cInfo->EscProc == 1) + { + if((*Str == '$') || (*Str == '(')) + { + cInfo->EscCode[cInfo->EscProc] = *Str++; + cInfo->EscProc++; + } + else + { + *Put++ = cInfo->EscCode[0]; + *Put++ = *Str++; + cInfo->EscProc = 0; + } + } + else if(cInfo->EscProc == 2) + { + if((cInfo->EscCode[1] == '$') && ((*Str == 'B') || (*Str == '@'))) + cInfo->KanjiMode = CONV_KANJI; + else if((cInfo->EscCode[1] == '(') && (*Str == 'I')) + cInfo->KanjiMode = CONV_KANA; + else if((cInfo->EscCode[1] == '(') && ((*Str == 'B') || (*Str == 'J') || (*Str == 'H'))) + cInfo->KanjiMode = CONV_ASCII; + else + { + *Put++ = cInfo->EscCode[0]; + *Put++ = cInfo->EscCode[1]; + if((cInfo->KanjiMode == CONV_KANJI) && ((*Str >= 0x21) && (*Str <= 0x7E))) + cInfo->KanjiFst = *Str; + else + *Put++ = *Str; + } + Str++; + cInfo->EscProc = 0; + } + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- JIS-->SHIFT-JISŠ¿ŽšƒR[ƒh‚É•ÏŠ·‚Ì”¼ŠpƒJƒ^ƒJƒi‚̏ˆ— ------------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* char Dt : •¶Žš +* char *Put : ƒf[ƒ^ƒZƒbƒgˆÊ’u +* +* Return Value +* char *ŽŸ‚̃f[ƒ^ƒZƒbƒgˆÊ’u +*----------------------------------------------------------------------------*/ + +static char *ConvJIStoSJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put) +{ + int Kcode; + int Daku; + + Dt = (uchar)Dt + (uchar)0x80; + if(cInfo->KanaCnv == NO) + { + if((uchar)Dt != (uchar)0x80) + *Put++ = Dt; + } + else + { + if(cInfo->KanaPrev != 0) + { + Daku = AskDakuon(cInfo->KanaPrev, Dt); + Kcode = _mbcjistojms(HanKataToZen(cInfo->KanaPrev)) + Daku; + *Put++ = HIGH8(Kcode); + *Put++ = LOW8(Kcode); + + if((Daku == 0) && ((uchar)Dt != (uchar)0x80)) + cInfo->KanaPrev = Dt; + else + cInfo->KanaPrev = 0; + } + else if((uchar)Dt != (uchar)0x80) + cInfo->KanaPrev = Dt; + } + return(Put); +} + + +/*----- Samba-HEX/Samba-CAPŠ¿ŽšƒR[ƒh‚ðSHIFT-JISŠ¿ŽšƒR[ƒh‚É•ÏŠ· -------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +* •ªŠ„‚³‚ꂽ“ü—Í•¶Žš—ñ‚Ì•ÏŠ·‚̓Tƒ|[ƒg‚µ‚Ä‚¢‚È‚¢ +* ”¼ŠpƒJƒ^ƒJƒi‚Ì•ÏŠ·Ý’è‚ɂ͑Ήž‚µ‚Ä‚¢‚È‚¢ +*----------------------------------------------------------------------------*/ + +int ConvSMBtoSJIS(CODECONVINFO *cInfo) +{ + char *Str; + char *Put; + char *Limit; + int Continue; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 2; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if((*Str == SAMBA_HEX_TAG) && (cInfo->StrLen >= 3)) + { + if(isxdigit(*(Str+1)) && isxdigit(*(Str+2))) + { + *Put++ = N2INT(hex2bin(*(Str+1)), hex2bin(*(Str+2))); + Str += 3; + cInfo->StrLen -= 2; + } + else + *Put++ = *Str++; + } + else + *Put++ = *Str++; + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- SHIFT-JISŠ¿ŽšƒR[ƒh‚ðEUCŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +*----------------------------------------------------------------------------*/ + +int ConvSJIStoEUC(CODECONVINFO *cInfo) +{ + int Kcode; + char *Str; + char *Put; + char *Limit; + int Continue; + + cInfo->KanaProc = &ConvSJIStoEUCkanaProc; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 2; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if(cInfo->KanjiFst == 0) + { + if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) || + ((uchar)*Str >= (uchar)0xE0)) + { + Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put); + cInfo->KanjiFst = *Str++; + } + else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF)) + { + Put = ConvSJIStoEUCkanaProc(cInfo, *Str++, Put); + } + else + { + Put = ConvSJIStoEUCkanaProc(cInfo, 0, Put); + *Put++ = *Str++; + } + } + else + { + if((uchar)*Str >= (uchar)0x40) + { + Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++); + Kcode = _mbcjmstojis(Kcode); + *Put++ = HIGH8(Kcode) | 0x80; + *Put++ = LOW8(Kcode) | 0x80; + } + else + { + *Put++ = cInfo->KanjiFst; + *Put++ = *Str++; + } + cInfo->KanjiFst = 0; + } + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- SHIFT-JIS-->EUCŠ¿ŽšƒR[ƒh‚É•ÏŠ·‚Ì”¼ŠpƒJƒ^ƒJƒi‚̏ˆ— ------------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* char Dt : •¶Žš +* char *Put : ƒf[ƒ^ƒZƒbƒgˆÊ’u +* +* Return Value +* char *ŽŸ‚̃f[ƒ^ƒZƒbƒgˆÊ’u +*----------------------------------------------------------------------------*/ + +static char *ConvSJIStoEUCkanaProc(CODECONVINFO *cInfo, char Dt, char *Put) +{ + int Kcode; + int Daku; + + if(cInfo->KanaCnv == NO) + { + if(Dt != 0) + { + Kcode = 0x8E00 + (uchar)Dt; + *Put++ = HIGH8(Kcode) | 0x80; + *Put++ = LOW8(Kcode) | 0x80; + } + } + else + { + if(cInfo->KanaPrev != 0) + { + Daku = AskDakuon(cInfo->KanaPrev, Dt); + Kcode = HanKataToZen(cInfo->KanaPrev) + Daku; + *Put++ = HIGH8(Kcode) | 0x80; + *Put++ = LOW8(Kcode) | 0x80; + + if(Daku == 0) + cInfo->KanaPrev = Dt; + else + cInfo->KanaPrev = 0; + } + else + cInfo->KanaPrev = Dt; + } + return(Put); +} + + +/*----- SHIFT-JISŠ¿ŽšƒR[ƒh‚ðJISŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +* +* ƒGƒXƒP[ƒvƒR[ƒh‚́AŽŸ‚Ì‚à‚Ì‚ðŽg—p‚·‚é +* Š¿ŽšŠJŽn $B +* ”¼ŠpƒJƒiŠJŽn (I +* Š¿ŽšI—¹ (B +*----------------------------------------------------------------------------*/ + +int ConvSJIStoJIS(CODECONVINFO *cInfo) +{ + int Kcode; + char *Str; + char *Put; + char *Limit; + int Continue; + + cInfo->KanaProc = &ConvSJIStoJISkanaProc; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 5; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if(cInfo->KanjiFst == 0) + { + if((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) || + ((uchar)*Str >= (uchar)0xE0)) + { + Put = ConvSJIStoJISkanaProc(cInfo, 0, Put); + cInfo->KanjiFst = *Str++; + } + else if(((uchar)*Str >= (uchar)0xA0) && ((uchar)*Str <= (uchar)0xDF)) + { + Put = ConvSJIStoJISkanaProc(cInfo, *Str++, Put); + } + else + { + Put = ConvSJIStoJISkanaProc(cInfo, 0, Put); + if(cInfo->KanjiMode != CONV_ASCII) + { + *Put++ = 0x1B; + *Put++ = '('; + *Put++ = 'B'; + cInfo->KanjiMode = CONV_ASCII; + } + *Put++ = *Str++; + } + } + else + { + Put = ConvSJIStoJISkanaProc(cInfo, 0, Put); + if((uchar)*Str >= (uchar)0x40) + { + if(cInfo->KanjiMode != CONV_KANJI) + { + *Put++ = 0x1B; + *Put++ = '$'; + *Put++ = 'B'; + cInfo->KanjiMode = CONV_KANJI; + } + + Kcode = ConvertIBMExtendedChar(((uchar)cInfo->KanjiFst * 0x100) + (uchar)*Str++); + Kcode = _mbcjmstojis(Kcode); + *Put++ = HIGH8(Kcode); + *Put++ = LOW8(Kcode); + } + else + { + if(cInfo->KanjiMode != CONV_ASCII) + { + *Put++ = 0x1B; + *Put++ = '('; + *Put++ = 'B'; + cInfo->KanjiMode = CONV_ASCII; + } + *Put++ = cInfo->KanjiFst; + *Put++ = *Str++; + } + cInfo->KanjiFst = 0; + } + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- SHIFT-JIS-->JISŠ¿ŽšƒR[ƒh‚É•ÏŠ·‚Ì”¼ŠpƒJƒ^ƒJƒi‚̏ˆ— ------------------- +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* char Dt : •¶Žš +* char *Put : ƒf[ƒ^ƒZƒbƒgˆÊ’u +* +* Return Value +* char *ŽŸ‚̃f[ƒ^ƒZƒbƒgˆÊ’u +*----------------------------------------------------------------------------*/ + +static char *ConvSJIStoJISkanaProc(CODECONVINFO *cInfo, char Dt, char *Put) +{ + int Kcode; + int Daku; + + if(cInfo->KanaCnv == NO) + { + if(Dt != 0) + { + if(cInfo->KanjiMode != CONV_KANA) + { + *Put++ = 0x1B; + *Put++ = '('; + *Put++ = 'I'; + cInfo->KanjiMode = CONV_KANA; + } + *Put++ = (uchar)Dt - (uchar)0x80; + } + } + else + { + if(cInfo->KanaPrev != 0) + { + if(cInfo->KanjiMode != CONV_KANJI) + { + *Put++ = 0x1B; + *Put++ = '$'; + *Put++ = 'B'; + cInfo->KanjiMode = CONV_KANJI; + } + Daku = AskDakuon(cInfo->KanaPrev, Dt); + Kcode = HanKataToZen(cInfo->KanaPrev) + Daku; + *Put++ = HIGH8(Kcode); + *Put++ = LOW8(Kcode); + + if(Daku == 0) + cInfo->KanaPrev = Dt; + else + cInfo->KanaPrev = 0; + } + else + cInfo->KanaPrev = Dt; + } + return(Put); +} + + +/*----- SHIFT-JISŠ¿ŽšƒR[ƒh‚ðSamba-HEXŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +* •ªŠ„‚³‚ꂽ“ü—Í•¶Žš—ñ‚Ì•ÏŠ·‚̓Tƒ|[ƒg‚µ‚Ä‚¢‚È‚¢ +* ”¼ŠpƒJƒ^ƒJƒi‚Ì•ÏŠ·Ý’è‚ɂ͑Ήž‚µ‚Ä‚¢‚È‚¢ +*----------------------------------------------------------------------------*/ + +int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo) +{ + char *Str; + char *Put; + char *Limit; + int Continue; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 6; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if((cInfo->StrLen >= 2) && + ((((uchar)*Str >= (uchar)0x81) && ((uchar)*Str <= (uchar)0x9F)) || + ((uchar)*Str >= (uchar)0xE0))) + { + sprintf(Put, "%c%02x%c%02x", SAMBA_HEX_TAG, (uchar)*Str, SAMBA_HEX_TAG, (uchar)*(Str+1)); + Str += 2; + Put += 6; + cInfo->StrLen--; + } + else if((uchar)*Str >= (uchar)0x80) + { + sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++); + Put += 3; + } + else + *Put++ = *Str++; + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- SHIFT-JISŠ¿ŽšƒR[ƒh‚ðSamba-CAPŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +* •ªŠ„‚³‚ꂽ“ü—Í•¶Žš—ñ‚Ì•ÏŠ·‚̓Tƒ|[ƒg‚µ‚Ä‚¢‚È‚¢ +*----------------------------------------------------------------------------*/ + +int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo) +{ + char *Str; + char *Put; + char *Limit; + int Continue; + + Continue = NO; + Str = cInfo->Str; + Put = cInfo->Buf; + Limit = cInfo->Buf + cInfo->BufSize - 6; + + for(; cInfo->StrLen > 0; cInfo->StrLen--) + { + if(Put >= Limit) + { + Continue = YES; + break; + } + + if((uchar)*Str >= (uchar)0x80) + { + sprintf(Put, "%c%02x", SAMBA_HEX_TAG, (uchar)*Str++); + Put += 3; + } + else + *Put++ = *Str++; + } + + cInfo->Str = Str; + cInfo->OutLen = Put - cInfo->Buf; + + return(Continue); +} + + +/*----- ‚PƒoƒCƒgƒJƒ^ƒJƒi‚ðJISŠ¿ŽšƒR[ƒh‚É•ÏŠ· --------------------------------- +* +* Parameter +* char Ch : ‚PƒoƒCƒgƒJƒ^ƒJƒiƒR[ƒh +* +* Return Value +* int JISŠ¿ŽšƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int HanKataToZen(char Ch) +{ + static const int Katakana[] = { + 0x2121, 0x2123, 0x2156, 0x2157, 0x2122, 0x2126, 0x2572, 0x2521, + 0x2523, 0x2525, 0x2527, 0x2529, 0x2563, 0x2565, 0x2567, 0x2543, + 0x213C, 0x2522, 0x2524, 0x2526, 0x2528, 0x252A, 0x252B, 0x252D, + 0x252F, 0x2531, 0x2533, 0x2535, 0x2537, 0x2539, 0x253B, 0x253D, + 0x253F, 0x2541, 0x2544, 0x2546, 0x2548, 0x254A, 0x254B, 0x254C, + 0x254D, 0x254E, 0x254F, 0x2552, 0x2555, 0x2558, 0x255B, 0x255E, + 0x255F, 0x2560, 0x2561, 0x2562, 0x2564, 0x2566, 0x2568, 0x2569, + 0x256A, 0x256B, 0x256C, 0x256D, 0x256F, 0x2573, 0x212B, 0x212C + }; + + return(Katakana[(uchar)Ch - (uchar)0xA0]); +} + + +/*----- ‘÷‰¹^”¼‘÷‰¹‚ɂȂ镶Žš‚©ƒ`ƒFƒbƒN -------------------------------------- +* +* Parameter +* char Ch : ‚PƒoƒCƒgƒJƒ^ƒJƒiƒR[ƒh +* char Daku : ‘÷“_^”¼‘÷“_ +* +* Return Value +* int •¶ŽšƒR[ƒh‚ɉÁ‚¦‚é’l (0=‘÷‰¹^”¼‘÷‰¹‚É‚È‚ç‚È‚¢) +*----------------------------------------------------------------------------*/ + +static int AskDakuon(char Ch, char Daku) +{ + int Ret; + + Ret = 0; + if((uchar)Daku == (uchar)0xDE) + { + if((((uchar)Ch >= (uchar)0xB6) && ((uchar)Ch <= (uchar)0xC4)) || + (((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE))) + { + Ret = 1; + } + } + else if((uchar)Daku == (uchar)0xDF) + { + if(((uchar)Ch >= (uchar)0xCA) && ((uchar)Ch <= (uchar)0xCE)) + { + Ret = 2; + } + } + return(Ret); +} + + + + + + + + + + + + +/*----- •¶Žš—ñ‚ÌŠ¿ŽšƒR[ƒh‚𒲂ׁAShift-JIS‚É•ÏŠ· ----------------------------- +* +* Parameter +* char *Text : •¶Žš—ñ +* int Pref : SJIS/EUC‚Ì—DæŽw’è +– KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC‚̃`ƒFƒbƒN‚Í‚µ‚È‚¢ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ConvAutoToSJIS(char *Text, int Pref) +{ + int Code; + char *Buf; + CODECONVINFO cInfo; + + Code = CheckKanjiCode(Text, strlen(Text), Pref); + if(Code != KANJI_SJIS) + { + Buf = malloc(strlen(Text)+1); + if(Buf != NULL) + { + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = NO; + cInfo.Str = Text; + cInfo.StrLen = strlen(Text); + cInfo.Buf = Buf; + cInfo.BufSize = strlen(Text); + + switch(Code) + { + case KANJI_JIS : + ConvJIStoSJIS(&cInfo); + break; + + case KANJI_EUC : + ConvEUCtoSJIS(&cInfo); + break; + } + + *(Buf + cInfo.OutLen) = NUL; + strcpy(Text, Buf); + free(Buf); + } + } + return; +} + + +/*----- Žg‚í‚ê‚Ä‚¢‚銿ŽšƒR[ƒh‚𒲂ׂé ---------------------------------------- +* +* Parameter +* char *Text : •¶Žš—ñ +* int Size : •¶Žš—ñ‚Ì’·‚³ +* int Pref : SJIS/EUC‚Ì—DæŽw’è +– KANJI_SJIS / KANJI_EUC / KANJI_NOCNV=SJIS/EUC‚̃`ƒFƒbƒN‚Í‚µ‚È‚¢ +* +* Return Value +* int Š¿ŽšƒR[ƒh (KANJI_xxx) +*----------------------------------------------------------------------------*/ + +int CheckKanjiCode(char *Text, int Size, int Pref) +{ + uchar *Pos; + uchar *Btm; + int Ret; + int PointSJIS; + int PointEUC; + + Ret = KANJI_SJIS; + if(Size >= 2) + { + Ret = -1; + Btm = Text + Size; + + /* JISŠ¿ŽšƒR[ƒh‚̃`ƒFƒbƒN */ + Pos = Text; + while((Pos = memchr(Pos, 0x1b, Btm-Pos-2)) != NULL) + { + Pos++; + if((memcmp(Pos, "$B", 2) == 0) || /* $B */ + (memcmp(Pos, "$@", 2) == 0) || /* $@ */ + (memcmp(Pos, "(I", 2) == 0)) /* (I */ + { + Ret = KANJI_JIS; + break; + } + } + + /* EUC‚ÆSHIFT-JISŠ¿ŽšƒR[ƒh‚̃`ƒFƒbƒN */ + if(Ret == -1) + { + if(Pref != KANJI_NOCNV) + { + Ret = Pref; + Pos = Text; + while(Pos < Btm) + { + PointSJIS = CheckOnSJIS(Pos, Btm); + PointEUC = CheckOnEUC(Pos, Btm); + if(PointSJIS > PointEUC) + { + Ret = KANJI_SJIS; + break; + } + if(PointSJIS < PointEUC) + { + Ret = KANJI_EUC; + break; + } + if((Pos = memchr(Pos, '\n', Btm-Pos)) == NULL) + break; + Pos++; + } + } + else + Ret = KANJI_SJIS; + } + } + return(Ret); +} + + +/*----- SHIFT-JISƒR[ƒh‚̉”\«‚ª‚ ‚é‚©ƒ`ƒFƒbƒN -------------------------------- +* +* Parameter +* uchar *Pos : •¶Žš—ñ +* uchar *Btm : •¶Žš—ñ‚Ì––”ö +* +* Return Value +* int “¾“_ +* +* Note +* High 81-FF (A0-DF‚Í”¼Šp) (EBˆÈ~‚Í‚Ù‚Æ‚ñ‚Ç–³‚¢) +* Low 40-FC +*----------------------------------------------------------------------------*/ + +static int CheckOnSJIS(uchar *Pos, uchar *Btm) +{ + int FstOnTwo; + int Point; + + FstOnTwo = NO; + Point = 100; + while((Point > 0) && (Pos < Btm) && (*Pos != '\n')) + { + if(FstOnTwo == YES) + { + if((*Pos < 0x40) || (*Pos > 0xFC)) /* 2ƒoƒCƒg–Ú‚Í 0x40`0xFC */ + Point = 0; + FstOnTwo = NO; + } + else if(*Pos >= 0x81) + { + if((*Pos < 0xA0) || (*Pos > 0xDF)) /* ”¼ŠpƒJƒi‚Å‚È‚¯‚ê‚Î */ + { + if(*Pos >= 0xEB) /* 1ƒoƒCƒg–Ú‚Í0xEBˆÈ~‚Í‚Ù‚Æ‚ñ‚Ç–³‚¢ */ + Point -= 50; + FstOnTwo = YES; + } + } + Pos++; + } + if(FstOnTwo == YES) /* ‚PƒoƒCƒg–ڂŏI‚í‚Á‚Ä‚¢‚é‚Ì‚Í‚¨‚©‚µ‚¢ */ + Point = 0; + + return(Point); +} + + +/*----- EUCƒR[ƒh‚̉”\«‚ª‚ ‚é‚©ƒ`ƒFƒbƒN ------------------------------------- +* +* Parameter +* uchar *Pos : •¶Žš—ñ +* uchar *Btm : •¶Žš—ñ‚Ì––”ö +* +* Return Value +* int “¾“_ +* +* Note +* High A1-FE , 8E +* Low A1-FE +*----------------------------------------------------------------------------*/ + +static int CheckOnEUC(uchar *Pos, uchar *Btm) +{ + int FstOnTwo; + int Point; + + FstOnTwo = 0; + Point = 100; + while((Point > 0) && (Pos < Btm) && (*Pos != '\n')) + { + if(FstOnTwo == 1) + { + if((*Pos < 0xA1) || (*Pos > 0xFE)) /* 2ƒoƒCƒg–Ú‚Í 0xA1`0xFE */ + Point = 0; + FstOnTwo = 0; + } + else if(FstOnTwo == 2) /* ”¼ŠpƒJƒi */ + { + if((*Pos < 0xA0) || (*Pos > 0xDF)) /* 2ƒoƒCƒg–Ú‚Í 0xA0`0xDF */ + Point = 0; + FstOnTwo = 0; + } + else + { + if(*Pos == 0x8E) /* 0x8E??‚Í”¼ŠpƒJƒi */ + FstOnTwo = 2; + else if((*Pos >= 0xA1) && (*Pos <= 0xFE)) + FstOnTwo = 1; + } + Pos++; + } + if(FstOnTwo != 0) /* ‚PƒoƒCƒg–ڂŏI‚í‚Á‚Ä‚¢‚é‚Ì‚Í‚¨‚©‚µ‚¢ */ + Point = 0; + + return(Point); +} + + +// UTF-8N‘Ήž ‚±‚±‚©‚火 +/*----- UTF-8NŠ¿ŽšƒR[ƒh‚ðSHIFT-JISŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +*----------------------------------------------------------------------------*/ + +int ConvUTF8NtoSJIS(CODECONVINFO *cInfo) +{ + int Continue; + + char temp_string[2048]; + int string_length; + + Continue = NO; + + // ¶¬‚³‚ê‚é’†ŠÔƒR[ƒh‚̃TƒCƒY‚𒲂ׂé + string_length = MultiByteToWideChar( + CP_UTF8, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + cInfo->Str, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + NULL, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ + 0 // Ši”[æƒTƒCƒY + ); + + // ƒTƒCƒY0 or ƒoƒbƒtƒ@ƒTƒCƒY‚æ‚è‘å‚«‚¢ê‡‚Í + // cInfo->Buf‚̍ŏ‰‚É'\0'‚ð“ü‚ê‚āA + // cInfo->BufSize‚É0‚ð“ü‚ê‚Ä•Ô‚·B + if( string_length == 0 || + string_length >= 1024 ){ + *(cInfo->Buf) = '\0'; + cInfo->BufSize = 0; + return(Continue); + } + + // ’†ŠÔƒR[ƒh(unicode)‚É•ÏŠ· + MultiByteToWideChar( + CP_UTF8, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + cInfo->Str, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + (unsigned short *)temp_string, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ + 1024 // Ši”[æƒTƒCƒY + ); + + // ¶¬‚³‚ê‚éUTF-8ƒR[ƒh‚̃TƒCƒY‚𒲂ׂé + string_length = WideCharToMultiByte( + CP_ACP, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + (unsigned short *)temp_string, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + NULL, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ + 0, // Ši”[æƒTƒCƒY + NULL,NULL + ); + + // ƒTƒCƒY0 or o—̓oƒbƒtƒ@ƒTƒCƒY‚æ‚è‘å‚«‚¢ê‡‚́A + // cInfo->Buf‚̍ŏ‰‚É'\0'‚ð“ü‚ê‚āA + // cInfo->BufSize‚É0‚ð“ü‚ê‚Ä•Ô‚·B + if( string_length == 0 || + string_length >= cInfo->BufSize ){ + *(cInfo->Buf) = '\0'; + cInfo->BufSize = 0; + return(Continue); + } + + // o—̓TƒCƒY‚ðÝ’è + cInfo->OutLen = string_length; + + // UTF-8ƒR[ƒh‚É•ÏŠ· + WideCharToMultiByte( + CP_ACP, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + (unsigned short *)temp_string, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + cInfo->Buf, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ(BOM:3bytes) + cInfo->BufSize, // Ši”[æƒTƒCƒY + NULL,NULL + ); + + return(Continue); +} + +/*----- SHIFT-JISŠ¿ŽšƒR[ƒh‚ðUTF-8NŠ¿ŽšƒR[ƒh‚É•ÏŠ· ------------------------------ +* +* Parameter +* CODECONVINFO *cInfo : Š¿ŽšƒR[ƒh•ÏŠ·î•ñ +* +* Return Value +* int ‚­‚è•Ô‚µƒtƒ‰ƒO (YES/NO) +* +* Note +* ‚­‚è•Ô‚µƒtƒ‰ƒO‚ªYES‚ÌŽž‚́AcInfo‚Ì“à—e‚ð•Ï‚¦‚¸‚É‚à‚¤ˆê“xŒÄ‚Ô‚±‚Æ +*----------------------------------------------------------------------------*/ +int ConvSJIStoUTF8N(CODECONVINFO *cInfo) +{ + int Continue; + + char temp_string[2048]; + int string_length; + + Continue = NO; + + // ¶¬‚³‚ê‚é’†ŠÔƒR[ƒh‚̃TƒCƒY‚𒲂ׂé + string_length = MultiByteToWideChar( + CP_ACP, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + cInfo->Str, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + NULL, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ + 0 // Ši”[æƒTƒCƒY + ); + + // ƒTƒCƒY0 or ƒoƒbƒtƒ@ƒTƒCƒY‚æ‚è‘å‚«‚¢ê‡‚́A + // cInfo->Buf‚̍ŏ‰‚É'\0'‚ð“ü‚ê‚āA + // cInfo->BufSize‚É0‚ð“ü‚ê‚Ä•Ô‚·B + if( string_length == 0 || + string_length >= 1024 ){ + *(cInfo->Buf) = '\0'; + cInfo->BufSize = 0; + return(Continue); + } + + // ’†ŠÔƒR[ƒh(unicode)‚É•ÏŠ· + MultiByteToWideChar( + CP_ACP, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + cInfo->Str, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + (unsigned short *)temp_string, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ + 1024 // Ši”[æƒTƒCƒY + ); + + // ¶¬‚³‚ê‚éUTF-8ƒR[ƒh‚̃TƒCƒY‚𒲂ׂé + string_length = WideCharToMultiByte( + CP_UTF8, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + (unsigned short *)temp_string, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + NULL, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ + 0, // Ši”[æƒTƒCƒY + NULL,NULL + ); + + // ƒTƒCƒY0 or o—̓oƒbƒtƒ@ƒTƒCƒY‚æ‚è‘å‚«‚¢ê‡‚́A + // cInfo->Buf‚̍ŏ‰‚É'\0'‚ð“ü‚ê‚āA + // cInfo->BufSize‚É0‚ð“ü‚ê‚Ä•Ô‚·B + if( string_length == 0 || + string_length >= cInfo->BufSize ){ + *(cInfo->Buf) = '\0'; + cInfo->BufSize = 0; + return(Continue); + } + + // o—̓TƒCƒY‚ðÝ’è + cInfo->OutLen = string_length; + + /* + // «•t‚¯‚¿‚Ⴞ‚ß ƒRƒ}ƒ“ƒh‚É‚à’ljÁ‚³‚ê‚Ä‚µ‚Ü‚¤ + // o—Í•¶Žš—ñ‚̐擪‚ÉBOM(byte order mark)‚ð‚‚¯‚é + *(cInfo->Buf) = (char)0xef; + *(cInfo->Buf+1) = (char)0xbb; + *(cInfo->Buf+2) = (char)0xbf; + */ + + // UTF-8ƒR[ƒh‚É•ÏŠ· + WideCharToMultiByte( + CP_UTF8, // •ÏŠ·æ•¶ŽšƒR[ƒh + 0, // ƒtƒ‰ƒO(0:‚È‚µ) + (unsigned short *)temp_string, // •ÏŠ·Œ³•¶Žš—ñ + -1, // •ÏŠ·Œ³•¶Žš—ñƒoƒCƒg”(-1:Ž©“®) + cInfo->Buf, // •ÏŠ·‚µ‚½•¶Žš—ñ‚ÌŠi”[æ(BOM:3bytes) + cInfo->BufSize, // Ši”[æƒTƒCƒY + NULL,NULL + ); + + return(Continue); +} +// UTF-8N‘Ήž ‚±‚±‚܂Łª + + +/*----- IBMŠg’£Š¿Žš‚ðNEC‘I’èIBMŠg’£Š¿Žš“™‚É•ÏŠ· ------------------------------- +* +* Parameter +* code Š¿ŽšƒR[ƒh +* +* Return Value +* int Š¿ŽšƒR[ƒh +*----------------------------------------------------------------------------*/ +static int ConvertIBMExtendedChar(int code) +{ + if((code >= 0xfa40) && (code <= 0xfa49)) code -= (0xfa40 - 0xeeef); + else if((code >= 0xfa4a) && (code <= 0xfa53)) code -= (0xfa4a - 0x8754); + else if((code >= 0xfa54) && (code <= 0xfa57)) code -= (0xfa54 - 0xeef9); + else if(code == 0xfa58) code = 0x878a; + else if(code == 0xfa59) code = 0x8782; + else if(code == 0xfa5a) code = 0x8784; + else if(code == 0xfa5b) code = 0x879a; + else if((code >= 0xfa5c) && (code <= 0xfa7e)) code -= (0xfa5c - 0xed40); + else if((code >= 0xfa80) && (code <= 0xfa9b)) code -= (0xfa80 - 0xed63); + else if((code >= 0xfa9c) && (code <= 0xfafc)) code -= (0xfa9c - 0xed80); + else if((code >= 0xfb40) && (code <= 0xfb5b)) code -= (0xfb40 - 0xede1); + else if((code >= 0xfb5c) && (code <= 0xfb7e)) code -= (0xfb5c - 0xee40); + else if((code >= 0xfb80) && (code <= 0xfb9b)) code -= (0xfb80 - 0xee63); + else if((code >= 0xfb9c) && (code <= 0xfbfc)) code -= (0xfb9c - 0xee80); + else if((code >= 0xfc40) && (code <= 0xfc4b)) code -= (0xfc40 - 0xeee1); + return code; +} + diff --git a/common.h b/common.h new file mode 100644 index 0000000..bcf3371 --- /dev/null +++ b/common.h @@ -0,0 +1,1619 @@ +/*============================================================================= +* ‚e‚e‚e‚s‚o‹¤’Ê’è‹`ƒtƒ@ƒCƒ‹ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#include "config.h" +#ifndef ENGLISH +#include "mesg-jpn.h" +#else +#include "mesg-eng.h" +#endif + + +#define NUL '\0' + +#define LOW8(x) ((x) & 0xFF) +#define HIGH8(x) (((x) >> 8) & 0xFF) +#define LOW32(x) ((x) & 0xFFFFFFFF) +#define HIGH32(x) (((x) >> 32) & 0xFFFFFFFF) +#define N2INT(h,l) ((int)(((uchar)(h) << 4) + (uchar)(l))) + +#define IsDigit(n) (isascii(n) && isdigit(n)) +#define IsAlpha(n) (isascii(n) && isalpha(n)) + +#define uchar unsigned char +#define ushort unsigned short +#define ulong unsigned long + +#define FAIL 0 +#define SUCCESS 1 + +#define NO 0 +#define YES 1 +#define NO_ALL 2 +#define YES_ALL 3 +#define YES_LIST 4 + +/*===== ƒo[ƒWƒ‡ƒ“ ======*/ + +#define VER_STR "1.97b" +#define VER_NUM 1921 /* Ý’èƒo[ƒWƒ‡ƒ“ */ +#define PROGRAM_VERSION_NUM 1972 /* ƒo[ƒWƒ‡ƒ“ */ + + +#define MYWEB_URL "http://www2.biglobe.ne.jp/~sota/ffftp-qa.html" + + + +/*===== ’ʐMŠÖŒW ======*/ + +#define TCP_PORT 6 + +/*===== ƒEƒCƒ“ƒhƒEƒTƒCƒY ======*/ + +#define TOOLWIN_HEIGHT 28 /* ƒc[ƒ‹ƒo[‚̍‚‚³ */ + +/*===== “ÁŽê‚ȃLƒƒƒbƒVƒ…ƒf[ƒ^”ԍ† =====*/ +/* iƒtƒ@ƒCƒ‹ˆê——Žæ“¾‚ÅŽg—p‚·‚郍[ƒJƒ‹ƒtƒ@ƒCƒ‹–¼ _ffftp.??? ‚̔ԍ†•”•ªj */ + +#define CACHE_FILE_TMP1 999 /* ƒzƒXƒg‚̃tƒ@ƒCƒ‹ƒcƒŠ[Žæ“¾—p */ +#define CACHE_FILE_TMP2 998 /* ƒAƒbƒvƒ[ƒh’†‚̃zƒXƒg‚̃tƒ@ƒCƒ‹ˆê——Žæ“¾—p */ + +/*===== ƒ†[ƒU’è‹`ƒRƒ}ƒ“ƒh =====*/ + +#define WM_CHANGE_COND (WM_USER+1) /* ƒtƒ@ƒCƒ‹ˆê——‚ð•ÏX‚·‚éƒRƒ}ƒ“ƒh */ +#define WM_SET_PACKET (WM_USER+2) /* Œ»ÝŽg—p‚µ‚Ä‚¢‚é“]‘—ƒpƒPƒbƒg‚̃AƒhƒŒƒX‚ð’Ê’m */ +#define WM_SELECT_HOST (WM_USER+3) /* ƒzƒXƒg‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚Å‘I‘ð‚µ‚½ */ +#define WM_DIAL_MSG (WM_USER+4) /* ƒ_ƒCƒAƒ‹’†‚̃Xƒe[ƒ^ƒX’Ê’m */ + +#define WM_ASYNC_SOCKET (WM_USER+5) +#define WM_ASYNC_DBASE (WM_USER+6) + +#define WM_REFRESH_LOCAL_FLG (WM_USER+7) +#define WM_REFRESH_REMOTE_FLG (WM_USER+8) + +/*===== ƒzƒXƒg”ԍ† =====*/ +/* ƒzƒXƒg”ԍ†‚Í 0` ‚Ì’l‚ðŽæ‚é */ + +#define HOSTNUM_NOENTRY (-1) /* ƒzƒXƒgˆê——‚É–³‚¢‚Æ‚«‚̃zƒXƒg”ԍ† */ + +/*===== ƒoƒbƒtƒ@ƒTƒCƒY =====*/ + +#define BUFSIZE 4096 /* ƒtƒ@ƒCƒ‹“]‘—ƒoƒbƒtƒ@‚̃TƒCƒY(4kˆÈã) */ + +#define HOST_NAME_LEN 40 /* ˆê——‚É•\Ž¦‚·‚éƒzƒXƒg‚Ì–¼‘O */ +#define HOST_ADRS_LEN 80 /* ƒzƒXƒg–¼ */ +#define USER_NAME_LEN 80 /* ƒ†[ƒU–¼ */ +#define PASSWORD_LEN 80 /* ƒpƒXƒ[ƒh */ +#define ACCOUNT_LEN 80 /* ƒAƒJƒEƒ“ƒg */ +#define HOST_TYPE_LEN 1 /* ƒzƒXƒg‚ÌŽí—Þ */ +#define INIT_DIR_LEN (FMAX_PATH-40) /* ‰ŠúƒfƒBƒŒƒNƒgƒŠ */ +#define USER_MAIL_LEN 80 /* ƒ†[ƒU‚̃[ƒ‹ƒAƒhƒŒƒX */ + /* PASSWORD_LEN ‚Æ“¯‚¶‚É‚·‚邱‚Æ */ +#define ASCII_EXT_LEN 400 /* ƒAƒXƒL[ƒ‚[ƒh“]‘—‚̃tƒ@ƒCƒ‹–¼—ñ */ +#define FILTER_EXT_LEN 400 /* ƒtƒBƒ‹ƒ^‚̃tƒ@ƒCƒ‹–¼—ñ */ +#define BOOKMARK_SIZE 2048 /* ƒuƒbƒNƒ}[ƒN */ +#define CHMOD_CMD_LEN 40 /* ‘®«•ÏXƒRƒ}ƒ“ƒh */ +#define MIRROR_LEN 400 /* ƒ~ƒ‰[ƒŠƒ“ƒO‚̐ݒè—p */ +#define NLST_NAME_LEN 40 /* NLST‚É•t‚¯‚éƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“ */ +#define DEFATTRLIST_LEN 800 /* ‘®«ƒŠƒXƒg‚Ì’·‚³ */ +#define INITCMD_LEN 256 /* ‰Šú‰»ƒRƒ}ƒ“ƒh */ +#define OWNER_NAME_LEN 40 /* ƒI[ƒi–¼ */ +#define RAS_NAME_LEN 256 /* RAS‚̃Gƒ“ƒgƒŠ–¼‚Ì’·‚³ */ + +#define FMAX_PATH 1024 + +#define ONELINE_BUF_SIZE (10*1024) + +/*===== ‰Šú’l =====*/ + +#define SAMBA_HEX_TAG ':' /* Samba-HEX ‚Ì‹æØ‚蕶Žš */ +#define CHMOD_CMD_NOR "SITE CHMOD" /* ‘®«•ÏXƒRƒ}ƒ“ƒh */ +#define PORT_NOR 21 /* ƒ|[ƒg”ԍ† */ +#define LS_FNAME "-alL" /* NLST‚É•t‚¯‚é‚à‚Ì */ + +/*===== “¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚Á‚½Žž‚̏ˆ— =====*/ + +#define EXIST_OVW 0 /* ã‘‚« */ +#define EXIST_NEW 1 /* V‚µ‚¯‚ê‚Ώ㏑‚« */ +#define EXIST_RESUME 2 /* ƒŒƒWƒ…[ƒ€ */ +#define EXIST_IGNORE 3 /* –³Ž‹ */ +#define EXIST_UNIQUE 4 /* ƒzƒXƒg‚ª–¼‘O‚ð•t‚¯‚é */ +#define EXIST_ABORT 5 /* ‘S‚Ä’†Ž~ */ + +/*===== ƒtƒ@ƒCƒ‹–¼‚Ì”äŠrƒ‚[ƒh =====*/ + +#define COMP_IGNORE 0 /* ‘啶Žš/¬•¶Žš‚Í‹æ•Ê‚µ‚È‚¢ */ +#define COMP_STRICT 1 /* ‘啶Žš/¬•¶Žš‚ð‹æ•Ê‚·‚é */ +#define COMP_LOWERMATCH 2 /* ‘啶Žš/¬•¶Žš‚ð‹æ•Ê‚µ‚È‚¢i•Ð‘¤‚Í‘S‚ﬕ¶Žšj */ + +/*===== FTP‚̉ž“šƒR[ƒh‚Ì“ª‚PŒ… =====*/ + +#define FTP_PRELIM 1 /* */ +#define FTP_COMPLETE 2 /* */ +#define FTP_CONTINUE 3 /* */ +#define FTP_RETRY 4 /* */ +#define FTP_ERROR 5 /* */ + +/*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̃m[ƒh‘®« =====*/ + +#define NODE_DIR 0 /* ƒfƒBƒŒƒNƒgƒŠ */ +#define NODE_FILE 1 /* ƒtƒ@ƒCƒ‹ */ +#define NODE_DRIVE 2 /* ƒhƒ‰ƒCƒu */ +#define NODE_NONE (-1) /* ‚È‚µ */ + +/*===== ã‘‚«Šm”F•û–@‚̐ݒè’l =====*/ + +#define TRANS_OVW 0 /* ã‘‚« */ +#define TRANS_DLG 1 /* ƒ_ƒCƒAƒƒO‚ðo‚· */ + +/*===== ƒzƒXƒg“àƒtƒ@ƒCƒ‹ˆÚ“®Šm”F•û–@‚̐ݒè’l =====*/ + +#define MOVE_NODLG 0 /* ƒ_ƒCƒAƒƒO‚ðo‚³‚È‚¢ */ +#define MOVE_DLG 1 /* ƒ_ƒCƒAƒƒO‚ðo‚· */ +#define MOVE_DISABLE 2 /* ‹@”\Žg—p‹ÖŽ~ */ + +/*===== “]‘—•û–@ =====*/ + +#define TYPE_I 'I' /* ƒoƒCƒiƒŠƒ‚[ƒh */ +#define TYPE_A 'A' /* ƒAƒXƒL[ƒ‚[ƒh */ +#define TYPE_X 'X' /* Ž©“®”»•Ê */ + +#define TYPE_DEFAULT NUL /* Ý’肵‚È‚¢ DirectConnectProc()‚̈ø”‚Æ‚µ‚Ä—LŒø */ + +/*===== ƒ\[ƒg•û–@ =====*/ +/* ”ԍ†‚ÍListView‚̃Jƒ‰ƒ€”ԍ†‚ƍ‡‚킹‚Ä‚ ‚é */ + +#define SORT_NAME 0 /* –¼‘O‡ */ +#define SORT_DATE 1 /* “ú•t‡ */ +#define SORT_SIZE 2 /* ƒTƒCƒY‡ */ +#define SORT_EXT 3 /* Šg’£Žq‡ */ + +#define SORT_ASCENT 0x00 /* ¸‡ */ +#define SORT_DESCENT 0x80 /* ~‡ */ + +#define SORT_MASK_ORD 0x7F /* ‚˜‚˜‡‚ðŽæ‚èo‚·ƒ}ƒXƒN */ +#define SORT_GET_ORD 0x80 /* ¸‡^~‡‚ðŽæ‚èo‚·ƒ}ƒXƒN */ + +#define SORT_NOTSAVED ((ulong)0xFFFFFFFF) /* ƒzƒXƒg–ˆ‚̃Z[ƒu•û–@‚ð•Û‘¶‚µ‚Ä‚¢‚È‚¢Žž‚Ì’l */ + +/*===== ƒ\[ƒg‚·‚éêŠ =====*/ + +#define ITEM_LFILE 0 /* ƒ[ƒJƒ‹‚Ì–¼‘O */ +#define ITEM_LDIR 1 /* ƒ[ƒJƒ‹‚̃fƒBƒŒƒNƒgƒŠ */ +#define ITEM_RFILE 2 /* ƒzƒXƒg‚Ì–¼‘O */ +#define ITEM_RDIR 3 /* ƒzƒXƒg‚̃fƒBƒŒƒNƒgƒŠ */ + +/*===== ƒEƒCƒ“ƒhƒE”ԍ† =====*/ + +#define WIN_LOCAL 0 /* ƒ[ƒJƒ‹ */ +#define WIN_REMOTE 1 /* ƒzƒXƒg */ +#define WIN_BOTH 2 /* —¼•û */ + +/*===== ƒtƒ@ƒCƒ‹‘I‘ð•û–@ =====*/ + +#define SELECT_ALL 0 /* ‘S‘I‘ð */ +#define SELECT_REGEXP 1 /* ŒŸõŽ®‚ð“ü—Í‚µ‚Ä‘I‘ð */ + +/*===== ŒŸõ•û–@ =====*/ + +#define FIND_FIRST 0 /* Å‰‚ÌŒŸõ */ +#define FIND_NEXT 1 /* ŽŸ‚ðŒŸõ */ + +/*===== ƒtƒ@ƒCƒ‹–¼‚̑啶Žš^¬•¶Žš•ÏŠ· =====*/ + +#define FNAME_NOCNV 0 /* •ÏŠ·‚µ‚È‚¢ */ +#define FNAME_LOWER 1 /* ¬•¶Žš‚É•ÏŠ· */ +#define FNAME_UPPER 2 /* ‘啶Žš‚É•ÏŠ· */ + +/*===== ƒtƒ@ƒCƒ‹ˆê——‚ÌŒ`Ž® =====*/ + +#define LIST_UNKNOWN (-1) /* •s–¾ */ + +#define LIST_UNIX_10 0 /* UNIX 10 */ +#define LIST_UNIX_11 1 /* UNIX 11 */ +#define LIST_UNIX_12 2 /* UNIX 12 */ +#define LIST_UNIX_13 3 /* UNIX 13 */ +#define LIST_UNIX_14 4 /* UNIX 14 */ +#define LIST_UNIX_15 5 /* UNIX 15 */ +#define LIST_UNIX_20 6 /* UNIX 20 */ +#define LIST_UNIX_21 7 /* UNIX 21 */ +#define LIST_UNIX_22 8 /* UNIX 22 */ +#define LIST_UNIX_23 9 /* UNIX 23 */ +#define LIST_UNIX_24 10 /* UNIX 24 */ +#define LIST_UNIX_25 11 /* UNIX 25 */ +#define LIST_UNIX_50 12 /* UNIX 50 */ +#define LIST_UNIX_51 13 /* UNIX 51 */ +#define LIST_UNIX_54 14 /* UNIX 54 */ +#define LIST_UNIX_60 15 /* UNIX 60 */ +#define LIST_UNIX_61 16 /* UNIX 61 */ +#define LIST_UNIX_62 17 /* UNIX 62 */ +#define LIST_UNIX_63 18 /* UNIX 63 */ +#define LIST_UNIX_64 19 /* UNIX 64 */ +#define LIST_UNIX_65 20 /* UNIX 65 */ +#define LIST_DOS_1 21 /* MS-DOS 1 */ +#define LIST_DOS_2 22 /* MS-DOS 2 */ +#define LIST_DOS_3 23 /* MS-DOS 3 */ +#define LIST_DOS_4 24 /* MS-DOS 4 */ +#define LIST_ACOS 25 /* ACOS */ +#define LIST_AS400 26 /* AS/400 */ +#define LIST_M1800 27 /* Fujitu M1800 (OS IV/MSP E20) */ +#define LIST_CHAMELEON 28 /* Win3.1—p Chameleon FTP server */ +#define LIST_GP6000 29 /* Fujitu GP6000 Model 900 */ +#define LIST_OS2 30 /* OS/2 */ +#define LIST_VMS 31 /* VAX VMS */ +#define LIST_OS7_1 32 /* Toshiba OS7 */ +#define LIST_OS7_2 33 /* Toshiba OS7 */ +#define LIST_IRMX 34 /* IRMX */ +#define LIST_ACOS_4 35 /* ACOS-4 */ +#define LIST_STRATUS 36 /* Stratus */ +#define LIST_ALLIED 37 /* allied telesis (DOS) */ +#define LIST_OS9 38 /* OS/9 */ +#define LIST_IBM 39 /* IBM host */ +#define LIST_AGILENT 40 /* Agilent logic analyzer */ +#define LIST_SHIBASOKU 41 /* Shibasoku LSI test system */ +#define LIST_UNIX_70 42 /* UNIX 70 */ +#define LIST_UNIX_71 43 /* UNIX 71 */ +#define LIST_UNIX_72 44 /* UNIX 72 */ +#define LIST_UNIX_73 45 /* UNIX 73 */ +#define LIST_UNIX_74 46 /* UNIX 74 */ +#define LIST_UNIX_75 47 /* UNIX 75 */ + +#define LIST_MELCOM 0x100 /* MELCOM80 */ + +#define LIST_MASKFLG 0xFF + +/* ƒtƒ@ƒCƒ‹ˆê——î•ñ—á --------------- + +*LIST_UNIX_10 + 0 1 2 3 4 5 6 7 8 + ------------------------------------------------------- + drwxr-xr-x 15 owner group 1024 Nov 6 14:21 Linux/ + -rwxrwx--- 5 owner group 12 Nov 6 1996 test.txt + drwxr-xr-x 15 owner group 1024 11ŒŽ 6“ú 14:21 Linux/ + drwxr-xr-x 15 owner group 1024 11ŒŽ 6“ú 14Žž21•ª Linux/ + -rwxrwx--- 5 owner group 12 11ŒŽ 6“ú 1996”N test.txt + drwxrwxr-x 6 root sys 512 1ŒŽ 26 03:10 adm (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + +*LIST_UNIX_11 + 0 1 2 3 4 5 6 7 + ------------------------------------------------------- + drwxr-xr-x 15 owner group 1024 11ŒŽ12“ú 14Žž21•ª Linux/ + -rwxrwx--- 5 owner group 12 11ŒŽ12“ú 1996”N test.txt + +*LIST_UNIX_12 + 0 1 2 3 4 5 6 7 + ------------------------------------------------------- + drwxr-xr-x123 owner group 1024 Nov 6 14:21 Linux/ + -rwxrwx---132 owner group 12 Nov 6 1996 test.txt + drwxr-xr-x123 owner group 1024 11ŒŽ 6“ú 14:21 Linux/ + drwxr-xr-x123 owner group 1024 11ŒŽ 6“ú 14Žž21•ª Linux/ + -rwxrwx---132 owner group 12 11ŒŽ 6“ú 1996”N test.txt + +*LIST_UNIX_13 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x123 owner group 1024 11ŒŽ12“ú 14Žž21•ª Linux/ + -rwxrwx---132 owner group 12 11ŒŽ12“ú 1996”N test.txt + +*LIST_UNIX_14 + 0 1 2 3 4 5 6 7 8 + ------------------------------------------------------- + drwxr-xr-x 15 owner group 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + +*LIST_UNIX_15 + 0 1 2 3 4 5 6 7 + ------------------------------------------------------- + drwxr-xr-x15 owner group 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + + + + + +*LIST_UNIX_20 + 0 1 2 3 4 5 6 7 + ------------------------------------------------------- + drwxr-xr-x 15 owner 1024 Nov 6 14:21 Linux/ + -rwxrwx--- 5 owner 12 Nov 6 1996 test.txt + drwxr-xr-x 15 owner 1024 11ŒŽ 6“ú 14:21 Linux/ + drwxr-xr-x 15 owner 1024 11ŒŽ 6“ú 14Žž21•ª Linux/ + -rwxrwx--- 5 owner 12 11ŒŽ 6“ú 1996”N test.txt + +*LIST_UNIX_21 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x 15 owner 1024 11ŒŽ12“ú 14Žž21•ª Linux/ + -rwxrwx--- 5 owner 12 11ŒŽ12“ú 1996”N test.txt + +*LIST_UNIX_22 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x123 owner 1024 Nov 6 14:21 Linux/ + -rwxrwx---132 owner 12 Nov 6 1996 test.txt + drwxr-xr-x123 owner 1024 11ŒŽ 6“ú 14:21 Linux/ + drwxr-xr-x123 owner 1024 11ŒŽ 6“ú 14Žž21•ª Linux/ + -rwxrwx---132 owner 12 11ŒŽ 6“ú 1996”N test.txt + +*LIST_UNIX_23 + 0 1 2 3 4 5 + ------------------------------------------------------- + drwxr-xr-x123 owner 1024 11ŒŽ12“ú 14Žž21•ª Linux/ + -rwxrwx---132 owner 12 11ŒŽ12“ú 1996”N test.txt + +*LIST_UNIX_24 + 0 1 2 3 4 5 6 7 + ------------------------------------------------------- + drwxr-xr-x 15 owner 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + +*LIST_UNIX_25 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x15 owner 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + + + + + + + +*LIST_UNIX_50 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x owner 1024 Nov 6 14:21 Linux/ + -rwxrwx--- owner 12 Nov 6 1996 test.txt + drwxr-xr-x owner 1024 11ŒŽ 6“ú 14:21 Linux/ + drwxr-xr-x owner 1024 11ŒŽ 6“ú 14Žž21•ª Linux/ + -rwxrwx--- owner 12 11ŒŽ 6“ú 1996”N test.txt + +*LIST_UNIX_51 + 0 1 2 3 4 5 + ------------------------------------------------------- + drwxr-xr-x owner 1024 11ŒŽ12“ú 14Žž21•ª Linux/ + -rwxrwx--- owner 12 11ŒŽ12“ú 1996”N test.txt + + 0 1 2 3 4 5 + ------------------------------------------------------- + -rwxrwxrwx SEQ 36203776 01/07/07 12:38:28 ADRS001 + -rwxrwxrwx SEQ 70172160 01/07/07 13:59:58 ADRS002 + +*LIST_UNIX_54 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x owner 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + + + + + + + +*LIST_UNIX_60 + 0 1 2 3 4 5 6 7 8 9 10 + ------------------------------------------------------- + drwxr-xr-x 123 owner m group g 1024 Nov 6 14:21 Linux/ + -rwxrwx--- 132 owner m group g 12 Nov 6 1996 test.txt + +*LIST_UNIX_61 + 0 1 2 3 4 5 6 7 8 9 + ------------------------------------------------------- + drwxr-xr-x 123 owner m group g 1024 11ŒŽ12“ú 14:21 Linux/ + -rwxrwx--- 132 owner m group g 12 11ŒŽ12“ú 1996 test.txt + +*LIST_UNIX_62 + 0 1 2 3 4 5 6 7 8 9 + ------------------------------------------------------- + drwxr-xr-x123 owner m group g 1024 Nov 6 14:21 Linux/ + -rwxrwx---132 owner m group g 12 Nov 6 1996 test.txt + +*LIST_UNIX_63 + 0 1 2 3 4 5 6 7 8 + ------------------------------------------------------- + drwxr-xr-x123 owner m group g 1024 11ŒŽ12“ú 14:21 Linux/ + -rwxrwx---132 owner m group g 12 11ŒŽ12“ú 1996 test.txt + +*LIST_UNIX_64 + 0 1 2 3 4 5 6 7 8 9 10 + ------------------------------------------------------- + drwxr-xr-x 15 owner m group g 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + +*LIST_UNIX_65 + 0 1 2 3 4 5 6 7 8 9 + ------------------------------------------------------- + drwxr-xr-x15 owner m group g 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + + + + +LIST_UNIX_70 + 0 1 2 3 4 5 6 7 8 9 + ------------------------------------------------------- + drwxr-xr-x 123 owner group g 1024 Nov 6 14:21 Linux/ + -rwxrwx--- 132 owner group g 12 Nov 6 1996 test.txt + +*LIST_UNIX_71 + 0 1 2 3 4 5 6 7 8 + ------------------------------------------------------- + drwxr-xr-x 123 owner group g 1024 11ŒŽ12“ú 14:21 Linux/ + -rwxrwx--- 132 owner group g 12 11ŒŽ12“ú 1996 test.txt + +*LIST_UNIX_72 + 0 1 2 3 4 5 6 7 8 + ------------------------------------------------------- + drwxr-xr-x123 owner group g 1024 Nov 6 14:21 Linux/ + -rwxrwx---132 owner group g 12 Nov 6 1996 test.txt + +*LIST_UNIX_73 + 0 1 2 3 4 5 6 7 + ------------------------------------------------------- + drwxr-xr-x123 owner group g 1024 11ŒŽ12“ú 14:21 Linux/ + -rwxrwx---132 owner group g 12 11ŒŽ12“ú 1996 test.txt + +*LIST_UNIX_74 + 0 1 2 3 4 5 6 7 8 9 + ------------------------------------------------------- + drwxr-xr-x 15 owner group g 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + +*LIST_UNIX_75 + 0 1 2 3 4 5 6 7 8 + ------------------------------------------------------- + drwxr-xr-x15 owner group g 512 2001 6ŒŽ 18 audit (ŒŽ‚ÍGBƒR[ƒh‚Å0xD4C2) + + + + + + +*unixŒn‚ňȉº‚̂悤‚È“ú•t + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxr-xr-x123 owner 1024 11/ 6 14:21 Linux/ + -rwxrwx---132 owner 12 11/13 1996 test.txt + + + + + + + + + + + + + + + + + + +*LIST_DOS_1 + 0 1 2 3 + ------------------------------------------------------- + 97-10-14 03:34p Linux + 97-10-14 03:34p 12 test.txt + 100-10-14 03:34p 12 test.txt + +*LIST_DOS_2 + 0 1 2 3 + ------------------------------------------------------- + 10-14-97 03:34p Linux + 10-14-97 03:34p 12 test.txt + 10-14-100 03:34p 12 test.txt + +*LIST_DOS_3 + 0 1 2 3 4 + ------------------------------------------------------- + Linux 10-14-97 03:34 + test.txt 12 10-14-97 14:34 A + test.txt 12 10-14-100 14:34 A + +*LIST_DOS_4 + 0 1 2 3 + ------------------------------------------------------- + 1998/07/30 15:39:02 Linux + 1998/07/30 15:42:19 11623 test.txt + +*LIST_ACOS + 0 + ------------------------------------------------------- + test.txt +@@ƒfƒBƒŒƒNƒgƒŠ‚È‚µA + +*LIST_AS400 + 0 1 2 3 4 5 + ------------------------------------------------------- + QSYS 18944 96/09/20 00:35:10 *DIR QOpenSys/ + QDOC 26624 70/01/01 00:00:00 *FLR QDLS/ + QSYS 0 98/09/27 10:00:04 *LIB QSYS.LIB/ + QSECOFR 0 98/05/15 16:01:15 *STMF WWWTEST.BAK + +*LIST_M1800 + 0 1 2 3 4 5 6 (ƒtƒ@ƒCƒ‹–¼‚ÌŒã‚ë‚ɃXƒy[ƒX‚ ‚èj + ------------------------------------------------------- + drwx F 400 400 PO 93.10.27 COMMON.PDL.EXCEL/ + -rw- F 10000 10000 DA 97.03.04 DTSLOG1.FNA + -rw- F 10000 ****** DA 97.03.04 DTSBRB.FNA + drwx U ****** 6144 PO 96.12.15 IS01.TISPLOAD/ + -rw- **** ****** ****** VSAM **.**.** HICS.CMDSEQ + +*LIST_CHAMELEON + 0 1 2 3 4 5 6 + ------------------------------------------------------- + Linux Nov 6 1997 14:21 drw- + test.txt 12 Nov 6 1886 14:21 -rwa + +*LIST_GP6000 + 0 1 2 3 4 5 6 + ------------------------------------------------------- + drwxrwxrwx 98.10.21 14:38:46 SYSG03 XSYSOPR 2048 atlib + -rwxrwxrwx 97.10.30 11:06:04 XSYSMNGR XSYSOPR 2048 blib + +*LIST_OS2 + 0 1 2 3 4 + ------------------------------------------------------- + 345 A 12-02-98 10:59 VirtualDevice.java + 0 DIR 12-09-98 09:43 ƒfƒBƒŒƒNƒgƒŠ + 0 DIR 12-09-100 09:43 ƒfƒBƒŒƒNƒgƒŠ + +*LIST_MELCOM + 0 1 2 3 4 5 6 7 8 + --------------------------------------------------------------- + - RW-RW-RW- 1 TERA 50 DEC 1 1997 AAAJ B(B) + - RW-RW-RW- 1 TERA 1 AUG 7 1998 12345678901234B(B) + d RWXRWXRWX 2 TERA 64 NOV 13 1997 Q2000 - + +*LIST_VMS + 0 1 2 3 4 + --------------------------------------------------------------- + CIM_ALL.MEM;5 2/4 21-APR-1998 11:01:17 [CIM,MIZOTE] + (RWED,RWED,RE,) + MAIL.DIR;1 104/248 18-SEP-2001 16:19:39 [CIM,MIZOTE] + (RWE,RWE,,) + ¦VMS‚̏ꍇˆê——‚ª•¡”s‚É•Ê‚ê‚éê‡‚ª‚ ‚é + +*LIST_OS7_1 + 0 1 2 3 + --------------------------------------------------------------- + drwxrwxrwx 99/05/13 11:38:34 APL +*LIST_OS7_2 + 0 1 2 3 4 5 + --------------------------------------------------------------- + -rwxrwxrwx SEQ 17408 96/12/06 10:11:27 INIT_CONFIG + +*LIST_IRMX + 0 1 2 3 4 5 6 7 8 9 10 11 + --------------------------------------------------------------- + world DR DLAC 1 416 1,024 1 WORLD 05 FEB 98 + world DR 1 416 1,024 1 WORLD 05 FEB 98 + name.f38 DRAU 5 4,692 1,024 1 # 0 24 MAR 99 + name.f38 5 4,692 1,024 1 # 0 24 MAR 99 + +*LIST_STRATUS + 0 1 2 3 4 5 + --------------------------------------------------------------- + Files: 15 Blocks: 29 + w 1 seq 99-06-15 13:11:39 member_srv.error + Dirs: 74 + m 3 98-12-25 16:14:58 amano + +*LIST_ALLIED + 0 1 2 3 4 5 6 + --------------------------------------------------------------- + 41622 IO.SYS Tue Dec 20 06:20:00 1994 + DOS Wed Nov 24 09:35:48 1999 + +*LIST_OS9 + 0 1 2 3 4 5 6 + --------------------------------------------------------------- + 0.0 01/02/13 0945 d-----wr 3C0 148724 W_017 + 0.0 01/02/13 0945 ------wr C20 48828 W_017.CLG + +*LIST_IBM + 0 1 2 3 4 5 6 7 8 9 + --------------------------------------------------------------- + JXSIB1 3390 2000/12/27 1 810 FB 240 24000 PO DIRNAME + JXSW01 3390 2000/12/27 1 5 VBA 240 3120 PS FILENAME + +*LIST_AGILENT + 0 1 2 3 4 5 + --------------------------------------------------------------- + drwxrwxrwx 1 1 1 1024 system + -rw-rw-rw- 1 1 1 1792 abc.aaa + +*LIST_SHIBASOKU + 0 1 2 3 4 + --------------------------------------------------------------- + 512 Jan-30-2002 14:52:04 DIRNAME + 61191 Aug-30-2002 17:30:38 FILENAME.C + + +------------------------------------*/ + +/*===== Ú‘±ƒEƒCƒ“ƒhƒE‚ÌŒ`Ž® =====*/ + +#define DLG_TYPE_CON 0 /* ŠÈˆÕiƒzƒXƒg•ÒW‚È‚µj */ +#define DLG_TYPE_SET 1 /* ƒzƒXƒg•ÒW‚ ‚è */ + +/*===== ƒtƒ@ƒCƒ‹ˆê——Žæ“¾ƒ‚[ƒh =====*/ + +#define CACHE_NORMAL 0 /* ’ʏíiƒLƒƒƒbƒVƒ…‚É‚ ‚ê‚ÎŽg—pA‚È‚¯‚ê‚Γǂݍž‚݁j */ +#define CACHE_REFRESH 1 /* í‚ɓǂݍž‚Ý */ +#define CACHE_LASTREAD 2 /* ÅŒã‚ɓǂݍž‚ñ‚¾‚à‚Ì‚ðŽg—p */ + +/*===== Š¿ŽšƒR[ƒh•ÏŠ· =====*/ + +#define KANJI_SJIS 0 /* SJIS */ +#define KANJI_JIS 1 /* JIS */ +#define KANJI_EUC 2 /* EUC */ +#define KANJI_SMB_HEX 3 /* Samba-HEX */ +#define KANJI_SMB_CAP 4 /* Samba-CAP */ +#define KANJI_UTF8N 5 /* UTF-8N */ + +#define KANJI_NOCNV 0 /* Š¿ŽšƒR[ƒh•ÏŠ·‚È‚µ */ + +/*===== ƒTƒEƒ“ƒh =====*/ + +#define SND_CONNECT 0 /* Ú‘±Žž‚̃TƒEƒ“ƒh */ +#define SND_TRANS 1 /* “]‘—I—¹Žž‚̃TƒEƒ“ƒh */ +#define SND_ERROR 2 /* ƒGƒ‰[Žž‚̃TƒEƒ“ƒh */ + +#define SOUND_TYPES 3 /* ƒTƒEƒ“ƒh‚ÌŽí—Þ */ + +/*===== ƒrƒ…[ƒ =====*/ + +#define VIEWERS 3 /* ƒrƒ…[ƒ‚̐” */ + +/*===== ƒuƒbƒNƒ}[ƒN =====*/ + +#define BMARK_SUB_MENU 2 /* ƒuƒbƒNƒ}[ƒNƒƒjƒ…[‚̃Tƒuƒƒjƒ…[”ԍ† */ +#define DEFAULT_BMARK_ITEM 5 /* ƒuƒbƒNƒ}[ƒNƒƒjƒ…[‚É‚ ‚éŒÅ’è•”•ª‚̐” */ +#define MENU_BMARK_TOP 30000 /* 3000ˆÈ~(3100‚­‚ç‚¢‚Ü‚Å)‚Í—\–ñ‚·‚é */ + /* resource.h ‚Ì’è‹`‚Əd‚È‚ç‚È‚¢‚悤‚É */ + +#define BMARK_TYPE_NONE 0 /* ƒuƒbƒNƒ}[ƒN–³‚µ */ +#define BMARK_TYPE_LOCAL 1 /* ƒ[ƒJƒ‹‘¤‚̃uƒbƒNƒ}[ƒN */ +#define BMARK_TYPE_REMOTE 2 /* ƒzƒXƒg‘¤‚̃uƒbƒNƒ}[ƒN */ +#define BMARK_TYPE_BOTH 3 /* —¼•û‚̃uƒbƒNƒ}[ƒN */ + +#define BMARK_MARK_LOCAL "L " /* ƒ[ƒJƒ‹‘¤‚̈ó */ +#define BMARK_MARK_REMOTE "H " /* ƒzƒXƒg‘¤‚̈ó */ +#define BMARK_MARK_BOTH "W " /* —¼•û‚̈ó */ +#define BMARK_MARK_LEN 2 /* ˆó‚Ì•¶Žš” */ + +#define BMARK_SEP " <> " /* ƒ[ƒJƒ‹‘¤‚ƃzƒXƒg‘¤‚Ì‹æØ‚è */ +#define BMARK_SEP_LEN 4 /* ‹æØ‚è‚Ì•¶Žš” */ + +/*===== ƒŒƒWƒXƒgƒŠ‚̃^ƒCƒv =====*/ + +#define REGTYPE_REG 0 /* ƒŒƒWƒXƒgƒŠ */ +#define REGTYPE_INI 1 /* INIƒtƒ@ƒCƒ‹ */ + +#define REG_SECT_MAX (16*1024) /* ƒŒƒWƒXƒgƒŠ‚Ì‚PƒZƒNƒVƒ‡ƒ“‚̍őåƒf[ƒ^ƒTƒCƒY */ + +/*===== ƒzƒXƒgÝ’è‚Å–¾Ž¦“I‚ÉŽw’è‚·‚éƒzƒXƒg‚̃^ƒCƒv =====*/ + +#define HTYPE_AUTO 0 /* Ž©“® */ +#define HTYPE_ACOS 1 /* ACOS (‘Ò‹@Œ‹‡ƒtƒ@ƒCƒ‹‚ÌŽw’肪•K—v) */ +#define HTYPE_VMS 2 /* VAX VMS */ +#define HTYPE_IRMX 3 /* IRMX */ +#define HTYPE_ACOS_4 4 /* ACOS ƒtƒ@ƒCƒ‹–¼‚ð('')‚ÅŠ‡‚ç‚È‚¢ */ +#define HTYPE_STRATUS 5 /* Stratus */ +#define HTYPE_AGILENT 6 /* Agilent Logic analyzer */ +#define HTYPE_SHIBASOKU 7 /* Shibasoku LSI test system */ + +/*===== ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ =====*/ + +#define OPT_MIRROR 0x0001 /* ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðs‚¤ */ +#define OPT_FORCE 0x0002 /* ƒ~ƒ‰[ƒŠƒ“ƒOŠJŽn‚ÌŠm”F‚ð‚µ‚È‚¢ */ +#define OPT_QUIT 0x0004 /* I—¹ŒãƒvƒƒOƒ‰ƒ€I—¹ */ +#define OPT_EUC 0x0008 /* Š¿ŽšƒR[ƒh‚ÍEUC */ +#define OPT_JIS 0x0010 /* Š¿ŽšƒR[ƒh‚ÍJIS */ +#define OPT_ASCII 0x0020 /* ƒAƒXƒL[“]‘—ƒ‚[ƒh */ +#define OPT_BINARY 0x0040 /* ƒoƒCƒiƒŠ“]‘—ƒ‚[ƒh */ +#define OPT_AUTO 0x0080 /* Ž©“®”»•Ê */ +#define OPT_KANA 0x0100 /* ”¼Šp‚©‚È‚ð‚»‚Ì‚Ü‚Ü’Ê‚· */ +#define OPT_EUC_NAME 0x0200 /* ƒtƒ@ƒCƒ‹–¼‚ÍEUC */ +#define OPT_JIS_NAME 0x0400 /* ƒtƒ@ƒCƒ‹–¼‚ÍJIS */ +#define OPT_MIRRORDOWN 0x0800 /* ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ðs‚¤ */ +#define OPT_SAVEOFF 0x1000 /* Ý’è‚Ì•Û‘¶‚𒆎~‚·‚é */ +#define OPT_SAVEON 0x2000 /* Ý’è‚Ì•Û‘¶‚ðÄŠJ‚·‚é */ + +/*===== ƒzƒXƒg‚̃qƒXƒgƒŠ =====*/ + +#define HISTORY_MAX 20 /* ƒtƒ@ƒCƒ‹‚̃qƒXƒgƒŠ‚̍őåŒÂ” */ +#define DEF_FMENU_ITEMS 8 /* Fileƒƒjƒ…[‚É‚ ‚鍀–ڐ”‚̏‰Šú’l */ + +/*===== SOCKS4 =====*/ + +#define SOCKS4_VER 4 /* SOCKS‚̃o[ƒWƒ‡ƒ“ */ + +#define SOCKS4_CMD_CONNECT 1 /* CONNECTƒRƒ}ƒ“ƒh */ +#define SOCKS4_CMD_BIND 2 /* BINDƒRƒ}ƒ“ƒh */ + +/* ƒŠƒUƒ‹ƒgƒR[ƒh */ +#define SOCKS4_RES_OK 90 /* —v‹‚Í‹–‰Â‚³‚ꂽ */ + /* ‚»‚Ì‘¼‚̃R[ƒh‚̓`ƒFƒbƒN‚µ‚È‚¢‚Ì‚Å’è‹`‚µ‚È‚¢ */ + +/*===== SOCKS5 =====*/ + +#define SOCKS5_VER 5 /* SOCKS‚̃o[ƒWƒ‡ƒ“ */ + +#define SOCKS5_CMD_CONNECT 1 /* CONNECTƒRƒ}ƒ“ƒh */ +#define SOCKS5_CMD_BIND 2 /* BINDƒRƒ}ƒ“ƒh */ + +#define SOCKS5_AUTH_NONE 0 /* ”FØ–³‚µ */ +#define SOCKS5_AUTH_GSSAPI 1 /* GSS-API */ +#define SOCKS5_AUTH_USER 2 /* Username/Password */ + +#define SOCKS5_ADRS_IPV4 1 /* IP V4 address */ +#define SOCKS5_ADRS_NAME 3 /* Domain name */ +#define SOCKS5_ADRS_IPV6 4 /* IP V6 address */ + +#define SOCKS5_USERAUTH_VER 1 /* Username\Password”FØ‚̃o[ƒWƒ‡ƒ“ */ + +/* ƒŠƒUƒ‹ƒgƒR[ƒh */ +#define SOCKS5_RES_OK 0x00 /* succeeded */ + /* ‚»‚Ì‘¼‚̃R[ƒh‚̓`ƒFƒbƒN‚µ‚È‚¢‚Ì‚Å’è‹`‚µ‚È‚¢ */ + +/*===== ’†’fƒR[ƒh =====*/ + +#define ABORT_NONE 0 /* “]‘—’†’f‚È‚µ */ +#define ABORT_USER 1 /* ƒ†[ƒU‚É‚æ‚é’†’f */ +#define ABORT_ERROR 2 /* ƒGƒ‰[‚É‚æ‚é’†’f */ +#define ABORT_DISKFULL 3 /* ƒfƒBƒXƒNƒtƒ‹‚æ‚é’†’f */ + +/*===== FireWall‚ÌŽí—Þ =====*/ + +#define FWALL_NONE 0 /* ‚È‚µ */ +#define FWALL_FU_FP_SITE 1 /* FW user ¨ FW pass ¨ SITE host */ +#define FWALL_FU_FP_USER 2 /* FW user ¨ FW pass ¨ USER user@host */ +#define FWALL_USER 3 /* USER user@host */ +#define FWALL_OPEN 4 /* OPEN host */ +#define FWALL_SOCKS4 5 /* SOCKS4 */ +#define FWALL_SOCKS5_NOAUTH 6 /* SOCKS5 (”FØ‚È‚µ) */ +#define FWALL_SOCKS5_USER 7 /* SOCKS5 (Username/Password”FØ) */ +#define FWALL_FU_FP 8 /* FW user ¨ FW pass */ +#define FWALL_SIDEWINDER 9 /* USER FWuser:FWpass@host */ + +/*===== ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh =====*/ + +/* ƒR[ƒh‚ÌŽí—Þ */ +#define SECURITY_DISABLE 0 /* Žg—p‚µ‚È‚¢ */ +#define SECURITY_AUTO 1 /* Ž©“®”FŽ¯ */ +#define MD4 2 /* MD4 */ +#define MD5 3 /* MD5 */ +#define SHA1 4 /* SHA-1 */ + +#define MAX_SEED_LEN 16 /* Seed‚Ì•¶Žš” */ + +/*===== Ä‹A“I‚ȃtƒ@ƒCƒ‹ŒŸõ‚Ì•û–@ =====*/ + +#define RDIR_NONE 0 /* Ä‹AŒŸõ‚È‚µ */ +#define RDIR_NLST 1 /* NLST -R */ +#define RDIR_CWD 2 /* CWD‚ňړ® */ + +/*===== VAX VMS ŠÖŒW =====*/ + +#define BLOCK_SIZE 512 /* 1ƒuƒƒbƒN‚̃oƒCƒg” */ + +/*===== Ý’è‚̃Œƒxƒ‹ =====*/ + +#define SET_LEVEL_GROUP 0x8000 /* ƒOƒ‹[ƒv‚̃tƒ‰ƒO */ +#define SET_LEVEL_MASK 0x7FFF +#define SET_LEVEL_SAME 0x7FFF + +/*===== “ú•tA”’l‚Ì•\Ž¦Œ`Ž® =====*/ + +#define DISPFORM_LEGACY 0 /* ŒÅ’菑Ž® */ +#define DISPFORM_LOCALE 1 /* ƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹‚ɏ]‚¤ */ + +/*===== ƒtƒ@ƒCƒ‹ˆê——‚É‘¶Ý‚µ‚½î•ñ =====*/ + +#define FINFO_DATE 0x01 /* “ú•t */ +#define FINFO_TIME 0x02 /* ŽžŠÔ */ +#define FINFO_SIZE 0x04 /* ƒTƒCƒY */ +#define FINFO_ATTR 0x08 /* ‘®« */ +#define FINFO_ALL 0xFF /* ‘S‚Ä */ + +/*===== GetMasterPasswordStatus‚ÅŽg‚¤ƒR[ƒh =====*/ +#define PASSWORD_OK 0 +#define PASSWORD_UNMATCH 2 +#define BAD_PASSWORD_HASH 3 + +/*===== ˆÃ†‰»ƒpƒXƒ[ƒhÝ’è =====*/ +#define DEFAULT_PASSWORD "DefaultPassword" +#define MAX_PASSWORD_LEN 128 + + +/*================================================= +* ƒXƒgƒ‰ƒNƒ`ƒƒ +*=================================================*/ + +/*===== ƒzƒXƒgÝ’èƒf[ƒ^ =====*/ + +typedef struct { + int Level; /* Ý’è‚̃Œƒxƒ‹ */ + /* ’ʏí‚̓Oƒ‹[ƒv‚̃tƒ‰ƒO‚Ì‚Ý‚ª—LŒø */ + /* ƒŒƒxƒ‹”‚͐ݒè‚Ì“o˜^^ŒÄoŽž‚Ì‚Ý‚ÅŽg—p */ + char HostName[HOST_NAME_LEN+1]; /* Ý’è–¼ */ + char HostAdrs[HOST_ADRS_LEN+1]; /* ƒzƒXƒg–¼ */ + char UserName[USER_NAME_LEN+1]; /* ƒ†[ƒU–¼ */ + char PassWord[PASSWORD_LEN+1]; /* ƒpƒXƒ[ƒh */ + char Account[ACCOUNT_LEN+1]; /* ƒAƒJƒEƒ“ƒg */ + char LocalInitDir[INIT_DIR_LEN+1]; /* ƒ[ƒJƒ‹‚ÌŠJŽnƒfƒBƒŒƒNƒgƒŠ */ + char RemoteInitDir[INIT_DIR_LEN+1]; /* ƒzƒXƒg‚ÌŠJŽnƒfƒBƒŒƒNƒgƒŠ */ + char BookMark[BOOKMARK_SIZE]; /* ƒuƒbƒNƒ}[ƒN */ + char ChmodCmd[CHMOD_CMD_LEN+1]; /* ‘®«•ÏXƒRƒ}ƒ“ƒh */ + char LsName[NLST_NAME_LEN+1]; /* NLST‚É•t‚¯‚éƒtƒ@ƒCƒ‹–¼/ƒIƒvƒVƒ‡ƒ“*/ + char InitCmd[INITCMD_LEN+1]; /* ƒzƒXƒg‚̏‰Šú‰»ƒRƒ}ƒ“ƒh */ + int Port; /* ƒ|[ƒg”ԍ† */ + int Anonymous; /* Anonymousƒtƒ‰ƒO */ + int KanjiCode; /* ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) */ + int KanaCnv; /* ”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·(YES/NO) */ + int NameKanjiCode; /* ƒtƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) */ + int NameKanaCnv; /* ƒtƒ@ƒCƒ‹–¼‚Ì”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·(YES/NO) */ + int Pasv; /* PASVƒ‚[ƒh (YES/NO) */ + int FireWall; /* FireWall‚ðŽg‚¤ (YES/NO) */ + int ListCmdOnly; /* "LIST"ƒRƒ}ƒ“ƒh‚Ì‚ÝŽg—p‚·‚é */ + int UseNLST_R; /* "NLST -R"ƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é */ + int LastDir; /* ÅŒã‚ɃAƒNƒZƒX‚µ‚½ƒtƒHƒ‹ƒ_‚ð•Û‘¶ */ + int TimeZone; /* ƒ^ƒCƒ€ƒ][ƒ“ (-12`12) */ + int HostType; /* ƒzƒXƒg‚̃^ƒCƒv (HTYPE_xxx) */ + int SyncMove; /* ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“® (YES/NO) */ + int NoFullPath; /* ƒtƒ‹ƒpƒX‚Ńtƒ@ƒCƒ‹ƒAƒNƒZƒX‚µ‚È‚¢ (YES/NO) */ + ulong Sort; /* ƒ\[ƒg•û–@ (0x11223344 : 11=LFsort 22=LDsort 33=RFsort 44=RFsort) */ + int Security; /* ƒZƒLƒ…ƒŠƒeƒB (SECURITY_xxx , MDx) */ + int Dialup; /* ƒ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±‚·‚é‚©‚Ç‚¤‚© (YES/NO) */ + int DialupAlways; /* í‚É‚±‚̃Gƒ“ƒgƒŠ‚֐ڑ±‚·‚é‚©‚Ç‚¤‚© (YES/NO) */ + int DialupNotify; /* ÄÚ‘±‚̍ۂɊm”F‚·‚é (YES/NO) */ + char DialEntry[RAS_NAME_LEN+1]; /* ƒ_ƒCƒAƒ‹ƒAƒbƒvƒGƒ“ƒgƒŠ */ +} HOSTDATA; + + +/*===== ƒzƒXƒgÝ’胊ƒXƒg =====*/ + +typedef struct hostlistdata { + HOSTDATA Set; /* ƒzƒXƒgÝ’èƒf[ƒ^ */ + struct hostlistdata *Next; + struct hostlistdata *Prev; + struct hostlistdata *Child; + struct hostlistdata *Parent; +} HOSTLISTDATA; + + +/*===== Ú‘±ƒqƒXƒgƒŠƒŠƒXƒg =====*/ + +typedef struct historydata { + char HostAdrs[HOST_ADRS_LEN+1]; /* ƒzƒXƒg–¼ */ + char UserName[USER_NAME_LEN+1]; /* ƒ†[ƒU–¼ */ + char PassWord[PASSWORD_LEN+1]; /* ƒpƒXƒ[ƒh */ + char Account[ACCOUNT_LEN+1]; /* ƒAƒJƒEƒ“ƒg */ + char LocalInitDir[INIT_DIR_LEN+1]; /* ƒfƒBƒŒƒNƒgƒŠ */ + char RemoteInitDir[INIT_DIR_LEN+1]; /* ƒfƒBƒŒƒNƒgƒŠ */ + char ChmodCmd[CHMOD_CMD_LEN+1]; /* ‘®«•ÏXƒRƒ}ƒ“ƒh */ + char LsName[NLST_NAME_LEN+1]; /* NLST‚É•t‚¯‚éƒtƒ@ƒCƒ‹–¼/ƒIƒvƒVƒ‡ƒ“*/ + char InitCmd[INITCMD_LEN+1]; /* ƒzƒXƒg‚̏‰Šú‰»ƒRƒ}ƒ“ƒh */ + int Port; /* ƒ|[ƒg”ԍ† */ + int KanjiCode; /* ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) */ + int KanaCnv; /* ”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·(YES/NO) */ + int NameKanjiCode; /* ƒtƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) */ + int NameKanaCnv; /* ƒtƒ@ƒCƒ‹–¼‚Ì”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·(YES/NO) */ + int Pasv; /* PASVƒ‚[ƒh (YES/NO) */ + int FireWall; /* FireWall‚ðŽg‚¤ (YES/NO) */ + int ListCmdOnly; /* "LIST"ƒRƒ}ƒ“ƒh‚Ì‚ÝŽg—p‚·‚é */ + int UseNLST_R; /* "NLST -R"ƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é */ + int TimeZone; /* ƒ^ƒCƒ€ƒ][ƒ“ (-12`12) */ + int HostType; /* ƒzƒXƒg‚̃^ƒCƒv (HTYPE_xxx) */ + int SyncMove; /* ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“® (YES/NO) */ + int NoFullPath; /* ƒtƒ‹ƒpƒX‚Ńtƒ@ƒCƒ‹ƒAƒNƒZƒX‚µ‚È‚¢ (YES/NO) */ + ulong Sort; /* ƒ\[ƒg•û–@ (0x11223344 : 11=LFsort 22=LDsort 33=RFsort 44=RFsort) */ + int Security; /* ƒZƒLƒ…ƒŠƒeƒB (OTP_xxx , MDx) */ + int Type; /* “]‘—•û–@ (TYPE_xx) */ + int Dialup; /* ƒ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±‚·‚é‚©‚Ç‚¤‚© (YES/NO) */ + int DialupAlways; /* í‚É‚±‚̃Gƒ“ƒgƒŠ‚֐ڑ±‚·‚é‚©‚Ç‚¤‚© (YES/NO) */ + int DialupNotify; /* ÄÚ‘±‚̍ۂɊm”F‚·‚é (YES/NO) */ + char DialEntry[RAS_NAME_LEN+1]; /* ƒ_ƒCƒAƒ‹ƒAƒbƒvƒGƒ“ƒgƒŠ */ + struct historydata *Next; +} HISTORYDATA; + + +/*===== “]‘—ƒtƒ@ƒCƒ‹ƒŠƒXƒg =====*/ + +typedef struct transpacket { + SOCKET ctrl_skt; /* Socket */ + char Cmd[40]; /* STOR/RETR/MKD */ + char RemoteFile[FMAX_PATH+1]; /* ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹–¼iƒtƒ‹ƒpƒXj */ + /* VMS‚ÌŽž‚Í ddd[xxx.yyy]/yyy/zzz ‚̂悤‚É */ + /* ‚È‚Á‚Ä‚é‚Ì‚Å’ˆÓ */ + char LocalFile[FMAX_PATH+1]; /* ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹–¼iƒtƒ‹ƒpƒXj */ + int Type; /* “]‘—•û–@ (TYPE_xx) */ + LONGLONG Size; /* ƒtƒ@ƒCƒ‹‚̃TƒCƒY */ + LONGLONG ExistSize; /* ‚·‚Å‚É‘¶Ý‚·‚éƒtƒ@ƒCƒ‹‚̃TƒCƒY */ + /* “]‘—’†‚́A“]‘—‚µ‚½ƒtƒ@ƒCƒ‹‚̃TƒCƒY‚ðŠi”[‚·‚é */ + FILETIME Time; /* ƒtƒ@ƒCƒ‹‚ÌŽžŠÔ(UTC) */ + int Attr; /* ƒtƒ@ƒCƒ‹‚Ì‘®« */ + int KanjiCode; /* Š¿ŽšƒR[ƒh (KANJI_xxx) */ + int KanaCnv; /* ”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·(YES/NO) */ + int Mode; /* “]‘—ƒ‚[ƒh (EXIST_xxx) */ + HWND hWndTrans; /* “]‘—’†ƒ_ƒCƒAƒƒO‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ */ + int Abort; /* “]‘—’†Ž~ƒtƒ‰ƒO (ABORT_xxx) */ + struct transpacket *Next; +} TRANSPACKET; + + +/*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒg =====*/ + +typedef struct filelist { + char File[FMAX_PATH+1]; /* ƒtƒ@ƒCƒ‹–¼ */ + char Node; /* Ží—Þ (NODE_xxx) */ + char Link; /* ƒŠƒ“ƒNƒtƒ@ƒCƒ‹‚©‚Ç‚¤‚© (YES/NO) */ + LONGLONG Size; /* ƒtƒ@ƒCƒ‹ƒTƒCƒY */ + int Attr; /* ‘®« */ + FILETIME Time; /* ŽžŠÔ(UTC) */ + char Owner[OWNER_NAME_LEN+1]; /* ƒI[ƒi–¼ */ + char InfoExist; /* ƒtƒ@ƒCƒ‹ˆê——‚É‘¶Ý‚µ‚½î•ñ‚̃tƒ‰ƒO (FINFO_xxx) */ + struct filelist *Next; +} FILELIST; + + +/*===== ƒR[ƒh•ÏŠ·î•ñƒpƒPƒbƒg =====*/ + +typedef char * (*funcptr)(struct codeconvinfo *, char , char *); + +typedef struct codeconvinfo { + char *Str; /* •¶Žš—ñ */ + int StrLen; /* •¶Žš—ñ‚Ì’·‚³ */ + int KanaCnv; /* ”¼ŠpƒJƒ^ƒJƒi‚ð‘SŠp‚É•ÏŠ·‚·‚é‚©‚Ç‚¤‚© (YES/NO) */ + char *Buf; /* •ÏŠ·Œã‚Ì•¶Žš—ñ‚ðŠi”[‚·‚éƒoƒbƒtƒ@ */ + int BufSize; /* •ÏŠ·Œã‚Ì•¶Žš—ñ‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚̃TƒCƒY */ + int OutLen; /* •ÏŠ·Œã‚Ì•¶Žš—ñ‚̃TƒCƒY */ + int KanjiMode; /* Š¿Žšƒ‚[ƒhƒtƒ‰ƒO(YES/NO) (“à•”ˆ——pƒ[ƒN) */ + int EscProc; /* ƒGƒXƒP[ƒvƒV[ƒPƒ“ƒX•¶Žš” (0`) (“à•”ˆ——pƒ[ƒN) */ + char EscCode[2]; /* ƒGƒXƒP[ƒvƒV[ƒPƒ“ƒX•¶Žš•Û‘¶—p (“à•”ˆ——pƒ[ƒN) */ + char KanjiFst; /* Š¿ŽšƒR[ƒh‚PƒoƒCƒg–Ú•Û‘¶—p (“à•”ˆ——pƒ[ƒN) */ + char KanaPrev; /* ”¼ŠpƒJƒ^ƒJƒi•Û‘¶—p (“à•”ˆ——pƒ[ƒN) */ + funcptr KanaProc; /* ”¼ŠpƒJƒ^ƒJƒiˆ—ƒ‹[ƒ`ƒ“ (“à•”ˆ——pƒ[ƒN) */ +} CODECONVINFO; + + +/*===== ‰üsƒR[ƒh•ÏŠ·î•ñƒpƒPƒbƒg =====*/ + +typedef struct termcodeconvinfo { + char *Str; /* •¶Žš—ñ */ + int StrLen; /* •¶Žš—ñ‚Ì’·‚³ */ + char *Buf; /* •ÏŠ·Œã‚Ì•¶Žš—ñ‚ðŠi”[‚·‚éƒoƒbƒtƒ@ */ + int BufSize; /* •ÏŠ·Œã‚Ì•¶Žš—ñ‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚̃TƒCƒY */ + int OutLen; /* •ÏŠ·Œã‚Ì•¶Žš—ñ‚̃TƒCƒY */ + char Term; /* ‰üsƒR[ƒh‚PƒoƒCƒg–Ú•Û‘¶—p (“à•”ˆ——pƒ[ƒN) */ +} TERMCODECONVINFO; + + +/*===== ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹ƒŠƒXƒg =====*/ + +typedef struct tempfilelist { + char *Fname; /* ƒtƒ@ƒCƒ‹–¼ */ + struct tempfilelist *Next; +} TEMPFILELIST; + + +/*===== ƒTƒEƒ“ƒhƒtƒ@ƒCƒ‹ =====*/ + +typedef struct { + int On; /* ON/OFFƒXƒCƒbƒ` */ + char Fname[FMAX_PATH+1]; /* ƒtƒ@ƒCƒ‹–¼ */ +} SOUNDFILE; + + +/*===== ƒ‰ƒWƒIƒ{ƒ^ƒ“‚̐ݒè =====*/ + +typedef struct { + int ButID; /* ƒ{ƒ^ƒ“‚ÌID */ + int Value; /* ’l */ +} RADIOBUTTON; + + +/*===== SOCKS4 =====*/ + +/* ƒRƒ}ƒ“ƒhƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ (SOCKS4_VER) */ + char Cmd; /* ƒRƒ}ƒ“ƒh (SOCKS4_CMD_xxx) */ + ushort Port; /* ƒ|[ƒg */ + ulong AdrsInt; /* ƒAƒhƒŒƒX */ + char UserID[USER_NAME_LEN+1]; /* ƒ†[ƒUID */ +} SOCKS4CMD; + + +/* •ÔMƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ */ + char Result; /* ƒŠƒUƒ‹ƒgƒR[ƒh (SOCKS4_RES_xxx) */ + ushort Port; /* ƒ|[ƒg */ + ulong AdrsInt; /* ƒAƒhƒŒƒX */ +} SOCKS4REPLY; + +#define SOCKS4REPLY_SIZE 8 + + +/*===== SOCKS5 =====*/ + +/* Method requestƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ (SOCKS5_VER) */ + char Num; /* ƒƒ\ƒbƒh‚̐” */ + uchar Methods[1]; /* ƒƒ\ƒbƒh */ +} SOCKS5METHODREQUEST; + +#define SOCKS5METHODREQUEST_SIZE 3 + + +/* Method replyƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ (SOCKS5_VER) */ + uchar Method; /* ƒƒ\ƒbƒh */ +} SOCKS5METHODREPLY; + +#define SOCKS5METHODREPLY_SIZE 2 + + +/* RequestƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ (SOCKS5_VER) */ + char Cmd; /* ƒRƒ}ƒ“ƒh (SOCKS5_CMD_xxx) */ + char Rsv; /* i—\–ñj */ + char Type; /* ƒAƒhƒŒƒX‚̃^ƒCƒv */ + /* ˆÈŒãi‰Â•Ï’·•”•ªj */ + char _dummy[255+1+2]; /* ƒAƒhƒŒƒXAƒ|[ƒg */ +} SOCKS5REQUEST; + +#define SOCKS5REQUEST_SIZE 4 /* Å‰‚̌Œ蕔•ª‚̃TƒCƒY */ + + +/* ReplyƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ */ + char Result; /* ƒŠƒUƒ‹ƒgƒR[ƒh (SOCKS4_RES_xxx) */ + char Rsv; /* i—\–ñj */ + char Type; /* ƒAƒhƒŒƒX‚̃^ƒCƒv */ + /* ˆÈŒãi‰Â•Ï’·•”•ªj */ + ulong AdrsInt; /* ƒAƒhƒŒƒX */ + ushort Port; /* ƒ|[ƒg */ + char _dummy[2]; /* dummy */ +} SOCKS5REPLY; + +#define SOCKS5REPLY_SIZE 4 /* Å‰‚̌Œ蕔•ª‚̃TƒCƒY */ + + +/* Username/Password”FØstatusƒpƒPƒbƒg */ +typedef struct { + char Ver; /* ƒo[ƒWƒ‡ƒ“ */ + uchar Status; /* ƒXƒe[ƒ^ƒX */ +} SOCKS5USERPASSSTATUS; + +#define SOCKS5USERPASSSTATUS_SIZE 2 + + + +/*===== ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX•ÏXˆ——p =====*/ + +typedef struct { + int HorMoveList[10]; /* …•½‚É“®‚©‚·•”•i‚̃ŠƒXƒg */ + int VarMoveList[10]; /* ‚’¼‚É“®‚©‚·•”•i‚̃ŠƒXƒg */ + int ResizeList[10]; /* ƒTƒCƒY•ÏX‚·‚é•”•i‚̃ŠƒXƒg */ + SIZE MinSize; /* Å­ƒTƒCƒY */ + SIZE CurSize; /* Œ»Ý‚̃TƒCƒY */ +} DIALOGSIZE; + + +/*===== ”’l•ÏŠ·—p =====*/ + +typedef struct { + int Num1; + int Num2; +} INTCONVTBL; + + +/*================================================= +* ƒvƒƒgƒ^ƒCƒv +*=================================================*/ + +/*===== main.c =====*/ + +int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow); +void DispWindowTitle(void); +HWND GetMainHwnd(void); +HWND GetFocusHwnd(void); +void SetFocusHwnd(HWND hWnd); +HINSTANCE GetFtpInst(void); +void DoubleClickProc(int Win, int Mode, int App); +void ExecViewer(char *Fname, int App); +void ExecViewer2(char *Fname1, char *Fname2, int App); +void AddTempFileList(char *Fname); +void SoundPlay(int Num); +char *AskHelpFilePath(void); +char *AskTmpFilePath(void); +char *AskIniFilePath(void); +int AskForceIni(void); +int BackgrndMessageProc(void); +void ResetAutoExitFlg(void); +int AskAutoExit(void); + +/*===== filelist.c =====*/ + +int MakeListWin(HWND hWnd, HINSTANCE hInst); +void DeleteListWin(void); +HWND GetLocalHwnd(void); +HWND GetRemoteHwnd(void); +void GetListTabWidth(void); +void SetListViewType(void); +void GetRemoteDirForWnd(int Mode, int *CancelCheckWork); +void GetLocalDirForWnd(void); +void ReSortDispList(int Win, int *CancelCheckWork); +void SelectFileInList(HWND hWnd, int Type); +void FindFileInList(HWND hWnd, int Type); +// void WildCard2RegExp(char *Str); +int GetCurrentItem(int Win); +int GetItemCount(int Win); +int GetSelectedCount(int Win); +int GetFirstSelected(int Win, int All); +int GetNextSelected(int Win, int Pos, int All); +int FindNameNode(int Win, char *Name); +void GetNodeName(int Win, int Pos, char *Buf, int Max); +int GetNodeTime(int Win, int Pos, FILETIME *Buf); +int GetNodeSize(int Win, int Pos, LONGLONG *Buf); +int GetNodeAttr(int Win, int Pos, int *Buf); +int GetNodeType(int Win, int Pos); +void GetNodeOwner(int Win, int Pos, char *Buf, int Max); +void EraseRemoteDirForWnd(void); +double GetSelectedTotalSize(int Win); +void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork); +void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base); +void MakeDroppedDir(WPARAM wParam, char *Cur); +void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base); +void DeleteFileList(FILELIST **Base); +FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps); +int Assume1900or2000(int Year); +void SetFilter(int *CancelCheckWork); +void doDeleteRemoteFile(void); + + +/*===== toolmenu.c =====*/ + +int MakeToolBarWindow(HWND hWnd, HINSTANCE hInst); +void DeleteToolBarWindow(void); +HWND GetMainTbarWnd(void); +HWND GetLocalHistHwnd(void); +HWND GetRemoteHistHwnd(void); +HWND GetLocalHistEditHwnd(void); +HWND GetRemoteHistEditHwnd(void); +HWND GetLocalTbarWnd(void); +HWND GetRemoteTbarWnd(void); +int GetHideUI(void); +void MakeButtonsFocus(void); +void DisableUserOpe(void); +void EnableUserOpe(void); +int AskUserOpeDisabled(void); +void SetTransferTypeImm(int Mode); +void SetTransferType(int Type); +void DispTransferType(void); +int AskTransferType(void); +int AskTransferTypeAssoc(char *Fname, int Type); +void SaveTransferType(void); +void SetHostKanjiCodeImm(int Mode); +void SetHostKanjiCode(int Type); +void DispHostKanjiCode(void); +int AskHostKanjiCode(void); +void HideHostKanjiButton(void); +void SetHostKanaCnvImm(int Mode); +void SetHostKanaCnv(void); +void DispHostKanaCnv(void); +int AskHostKanaCnv(void); +void SetSortTypeImm(int LFsort, int LDsort, int RFsort, int RDsort); +void SetSortTypeByColumn(int Win, int Tab); +int AskSortType(int Name); +void SetSaveSortToHost(int Sw); +int AskSaveSortToHost(void); +void DispListType(void); +void SetSyncMoveMode(int Mode); +void ToggleSyncMoveMode(void); +void DispSyncMoveMode(void); +int AskSyncMoveMode(void); +void SetRemoteDirHist(char *Path); +void SetLocalDirHist(char *Path); +void AskLocalCurDir(char *Buf, int Max); +void AskRemoteCurDir(char *Buf, int Max); +void SetCurrentDirAsDirHist(void); +void DispDotFileMode(void); +void LocalRbuttonMenu(int Pos); +void RemoteRbuttonMenu(int Pos); + +/*===== statuswin.c =====*/ + +int MakeStatusBarWindow(HWND hWnd, HINSTANCE hInst); +void DeleteStatusBarWindow(void); +HWND GetSbarWnd(void); +void DispCurrentWindow(int Win); +void DispSelectedSpace(void); +void DispLocalFreeSpace(char *Path); +void DispTransferFiles(void); +void DispDownloadSize(LONGLONG Size); + +/*===== taskwin.c =====*/ + +int MakeTaskWindow(HWND hWnd, HINSTANCE hInst); +void DeleteTaskWindow(void); +HWND GetTaskWnd(void); +void SetTaskMsg(char *szFormat, ...); +int SaveTaskMsg(char *Fname); +void DispTaskMsg(void); +void DoPrintf(char *szFormat, ...); +void DoPrintf2(char *szFormat, ...); + +/*===== hostman.c =====*/ + +int SelectHost(int Type); +int AddHostToList(HOSTDATA *Set, int Pos, int Level); +int CopyHostFromList(int Num, HOSTDATA *Set); +int CopyHostFromListInConnect(int Num, HOSTDATA *Set); +int SetHostBookMark(int Num, char *Bmask, int Len); +char *AskHostBookMark(int Num); +int SetHostDir(int Num, char *LocDir, char *HostDir); +int SetHostPassword(int Num, char *Pass); +int SetHostSort(int Num, int LFSort, int LDSort, int RFSort, int RDSort); +void DecomposeSortType(ulong Sort, int *LFSort, int *LDSort, int *RFSort, int *RDSort); +int AskCurrentHost(void); +void SetCurrentHost(int Num); +void CopyDefaultHost(HOSTDATA *Set); +int SearchHostName(char *Name); +void ImportFromWSFTP(void); + +/*===== connect.c =====*/ + +void ConnectProc(int Type, int Num); +void QuickConnectProc(void); +void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode); +void HistoryConnectProc(int MenuCmd); +char *AskHostAdrs(void); +int AskHostPort(void); +int AskHostNameKanji(void); +int AskHostNameKana(void); +int AskListCmdMode(void); +int AskUseNLST_R(void); +char *AskHostChmodCmd(void); +int AskHostTimeZone(void); +int AskPasvMode(void); +char *AskHostLsName(void); +int AskHostType(void); +int AskHostFireWall(void); +int AskNoFullPathMode(void); +char *AskHostUserName(void); +void SaveCurrentSetToHost(void); +int ReConnectCmdSkt(void); +// int ReConnectTrnSkt(void); +SOCKET AskCmdCtrlSkt(void); +SOCKET AskTrnCtrlSkt(void); +void SktShareProh(void); +int AskShareProh(void); +void DisconnectProc(void); +void DisconnectSet(void); +int AskConnecting(void); +SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork); +SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork); +int AskTryingConnect(void); +int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data); + +/*===== cache.c =====*/ + +int MakeCacheBuf(int Num); +void DeleteCacheBuf(void); +int AskCached(char *Path); +int AskFreeCache(void); +void SetCache(int Num, char *Path); +void ClearCache(int Num); +int AskCurrentFileListNum(void); +void SetCurrentFileListNum(int Num); +void SaveCache(void); +void LoadCache(void); +void DeleteCache(void); +void MakeCacheFileName(int Num, char *Buf); +void CountPrevFfftpWindows(void); + +/*===== ftpproc.c =====*/ + +void DownLoadProc(int ChName, int ForceFile, int All); +void DirectDownLoadProc(char *Fname); +void InputDownLoadProc(void); +void MirrorDownloadProc(int Notify); +void UpLoadListProc(int ChName, int All); +void UpLoadDragProc(WPARAM wParam); +void MirrorUploadProc(int Notify); +void DeleteProc(void); +void RenameProc(void); +void MoveRemoteFileProc(int); +void MkdirProc(void); +void ChangeDirComboProc(HWND hWnd); +void ChangeDirBmarkProc(int MarkID); +void ChangeDirDirectProc(int Win); +void ChangeDirDropFileProc(WPARAM wParam); +void ChmodProc(void); +BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +void SomeCmdProc(void); +void CalcFileSizeProc(void); +void DispCWDerror(HWND hWnd); +void CopyURLtoClipBoard(void); +int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type); +void ReformToVMSstyleDirName(char *Path); +void ReformToVMSstylePathName(char *Path); +#if defined(HAVE_OPENVMS) +void ReformVMSDirName(char *DirName, int Flg); +#endif + +/*===== local.c =====*/ + +int DoLocalCWD(char *Path); +void DoLocalMKD(char *Path); +void DoLocalPWD(char *Buf); +void DoLocalRMD(char *Path); +void DoLocalDELE(char *Path); +void DoLocalRENAME(char *Src, char *Dst); +void DispFileProperty(char *Fname); +HANDLE FindFirstFileAttr(char *Fname, WIN32_FIND_DATA *FindData, int IgnHide); +BOOL FindNextFileAttr(HANDLE hFind, WIN32_FIND_DATA *FindData, int IgnHide); + +/*===== remote.c =====*/ + +int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell); +int DoCWDStepByStep(char *Path, char *Cur); +int DoMKD(char *Path); +void InitPWDcommand(); +int DoRMD(char *Path); +int DoDELE(char *Path); +int DoRENAME(char *Src, char *Dst); +int DoCHMOD(char *Path, char *Mode); +int DoSIZE(char *Path, LONGLONG *Size); +int DoMDTM(char *Path, FILETIME *Time); +int DoQUOTE(char *CmdStr); +SOCKET DoClose(SOCKET Sock); +int DoQUIT(SOCKET ctrl_skt); +int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork); +int CommandProcCmd(char *Reply, char *fmt, ...); +int CommandProcTrn(char *Reply, char *fmt, ...); +int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...); +int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork); +int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char *Tmp); +int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork); +char *ReturnWSError(UINT Error); +void ReportWSError(char *Msg, UINT Error); +int ChangeFnameRemote2Local(char *Fname, int Max); +int ChangeFnameLocal2Remote(char *Fname, int Max); + +/*===== getput.c =====*/ + +int MakeTransferThread(void); +void CloseTransferThread(void); +int AddTmpTransFileList(TRANSPACKET *Pkt, TRANSPACKET **Base); +void EraseTmpTransFileList(TRANSPACKET **Base); +int RemoveTmpTransFileListItem(TRANSPACKET **Base, int Num); + +void AddTransFileList(TRANSPACKET *Pkt); +void AppendTransFileList(TRANSPACKET *Pkt); +void KeepTransferDialog(int Sw); +int AskTransferNow(void); +int AskTransferFileNum(void); +void GoForwardTransWindow(void); +void InitTransCurDir(void); +int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork); +int CheckPathViolation(TRANSPACKET *packet); + +/*===== codecnv.c =====*/ + +void InitTermCodeConvInfo(TERMCODECONVINFO *cInfo); +int FlushRestTermCodeConvData(TERMCODECONVINFO *cInfo); +int ConvTermCodeToCRLF(TERMCODECONVINFO *cInfo); + +void InitCodeConvInfo(CODECONVINFO *cInfo); +int FlushRestData(CODECONVINFO *cInfo); +int ConvEUCtoSJIS(CODECONVINFO *cInfo); +int ConvJIStoSJIS(CODECONVINFO *cInfo); +int ConvSMBtoSJIS(CODECONVINFO *cInfo); +int ConvUTF8NtoSJIS(CODECONVINFO *cInfo); // UTF-8N‘Ήž +int ConvSJIStoEUC(CODECONVINFO *cInfo); +int ConvSJIStoJIS(CODECONVINFO *cInfo); +int ConvSJIStoSMB_HEX(CODECONVINFO *cInfo); +int ConvSJIStoSMB_CAP(CODECONVINFO *cInfo); +int ConvSJIStoUTF8N(CODECONVINFO *cInfo); // UTF-8N‘Ήž +void ConvAutoToSJIS(char *Text, int Pref); +int CheckKanjiCode(char *Text, int Size, int Pref); + +/*===== option.c =====*/ + +void SetOption(int Start); +int SortSetting(void); + +/*===== bookmark.c =====*/ + +void ClearBookMark(void); +void AddCurDirToBookMark(int Win); +int AskBookMarkText(int MarkID, char *Local, char *Remote, int Max); +void SaveBookMark(void); +void LoadBookMark(void); +int EditBookMark(void); + +/*===== regexp.c =====*/ + +int LoadJre(void); +void ReleaseJre(void); +int AskRasUsable(void); +int AskJreUsable(void); +int GetJreVersion(void); +int JreCompileStr(char *Str); +char *JreGetStrMatchInfo(char *Str, UINT nStart); + +/*===== wildcard.c =====*/ + +int CheckFname(char *str, char *regexp); + +/*===== registory.c =====*/ + +void SaveRegistory(void); +int LoadRegistory(void); +void ClearRegistory(void); +void SetMasterPassword( const char* ); +int GetMasterPasswordStatus(void); +int ValidateMasterPassword(void); +DWORD LoadHideDriveListRegistory(void); +void SaveSettingsToFile(void); +int LoadSettingsFromFile(void); + +/*===== lvtips.c =====*/ + +int InitListViewTips(HWND hWnd, HINSTANCE hInst); +void DeleteListViewTips(void); +void EraseListViewTips(void); +HWND GetListViewTipsHwnd(void); +void CheckTipsDisplay(HWND hWnd, LPARAM lParam); + +/*===== ras.c =====*/ + +void LoadRasLib(void); +void ReleaseRasLib(void); +void DisconnectRas(int Notify); +int SetRasEntryToComboBox(HWND hDlg, int Item, char *CurName); +int ConnectRas(int Dialup, int UseThis, int Notify, char *Name); + +/*===== misc.c =====*/ + +int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg, int Help); +BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +void SetYenTail(char *Str); +void RemoveYenTail(char *Str); +void SetSlashTail(char *Str); +void RemoveReturnCode(char *Str); +void ReplaceAll(char *Str, char Src, char Dst); +int IsDigitSym(int Ch, int Sym); +int StrAllSameChar(char *Str, char Ch); +void RemoveTailingSpaces(char *Str); +char *stristr(char *s1, char *s2); +char *GetNextField(char *Str); +int GetOneField(char *Str, char *Buf, int Max); +void RemoveComma(char *Str); +char *GetFileName(char *Path); +char *GetFileExt(char *Path); +char *GetToolName(char *Path); +void RemoveFileName(char *Path, char *Buf); +void GetUpperDir(char *Path); +void GetUpperDirEraseTopSlash(char *Path); +int AskDirLevel(char *Path); +void MakeSizeString(double Size, char *Buf); +void DispStaticText(HWND hWnd, char *Str); +int StrMultiLen(char *Str); +void RectClientToScreen(HWND hWnd, RECT *Rect); +int hex2bin(char Ch); +int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char *Pass, int *Port); +int TimeString2FileTime(char *Time, FILETIME *Buf); +void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist); +void SpecificLocalFileTime2FileTime(FILETIME *Time, int TimeZone); +int AttrString2Value(char *Str); +void AttrValue2String(int Attr, char *Buf); +void FormatIniString(char *Str); +int SelectFile(HWND hWnd, char *Fname, char *Title, char *Filters, char *Ext, int Flags, int Save); +int SelectDir(HWND hWnd, char *Buf, int MaxLen); +void SetRadioButtonByValue(HWND hDlg, int Value, const RADIOBUTTON *Buttons, int Num); +int AskRadioButtonValue(HWND hDlg, const RADIOBUTTON *Buttons, int Num); +int xtoi(char *Str); +int CheckFileReadable(char *Fname); +int max1(int n, int m); +int min1(int n, int m); +void ExcEndianDWORD(DWORD *x); +void SwapInt(int *Num1, int *Num2); +int IsFolderExist(char *Path); +int ConvertNum(int x, int Dir, const INTCONVTBL *Tbl, int Num); +int MoveFileToTrashCan(char *Path); +LONGLONG MakeLongLong(DWORD High, DWORD Low); +char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma); + +/*===== dlgsize.c =====*/ + +void DlgSizeInit(HWND hDlg, DIALOGSIZE *Dt, SIZE *Size); +void AskDlgSize(HWND hDlg, DIALOGSIZE *Dt, SIZE *Size); +void DlgSizeChange(HWND hDlg, DIALOGSIZE *Dt, RECT *New, int Flg); + +/*===== opie.c =====*/ + +int Make6WordPass(int seq, char *seed, char *pass, int type, char *buf); + +/*===== tool.c =====*/ + +void OtpCalcTool(void); + +/*===== history.c =====*/ + +void AddHostToHistory(HOSTDATA *Host, int TrMode); +void AddHistoryToHistory(HISTORYDATA *Hist); +int AskHistoryNum(void); +void CheckHistoryNum(int Space); +void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host); +void CopyDefaultHistory(HISTORYDATA *Set); +void SetAllHistoryToMenu(void); +int GetHistoryByCmd(int MenuCmd, HISTORYDATA *Buf); +int GetHistoryByNum(int Num, HISTORYDATA *Buf); + +/*===== clipboard.c =====*/ + +int CopyStrToClipBoard(char *Str); + +/*===== diskfree.c =====*/ + +void LoadKernelLib(void); +void ReleaseKernelLib(void); +char *AskLocalFreeSpace(char *Path); + +/*===== socket.c =====*/ + +int MakeSocketWin(HWND hWnd, HINSTANCE hInst); +void DeleteSocketWin(void); +struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork); +SOCKET do_socket(int af, int type, int protocol); +int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCheckWork); +int do_closesocket(SOCKET s); +int do_listen(SOCKET s, int backlog); +SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen); +int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOut, int *CancelCheckWork); +int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork); +int CheckClosedAndReconnect(void); +void CheckAllEventClosed(void); + +/*===== updatebell.c =====*/ + +void SaveUpdateBellInfo(void); + + +#endif // __COMMON_H__ diff --git a/config.h b/config.h new file mode 100644 index 0000000..2e8afea --- /dev/null +++ b/config.h @@ -0,0 +1,4 @@ + +/* OPENVMS—p‚̃R[ƒh‚ð—LŒø‚É‚·‚éB”óŒû“aì¬‚̃pƒbƒ`‚ð‘g‚ݍž‚Ý‚Ü‚µ‚½B */ +#define HAVE_OPENVMS + diff --git a/connect.c b/connect.c new file mode 100644 index 0000000..7283282 --- /dev/null +++ b/connect.c @@ -0,0 +1,2125 @@ +/*============================================================================= +* +* ƒzƒXƒg‚ւ̐ڑ±^Ø’f +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static int SendInitCommand(char *Cmd); +static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List); +static void SaveCurrentSetToHistory(void); +static int ReConnectSkt(SOCKET *Skt); +static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security); +static int CheckOneTimePassword(char *Pass, char *Reply, int Type); +static BOOL CALLBACK BlkHookFnc(void); +static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port); +static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork); +static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet); +static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet); +static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork); + +/*===== ŠO•”ŽQÆ =====*/ + +extern char FilterStr[FILTER_EXT_LEN+1]; +extern char TitleHostName[HOST_ADRS_LEN+1]; +extern int CancelFlg; + +/* Ý’è’l */ +extern char UserMailAdrs[USER_MAIL_LEN+1]; +extern char FwallHost[HOST_ADRS_LEN+1]; +extern char FwallUser[USER_NAME_LEN+1]; +extern char FwallPass[PASSWORD_LEN+1]; +extern int FwallPort; +extern int FwallType; +extern int FwallDefault; +extern int FwallSecurity; +extern int FwallResolv; +extern int FwallLower; +extern int FwallDelimiter; +extern int PasvDefault; +extern int QuickAnonymous; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static int Anonymous; +static int TryConnect = NO; +static SOCKET CmdCtrlSocket = INVALID_SOCKET; +static SOCKET TrnCtrlSocket = INVALID_SOCKET; +static HOSTDATA CurHost; + +/* Ú‘±’†‚̐ڑ±æASOCKSƒT[ƒo‚̃AƒhƒŒƒXî•ñ‚ð•Û‘¶‚µ‚Ä‚¨‚­ */ +/* ‚±‚̏î•ñ‚Ílistenƒ\ƒPƒbƒg‚ðŽæ“¾‚·‚éÛ‚É—p‚¢‚é */ +static struct sockaddr_in SocksSockAddr; /* SOCKSƒT[ƒo‚̃AƒhƒŒƒXî•ñ */ +static struct sockaddr_in CurSockAddr; /* Ú‘±æƒzƒXƒg‚̃AƒhƒŒƒXî•ñ */ + +static int UseIPadrs; +static char DomainName[HOST_ADRS_LEN+1]; + + + + +/*----- ƒzƒXƒgˆê——‚ðŽg‚Á‚ăzƒXƒg‚֐ڑ± ---------------------------------------- +* +* Parameter +* int Type : ƒ_ƒCƒAƒƒO‚̃^ƒCƒv (DLG_TYPE_xxx) +* int Num : Ú‘±‚·‚éƒzƒXƒg”ԍ†(0`, -1=ƒ_ƒCƒAƒƒO‚ðo‚·) + +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ConnectProc(int Type, int Num) +{ + int Save; + int LFSort; + int LDSort; + int RFSort; + int RDSort; + + SaveBookMark(); + SaveCurrentSetToHost(); + + if((Num >= 0) || (SelectHost(Type) == YES)) + { + if(Num >= 0) + SetCurrentHost(Num); + + /* Ú‘±’†‚È‚çØ’f‚·‚é */ + if(CmdCtrlSocket != INVALID_SOCKET) + DisconnectProc(); + + SetTaskMsg("----------------------------"); + + InitPWDcommand(); + CopyHostFromList(AskCurrentHost(), &CurHost); + + if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == SUCCESS) + { + SetHostKanaCnvImm(CurHost.KanaCnv); + SetHostKanjiCodeImm(CurHost.KanjiCode); + SetSyncMoveMode(CurHost.SyncMove); + + if((AskSaveSortToHost() == YES) && (CurHost.Sort != SORT_NOTSAVED)) + { + DecomposeSortType(CurHost.Sort, &LFSort, &LDSort, &RFSort, &RDSort); + SetSortTypeImm(LFSort, LDSort, RFSort, RDSort); + ReSortDispList(WIN_LOCAL, &CancelFlg); + } + + Save = NO; + if(strlen(CurHost.PassWord) > 0) + Save = YES; + + DisableUserOpe(); + CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, Save, CurHost.Security); + TrnCtrlSocket = CmdCtrlSocket; + + if(CmdCtrlSocket != INVALID_SOCKET) + { + strcpy(TitleHostName, CurHost.HostName); + DispWindowTitle(); + SoundPlay(SND_CONNECT); + + SendInitCommand(CurHost.InitCmd); + + if(strlen(CurHost.LocalInitDir) > 0) + { + DoLocalCWD(CurHost.LocalInitDir); + GetLocalDirForWnd(); + } + InitTransCurDir(); + DoCWD(CurHost.RemoteInitDir, YES, YES, YES); + + LoadBookMark(); + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + } + else + SoundPlay(SND_ERROR); + + EnableUserOpe(); + } + else + SetTaskMsg(MSGJPN001); + } + return; +} + + +/*----- ƒzƒXƒg–¼‚ð“ü—Í‚µ‚ăzƒXƒg‚֐ڑ± ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void QuickConnectProc(void) +{ + char Tmp[FMAX_PATH+1 + USER_NAME_LEN+1 + PASSWORD_LEN+1 + 2]; + char File[FMAX_PATH+1]; + + SaveBookMark(); + SaveCurrentSetToHost(); + + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(hostname_dlg), GetMainHwnd(), QuickConDialogCallBack, (LPARAM)Tmp) == YES) + { + /* Ú‘±’†‚È‚çØ’f‚·‚é */ + if(CmdCtrlSocket != INVALID_SOCKET) + DisconnectProc(); + + SetTaskMsg("----------------------------"); + + InitPWDcommand(); + CopyDefaultHost(&CurHost); + if(SplitUNCpath(Tmp, CurHost.HostAdrs, CurHost.RemoteInitDir, File, CurHost.UserName, CurHost.PassWord, &CurHost.Port) == SUCCESS) + { + if(strlen(CurHost.UserName) == 0) + { + strcpy(CurHost.UserName, Tmp + FMAX_PATH+1); + strcpy(CurHost.PassWord, Tmp + FMAX_PATH+1 + USER_NAME_LEN+1); + } + + SetCurrentHost(HOSTNUM_NOENTRY); + AskUseFireWall(CurHost.HostAdrs, &CurHost.FireWall, &CurHost.Pasv, &CurHost.ListCmdOnly); + CurHost.FireWall = (int)Tmp[FMAX_PATH+1 + USER_NAME_LEN+1 + PASSWORD_LEN+1]; + CurHost.Pasv = (int)Tmp[FMAX_PATH+1 + USER_NAME_LEN+1 + PASSWORD_LEN+1 + 1]; + + SetHostKanaCnvImm(CurHost.KanaCnv); + SetHostKanjiCodeImm(CurHost.KanjiCode); + SetSyncMoveMode(CurHost.SyncMove); + + DisableUserOpe(); + CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + TrnCtrlSocket = CmdCtrlSocket; + + if(CmdCtrlSocket != INVALID_SOCKET) + { + strcpy(TitleHostName, CurHost.HostAdrs); + DispWindowTitle(); + SoundPlay(SND_CONNECT); + + InitTransCurDir(); + DoCWD(CurHost.RemoteInitDir, YES, YES, YES); + + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + EnableUserOpe(); + + if(strlen(File) > 0) + DirectDownLoadProc(File); + } + else + { + SoundPlay(SND_ERROR); + EnableUserOpe(); + } + } + } + return; +} + + +/*----- ƒNƒCƒbƒNÚ‘±ƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK QuickConDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static char *Buf; + int i; + HISTORYDATA Tmp; + +//char Str[HOST_ADRS_LEN+USER_NAME_LEN+INIT_DIR_LEN+5+1]; + + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, QHOST_HOST, CB_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, QHOST_HOST, WM_SETTEXT, 0, (LPARAM)""); + SendDlgItemMessage(hDlg, QHOST_USER, EM_LIMITTEXT, USER_NAME_LEN, 0); + if(QuickAnonymous == YES) + { + SendDlgItemMessage(hDlg, QHOST_USER, WM_SETTEXT, 0, (LPARAM)"anonymous"); + SendDlgItemMessage(hDlg, QHOST_PASS, WM_SETTEXT, 0, (LPARAM)UserMailAdrs); + } + else + { + SendDlgItemMessage(hDlg, QHOST_USER, WM_SETTEXT, 0, (LPARAM)""); + SendDlgItemMessage(hDlg, QHOST_PASS, WM_SETTEXT, 0, (LPARAM)""); + } + SendDlgItemMessage(hDlg, QHOST_PASS, EM_LIMITTEXT, PASSWORD_LEN, 0); + SendDlgItemMessage(hDlg, QHOST_FWALL, BM_SETCHECK, FwallDefault, 0); + SendDlgItemMessage(hDlg, QHOST_PASV, BM_SETCHECK, PasvDefault, 0); + for(i = 0; i < HISTORY_MAX; i++) + { + if(GetHistoryByNum(i, &Tmp) == SUCCESS) + { +//sprintf(Str, "%s (%s) %s", Tmp.HostAdrs, Tmp.UserName, Tmp.RemoteInitDir); +//SendDlgItemMessage(hDlg, QHOST_HOST, CB_ADDSTRING, 0, (LPARAM)Str); + SendDlgItemMessage(hDlg, QHOST_HOST, CB_ADDSTRING, 0, (LPARAM)Tmp.HostAdrs); + } + } + Buf = (char *)lParam; + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, QHOST_HOST, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Buf); + SendDlgItemMessage(hDlg, QHOST_USER, WM_GETTEXT, USER_NAME_LEN+1, (LPARAM)Buf + FMAX_PATH+1); + SendDlgItemMessage(hDlg, QHOST_PASS, WM_GETTEXT, PASSWORD_LEN+1, (LPARAM)Buf + FMAX_PATH+1 + USER_NAME_LEN+1); + *(Buf + FMAX_PATH+1 + USER_NAME_LEN+1 + PASSWORD_LEN+1) = (char)SendDlgItemMessage(hDlg, QHOST_FWALL, BM_GETCHECK, 0, 0); + *(Buf + FMAX_PATH+1 + USER_NAME_LEN+1 + PASSWORD_LEN+1+1) = (char)SendDlgItemMessage(hDlg, QHOST_PASV, BM_GETCHECK, 0, 0); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + +// case QHOST_HOST : +// if(HIWORD(wParam) == CBN_EDITCHANGE) +// DoPrintf("EDIT"); +// break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- Žw’肵‚½ƒzƒXƒg–¼‚ŃzƒXƒg‚֐ڑ± ---------------------------------------- +* +* Parameter +* char *unc : UNC•¶Žš—ñ +* int Kanji : ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) +* int Kana : ”¼Šp‚©‚ȁ¨‘SŠp•ÏŠ·ƒ‚[ƒh (YES/NO) +* int Fkanji : ƒtƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh (KANJI_xxx) +* int TrMode : “]‘—ƒ‚[ƒh (TYPE_xx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DirectConnectProc(char *unc, int Kanji, int Kana, int Fkanji, int TrMode) +{ + char Host[HOST_ADRS_LEN+1]; + char Path[FMAX_PATH+1]; + char File[FMAX_PATH+1]; + char User[USER_NAME_LEN+1]; + char Pass[PASSWORD_LEN+1]; + int Port; + + SaveBookMark(); + SaveCurrentSetToHost(); + + /* Ú‘±’†‚È‚çØ’f‚·‚é */ + if(CmdCtrlSocket != INVALID_SOCKET) + DisconnectProc(); + + SetTaskMsg("----------------------------"); + + InitPWDcommand(); + if(SplitUNCpath(unc, Host, Path, File, User, Pass, &Port) == SUCCESS) + { + if(strlen(User) == 0) + { + strcpy(User, "anonymous"); + strcpy(Pass, UserMailAdrs); + } + + CopyDefaultHost(&CurHost); + + SetCurrentHost(HOSTNUM_NOENTRY); + strcpy(CurHost.HostAdrs, Host); + strcpy(CurHost.UserName, User); + strcpy(CurHost.PassWord, Pass); + strcpy(CurHost.RemoteInitDir, Path); + AskUseFireWall(CurHost.HostAdrs, &CurHost.FireWall, &CurHost.Pasv, &CurHost.ListCmdOnly); + CurHost.Port = Port; + CurHost.KanjiCode = Kanji; + CurHost.KanaCnv = Kana; + CurHost.NameKanjiCode = Fkanji; + CurHost.KanaCnv = YES; /* ‚Æ‚è‚ ‚¦‚¸ */ + + SetHostKanaCnvImm(CurHost.KanaCnv); + SetHostKanjiCodeImm(CurHost.KanjiCode); + SetSyncMoveMode(CurHost.SyncMove); + + if(TrMode != TYPE_DEFAULT) + { + SetTransferTypeImm(TrMode); + DispTransferType(); + } + + DisableUserOpe(); + CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + TrnCtrlSocket = CmdCtrlSocket; + + if(CmdCtrlSocket != INVALID_SOCKET) + { + strcpy(TitleHostName, CurHost.HostAdrs); + DispWindowTitle(); + SoundPlay(SND_CONNECT); + + InitTransCurDir(); + DoCWD(CurHost.RemoteInitDir, YES, YES, YES); + + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + EnableUserOpe(); + + if(strlen(File) > 0) + DirectDownLoadProc(File); + else + ResetAutoExitFlg(); + } + else + { + SoundPlay(SND_ERROR); + EnableUserOpe(); + } + } + return; +} + + +/*----- ƒzƒXƒg‚̃qƒXƒgƒŠ‚ÅŽw’肳‚ꂽƒzƒXƒg‚֐ڑ± ------------------------------ +* +* Parameter +* int MenuCmd : Žæ‚èo‚·ƒqƒXƒgƒŠ‚ÉŠ„‚è“–‚Ä‚ç‚ꂽƒƒjƒ…[ƒRƒ}ƒ“ƒh +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void HistoryConnectProc(int MenuCmd) +{ + HISTORYDATA Hist; + int LFSort; + int LDSort; + int RFSort; + int RDSort; + + if(GetHistoryByCmd(MenuCmd, &Hist) == SUCCESS) + { + SaveBookMark(); + SaveCurrentSetToHost(); + + /* Ú‘±’†‚È‚çØ’f‚·‚é */ + if(CmdCtrlSocket != INVALID_SOCKET) + DisconnectProc(); + + SetTaskMsg("----------------------------"); + + InitPWDcommand(); + CopyHistoryToHost(&Hist, &CurHost); + + if(ConnectRas(CurHost.Dialup, CurHost.DialupAlways, CurHost.DialupNotify, CurHost.DialEntry) == SUCCESS) + { + SetCurrentHost(HOSTNUM_NOENTRY); + SetHostKanaCnvImm(CurHost.KanaCnv); + SetHostKanjiCodeImm(CurHost.KanjiCode); + SetSyncMoveMode(CurHost.SyncMove); + + DecomposeSortType(CurHost.Sort, &LFSort, &LDSort, &RFSort, &RDSort); + SetSortTypeImm(LFSort, LDSort, RFSort, RDSort); + ReSortDispList(WIN_LOCAL, &CancelFlg); + + SetTransferTypeImm(Hist.Type); + DispTransferType(); + + DisableUserOpe(); + CmdCtrlSocket = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security); + TrnCtrlSocket = CmdCtrlSocket; + + if(CmdCtrlSocket != INVALID_SOCKET) + { + strcpy(TitleHostName, CurHost.HostAdrs); + DispWindowTitle(); + SoundPlay(SND_CONNECT); + + SendInitCommand(CurHost.InitCmd); + + DoLocalCWD(CurHost.LocalInitDir); + GetLocalDirForWnd(); + + InitTransCurDir(); + DoCWD(CurHost.RemoteInitDir, YES, YES, YES); + + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + } + else + SoundPlay(SND_ERROR); + + EnableUserOpe(); + } + else + SetTaskMsg(MSGJPN002); + } + else + SoundPlay(SND_ERROR); + + return; +} + + +/*----- ƒzƒXƒg‚̏‰Šú‰»ƒRƒ}ƒ“ƒh‚ð‘—‚é ------------------------------------------ +* +* Parameter +* int Cmd : ‰Šú‰»ƒRƒ}ƒ“ƒhƒX +* +* Return Value +* ‚È‚µ +* +* NOte +* ‰Šú‰»ƒRƒ}ƒ“ƒh‚͈ȉº‚̂悤‚ȃtƒH[ƒ}ƒbƒg‚Å‚ ‚邱‚Æ +* cmd1\0 +* cmd1\r\ncmd2\r\n\0 +*----------------------------------------------------------------------------*/ + +static int SendInitCommand(char *Cmd) +{ + char Tmp[INITCMD_LEN+1]; + char *Pos; + + while(strlen(Cmd) > 0) + { + strcpy(Tmp, Cmd); + if((Pos = strchr(Tmp, '\r')) != NULL) + *Pos = NUL; + if(strlen(Tmp) > 0) + DoQUOTE(Tmp); + + if((Cmd = strchr(Cmd, '\n')) != NULL) + Cmd++; + else + break; + } + return(0); +} + + +/*----- Žw’è‚̃zƒXƒg‚ÍFireWall‚ðŽg‚¤Ý’è‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------ +* +* Parameter +* char *Hots : ƒzƒXƒg–¼ +* int *Fire : FireWall‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð•Ô‚·ƒ[ƒN +* int *Pasv : PASVƒ‚[ƒh‚ð•Ô‚·ƒ[ƒN +* int *List : LISTƒRƒ}ƒ“ƒh‚Ì‚ÝŽg—pƒtƒ‰ƒO +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AskUseFireWall(char *Host, int *Fire, int *Pasv, int *List) +{ + int i; + HOSTDATA Tmp; + + *Fire = FwallDefault; + *Pasv = PasvDefault; + *List = NO; + + i = 0; + while(CopyHostFromList(i, &Tmp) == SUCCESS) + { + if(strcmp(Host, Tmp.HostAdrs) == 0) + { + *Fire = Tmp.FireWall; + *Pasv = Tmp.Pasv; + *List = Tmp.ListCmdOnly; + break; + } + i++; + } + return; +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃AƒhƒŒƒX‚ð•Ô‚· ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒzƒXƒg‚̃AƒhƒŒƒX +*----------------------------------------------------------------------------*/ + +char *AskHostAdrs(void) +{ + return(CurHost.HostAdrs); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃|[ƒg‚ð•Ô‚· -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒzƒXƒg‚̃|[ƒg +*----------------------------------------------------------------------------*/ + +int AskHostPort(void) +{ + return(CurHost.Port); +} + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ð•Ô‚· ---------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int Š¿ŽšƒR[ƒh (KANJI_xxx) +*----------------------------------------------------------------------------*/ + +int AskHostNameKanji(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.NameKanjiCode); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚Ì”¼ŠpƒJƒi•ÏŠ·ƒtƒ‰ƒO‚ð•Ô‚· -------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·‚·‚é‚©‚Ç‚¤‚© (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskHostNameKana(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.NameKanaCnv); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌLISTƒRƒ}ƒ“ƒhƒ‚[ƒh‚ð•Ô‚· -------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int LISTƒRƒ}ƒ“ƒhƒ‚[ƒh (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskListCmdMode(void) +{ + if(CurHost.HostType == HTYPE_VMS) + return(YES); + else + { + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + return(CurHost.ListCmdOnly); + } +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÅNLST -R‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int NLST -R‚ðŽg‚¤‚©‚Ç‚¤‚© (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskUseNLST_R(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.UseNLST_R); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌChmodƒRƒ}ƒ“ƒh‚ð•Ô‚· ------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ChmodƒRƒ}ƒ“ƒh +*----------------------------------------------------------------------------*/ + +char *AskHostChmodCmd(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.ChmodCmd); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃^ƒCƒ€ƒ][ƒ“‚ð•Ô‚· -------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒ^ƒCƒ€ƒ][ƒ“ +*----------------------------------------------------------------------------*/ + +int AskHostTimeZone(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.TimeZone); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌPASVƒ‚[ƒh‚ð•Ô‚· ---------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int PASVƒ‚[ƒh‚©‚Ç‚¤‚© (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskPasvMode(void) +{ + return(CurHost.Pasv); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÌLNSTƒtƒ@ƒCƒ‹–¼‚ð•Ô‚· ------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“ +*----------------------------------------------------------------------------*/ + +char *AskHostLsName(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.LsName); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚̃zƒXƒgƒ^ƒCƒv‚ð•Ô‚· -------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“ +*----------------------------------------------------------------------------*/ + +int AskHostType(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.HostType); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚ÍFireWall‚ðŽg‚¤ƒzƒXƒg‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int FireWall‚ðŽg‚¤‚©‚Ç‚¤‚© (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskHostFireWall(void) +{ + return(CurHost.FireWall); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚éƒzƒXƒg‚Ńtƒ‹ƒpƒX‚Ńtƒ@ƒCƒ‹ƒAƒNƒZƒX‚µ‚È‚¢‚©‚Ç‚¤‚©‚ð•Ô‚· ---- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒtƒ‹ƒpƒX‚ŃAƒNƒZƒX‚µ‚È‚¢ (YES=ƒtƒ‹ƒpƒX‹ÖŽ~/NO) +*----------------------------------------------------------------------------*/ + +int AskNoFullPathMode(void) +{ + if(CurHost.HostType == HTYPE_VMS) + return(YES); + else + return(CurHost.NoFullPath); +} + + +/*----- Ú‘±‚µ‚Ä‚¢‚郆[ƒU–¼‚ð•Ô‚· -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒ†[ƒU–¼ +*----------------------------------------------------------------------------*/ + +char *AskHostUserName(void) +{ + return(CurHost.UserName); +} + + +/*----- Œ»Ý‚̐ݒè‚ðƒzƒXƒg‚̐ݒè‚ɃZƒbƒg‚·‚é ---------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠAƒ\[ƒg•û–@‚ðƒzƒXƒg‚̐ݒè‚ɃZƒbƒg‚·‚é +*----------------------------------------------------------------------------*/ + +void SaveCurrentSetToHost(void) +{ + int Host; + char LocDir[FMAX_PATH+1]; + char HostDir[FMAX_PATH+1]; + + if(TrnCtrlSocket != INVALID_SOCKET) + { + if((Host = AskCurrentHost()) != HOSTNUM_NOENTRY) + { + CopyHostFromListInConnect(Host, &CurHost); + if(CurHost.LastDir == YES) + { + AskLocalCurDir(LocDir, FMAX_PATH); + AskRemoteCurDir(HostDir, FMAX_PATH); + SetHostDir(AskCurrentHost(), LocDir, HostDir); + } + SetHostSort(AskCurrentHost(), AskSortType(ITEM_LFILE), AskSortType(ITEM_LDIR), AskSortType(ITEM_RFILE), AskSortType(ITEM_RDIR)); + } + } + return; +} + + +/*----- Œ»Ý‚̐ݒè‚ðƒqƒXƒgƒŠ‚ɃZƒbƒg‚·‚é -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void SaveCurrentSetToHistory(void) +{ + char LocDir[FMAX_PATH+1]; + char HostDir[FMAX_PATH+1]; + + AskLocalCurDir(LocDir, FMAX_PATH); + AskRemoteCurDir(HostDir, FMAX_PATH); + strcpy(CurHost.LocalInitDir, LocDir); + strcpy(CurHost.RemoteInitDir, HostDir); + + CurHost.Sort = AskSortType(ITEM_LFILE) * 0x1000000 | AskSortType(ITEM_LDIR) * 0x10000 | AskSortType(ITEM_RFILE) * 0x100 | AskSortType(ITEM_RDIR); + + CurHost.KanjiCode = AskHostKanjiCode(); + CurHost.KanaCnv = AskHostKanaCnv(); + + CurHost.SyncMove = AskSyncMoveMode(); + + AddHostToHistory(&CurHost, AskTransferType()); + SetAllHistoryToMenu(); + + return; +} + + +/*----- ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚̍Đڑ± ---------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int ReConnectCmdSkt(void) +{ + int Sts; + + if(CmdCtrlSocket != TrnCtrlSocket) + do_closesocket(TrnCtrlSocket); + TrnCtrlSocket = INVALID_SOCKET; + + Sts = ReConnectSkt(&CmdCtrlSocket); + + TrnCtrlSocket = CmdCtrlSocket; + + return(Sts); +} + + +/*----- “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚̍Đڑ± -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +//int ReConnectTrnSkt(void) +//{ +// return(ReConnectSkt(&TrnCtrlSocket)); +//} + + +/*----- ‰ñü‚̍Đڑ± ---------------------------------------------------------- +* +* Parameter +* SOCKET *Skt : Ú‘±‚µ‚½ƒ\ƒPƒbƒg‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReConnectSkt(SOCKET *Skt) +{ + char Path[FMAX_PATH+1]; + int Sts; + + Sts = FAIL; + + SetTaskMsg(MSGJPN003); + + DisableUserOpe(); + /* Œ»Ý‚̃\ƒPƒbƒg‚͐ؒf */ + if(*Skt != INVALID_SOCKET) + do_closesocket(*Skt); + /* ÄÚ‘± */ + if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) + { + AskRemoteCurDir(Path, FMAX_PATH); + DoCWD(Path, YES, YES, YES); + Sts = SUCCESS; + } + else + SoundPlay(SND_ERROR); + + EnableUserOpe(); + return(Sts); +} + + +/*----- ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ð•Ô‚· ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* SOCKET ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +*----------------------------------------------------------------------------*/ + +SOCKET AskCmdCtrlSkt(void) +{ + return(CmdCtrlSocket); +} + + +/*----- “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* SOCKET “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +*----------------------------------------------------------------------------*/ + +SOCKET AskTrnCtrlSkt(void) +{ + return(TrnCtrlSocket); +} + + +/*----- ƒRƒ}ƒ“ƒh^“]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚Ì‹¤—L‚ð‰ðœ ------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SktShareProh(void) +{ + if(CmdCtrlSocket == TrnCtrlSocket) + { + +//SetTaskMsg("############### SktShareProh"); + + CmdCtrlSocket = INVALID_SOCKET; + ReConnectSkt(&CmdCtrlSocket); + } + return; +} + + +/*----- ƒRƒ}ƒ“ƒh^“]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚Ì‹¤—L‚ª‰ðœ‚³‚ê‚Ä‚¢‚é‚©ƒ`ƒFƒbƒN ---- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES=‹¤—L‰ðœ/NO=‹¤—L +*----------------------------------------------------------------------------*/ + +int AskShareProh(void) +{ + int Sts; + + Sts = YES; + if(CmdCtrlSocket == TrnCtrlSocket) + Sts = NO; + + return(Sts); +} + + +/*----- ƒzƒXƒg‚©‚çØ’f -------------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DisconnectProc(void) +{ + +//SetTaskMsg("############### Disconnect Cmd=%x, Trn=%x", CmdCtrlSocket,TrnCtrlSocket); + + if((CmdCtrlSocket != INVALID_SOCKET) && (CmdCtrlSocket != TrnCtrlSocket)) + { + DoQUIT(CmdCtrlSocket); + DoClose(CmdCtrlSocket); + } + + if(TrnCtrlSocket != INVALID_SOCKET) + { + DoQUIT(TrnCtrlSocket); + DoClose(TrnCtrlSocket); + + SaveCurrentSetToHistory(); + + EraseRemoteDirForWnd(); + SetTaskMsg(MSGJPN004); + } + + TrnCtrlSocket = INVALID_SOCKET; + CmdCtrlSocket = INVALID_SOCKET; + + DispWindowTitle(); + MakeButtonsFocus(); + ClearBookMark(); + + return; +} + + +/*----- ƒ\ƒPƒbƒg‚ª‹­§Ø’f‚³‚ꂽ‚Æ‚«‚̏ˆ— ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DisconnectSet(void) +{ + CmdCtrlSocket = INVALID_SOCKET; + TrnCtrlSocket = INVALID_SOCKET; + + EraseRemoteDirForWnd(); + DispWindowTitle(); + MakeButtonsFocus(); + SetTaskMsg(MSGJPN005); + return; +} + + +/*----- ƒzƒXƒg‚ɐڑ±’†‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskConnecting(void) +{ + int Sts; + + Sts = NO; + if(TrnCtrlSocket != INVALID_SOCKET) + Sts = YES; + + return(Sts); +} + + +/*----- ƒzƒXƒg‚֐ڑ±‚·‚é ------------------------------------------------------ +* +* Parameter +* char *Host : ƒzƒXƒg–¼ +* char *User : ƒ†[ƒU–¼ +* char *Pass : ƒpƒXƒ[ƒh +* char *Acct : ƒAƒJƒEƒ“ƒg +* int Port : ƒ|[ƒg +* int Fwall : FireWall‚ðŽg‚¤‚©‚Ç‚¤‚© (YES/NO) +* int SavePass : ƒpƒXƒ[ƒh‚ðÄ“ü—Í‚µ‚½Žž‚É•Û‘¶‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* int Security : ƒZƒLƒ…ƒŠƒeƒB (SECURITY_xxx, MDx) +* +* Return Value +* SOCKET ƒ\ƒPƒbƒg +* +* Note +* ƒzƒXƒg–¼Aƒ†[ƒU–¼AƒpƒXƒ[ƒh‚ªŽw’肳‚ê‚Ä‚¢‚È‚©‚Á‚½‚Æ‚«‚́AÚ‘±‚ÉŽg—p +* ‚µ‚½‚à‚Ì‚ðƒRƒs[‚µ‚Ä‚©‚¦‚· +* char *Host : ƒzƒXƒg–¼ +* char *User : ƒ†[ƒU–¼ +* char *Pass : ƒpƒXƒ[ƒh +* char *Acct : ƒAƒJƒEƒ“ƒg +* +* FireWall‚ÍŽŸ‚̂悤‚É“®ì‚·‚é +* TYPE1 Connect fire ¨ USER user(f) ¨ PASS pass(f) ¨ SITE host ¨ USER user(h) ¨ PASS pass(h) ¨ ACCT acct +* TYPE2 Connect fire ¨ USER user(f) ¨ PASS pass(f) ¨ USER user(h)@host ¨ PASS pass(h) ¨ ACCT acct +* TYPE3 Connect fire ¨ USER user(h)@host ¨ PASS pass(h) ¨ ACCT acct +* TYPE4 Connect fire ¨ OPEN host ¨ USER user(h) ¨ PASS pass(h) ¨ ACCT acct +* TYPE5 SOCKS4 +* none Connect host ¨ USER user(h) ¨ PASS pass(h) ¨ ACCT acct +*----------------------------------------------------------------------------*/ + +static SOCKET DoConnect(char *Host, char *User, char *Pass, char *Acct, int Port, int Fwall, int SavePass, int Security) +{ + int Sts; + int Flg; + int Anony; + SOCKET ContSock; + char Buf[1024]; + char Reply[1024]; + int Continue; + int ReInPass; + char *Tmp; + int HostPort; + static const char *SiteTbl[4] = { "SITE", "site", "OPEN", "open" }; + char TmpBuf[ONELINE_BUF_SIZE]; + struct linger LingerOpt; + + if(Fwall == YES) + Fwall = FwallType; + else + Fwall = FWALL_NONE; + + TryConnect = YES; + CancelFlg = NO; +#if 0 +// WSASetBlockingHook(BlkHookFnc); +#endif + + ContSock = INVALID_SOCKET; + + HostPort = Port; + Tmp = Host; + if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || + (Fwall == FWALL_SIDEWINDER) || + (Fwall == FWALL_FU_FP)) + { + Tmp = FwallHost; + Port = FwallPort; + } + + if(strlen(Tmp) != 0) + { + if((ContSock = connectsock(Tmp, Port, "", &CancelFlg)) != INVALID_SOCKET) + { + while((Sts = ReadReplyMessage(ContSock, Buf, 1024, &CancelFlg, TmpBuf) / 100) == FTP_PRELIM) + ; + + if(Sts == FTP_COMPLETE) + { + Flg = 1; + if(setsockopt(ContSock, SOL_SOCKET, SO_OOBINLINE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); +#pragma aaa + Flg = 1; + if(setsockopt(ContSock, SOL_SOCKET, SO_KEEPALIVE, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + LingerOpt.l_onoff = 1; + LingerOpt.l_linger = 90; + if(setsockopt(ContSock, SOL_SOCKET, SO_LINGER, (LPSTR)&LingerOpt, sizeof(LingerOpt)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); +/////// + + + /*===== ”FØ‚ðs‚È‚¤ =====*/ + + Sts = FTP_COMPLETE; + if((Fwall == FWALL_FU_FP_SITE) || + (Fwall == FWALL_FU_FP_USER) || + (Fwall == FWALL_FU_FP)) + { + if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", FwallUser) / 100) == FTP_CONTINUE) + { + CheckOneTimePassword(FwallPass, Reply, FwallSecurity); + Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + } + } + else if(Fwall == FWALL_SIDEWINDER) + { + Sts = command(ContSock, Reply, &CancelFlg, "USER %s:%s%c%s", FwallUser, FwallPass, FwallDelimiter, Host) / 100; + } + if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) + { + SetTaskMsg(MSGJPN006); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else + { + if((Fwall == FWALL_FU_FP_SITE) || (Fwall == FWALL_OPEN)) + { + Flg = 0; + if(Fwall == FWALL_OPEN) + Flg = 2; + if(FwallLower == YES) + Flg++; + + if(HostPort == PORT_NOR) + Sts = command(ContSock, NULL, &CancelFlg, "%s %s", SiteTbl[Flg], Host) / 100; + else + Sts = command(ContSock, NULL, &CancelFlg, "%s %s %d", SiteTbl[Flg], Host, HostPort) / 100; + } + + if((Sts != FTP_COMPLETE) && (Sts != FTP_CONTINUE)) + { + SetTaskMsg(MSGJPN007, Host); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else + { + Anony = NO; + if((strlen(User) != 0) || + (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + { + if(Anony == YES) + { + strcpy(User, "anonymous"); + strcpy(Pass, UserMailAdrs); + } + + if((Fwall == FWALL_FU_FP_USER) || (Fwall == FWALL_USER)) + { + if(HostPort == PORT_NOR) + sprintf(Buf, "%s%c%s", User, FwallDelimiter, Host); + else + sprintf(Buf, "%s%c%s %d", User, FwallDelimiter, Host, HostPort); + } + else + strcpy(Buf, User); + + ReInPass = NO; + do + { + Continue = NO; + if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) + { + if((strlen(Pass) != 0) || + (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + { + CheckOneTimePassword(Pass, Reply, Security); + + /* ƒpƒXƒ[ƒh‚ªƒXƒy[ƒX1ŒÂ‚ÌŽž‚̓pƒXƒ[ƒh‚ÌŽÀ‘Ì‚È‚µ‚Æ‚·‚é */ + if(strcmp(Reply, " ") == 0) + strcpy(Reply, ""); + + Sts = command(ContSock, NULL, &CancelFlg, "PASS %s", Reply) / 100; + if(Sts == FTP_ERROR) + { + strcpy(Pass, ""); + if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) + Continue = YES; + else + DoPrintf("No password specified."); + ReInPass = YES; + } + else if(Sts == FTP_CONTINUE) + { + if((strlen(Acct) != 0) || + (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) + { + Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; + } + else + DoPrintf("No account specified"); + } + } + else + { + Sts = FTP_ERROR; + DoPrintf("No password specified."); + } + } + } + while(Continue == YES); + } + else + { + Sts = FTP_ERROR; + DoPrintf("No user name specified"); + } + + if(Sts != FTP_COMPLETE) + { + SetTaskMsg(MSGJPN008, Host); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + else if((SavePass == YES) && (ReInPass == YES)) + { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) + SetHostPassword(AskCurrentHost(), Pass); + } + } + } + } + else + { +//#pragma aaa + SetTaskMsg(MSGJPN009/*"Ú‘±‚Å‚«‚Ü‚¹‚ñ(1) %x", ContSock*/); + DoClose(ContSock); + ContSock = INVALID_SOCKET; + } + } + } + else + { + + if(((Fwall >= FWALL_FU_FP_SITE) && (Fwall <= FWALL_OPEN)) || + (Fwall == FWALL_FU_FP)) + SetTaskMsg(MSGJPN010); + else + SetTaskMsg(MSGJPN011); + } + +#if 0 +// WSAUnhookBlockingHook(); +#endif + TryConnect = NO; + + return(ContSock); +} + + +/*----- ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̃`ƒFƒbƒN ---------------------------------------- +* +* Parameter +* chat *Pass : ƒpƒXƒ[ƒh^ƒpƒXƒtƒŒ[ƒY +* char *Reply : USERƒRƒ}ƒ“ƒh‚ð‘—‚Á‚½‚ ‚Ƃ̃Šƒvƒ‰ƒC•¶Žš—ñ +* ^PASSƒRƒ}ƒ“ƒh‚Å‘—‚éƒpƒXƒ[ƒh‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Type : ƒ^ƒCƒv (SECURITY_xxx, MDx) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +* +* Note +* ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚Å‚È‚¢Žž‚ÍPass‚ð‚»‚Ì‚Ü‚ÜReply‚ɃRƒs[ +*----------------------------------------------------------------------------*/ + +static int CheckOneTimePassword(char *Pass, char *Reply, int Type) +{ + int Sts; + char *Pos; + int Seq; + char Seed[MAX_SEED_LEN+1]; + int i; + + Sts = SUCCESS; + Pos = NULL; + + if(Type == SECURITY_AUTO) + { + if((Pos = stristr(Reply, "otp-md5")) != NULL) + { + Type = MD5; + SetTaskMsg(MSGJPN012); + } + else if((Pos = stristr(Reply, "otp-sha1")) != NULL) + { + Type = SHA1; + SetTaskMsg(MSGJPN013); + } + else if(((Pos = stristr(Reply, "otp-md4")) != NULL) || ((Pos = stristr(Reply, "s/key")) != NULL)) + { + Type = MD4; + SetTaskMsg(MSGJPN014); + } + } + else + Pos = GetNextField(Reply); + + if((Type == MD4) || (Type == MD5) || (Type == SHA1)) + { + /* ƒV[ƒPƒ“ƒX”ԍ†‚ðŒ©‚Â‚¯‚郋[ƒv */ + DoPrintf("Analize OTP"); + DoPrintf("%s", Pos); + Sts = FAIL; + while((Pos = GetNextField(Pos)) != NULL) + { + if(IsDigit(*Pos)) + { + Seq = atoi(Pos); + DoPrintf("Sequence=%d", Seq); + + /* Seed */ + if((Pos = GetNextField(Pos)) != NULL) + { + if(GetOneField(Pos, Seed, MAX_SEED_LEN) == SUCCESS) + { + /* Seed‚͉p”Žš‚Ì‚Ý—LŒø‚Æ‚·‚é */ + for(i = strlen(Seed)-1; i >= 0; i--) + { + if((IsAlpha(Seed[i]) == 0) && (IsDigit(Seed[i]) == 0)) + Seed[i] = NUL; + } + if(strlen(Seed) > 0) + { + DoPrintf("Seed=%s", Seed); + Make6WordPass(Seq, Seed, Pass, Type, Reply); + DoPrintf("Response=%s", Reply); + + /* ƒV[ƒPƒ“ƒX”ԍ†‚̃`ƒFƒbƒN‚ÆŒx */ + if(Seq <= 10) + DialogBox(GetFtpInst(), MAKEINTRESOURCE(otp_notify_dlg), GetMainHwnd(), ExeEscDialogProc); + + Sts = SUCCESS; + } + } + } + break; + } + } + + if(Sts == FAIL) + SetTaskMsg(MSGJPN015); + } + else + { + strcpy(Reply, Pass); + DoPrintf("No OTP used."); + } + return(Sts); +} + + + + + + + + + + + + + + +/*----- ƒ\ƒPƒbƒg‚ðÚ‘±‚·‚é ---------------------------------------------------- +* +* Parameter +* char *host : ƒzƒXƒg–¼ +* int port : ƒ|[ƒg”ԍ† +* char *PreMsg : ƒƒbƒZ[ƒW‚Ì‘O”¼•”•ª +* +* Return Value +* SOCKET ƒ\ƒPƒbƒg +*----------------------------------------------------------------------------*/ + +SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) +{ + struct sockaddr_in saSockAddr; + char HostEntry[MAXGETHOSTSTRUCT]; + struct hostent *pHostEntry; + SOCKET sSocket; + int Len; + int Fwall; + SOCKS4CMD Socks4Cmd; + SOCKS4REPLY Socks4Reply; + SOCKS5REQUEST Socks5Cmd; + SOCKS5REPLY Socks5Reply; + + ////////////////////////////// + // ƒzƒXƒg–¼‰ðŒˆ‚Ɛڑ±‚̏€”õ + ////////////////////////////// + + Fwall = FWALL_NONE; + if(AskHostFireWall() == YES) + Fwall = FwallType; + + sSocket = INVALID_SOCKET; + + UseIPadrs = YES; + strcpy(DomainName, host); + memset(&CurSockAddr, 0, sizeof(CurSockAddr)); + CurSockAddr.sin_port = htons((u_short)port); + CurSockAddr.sin_family = AF_INET; + if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) + { + // ƒzƒXƒg–¼‚ªŽw’肳‚ꂽ + // ƒzƒXƒg–¼‚©‚çƒAƒhƒŒƒX‚ð‹‚ß‚é + if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) && + (FwallResolv == YES)) + { + // ƒzƒXƒg–¼‰ðŒˆ‚ÍSOCKSƒT[ƒo‚É”C‚¹‚é + pHostEntry = NULL; + } + else + { + // ƒAƒhƒŒƒX‚ðŽæ“¾ + SetTaskMsg(MSGJPN016, DomainName); + pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); + } + + if(pHostEntry != NULL) + { + memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); + SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + } + else + { + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + UseIPadrs = NO; + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); + } + else + { + SetTaskMsg(MSGJPN019, host); + return(INVALID_SOCKET); + } + } + } + else + SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); + + if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + // SOCKS‚ðŽg‚¤ + // SOCKS‚ɐڑ±‚·‚鏀”õ + if(Fwall == FWALL_SOCKS4) + { + Socks4Cmd.Ver = SOCKS4_VER; + Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT; + Socks4Cmd.Port = CurSockAddr.sin_port; + Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + strcpy(Socks4Cmd.UserID, FwallUser); + Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; + } + else + { + Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + } + + memset(&SocksSockAddr, 0, sizeof(SocksSockAddr)); + if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) + { + if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) + memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); + else + { + SetTaskMsg(MSGJPN021, FwallHost); + return INVALID_SOCKET; + } + } + SocksSockAddr.sin_port = htons((u_short)FwallPort); + SocksSockAddr.sin_family = AF_INET; + SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port)); + // connect‚Őڑ±‚·‚éæ‚ÍSOCKSƒT[ƒo + memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); + } + else + { + // connect‚Őڑ±‚·‚é‚̂͐ڑ±æ‚̃zƒXƒg + memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); + } + + ///////////// + // Ú‘±ŽÀs + ///////////// + + if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET) + { + if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR) + { + if(Fwall == FWALL_SOCKS4) + { + Socks4Reply.Result = -1; + if((SocksSendCmd(sSocket, &Socks4Cmd, Len, CancelCheckWork) != SUCCESS) || + (Socks4GetCmdReply(sSocket, &Socks4Reply) != SUCCESS) || + (Socks4Reply.Result != SOCKS4_RES_OK)) + { + SetTaskMsg(MSGJPN023, Socks4Reply.Result); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + } + else if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + if(Socks5SelMethod(sSocket, CancelCheckWork) == FAIL) + { + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + Socks5Reply.Result = -1; + if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != SUCCESS) || + (Socks5GetCmdReply(sSocket, &Socks5Reply) != SUCCESS) || + (Socks5Reply.Result != SOCKS5_RES_OK)) + { + SetTaskMsg(MSGJPN024, Socks5Reply.Result); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + + } + + if(sSocket != INVALID_SOCKET) + SetTaskMsg(MSGJPN025); + } + else + { +//#pragma aaa + SetTaskMsg(MSGJPN026/*"Ú‘±‚Å‚«‚Ü‚¹‚ñ(2) %x", sSocket*/); + DoClose(sSocket); + sSocket = INVALID_SOCKET; + } + } + else + SetTaskMsg(MSGJPN027); + + return(sSocket); +} + + +/*----- ƒŠƒbƒXƒ“ƒ\ƒPƒbƒg‚ðŽæ“¾ ------------------------------------------------ +* +* Parameter +* SOCKET ctrl_skt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* +* Return Value +* SOCKET ƒŠƒbƒXƒ“ƒ\ƒPƒbƒg +*----------------------------------------------------------------------------*/ + +SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) +{ + SOCKET listen_skt; + int iLength; + char *a,*p; + struct sockaddr_in saCtrlAddr; + struct sockaddr_in saTmpAddr; + SOCKS4CMD Socks4Cmd; + SOCKS4REPLY Socks4Reply; + SOCKS5REQUEST Socks5Cmd; + SOCKS5REPLY Socks5Reply; + + int Len; + int Fwall; + + Fwall = FWALL_NONE; + if(AskHostFireWall() == YES) + Fwall = FwallType; + + if((listen_skt = do_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET) + { + if(Fwall == FWALL_SOCKS4) + { + /*===== SOCKS4‚ðŽg‚¤ =====*/ + DoPrintf("Use SOCKS4 BIND"); + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + { + Socks4Cmd.Ver = SOCKS4_VER; + Socks4Cmd.Cmd = SOCKS4_CMD_BIND; + Socks4Cmd.Port = CurSockAddr.sin_port; + Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; + strcpy(Socks4Cmd.UserID, FwallUser); + Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; + + Socks4Reply.Result = -1; + if((SocksSendCmd(listen_skt, &Socks4Cmd, Len, CancelCheckWork) != SUCCESS) || + (Socks4GetCmdReply(listen_skt, &Socks4Reply) != SUCCESS) || + (Socks4Reply.Result != SOCKS4_RES_OK)) + { + SetTaskMsg(MSGJPN028, Socks4Reply.Result); + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + } + + if(Socks4Reply.AdrsInt == 0) + Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + + a = (char *)&Socks4Reply.AdrsInt; + p = (char *)&Socks4Reply.Port; + } + } + else if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) + { + /*===== SOCKS5‚ðŽg‚¤ =====*/ + DoPrintf("Use SOCKS5 BIND"); + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) + { + if(Socks5SelMethod(listen_skt, CancelCheckWork) == FAIL) + { + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + return(listen_skt); + } + + Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); + + Socks5Reply.Result = -1; + if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != SUCCESS) || + (Socks5GetCmdReply(listen_skt, &Socks5Reply) != SUCCESS) || + (Socks5Reply.Result != SOCKS5_RES_OK)) + { + SetTaskMsg(MSGJPN029, Socks5Reply.Result); + DoClose(listen_skt); + listen_skt = INVALID_SOCKET; + } + + if(Socks5Reply.AdrsInt == 0) + Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; + + a = (char *)&Socks5Reply.AdrsInt; + p = (char *)&Socks5Reply.Port; + } + } + else + { + /*===== SOCKS‚ðŽg‚í‚È‚¢ =====*/ + DoPrintf("Use normal BIND"); + saCtrlAddr.sin_port = htons(0); + saCtrlAddr.sin_family = AF_INET; + saCtrlAddr.sin_addr.s_addr = 0; + + if(bind(listen_skt, (struct sockaddr *)&saCtrlAddr, sizeof(struct sockaddr)) != SOCKET_ERROR) + { + iLength = sizeof(saCtrlAddr); + if(getsockname(listen_skt, (struct sockaddr *)&saCtrlAddr, &iLength) != SOCKET_ERROR) + { + if(do_listen(listen_skt, 1) == 0) + { + iLength = sizeof(saTmpAddr); + if(getsockname(ctrl_skt, (struct sockaddr *)&saTmpAddr, &iLength) == SOCKET_ERROR) + ReportWSError("getsockname", WSAGetLastError()); + + a = (char *)&saTmpAddr.sin_addr; + p = (char *)&saCtrlAddr.sin_port; + } + else + { + ReportWSError("listen", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + } + else + { + ReportWSError("getsockname", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + } + else + { + ReportWSError("bind", WSAGetLastError()); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } + + if(listen_skt == INVALID_SOCKET) + SetTaskMsg(MSGJPN030); + } + } + else + ReportWSError("socket create", WSAGetLastError()); + + if(listen_skt != INVALID_SOCKET) + { +#define UC(b) (((int)b)&0xff) + if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", + UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), + UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) + { + SetTaskMsg(MSGJPN031); + do_closesocket(listen_skt); + listen_skt = INVALID_SOCKET; + } +// else +// DoPrintf("Skt=%u : listener %s port %u",listen_skt,inet_ntoa(saCtrlAddr.sin_addr),ntohs(saCtrlAddr.sin_port)); + } + + return(listen_skt); +} + + +/*----- ƒzƒXƒg‚֐ڑ±ˆ—’†‚©‚Ç‚¤‚©‚ð•Ô‚·--------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO +*----------------------------------------------------------------------------*/ + +int AskTryingConnect(void) +{ + return(TryConnect); +} + + +#if 0 +///*----- ƒuƒƒbƒLƒ“ƒOƒR[ƒ‹‚̃tƒbƒNƒR[ƒ‹ƒoƒbƒN -------------------------------- +//* +//* Parameter +//* ‚È‚µ +//* +//* Return Value +//* BOOL FALSE +//*----------------------------------------------------------------------------*/ +// +//static BOOL CALLBACK BlkHookFnc(void) +//{ +// BackgrndMessageProc(); +// +// if(CancelFlg == YES) +// { +// SetTaskMsg(MSGJPN032); +// WSACancelBlockingCall(); +// CancelFlg = NO; +// } +// return(FALSE); +//} +#endif + + + +/*----- SOCKS5‚̃Rƒ}ƒ“ƒhƒpƒPƒbƒg‚ðì¬‚·‚é ------------------------------------ +* +* Parameter +* SOCKS5REQUEST *Packet : ƒpƒPƒbƒg‚ðì¬‚·‚郏[ƒN +* char Cmd : ƒRƒ}ƒ“ƒh +* int ValidIP : IPƒAƒhƒŒƒX‚ðŽg‚¤‚©‚Ç‚¤‚©(YES/NO) +* ulong IP : IPƒAƒhƒŒƒX +* char *Host : ƒzƒXƒg–¼ +* ushort Port : ƒ|[ƒg +* +* Return Value +* int ƒRƒ}ƒ“ƒhƒpƒPƒbƒg‚Ì’·‚³ +*----------------------------------------------------------------------------*/ + +static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port) +{ + uchar *Pos; + int Len; + int TotalLen; + + Pos = (uchar *)Packet; + Pos += SOCKS5REQUEST_SIZE; + TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2‚̓|[ƒg‚Ì•ª */ + + Packet->Ver = SOCKS5_VER; + Packet->Cmd = Cmd; + Packet->Rsv = 0; + if(ValidIP == YES) + { + /* IPƒAƒhƒŒƒX‚ðŽw’è */ + Packet->Type = SOCKS5_ADRS_IPV4; + *((ulong *)Pos) = IP; + Pos += 4; + TotalLen += 4; + } + else + { + /* ƒzƒXƒg–¼‚ðŽw’è */ + Packet->Type = SOCKS5_ADRS_NAME; + Len = strlen(Host); + *Pos++ = Len; + strcpy(Pos, Host); + Pos += Len; + TotalLen += Len + 1; + } + *((ushort *)Pos) = Port; + + return(TotalLen); +} + + +/*----- SOCKS‚̃Rƒ}ƒ“ƒh‚ð‘—‚é ------------------------------------------------- +* +* Parameter +* SOCKET Socket : ƒ\ƒPƒbƒg +* void *Data : ‘—‚éƒf[ƒ^ +* int Size : ƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork) +{ + int Ret; + + Ret = SendData(Socket, (char *)Data, Size, 0, CancelCheckWork); + + if(Ret != SUCCESS) + SetTaskMsg(MSGJPN033, *((short *)Data)); + + return(Ret); +} + + +/*----- SOCKS5‚̃Rƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒCƒpƒPƒbƒg‚ðŽóM‚·‚é -------------------- +* +* Parameter +* SOCKET Socket : ƒ\ƒPƒbƒg +* SOCKS5REPLY *Packet : ƒpƒPƒbƒg +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet) +{ + uchar *Pos; + int Len; + int Ret; + + Pos = (uchar *)Packet; + Pos += SOCKS5REPLY_SIZE; + + if((Ret = ReadNchar(Socket, (char *)Packet, SOCKS5REPLY_SIZE, &CancelFlg)) == SUCCESS) + { + if(Packet->Type == SOCKS5_ADRS_IPV4) + Len = 4 + 2; + else if(Packet->Type == SOCKS5_ADRS_IPV6) + Len = 6 + 2; + else + { + if((Ret = ReadNchar(Socket, (char *)Pos, 1, &CancelFlg)) == SUCCESS) + { + Len = *Pos + 2; + Pos++; + } + } + + if(Ret == SUCCESS) + Ret = ReadNchar(Socket, (char *)Pos, Len, &CancelFlg); + } + + if(Ret != SUCCESS) + SetTaskMsg(MSGJPN034); + + return(Ret); +} + + +/*----- SOCKS4‚̃Rƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒCƒpƒPƒbƒg‚ðŽóM‚·‚é -------------------- +* +* Parameter +* SOCKET Socket : ƒ\ƒPƒbƒg +* SOCKS5REPLY *Packet : ƒpƒPƒbƒg +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +static int Socks4GetCmdReply(SOCKET Socket, SOCKS4REPLY *Packet) +{ + int Ret; + + Ret = ReadNchar(Socket, (char *)Packet, SOCKS4REPLY_SIZE, &CancelFlg); + + if(Ret != SUCCESS) + DoPrintf(MSGJPN035); + + return(Ret); +} + + +/*----- SOCKS5‚Ì”FØ‚ðs‚¤ ---------------------------------------------------- +* +* Parameter +* SOCKET Socket : ƒ\ƒPƒbƒg +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +static int Socks5SelMethod(SOCKET Socket, int *CancelCheckWork) +{ + int Ret; + SOCKS5METHODREQUEST Socks5Method; + SOCKS5METHODREPLY Socks5MethodReply; + SOCKS5USERPASSSTATUS Socks5Status; + char Buf[USER_NAME_LEN + PASSWORD_LEN + 4]; + int Len; + int Len2; + + Ret = SUCCESS; + Socks5Method.Ver = SOCKS5_VER; + Socks5Method.Num = 1; + if(FwallType == FWALL_SOCKS5_NOAUTH) + Socks5Method.Methods[0] = SOCKS5_AUTH_NONE; + else + Socks5Method.Methods[0] = SOCKS5_AUTH_USER; + + if((SocksSendCmd(Socket, &Socks5Method, SOCKS5METHODREQUEST_SIZE, CancelCheckWork) != SUCCESS) || + (ReadNchar(Socket, (char *)&Socks5MethodReply, SOCKS5METHODREPLY_SIZE, &CancelFlg) != SUCCESS) || + (Socks5MethodReply.Method == (uchar)0xFF)) + { + SetTaskMsg(MSGJPN036); + Ret = FAIL; + } + else if(Socks5MethodReply.Method == SOCKS5_AUTH_USER) + { + DoPrintf("SOCKS5 User/Pass Authentication"); + Buf[0] = SOCKS5_USERAUTH_VER; + Len = strlen(FwallUser); + Len2 = strlen(FwallPass); + Buf[1] = Len; + strcpy(Buf+2, FwallUser); + Buf[2 + Len] = Len2; + strcpy(Buf+3+Len, FwallPass); + + if((SocksSendCmd(Socket, &Buf, Len+Len2+3, CancelCheckWork) != SUCCESS) || + (ReadNchar(Socket, (char *)&Socks5Status, SOCKS5USERPASSSTATUS_SIZE, &CancelFlg) != SUCCESS) || + (Socks5Status.Status != 0)) + { + SetTaskMsg(MSGJPN037); + Ret = FAIL; + } + } + else + DoPrintf("SOCKS5 No Authentication"); + + return(Ret); +} + + +/*----- SOCKS‚ÌBIND‚Ì‘æ‚QƒŠƒvƒ‰ƒCƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚é ------------------------- +* +* Parameter +* SOCKET Socket : ƒ\ƒPƒbƒg +* SOCKET *Data : ƒf[ƒ^ƒ\ƒPƒbƒg‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data) +{ + int Ret; + char Buf[300]; + + Ret = FAIL; + if((AskHostFireWall() == YES) && (FwallType == FWALL_SOCKS4)) + { + Socks4GetCmdReply(Socket, (SOCKS4REPLY *)Buf); + *Data = Socket; + Ret = SUCCESS; + } + else if((AskHostFireWall() == YES) && + ((FwallType == FWALL_SOCKS5_NOAUTH) || (FwallType == FWALL_SOCKS5_USER))) + { + Socks5GetCmdReply(Socket, (SOCKS5REPLY *)Buf); + *Data = Socket; + Ret = SUCCESS; + } + return(Ret); +} + + + diff --git a/diskfree.c b/diskfree.c new file mode 100644 index 0000000..a095b53 --- /dev/null +++ b/diskfree.c @@ -0,0 +1,158 @@ +/*============================================================================= +* +* ‚c‚h‚r‚j‚̃tƒŠ[ƒXƒy[ƒX‚𓾂é +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +typedef DWORD (WINAPI*FUNC_GETDISKFREESPACEEX) (LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HINSTANCE m_hDll = NULL; + +static FUNC_GETDISKFREESPACEEX m_GetDiskFreeSpaceEx = NULL; + + + +/*----- KERNEL32‚ðƒ[ƒh‚·‚é -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void LoadKernelLib(void) +{ + OSVERSIONINFO VerInfo; + + VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&VerInfo); + if(((VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (VerInfo.dwBuildNumber > 1000)) || + (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)) + { + if((m_hDll = LoadLibrary("kernel32.dll")) != NULL) + { + m_GetDiskFreeSpaceEx = (FUNC_GETDISKFREESPACEEX)GetProcAddress(m_hDll, "GetDiskFreeSpaceExA"); + + if(m_GetDiskFreeSpaceEx == NULL) + { + FreeLibrary(m_hDll); + m_hDll = NULL; + } + } + } + return; +} + + +/*----- KERNEL32‚ðƒŠƒŠ[ƒX‚·‚é ------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ReleaseKernelLib(void) +{ + if(m_hDll != NULL) + FreeLibrary(m_hDll); + m_hDll = NULL; + + return; +} + + +/*----- ƒtƒŠ[ƒGƒŠƒA‚̃TƒCƒY‚ð•\‚í‚·•¶Žš—ñ‚ð•Ô‚·------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* char *•¶Žš—ñ +*----------------------------------------------------------------------------*/ + +char *AskLocalFreeSpace(char *Path) +{ + DWORD SectClus; + DWORD ByteSect; + DWORD FreeClus; + DWORD AllClus; + ULARGE_INTEGER a; + ULARGE_INTEGER b; + ULARGE_INTEGER c; + double Free; + static char Buf[40]; + + strcpy(Buf, "??"); + if(*(Path+1) == ':') + { + strncpy(Buf, Path, 2); + strcpy(Buf+2, "\\"); + + if(m_GetDiskFreeSpaceEx != NULL) + { + if((*m_GetDiskFreeSpaceEx)(Buf, &a, &b, &c) != 0) + { + _ui64toa(a.QuadPart, Buf, 10); + Free = atof(Buf); + MakeSizeString(Free, Buf); + } + else + strcpy(Buf, "??"); + } + else + { + if(GetDiskFreeSpace(Buf, &SectClus, &ByteSect, &FreeClus, &AllClus) == TRUE) + { + Free = SectClus * ByteSect * FreeClus; + MakeSizeString(Free, Buf); + } + else + strcpy(Buf, "??"); + } + } + return(Buf); +} + + diff --git a/dlgsize.c b/dlgsize.c new file mode 100644 index 0000000..8c0911b --- /dev/null +++ b/dlgsize.c @@ -0,0 +1,211 @@ +/*============================================================================= +* +* ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃TƒCƒY•ÏXˆ— +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +/*---------------------------------------------------------------------------*/ +/* ƒTƒCƒY•ÏX‰Â”\‚Æ‚·‚éƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚Í WS_CLIPCHILDREN ƒXƒ^ƒCƒ‹‚ð’ljÁ‚· */ +/* ‚邱‚Æ */ +/*---------------------------------------------------------------------------*/ + + +/*----- ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̏‰ŠúƒTƒCƒY‚ðÝ’è ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* DIALOGSIZE *Dt : ƒ_ƒCƒAƒƒOƒTƒCƒYÝ’èƒpƒ‰ƒ[ƒ^ +* SIZE *Size : ƒ_ƒCƒAƒƒO‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DlgSizeInit(HWND hDlg, DIALOGSIZE *Dt, SIZE *Size) +{ + RECT Rect; + + GetWindowRect(hDlg, &Rect); + Dt->MinSize.cx = Rect.right - Rect.left; + Dt->MinSize.cy = Rect.bottom - Rect.top; + Dt->CurSize.cx = Dt->MinSize.cx; + Dt->CurSize.cy = Dt->MinSize.cy; + + if(Size->cx != -1) + { + Rect.right = Rect.left + Size->cx; + Rect.bottom = Rect.top + Size->cy; + + DlgSizeChange(hDlg, Dt, &Rect, WMSZ_BOTTOMRIGHT); + + GetWindowRect(hDlg, &Rect); + MoveWindow(hDlg, Rect.left, Rect.top, Dt->CurSize.cx, Dt->CurSize.cy, TRUE); + } + return; +} + + +/*----- ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃TƒCƒY‚ð•Ô‚· -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* DIALOGSIZE *Dt : ƒ_ƒCƒAƒƒOƒTƒCƒYÝ’èƒpƒ‰ƒ[ƒ^ +* SIZE *Size : ƒ_ƒCƒAƒƒO‚̃TƒCƒY‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AskDlgSize(HWND hDlg, DIALOGSIZE *Dt, SIZE *Size) +{ + Size->cx = Dt->CurSize.cx; + Size->cy = Dt->CurSize.cy; + return; +} + + + +/*----- ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃TƒCƒY•ÏXˆ— ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* DIALOGSIZE *Dt : ƒ_ƒCƒAƒƒOƒTƒCƒYÝ’èƒpƒ‰ƒ[ƒ^ +* RECT *New : V‚µ‚¢ƒ_ƒCƒAƒƒO‚̃TƒCƒY +* int Flg : ƒTƒCƒY•ÏX•ûŒü (WMSZ_xxx) +* +* Return Value +* ‚È‚µ +* +* Note +* ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚É WM_SIZING ƒƒbƒZ[ƒW‚ª—ˆ‚½Žž‚ɌĂԎ– +*----------------------------------------------------------------------------*/ + +void DlgSizeChange(HWND hDlg, DIALOGSIZE *Dt, RECT *New, int Flg) +{ + int *Win; + RECT Rect; + POINT Point; + + /* Å­ƒTƒCƒY‚æ‚菬‚³‚­‚È‚ç‚È‚¢‚悤‚É‚·‚鏈— */ + if((New->right - New->left) < Dt->MinSize.cx) + { + if((Flg == WMSZ_LEFT) || (Flg == WMSZ_TOPLEFT) || (Flg == WMSZ_BOTTOMLEFT)) + New->left = New->right - Dt->MinSize.cx; + else + New->right = New->left + Dt->MinSize.cx; + } + if((New->bottom - New->top) < Dt->MinSize.cy) + { + if((Flg == WMSZ_TOP) || (Flg == WMSZ_TOPLEFT) || (Flg == WMSZ_TOPRIGHT)) + New->top = New->bottom - Dt->MinSize.cy; + else + New->bottom = New->top + Dt->MinSize.cy; + } + + /* …•½•ûŒü‚Ɉړ®‚·‚é•”•i‚̏ˆ— */ + if(Dt->CurSize.cx != New->right - New->left) + { + Win = Dt->HorMoveList; + while(*Win != -1) + { + GetWindowRect(GetDlgItem(hDlg, *Win), &Rect); + Point.x = Rect.left + (New->right - New->left) - Dt->CurSize.cx; + Point.y = Rect.top; + ScreenToClient(hDlg, &Point); + + GetClientRect(GetDlgItem(hDlg, *Win), &Rect); + Rect.left = Point.x; + Rect.top = Point.y; + MoveWindow(GetDlgItem(hDlg, *Win), Rect.left, Rect.top, Rect.right, Rect.bottom, FALSE); + + Win++; + } + } + + /* ‚’¼•ûŒü‚Ɉړ®‚·‚é•”•i‚̏ˆ— */ + if(Dt->CurSize.cy != New->bottom - New->top) + { + Win = Dt->VarMoveList; + while(*Win != -1) + { + GetWindowRect(GetDlgItem(hDlg, *Win), &Rect); + Point.x = Rect.left; + Point.y = Rect.top + (New->bottom - New->top) - Dt->CurSize.cy; + ScreenToClient(hDlg, &Point); + + GetClientRect(GetDlgItem(hDlg, *Win), &Rect); + Rect.left = Point.x; + Rect.top = Point.y; + MoveWindow(GetDlgItem(hDlg, *Win), Rect.left, Rect.top, Rect.right, Rect.bottom, FALSE); + + Win++; + } + } + + /* ‘å‚«‚³‚ð•ÏX‚·‚é•”•i‚̏ˆ— */ + if((Dt->CurSize.cx != New->right - New->left) || + (Dt->CurSize.cy != New->bottom - New->top)) + { + Win = Dt->ResizeList; + while(*Win != -1) + { + GetWindowRect(GetDlgItem(hDlg, *Win), &Rect); + Rect.right = (Rect.right - Rect.left) + (New->right - New->left) - Dt->CurSize.cx; + Rect.bottom = (Rect.bottom - Rect.top) + (New->bottom - New->top) - Dt->CurSize.cy; + + Point.x = Rect.left; + Point.y = Rect.top; + ScreenToClient(hDlg, &Point); + Rect.left = Point.x; + Rect.top = Point.y; + + MoveWindow(GetDlgItem(hDlg, *Win), Rect.left, Rect.top, Rect.right, Rect.bottom, FALSE); + + Win++; + } + + } + + Dt->CurSize.cx = New->right - New->left; + Dt->CurSize.cy = New->bottom - New->top; + InvalidateRect(hDlg, NULL, FALSE); + + return; +} + + diff --git a/filelist.c b/filelist.c new file mode 100644 index 0000000..9644868 --- /dev/null +++ b/filelist.c @@ -0,0 +1,5322 @@ +/*============================================================================= +* +* ƒtƒ@ƒCƒ‹ˆê—— +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define _WIN32_WINNT 0x400 + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + +#include +#include "OleDragDrop.h" +#include "common.h" + +#define BUF_SIZE 256 +#define CF_CNT 2 +#define WM_DRAGDROP (WM_APP + 100) +#define WM_GETDATA (WM_APP + 101) +#define WM_DRAGOVER (WM_APP + 102) + + +/*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̃ŠƒXƒg—pƒXƒgƒ‰ƒNƒ`ƒƒ =====*/ + +typedef struct { + FILELIST *Top; /* ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 */ + int Files; /* ƒtƒ@ƒCƒ‹‚̐” */ +} FLISTANCHOR; + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static LRESULT CALLBACK LocalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static LRESULT CALLBACK RemoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win); +static void EraseDispFileList(FLISTANCHOR *Anchor); +static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor); +static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist); +static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static void DispListList(FILELIST *Pos, char *Title); +static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); +static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork); +static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List); +static int GetListOneLine(char *Buf, int Max, FILE *Fd); +static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir); +static void MakeLocalTree(char *Path, FILELIST **Base); +static void AddFileList(FILELIST *Pkt, FILELIST **Base); +static int AnalizeFileInfo(char *Str); +static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day); +static int CheckHHMMformat(char *Str); +static int CheckYYMMDDformat(char *Str, char Sym, int Dig3); +static int CheckYYYYMMDDformat(char *Str, char Sym); +static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist); +static int FindField(char *Str, char *Buf, int Num, int ToLast); +static void GetMonth(char *Str, WORD *Month, WORD *Day); +static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day); +static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute); +static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day); +static int CheckSpecialDirName(char *Fname); +static int AskFilterStr(char *Fname, int Type); +static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static int atoi_n(const char *Str, int Len); + +/*===== ŠO•”ŽQÆ =====*/ + +extern int SepaWidth; +extern int RemoteWidth; +extern int ListHeight; +extern char FilterStr[FILTER_EXT_LEN+1]; +extern HWND hHelpWin; + +/* Ý’è’l */ +extern int LocalWidth; +extern int LocalTabWidth[4]; +extern int RemoteTabWidth[6]; +extern char UserMailAdrs[USER_MAIL_LEN+1]; +extern HFONT ListFont; +extern int ListType; +extern int FindMode; +extern int DotFile; +extern int DispIgnoreHide; +extern int DispDrives; +extern int MoveMode; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HWND hWndListLocal = NULL; +static HWND hWndListRemote = NULL; + +static WNDPROC LocalProcPtr; +static WNDPROC RemoteProcPtr; + +static HIMAGELIST ListImg = NULL; + +static char FindStr[40+1] = { "*" }; /* ŒŸõ•¶Žš—ñ */ +static int IgnoreNew = NO; +static int IgnoreOld = NO; +static int IgnoreExist = NO; + +static int Dragging = NO; + +static int StratusMode; /* 0=ƒtƒ@ƒCƒ‹, 1=ƒfƒBƒŒƒNƒgƒŠ, 2=ƒŠƒ“ƒN */ + + +// ƒŠƒ‚[ƒgƒtƒ@ƒCƒ‹ƒŠƒXƒg (2007.9.3 yutaka) +static FILELIST *remoteFileListBase; +static FILELIST *remoteFileListBaseNoExpand; +static char remoteFileDir[FMAX_PATH + 1]; + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒgƒEƒCƒ“ƒhƒE‚ðì¬‚·‚é ------------------------------------ +* +* Parameter +* HWND hWnd : eƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HINSTANCE hInst : ƒCƒ“ƒXƒ^ƒ“ƒXƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int MakeListWin(HWND hWnd, HINSTANCE hInst) +{ + int Sts; + LV_COLUMN LvCol; + long Tmp; + + /*===== ƒ[ƒJƒ‹‘¤‚̃ŠƒXƒgƒrƒ…[ =====*/ + + hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, + WC_LISTVIEWA, NULL, + WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS, + 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, + GetMainHwnd(), (HMENU)1500, hInst, NULL); + + if(hWndListLocal != NULL) + { + LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc); + + Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + Tmp |= LVS_EX_FULLROWSELECT; + SendMessage(hWndListLocal, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp); + + if(ListFont != NULL) + SendMessage(hWndListLocal, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + + ListImg = ImageList_LoadBitmap(hInst, MAKEINTRESOURCE(dirattr_bmp), 16, 9, RGB(255,0,0)); + SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg); + ShowWindow(hWndListLocal, SW_SHOW); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = LocalTabWidth[0]; + LvCol.pszText = MSGJPN038; + LvCol.iSubItem = 0; + SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = LocalTabWidth[1]; + LvCol.pszText = MSGJPN039; + LvCol.iSubItem = 1; + SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT; + LvCol.fmt = LVCFMT_RIGHT; + LvCol.cx = LocalTabWidth[2]; + LvCol.pszText = MSGJPN040; + LvCol.iSubItem = 2; + SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 2, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = LocalTabWidth[3]; + LvCol.pszText = MSGJPN041; + LvCol.iSubItem = 3; + SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 3, (LPARAM)&LvCol); + } + + /*===== ƒzƒXƒg‘¤‚̃ŠƒXƒgƒrƒ…[ =====*/ + + hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, + WC_LISTVIEWA, NULL, + WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS, + LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, + GetMainHwnd(), (HMENU)1500, hInst, NULL); + + if(hWndListRemote != NULL) + { + RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc); + + Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + Tmp |= LVS_EX_FULLROWSELECT; + SendMessage(hWndListRemote, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp); + + if(ListFont != NULL) + SendMessage(hWndListRemote, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + + SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg); + ShowWindow(hWndListRemote, SW_SHOW); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = RemoteTabWidth[0]; + LvCol.pszText = MSGJPN042; + LvCol.iSubItem = 0; + SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = RemoteTabWidth[1]; + LvCol.pszText = MSGJPN043; + LvCol.iSubItem = 1; + SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT; + LvCol.fmt = LVCFMT_RIGHT; + LvCol.cx = RemoteTabWidth[2]; + LvCol.pszText = MSGJPN044; + LvCol.iSubItem = 2; + SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 2, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = RemoteTabWidth[3]; + LvCol.pszText = MSGJPN045; + LvCol.iSubItem = 3; + SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 3, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = RemoteTabWidth[4]; + LvCol.pszText = MSGJPN046; + LvCol.iSubItem = 4; + SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 4, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = RemoteTabWidth[5]; + LvCol.pszText = MSGJPN047; + LvCol.iSubItem = 5; + SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 5, (LPARAM)&LvCol); + } + + Sts = SUCCESS; + if((hWndListLocal == NULL) || + (hWndListRemote == NULL)) + { + Sts = FAIL; + } + return(Sts); +} + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒgƒEƒCƒ“ƒhƒE‚ðíœ ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteListWin(void) +{ +// if(ListImg != NULL) +// ImageList_Destroy(ListImg); + if(hWndListLocal != NULL) + DestroyWindow(hWndListLocal); + if(hWndListRemote != NULL) + DestroyWindow(hWndListRemote); + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ƒŠƒXƒg‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetLocalHwnd(void) +{ + return(hWndListLocal); +} + + +/*----- ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ƒŠƒXƒg‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· -------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetRemoteHwnd(void) +{ + return(hWndListRemote); +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ƒŠƒXƒgƒEƒCƒ“ƒhƒE‚̃ƒbƒZ[ƒWˆ— ------------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK LocalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + return(FileListCommonWndProc(hWnd, message, wParam, lParam)); +} + + +/*----- ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ƒŠƒXƒgƒEƒCƒ“ƒhƒE‚̃ƒbƒZ[ƒWˆ— -------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK RemoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + return(FileListCommonWndProc(hWnd, message, wParam, lParam)); +} + + +// ƒ_ƒCƒAƒƒOƒvƒƒV[ƒWƒƒ +static BOOL CALLBACK doOleDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) +{ +#define TIMER_ID (100) // ì¬‚·‚éƒ^ƒCƒ}‚ÌŽ¯•ÊID +#define TIMER_ELAPSE (100) // WM_TIMER‚Ì”­¶ŠÔŠu + MSG message; + + switch( msg ){ + case WM_INITDIALOG: // ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚ªì¬‚³‚ꂽ‚Æ‚« + SetTimer( hDlg, TIMER_ID, 0, NULL); + return TRUE; + + case WM_TIMER: + ShowWindow(hDlg, SW_HIDE); // ƒ_ƒCƒAƒƒO‚͉B‚· + + if (wp != TIMER_ID) + break; + + if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&message); + DispatchMessage(&message); + + } else { + if (AskTransferNow() == NO) { + EndDialog( hDlg, 0 ); + return TRUE; + } + } + + SetTimer( hDlg, TIMER_ID, TIMER_ELAPSE, NULL ); + return TRUE; + + case WM_COMMAND: // ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX“à‚̉½‚©‚ª‘I‘ð‚³‚ê‚½‚Æ‚« + switch( LOWORD( wp ) ){ +// case IDOK: // uOKvƒ{ƒ^ƒ“‚ª‘I‘ð‚³‚ê‚½ + case IDCANCEL: // uƒLƒƒƒ“ƒZƒ‹vƒ{ƒ^ƒ“‚ª‘I‘ð‚³‚ê‚½ + // ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚ðÁ‚· + EndDialog( hDlg, 0 ); + break; + } + return TRUE; + } + + return FALSE; // DefWindowProc()‚Å‚Í‚È‚­AFALSE‚ð•Ô‚·‚±‚ƁI +#undef TIMER_ID +#undef TIMER_ELAPSE +} + + +static void doTransferRemoteFile(void) +{ + FILELIST *FileListBase, *FileListBaseNoExpand, *pf; + int CancelFlg = NO; + char LocDir[FMAX_PATH+1]; + char TmpDir[FMAX_PATH+1]; + char buf[32]; + int i; + DWORD pid; + + // ‚·‚łɃŠƒ‚[ƒg‚©‚ç“]‘—Ï‚݂Ȃ牽‚à‚µ‚È‚¢B(2007.9.3 yutaka) + if (remoteFileListBase != NULL) + return; + + FileListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, YES, NO, &FileListBase, &CancelFlg); + FileListBaseNoExpand = NULL; + MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBaseNoExpand, &CancelFlg); + + // set temporary folder + AskLocalCurDir(LocDir, FMAX_PATH); + + // ƒAƒvƒŠ‚𑽏d‹N“®‚µ‚Ä‚àƒRƒ“ƒtƒŠƒNƒg‚µ‚È‚¢‚悤‚ɁAƒeƒ“ƒ|ƒ‰ƒŠƒtƒHƒ‹ƒ_–¼‚ɃvƒƒZƒXID + // ‚ð•t‰Á‚·‚éB(2007.9.13 yutaka) + GetTempPath(sizeof(TmpDir), TmpDir); + pid = GetCurrentProcessId(); + _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid); + strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE); + _mkdir(TmpDir); +#if 0 + if (TmpDir[strlen(TmpDir) - 1] == '\\') { + TmpDir[strlen(TmpDir) - 1] = '\0'; + } +#endif + + // Šù‘¶‚̃tƒ@ƒCƒ‹‚ðíœ‚·‚é + for (pf = FileListBase ; pf ; pf = pf->Next) { + char fn[FMAX_PATH+1]; + + strncpy_s(fn, sizeof(fn), TmpDir, _TRUNCATE); + strncat_s(fn, sizeof(fn), "\\", _TRUNCATE); + strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE); + + remove(fn); + } + + // ƒ_ƒEƒ“ƒ[ƒhæ‚ðƒeƒ“ƒ|ƒ‰ƒŠ‚ɐݒè + SetLocalDirHist(TmpDir); + + // FFFTP‚Ƀ_ƒEƒ“ƒ[ƒh—v‹‚ðo‚µAƒ_ƒEƒ“ƒ[ƒh‚ÌŠ®—¹‚ð‘҂B + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0); + + for (i = 0 ; i < 10 ; i++) { + MSG msg; + + if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + + } else { + // “]‘—ƒXƒŒƒbƒh‚ª“®‚«o‚µ‚½‚甲‚¯‚éB + if (AskTransferNow() == YES) + break; + } + + Sleep(10); + } + + // OLE D&D’†‚ɃƒCƒ“ƒEƒBƒ“ƒhƒE‚ðƒ†[ƒU‚É‘€ì‚³‚¹‚é‚ƁA‚¨‚©‚µ‚­‚È‚é‚̂ŁA + // ‰B‚µƒ‚[ƒ_ƒ‹ƒ_ƒCƒAƒƒO‚ðì‚éB + // (2007.9.11 yutaka) + DialogBox(GetFtpInst(), MAKEINTRESOURCE(IDD_OLEDRAG), GetMainHwnd(), (DLGPROC)doOleDlgProc); + + // ƒ_ƒEƒ“ƒ[ƒhæ‚ðŒ³‚É–ß‚· + SetLocalDirHist(LocDir); + SetCurrentDirAsDirHist(); + + remoteFileListBase = FileListBase; // ‚ ‚ƂŃtƒŠ[‚·‚邱‚Æ + remoteFileListBaseNoExpand = FileListBaseNoExpand; // ‚ ‚ƂŃtƒŠ[‚·‚邱‚Æ + strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE); + +#if 0 + // add temporary list + if (remoteFileListBase != NULL) { + FILELIST *pf = remoteFileListBase; + char fn[FMAX_PATH + 1]; + while (pf) { + strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE); + strncat_s(fn, sizeof(fn), "\\", _TRUNCATE); + strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE); + AddTempFileList(fn); + pf = pf->Next; + } + } +#endif +} + + +int isDirectory(char *fn) +{ + struct _stat buf; + + if (_stat(fn, &buf) == 0) { + if (buf.st_mode & _S_IFDIR) { // is directory + return 1; + } + } + return 0; +} + +// ƒeƒ“ƒ|ƒ‰ƒŠ‚̃tƒ@ƒCƒ‹‚¨‚æ‚уtƒHƒ‹ƒ_‚ðíœ‚·‚éB +void doDeleteRemoteFile(void) +{ + if (remoteFileListBase != NULL) { +#if 0 + int dirs = 0; + int i, count; + FILELIST *pf = remoteFileListBase; + char fn[FMAX_PATH + 1]; + while (pf) { + strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE); + strncat_s(fn, sizeof(fn), "\\", _TRUNCATE); + strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE); + if (isDirectory(fn)) { + dirs++; + } else { + remove(fn); + } + pf = pf->Next; + } + + count = 0; + for (i = 0 ; i < 1000 ; i++) { + pf = remoteFileListBase; + while (pf) { + strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE); + strncat_s(fn, sizeof(fn), "\\", _TRUNCATE); + strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE); + if (isDirectory(fn)) { + if (_rmdir(fn) == 0) { // ƒfƒBƒŒƒNƒgƒŠ‚ðÁ‚¹‚½‚çƒJƒEƒ“ƒgƒAƒbƒv + count++; + if (count >= dirs) // ‚·‚ׂďÁ‚¹‚½‚çI‚í‚è + goto skip; + } + } + pf = pf->Next; + } + } +skip: + _rmdir(remoteFileDir); // Ž©•ª‚ōì‚Á‚½ƒfƒBƒŒƒNƒgƒŠ‚àÁ‚· +#else + SHFILEOPSTRUCT FileOp = { NULL, FO_DELETE, remoteFileDir, NULL, + FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI, + FALSE, NULL, NULL }; + SHFileOperation(&FileOp); +#endif + + DeleteFileList(&remoteFileListBase); + remoteFileListBase = NULL; + } + + if (remoteFileListBaseNoExpand != NULL) { + DeleteFileList(&remoteFileListBaseNoExpand); + remoteFileListBaseNoExpand = NULL; + } +} + + +// yutaka +// cf. http://www.nakka.com/lib/ +/* ƒhƒƒbƒvƒtƒ@ƒCƒ‹‚̍쐬 */ +static HDROP APIPRIVATE CreateDropFileMem(char **FileName,int cnt,BOOL fWide) +{ + HDROP hDrop; + LPDROPFILES lpDropFile; + wchar_t wbuf[BUF_SIZE]; + int flen = 0; + int i; + + if(fWide == TRUE){ + /* ƒƒCƒhƒLƒƒƒ‰ */ + for(i = 0;i < cnt;i++){ + MultiByteToWideChar(CP_ACP,0,FileName[i],-1,wbuf,BUF_SIZE); + flen += (wcslen(wbuf) + 1) * sizeof(wchar_t); + } + flen++; + }else{ + /* ƒ}ƒ‹ƒ`ƒoƒCƒg */ + for(i = 0;i < cnt;i++){ + flen += lstrlen(FileName[i]) + 1; + } + } + + hDrop = (HDROP)GlobalAlloc(GHND,sizeof(DROPFILES) + flen + 1); + if (hDrop == NULL){ + return NULL; + } + + lpDropFile = (LPDROPFILES) GlobalLock(hDrop); + lpDropFile->pFiles = sizeof(DROPFILES); /* ƒtƒ@ƒCƒ‹–¼‚̃ŠƒXƒg‚܂ł̃IƒtƒZƒbƒg */ + lpDropFile->pt.x = 0; + lpDropFile->pt.y = 0; + lpDropFile->fNC = FALSE; + lpDropFile->fWide = fWide; /* ƒƒCƒhƒLƒƒƒ‰‚̏ꍇ‚Í TRUE */ + + /* \‘¢‘Ì‚ÌŒã‚ë‚Ƀtƒ@ƒCƒ‹–¼‚̃ŠƒXƒg‚ðƒRƒs[‚·‚éB(ƒtƒ@ƒCƒ‹–¼\0ƒtƒ@ƒCƒ‹–¼\0ƒtƒ@ƒCƒ‹–¼\0\0) */ + if(fWide == TRUE){ + /* ƒƒCƒhƒLƒƒƒ‰ */ + wchar_t *buf; + + buf = (wchar_t *)(&lpDropFile[1]); + for(i = 0;i < cnt;i++){ + MultiByteToWideChar(CP_ACP,0,FileName[i],-1,wbuf,BUF_SIZE); + wcscpy(buf,wbuf); + buf += wcslen(wbuf) + 1; + } + }else{ + /* ƒ}ƒ‹ƒ`ƒoƒCƒg */ + char *buf; + + buf = (char *)(&lpDropFile[1]); + for(i = 0;i < cnt;i++){ + lstrcpy(buf,FileName[i]); + buf += lstrlen(FileName[i]) + 1; + } + } + + GlobalUnlock(hDrop); + return(hDrop); +} + + +// OLE D&D‚ðŠJŽn‚·‚é +// (2007.8.30 yutaka) +static void doDragDrop(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + UINT cf[CF_CNT]; + POINT pt; + int ret; + + // ƒeƒ“ƒ|ƒ‰ƒŠ‚ð‚«‚ê‚¢‚É‚·‚é (2007.9.3 yutaka) + doDeleteRemoteFile(); + + /* ƒhƒ‰ƒbƒO&ƒhƒƒbƒv‚ÌŠJŽn */ + cf[0] = CF_HDROP; + cf[1] = CF_HDROP; /* ƒtƒ@ƒCƒ‹ */ + if((ret = OLE_IDropSource_Start(hWnd,WM_GETDATA, WM_DRAGOVER, cf,1,DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK)) == DROPEFFECT_MOVE){ + } + + // ƒhƒƒbƒvæ‚̃AƒvƒŠ‚É WM_LBUTTONUP ‚ð”ò‚΂·B + GetCursorPos(&pt); + ScreenToClient(hWnd, &pt); + PostMessage(hWnd,WM_LBUTTONUP,0,MAKELPARAM(pt.x,pt.y)); +} + + + +/*----- ƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚Ì‹¤’ʃƒbƒZ[ƒWˆ— ---------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + POINT Point; + HWND hWndPnt; + HWND hWndParent; + static HCURSOR hCsrDrg; + static HCURSOR hCsrNoDrg; + static POINT DragPoint; + static HWND hWndDragStart; + static int RemoteDropFileIndex = -1; + int Win; + HWND hWndDst; + WNDPROC ProcPtr; + HWND hWndHistEdit; + + Win = WIN_LOCAL; + hWndDst = hWndListRemote; + ProcPtr = LocalProcPtr; + hWndHistEdit = GetLocalHistEditHwnd(); + if(hWnd == hWndListRemote) + { + Win = WIN_REMOTE; + hWndDst = hWndListLocal; + ProcPtr = RemoteProcPtr; + hWndHistEdit = GetRemoteHistEditHwnd(); + } + + switch (message) + { + case WM_SYSKEYDOWN: + if (wParam == 'D') { // Alt+D + SetFocus(hWndHistEdit); + break; + } + EraseListViewTips(); + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + + case WM_KEYDOWN: + if(wParam == 0x09) + { + SetFocus(hWndDst); + break; + } + EraseListViewTips(); + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + + case WM_SETFOCUS : + SetFocusHwnd(hWnd); + MakeButtonsFocus(); + DispCurrentWindow(Win); + DispSelectedSpace(); + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + + case WM_KILLFOCUS : + EraseListViewTips(); + MakeButtonsFocus(); + DispCurrentWindow(-1); + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + + case WM_DROPFILES : + // ƒhƒ‰ƒbƒO’†‚͏ˆ—‚µ‚È‚¢Bƒhƒ‰ƒbƒOŒã‚ÉWM_LBUTTONDOWN‚ª”ò‚ñ‚Å‚­‚邽‚߁A‚»‚±‚ŏˆ—‚·‚éB + if (Dragging == YES) + return (FALSE); + + if(hWnd == hWndListRemote) + { + if(AskConnecting() == YES) + UpLoadDragProc(wParam); + } + else if(hWnd == hWndListLocal) + { + ChangeDirDropFileProc(wParam); + } + break; + + case WM_LBUTTONDOWN : + EraseListViewTips(); + SetFocus(hWnd); + DragPoint.x = LOWORD(lParam); + DragPoint.y = HIWORD(lParam); + hWndDragStart = hWnd; + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + break; + + case WM_LBUTTONUP : + if(Dragging == YES) + { + Dragging = NO; + ReleaseCapture(); + hCsrDrg = LoadCursor(NULL, IDC_ARROW); + SetCursor(hCsrDrg); + + Point.x = (long)(short)LOWORD(lParam); + Point.y = (long)(short)HIWORD(lParam); + ClientToScreen(hWnd, &Point); + hWndPnt = WindowFromPoint(Point); + if(hWndPnt == hWndDst) // local <-> remote + { + if(hWndPnt == hWndListRemote) { + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0); + } else if(hWndPnt == hWndListLocal) { + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0); + } + } else { // “¯ˆêƒEƒBƒ“ƒhƒE“à‚̏ꍇ (yutaka) + if (hWndDragStart == hWndListRemote && hWndPnt == hWndListRemote) { + // remote <-> remote‚̏ꍇ‚́AƒT[ƒo‚ł̃tƒ@ƒCƒ‹‚̈ړ®‚ðs‚¤B(2007.9.5 yutaka) + if (RemoteDropFileIndex != -1) { + ListView_SetItemState(hWnd, RemoteDropFileIndex, 0, LVIS_DROPHILITED); + MoveRemoteFileProc(RemoteDropFileIndex); + } + + } + + } + } + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + + case WM_DRAGDROP: + // OLE D&D‚ðŠJŽn‚·‚é (yutaka) + doDragDrop(hWnd, message, wParam, lParam); + return (TRUE); + break; + + case WM_GETDATA: // ƒtƒ@ƒCƒ‹‚̃pƒX‚ðD&Dæ‚̃AƒvƒŠ‚Ö•Ô‚· (yutaka) + switch(wParam) + { + case CF_HDROP: /* ƒtƒ@ƒCƒ‹ */ + { + OSVERSIONINFO os_info; + BOOL NTFlag = FALSE; + char **FileNameList; + int filelen; + int i, j, filenum = 0; + + FILELIST *FileListBase, *FileListBaseNoExpand, *pf; + int CancelFlg = NO; + char LocDir[FMAX_PATH+1]; + char *PathDir; + + // ƒ[ƒJƒ‹‘¤‚Å‘I‚΂ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ðFileListBase‚É“o˜^ + if (hWndDragStart == hWndListLocal) { + AskLocalCurDir(LocDir, FMAX_PATH); + PathDir = LocDir; + + FileListBase = NULL; + MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg); + + } else if (hWndDragStart == hWndListRemote) { + GetCursorPos(&Point); + hWndPnt = WindowFromPoint(Point); + hWndParent = GetParent(hWndPnt); + if (hWndPnt == hWndListRemote || hWndPnt == hWndListLocal || + hWndParent == hWndListRemote || hWndParent == hWndListLocal) { + FileListBase = NULL; + + } else { + // ‘I‘ð‚³‚ê‚Ä‚¢‚郊ƒ‚[ƒgƒtƒ@ƒCƒ‹‚̃ŠƒXƒgƒAƒbƒv + // ‚±‚̃^ƒCƒ~ƒ“ƒO‚ŃŠƒ‚[ƒg‚©‚烍[ƒJƒ‹‚̈ꎞƒtƒHƒ‹ƒ_‚Öƒ_ƒEƒ“ƒ[ƒh‚·‚é + // (2007.8.31 yutaka) + doTransferRemoteFile(); + PathDir = remoteFileDir; + FileListBase = remoteFileListBase; + FileListBaseNoExpand = remoteFileListBaseNoExpand; + } + + } + + pf = FileListBaseNoExpand; + for (filenum = 0; pf ; filenum++) { + pf = pf->Next; + } + // ƒtƒ@ƒCƒ‹‚ª–¢‘I‘ð‚̏ꍇ‚͉½‚à‚µ‚È‚¢B(yutaka) + if (filenum <= 0) { + *((HANDLE *)lParam) = NULL; + return (FALSE); + } + + /* ƒtƒ@ƒCƒ‹–¼‚Ì”z—ñ‚ðì¬‚·‚é */ + FileNameList = (char **)GlobalAlloc(GPTR,sizeof(char *) * filenum); + if(FileNameList == NULL){ + abort(); + } + pf = FileListBaseNoExpand; + for (j = 0; pf ; j++) { + filelen = strlen(PathDir) + 1 + strlen(pf->File) + 1; + FileNameList[j] = (char *)GlobalAlloc(GPTR, filelen); + strncpy_s(FileNameList[j], filelen, PathDir, _TRUNCATE); + strncat_s(FileNameList[j], filelen, "\\", _TRUNCATE); + strncat_s(FileNameList[j], filelen, pf->File, _TRUNCATE); + pf = pf->Next; +#if 0 + if (FileListBase->Node == NODE_DIR) { + // ƒtƒHƒ‹ƒ_‚ð’Í‚ñ‚¾ê‡‚Í‚»‚êˆÈ~“WŠJ‚µ‚È‚¢ + filenum = 1; + break; + } +#endif + } + + os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&os_info); + if(os_info.dwPlatformId == VER_PLATFORM_WIN32_NT){ + NTFlag = TRUE; + } + + /* ƒhƒƒbƒvƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̍쐬 */ + /* NT‚̏ꍇ‚ÍUNICODE‚É‚È‚é‚悤‚É‚·‚é */ + *((HANDLE *)lParam) = CreateDropFileMem(FileNameList, filenum, NTFlag); + + /* ƒtƒ@ƒCƒ‹–¼‚Ì”z—ñ‚ð‰ð•ú‚·‚é */ + for (i = 0; i < filenum ; i++) { + GlobalFree(FileNameList[i]); + } + GlobalFree(FileNameList); + + if (hWndDragStart == hWndListLocal) { + DeleteFileList(&FileListBase); + } else { + // ‚ ‚ƂŃtƒ@ƒCƒ‹íœ‚µ‚ătƒŠ[‚·‚é + } + + return (TRUE); + } + break; + + default: + *((HANDLE *)lParam) = NULL; + break; + } + + break; + + case WM_DRAGOVER: + { + LVHITTESTINFO hi; + int Node, index; + static int prev_index = -1; + + // “¯ˆêƒEƒBƒ“ƒhƒE“à‚Å‚ÌD&D‚̓Šƒ‚[ƒg‘¤‚Ì‚Ý + if (Win != WIN_REMOTE) + break; + + if(MoveMode == MOVE_DISABLE) + break; + + memset(&hi, 0, sizeof(hi)); + + GetCursorPos(&Point); + hWndPnt = WindowFromPoint(Point); + ScreenToClient(hWnd, &Point); + + hi.pt = Point; + + // ˆÈ‘O‚Ì‘I‘ð‚ðÁ‚· + ListView_SetItemState(hWnd, prev_index, 0, LVIS_DROPHILITED); + RemoteDropFileIndex = -1; + + if ((hWndPnt == hWndListRemote) && (ListView_HitTest(hWnd, &hi) != -1)) { + if (hi.flags == LVHT_ONITEMLABEL) { // The position is over a list-view item's text. + + index = hi.iItem; + prev_index = index; + Node = GetNodeType(Win, index); + if (Node == NODE_DIR) { + ListView_SetItemState(hWnd, index, LVIS_DROPHILITED, LVIS_DROPHILITED); + RemoteDropFileIndex = index; + } + } + } + + } + break; + + case WM_RBUTTONDOWN : + /* ‚±‚±‚Ńtƒ@ƒCƒ‹‚ð‘I‚Ô */ + CallWindowProc(ProcPtr, hWnd, message, wParam, lParam); + + EraseListViewTips(); + SetFocus(hWnd); + if(hWnd == hWndListRemote) + RemoteRbuttonMenu(0); + else if(hWnd == hWndListLocal) + LocalRbuttonMenu(0); + break; + + case WM_LBUTTONDBLCLK : + DoubleClickProc(Win, NO, -1); + break; + + case WM_MOUSEMOVE : + if(wParam == MK_LBUTTON) + { + if((Dragging == NO) && + (hWnd == hWndDragStart) && + (AskConnecting() == YES) && + (SendMessage(hWnd, LVM_GETSELECTEDCOUNT, 0, 0) > 0) && + ((abs((short)LOWORD(lParam) - DragPoint.x) > 5) || + (abs((short)HIWORD(lParam) - DragPoint.y) > 5))) + { + SetCapture(hWnd); + Dragging = YES; + hCsrDrg = LoadCursor(GetFtpInst(), MAKEINTRESOURCE(drag_csr)); + hCsrNoDrg = LoadCursor(GetFtpInst(), MAKEINTRESOURCE(nodrop_csr)); + SetCursor(hCsrDrg); + } + else if(Dragging == YES) + { + Point.x = (long)(short)LOWORD(lParam); + Point.y = (long)(short)HIWORD(lParam); + ClientToScreen(hWnd, &Point); + hWndPnt = WindowFromPoint(Point); + if((hWndPnt == hWndListRemote) || (hWndPnt == hWndListLocal)) + SetCursor(hCsrDrg); + else { + // ƒ}ƒEƒXƒ|ƒCƒ“ƒ^‚́~•\Ž¦‚ð‚â‚ß‚é (yutaka) +#if 0 + SetCursor(hCsrNoDrg); +#endif + } + + // OLE D&D‚ÌŠJŽn‚ðŽwŽ¦‚·‚é + PostMessage(hWnd, WM_DRAGDROP, MAKEWPARAM(wParam, lParam), 0); + + } + else + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + } + else + { + CheckTipsDisplay(hWnd, lParam); + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + } + break; + + case WM_MOUSEWHEEL : + if(Dragging == NO) + { + short zDelta = (short)HIWORD(wParam); + + EraseListViewTips(); + Point.x = (short)LOWORD(lParam); + Point.y = (short)HIWORD(lParam); + hWndPnt = WindowFromPoint(Point); + + if((wParam & MAKEWPARAM(MK_SHIFT, 0)) && + ((hWndPnt == hWndListRemote) || + (hWndPnt == hWndListLocal) || + (hWndPnt == GetTaskWnd()))) + { + PostMessage(hWndPnt, WM_VSCROLL, zDelta > 0 ? MAKEWPARAM(SB_PAGEUP, 0) : MAKEWPARAM(SB_PAGEDOWN, 0), 0); +// PostMessage(hWndPnt, WM_VSCROLL, MAKEWPARAM(SB_ENDSCROLL, 0), 0); + } + else if(hWndPnt == hWnd) + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + else if((hWndPnt == hWndDst) || (hWndPnt == GetTaskWnd())) + PostMessage(hWndPnt, message, wParam, lParam); + } + break; + + default : + return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); + } + return(0L); +} + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̃^ƒu•‚ðŽæ“¾‚·‚é -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void GetListTabWidth(void) +{ + LV_COLUMN LvCol; + int i; + + for(i = 0; i <= 3; i++) + { + LvCol.mask = LVCF_WIDTH; + if(SendMessage(hWndListLocal, LVM_GETCOLUMN, i, (LPARAM)&LvCol) == TRUE) + LocalTabWidth[i] = LvCol.cx; + } + + for(i = 0; i <= 5; i++) + { + LvCol.mask = LVCF_WIDTH; + if(SendMessage(hWndListRemote, LVM_GETCOLUMN, i, (LPARAM)&LvCol) == TRUE) + RemoteTabWidth[i] = LvCol.cx; + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——•û–@‚É‚µ‚½‚ª‚Á‚ăŠƒXƒgƒrƒ…[‚ðÝ’è‚·‚é -------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetListViewType(void) +{ + long lStyle; + + switch(ListType) + { + case LVS_LIST : + lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE); + lStyle &= ~(LVS_REPORT | LVS_LIST); + lStyle |= LVS_LIST; + SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle); + + lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE); + lStyle &= ~(LVS_REPORT | LVS_LIST); + lStyle |= LVS_LIST; + SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle); + break; + + default : + lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE); + lStyle &= ~(LVS_REPORT | LVS_LIST); + lStyle |= LVS_REPORT; + SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle); + + lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE); + lStyle &= ~(LVS_REPORT | LVS_LIST); + lStyle |= LVS_REPORT; + SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle); + break; + } + return; +} + + +/*----- ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚Ƀtƒ@ƒCƒ‹–¼‚ðƒZƒbƒg ------------------ +* +* Parameter +* int Mode : ƒLƒƒƒbƒVƒ…ƒ‚[ƒh (CACHE_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void GetRemoteDirForWnd(int Mode, int *CancelCheckWork) +{ + FILE *fd; + LONGLONG Size; + char Str[FMAX_PATH+1]; + char Buf[FMAX_PATH+1]; + FILETIME Time; + int Attr; + int Type; + int ListType; + int Num; + FLISTANCHOR Anchor; + char Owner[OWNER_NAME_LEN+1]; + int Link; + int InfoExist; + +//#pragma aaa +//DoPrintf("===== GetRemoteDirForWnd"); + + Anchor.Top = NULL; + Anchor.Files = 0; + + if(AskConnecting() == YES) + { +// SetCursor(LoadCursor(NULL, IDC_WAIT)); + DisableUserOpe(); + + AskRemoteCurDir(Buf, FMAX_PATH); + SetRemoteDirHist(Buf); + + Type = FTP_COMPLETE; + if(Mode != CACHE_LASTREAD) + { + + if((Num = AskCached(Buf)) == -1) + { + Num = AskFreeCache(); + Mode = CACHE_REFRESH; + } + + if(Mode == CACHE_REFRESH) + { + if((Type = DoDirListCmdSkt("", "", Num, CancelCheckWork)) == FTP_COMPLETE) + SetCache(Num, Buf); + else + ClearCache(Num); + } + } + else + Num = AskCurrentFileListNum(); + + if(Type == FTP_COMPLETE) + { + SetCurrentFileListNum(Num); + MakeCacheFileName(Num, Buf); + if((fd = fopen(Buf, "rb"))!=NULL) + { + ListType = LIST_UNKNOWN; + + while(GetListOneLine(Str, FMAX_PATH, fd) == SUCCESS) + { + if((ListType = AnalizeFileInfo(Str)) != LIST_UNKNOWN) + { + if((Type = ResolvFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE) + { + if(AskFilterStr(Buf, Type) == YES) + { + if((DotFile == YES) || (Buf[0] != '.')) + { + AddDispFileList(&Anchor, Buf, &Time, Size, Attr, Type, Link, Owner, InfoExist, WIN_REMOTE); + } + } + } + } + } + fclose(fd); + + DispFileList2View(GetRemoteHwnd(), &Anchor); + EraseDispFileList(&Anchor); + + // æ“ª‚̃AƒCƒeƒ€‚ð‘I‘ð + ListView_SetItemState(GetRemoteHwnd(), 0, LVIS_FOCUSED, LVIS_FOCUSED); + } + else + { + SetTaskMsg(MSGJPN048); + SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0); + } + } + else + { +#if defined(HAVE_OPENVMS) + /* OpenVMS‚̏ꍇ‹óƒfƒBƒŒƒNƒgƒŠˆÚ“®‚ÌŽž‚ɏo‚é‚̂ŁAƒƒbƒZ[ƒW‚¾‚¯o‚³‚È‚¢ + * ‚悤‚É‚·‚é(VIEW‚̓NƒŠƒA‚µ‚Ä—Ç‚¢) */ + if (AskHostType() != HTYPE_VMS) +#endif + SetTaskMsg(MSGJPN049); + SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0); + } + +// SetCursor(LoadCursor(NULL, IDC_ARROW)); + EnableUserOpe(); + + } + +//#pragma aaa +//DoPrintf("===== GetRemoteDirForWnd Done"); + + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚Ƀtƒ@ƒCƒ‹–¼‚ðƒZƒbƒg ---------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void GetLocalDirForWnd(void) +{ + HANDLE fHnd; + WIN32_FIND_DATA Find; + char Scan[FMAX_PATH+1]; + char *Pos; + char Buf[10]; + FILETIME Time; + FLISTANCHOR Anchor; + DWORD NoDrives; + int Tmp; + + Anchor.Top = NULL; + Anchor.Files = 0; + + DoLocalPWD(Scan); + SetLocalDirHist(Scan); + DispLocalFreeSpace(Scan); + + /* ƒfƒBƒŒƒNƒgƒŠ^ƒtƒ@ƒCƒ‹ */ + + SetYenTail(Scan); + strcat(Scan, "*"); + if((fHnd = FindFirstFileAttr(Scan, &Find, DispIgnoreHide)) != INVALID_HANDLE_VALUE) + { + do + { + if((strcmp(Find.cFileName, ".") != 0) && + (strcmp(Find.cFileName, "..") != 0)) + { + if((DotFile == YES) || (Find.cFileName[0] != '.')) + { + if(Find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + AddDispFileList(&Anchor, Find.cFileName, &Find.ftLastWriteTime, MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow), 0, NODE_DIR, NO, "", FINFO_ALL, WIN_LOCAL); + else + { + if(AskFilterStr(Find.cFileName, NODE_FILE) == YES) + { + AddDispFileList(&Anchor, Find.cFileName, &Find.ftLastWriteTime, MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow), 0, NODE_FILE, NO, "", FINFO_ALL, WIN_LOCAL); + } + } + } + } + } + while(FindNextFileAttr(fHnd, &Find, DispIgnoreHide) == TRUE); + FindClose(fHnd); + } + + /* ƒhƒ‰ƒCƒu */ + if(DispDrives) + { + GetLogicalDriveStrings(FMAX_PATH, Scan); + NoDrives = LoadHideDriveListRegistory(); + + Pos = Scan; + while(*Pos != NUL) + { + Tmp = toupper(*Pos) - 'A'; + if((NoDrives & (0x00000001 << Tmp)) == 0) + { + sprintf(Buf, "%s", Pos); + memset(&Time, 0, sizeof(FILETIME)); + AddDispFileList(&Anchor, Buf, &Time, 0, 0, NODE_DRIVE, NO, "", FINFO_ALL, WIN_LOCAL); + } + Pos = strchr(Pos, NUL) + 1; + } + } + + DispFileList2View(GetLocalHwnd(), &Anchor); + EraseDispFileList(&Anchor); + + // æ“ª‚̃AƒCƒeƒ€‚ð‘I‘ð + ListView_SetItemState(GetLocalHwnd(), 0, LVIS_FOCUSED, LVIS_FOCUSED); + + return; +} + + +/*----- ƒtƒ@ƒCƒ‹î•ñ‚ðƒtƒ@ƒCƒ‹ˆê———pƒŠƒXƒg‚É“o˜^‚·‚é -------------------------- +* +* Parameter +* FLISTANCHOR *Anchor : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* char *Name : ƒtƒ@ƒCƒ‹–¼ +* FILETIME *Time : “ú•t +* LONGLONG Size : ƒTƒCƒY +* int Attr : ‘®« +* int Type : ƒ^ƒCƒv (NODE_xxxx) +* int Link : ƒŠƒ“ƒN‚©‚Ç‚¤‚© (YES/NO) +* char *Owner : ƒI[ƒi–¼ +* int InfoExist : î•ñ‚ª‚ ‚é‚©‚Ç‚¤‚© (FINFO_xxx) +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win) +{ + int i; + FILELIST *Pos; + FILELIST *Prev; + FILELIST *New; + int FileSort; + int DirSort; + int Sort; + LONGLONG Cmp; + + FileSort = AskSortType(ITEM_LFILE); + DirSort = AskSortType(ITEM_LDIR); + if(Win == WIN_REMOTE) + { + FileSort = AskSortType(ITEM_RFILE); + DirSort = AskSortType(ITEM_RDIR); + } + + Pos = Anchor->Top; + for(i = 0; i < Anchor->Files; i++) + { + if((Type == NODE_DIR) && (Pos->Node == NODE_FILE)) + break; + if((Type == NODE_FILE) && (Pos->Node == NODE_DRIVE)) + break; + + if(Type == Pos->Node) + { + if(Type == NODE_DIR) + Sort = DirSort; + else + Sort = FileSort; + + if((Sort & SORT_GET_ORD) == SORT_ASCENT) + { + if((((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) || + (((Sort & SORT_MASK_ORD) == SORT_SIZE) && + ((Cmp = Size - Pos->Size) < 0)) || + (((Sort & SORT_MASK_ORD) == SORT_DATE) && + ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0))) + { + break; + } + + if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0)) + { + if(_mbsicmp(Name, Pos->File) < 0) + break; + } + } + else + { + if((((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) || + (((Sort & SORT_MASK_ORD) == SORT_SIZE) && + ((Cmp = Size - Pos->Size) > 0)) || + (((Sort & SORT_MASK_ORD) == SORT_DATE) && + ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))) + { + break; + } + + if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0)) + { + if(_mbsicmp(Name, Pos->File) > 0) + break; + } + } + } + Prev = Pos; + Pos = Pos->Next; + } + + if((New = malloc(sizeof(FILELIST))) != NULL) + { + strcpy(New->File, Name); + New->Node = Type; + New->Link = Link; + New->Size = Size; + New->Attr = Attr; + New->Time = *Time; + strcpy(New->Owner, Owner); + New->InfoExist = InfoExist; + + if(Pos == Anchor->Top) + { + New->Next = Anchor->Top; + Anchor->Top = New; + } + else + { + New->Next = Prev->Next; + Prev->Next = New; + } + Anchor->Files += 1; + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê———pƒŠƒXƒg‚ðƒNƒŠƒA‚·‚é -------------------------------------- +* +* Parameter +* FLISTANCHOR *Anchor : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EraseDispFileList(FLISTANCHOR *Anchor) +{ + FILELIST *Pos; + FILELIST *Next; + int i; + + Pos = Anchor->Top; + for(i = 0; i < Anchor->Files; i++) + { + Next = Pos->Next; + free(Pos); + Pos = Next; + } + Anchor->Files = 0; + Anchor->Top = NULL; + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê———pƒŠƒXƒg‚Ì“à—e‚ðƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚ɃZƒbƒg ------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* FLISTANCHOR *Anchor : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor) +{ + int i; + FILELIST *Pos; + + SendMessage(hWnd, WM_SETREDRAW, (WPARAM)FALSE, 0); + SendMessage(hWnd, LVM_DELETEALLITEMS, 0, 0); + + Pos = Anchor->Top; + for(i = 0; i < Anchor->Files; i++) + { + AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist); + Pos = Pos->Next; + } + + SendMessage(hWnd, WM_SETREDRAW, (WPARAM)TRUE, 0); + UpdateWindow(hWnd); + + DispSelectedSpace(); + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒEiƒŠƒXƒgƒrƒ…[j‚ɒljÁ -------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Pos : ‘}“üˆÊ’u +* char *Name : –¼‘O +* int Type : ƒ^ƒCƒv (NIDE_xxxx) +* LONGLONG Size : ƒTƒCƒY +* FILETIME *Time : “ú•t +* int Attr : ‘®« +* char Owner : ƒI[ƒi–¼ +* int Link : ƒŠƒ“ƒN‚©‚Ç‚¤‚© +* int InfoExist : î•ñ‚ª‚ ‚é‚©‚Ç‚¤‚© (FINFO_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist) +{ + LV_ITEM LvItem; + char Tmp[20]; + + if(Pos == -1) + Pos = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0); + + /* ƒAƒCƒRƒ“/ƒtƒ@ƒCƒ‹–¼ */ + LvItem.mask = LVIF_TEXT | LVIF_IMAGE; + LvItem.iItem = Pos; + LvItem.iSubItem = 0; + LvItem.pszText = Name; + if((Type == NODE_FILE) && (AskTransferTypeAssoc(Name, TYPE_X) == TYPE_I)) + Type = 3; + if(Link == NO) + LvItem.iImage = Type; + else + LvItem.iImage = 4; + LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem); + + /* “ú•t/Žž */ + FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist); + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 1; + LvItem.pszText = Tmp; + LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); + + /* ƒTƒCƒY */ + if(Type == NODE_DIR) + strcpy(Tmp, ""); + else if(Type == NODE_DRIVE) + strcpy(Tmp, ""); + else if(Size >= 0) + MakeNumString(Size, Tmp, TRUE); + else + strcpy(Tmp, ""); + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 2; + LvItem.pszText = Tmp; + LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); + + /* Šg’£Žq */ + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 3; + LvItem.pszText = GetFileExt(Name); + LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); + + if(hWnd == GetRemoteHwnd()) + { + /* ‘®« */ + strcpy(Tmp, ""); + if(InfoExist & FINFO_ATTR) + AttrValue2String(Attr, Tmp); + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 4; + LvItem.pszText = Tmp; + LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); + + /* ƒI[ƒi–¼ */ + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 5; + LvItem.pszText = Owner; + LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹–¼ˆê——ƒEƒCƒ“ƒhƒE‚ðƒ\[ƒg‚µ’¼‚· -------------------------------- +* +* Parameter +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ReSortDispList(int Win, int *CancelCheckWork) +{ + if(Win == WIN_REMOTE) + GetRemoteDirForWnd(CACHE_LASTREAD, CancelCheckWork); + else + GetLocalDirForWnd(); + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚̃tƒ@ƒCƒ‹‚ð‘I‘ð‚·‚é ---------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Type : ‘I‘ð•û–@ (SELECT_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SelectFileInList(HWND hWnd, int Type) +{ + int Win; + int WinDst; + int i; + int Num; + char RegExp[FMAX_PATH+1]; + char Name[FMAX_PATH+1]; + LV_ITEM LvItem; + int CsrPos; + FILETIME Time1; + FILETIME Time2; + int Find; + + Win = WIN_LOCAL; + WinDst = WIN_REMOTE; + if(hWnd == GetRemoteHwnd()) + { + Win = WIN_REMOTE; + WinDst = WIN_LOCAL; + } + + Num = GetItemCount(Win); + switch(Type) + { + case SELECT_ALL : + LvItem.state = 0; + if(GetSelectedCount(Win) <= 1) + LvItem.state = LVIS_SELECTED; + for(i = 0; i < Num; i++) + { + if(GetNodeType(Win, i) != NODE_DRIVE) + { + LvItem.mask = LVIF_STATE; + LvItem.iItem = i; + LvItem.stateMask = LVIS_SELECTED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem); + } + } + break; + + case SELECT_REGEXP : + if(((Win == WIN_LOCAL) && + (DialogBox(GetFtpInst(), MAKEINTRESOURCE(sel_local_dlg), hWnd, SelectDialogCallBack) == YES)) || + ((Win == WIN_REMOTE) && + (DialogBox(GetFtpInst(), MAKEINTRESOURCE(sel_remote_dlg), hWnd, SelectDialogCallBack) == YES))) + { + strcpy(RegExp, FindStr); +// if(FindMode == 0) +// WildCard2RegExp(RegExp); + + _mbslwr(RegExp); + if((FindMode == 0) || (JreCompileStr(RegExp) == TRUE)) + { + CsrPos = -1; + for(i = 0; i < Num; i++) + { + GetNodeName(Win, i, Name, FMAX_PATH); + Find = FindNameNode(WinDst, Name); + + _mbslwr(Name); + LvItem.state = 0; + if(GetNodeType(Win, i) != NODE_DRIVE) + { + if(((FindMode == 0) && (CheckFname(Name, RegExp) == SUCCESS)) || + ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL))) + { + LvItem.state = LVIS_SELECTED; + + if(Find >= 0) + { + if(IgnoreExist == YES) + LvItem.state = 0; + + if((LvItem.state != 0) && (IgnoreNew == YES)) + { + GetNodeTime(Win, i, &Time1); + GetNodeTime(WinDst, Find, &Time2); + if(CompareFileTime(&Time1, &Time2) > 0) + LvItem.state = 0; + } + + if((LvItem.state != 0) && (IgnoreOld == YES)) + { + GetNodeTime(Win, i, &Time1); + GetNodeTime(WinDst, Find, &Time2); + if(CompareFileTime(&Time1, &Time2) < 0) + LvItem.state = 0; + } + } + } + } + + if((LvItem.state != 0) && (CsrPos == -1)) + CsrPos = i; + + LvItem.mask = LVIF_STATE; + LvItem.iItem = i; + LvItem.stateMask = LVIS_SELECTED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem); + } + if(CsrPos != -1) + { + LvItem.mask = LVIF_STATE; + LvItem.iItem = CsrPos; + LvItem.state = LVIS_FOCUSED; + LvItem.stateMask = LVIS_FOCUSED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, CsrPos, (LPARAM)&LvItem); + SendMessage(hWnd, LVM_ENSUREVISIBLE, CsrPos, (LPARAM)TRUE); + } + } + } + break; + } + return; +} + + +/*----- ‘I‘ðƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, SEL_FNAME, EM_LIMITTEXT, 40, 0); + SendDlgItemMessage(hDlg, SEL_FNAME, WM_SETTEXT, 0, (LPARAM)FindStr); + SendDlgItemMessage(hDlg, SEL_REGEXP, BM_SETCHECK, FindMode, 0); + SendDlgItemMessage(hDlg, SEL_NOOLD, BM_SETCHECK, IgnoreOld, 0); + SendDlgItemMessage(hDlg, SEL_NONEW, BM_SETCHECK, IgnoreNew, 0); + SendDlgItemMessage(hDlg, SEL_NOEXIST, BM_SETCHECK, IgnoreExist, 0); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, SEL_FNAME, WM_GETTEXT, 40+1, (LPARAM)FindStr); + FindMode = SendDlgItemMessage(hDlg, SEL_REGEXP, BM_GETCHECK, 0, 0); + IgnoreOld = SendDlgItemMessage(hDlg, SEL_NOOLD, BM_GETCHECK, 0, 0); + IgnoreNew = SendDlgItemMessage(hDlg, SEL_NONEW, BM_GETCHECK, 0, 0); + IgnoreExist = SendDlgItemMessage(hDlg, SEL_NOEXIST, BM_GETCHECK, 0, 0); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000061); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚̃tƒ@ƒCƒ‹‚ðŒŸõ‚·‚é ---------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Type : ŒŸõ•û–@ (FIND_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void FindFileInList(HWND hWnd, int Type) +{ + int Win; + int i; + int Num; + static char RegExp[FMAX_PATH+1] = { "" }; + char Name[FMAX_PATH+1]; + LV_ITEM LvItem; + char *Title; + + Win = WIN_LOCAL; + Title = MSGJPN050; + if(hWnd == GetRemoteHwnd()) + { + Win = WIN_REMOTE; + Title = MSGJPN051; + } + + Num = GetItemCount(Win); + switch(Type) + { + case FIND_FIRST : + if(InputDialogBox(find_dlg, hWnd, Title, FindStr, 40+1, &FindMode, IDH_HELP_TOPIC_0000001) == YES) + { + strcpy(RegExp, FindStr); +// if(FindMode == 0) +// WildCard2RegExp(RegExp); + + _mbslwr(RegExp); + if((FindMode == 0) || (JreCompileStr(RegExp) == TRUE)) + { + for(i = GetCurrentItem(Win)+1; i < Num; i++) + { + GetNodeName(Win, i, Name, FMAX_PATH); + _mbslwr(Name); + + LvItem.state = 0; + if(((FindMode == 0) && (CheckFname(Name, RegExp) == SUCCESS)) || + ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL))) + { + LvItem.mask = LVIF_STATE; + LvItem.iItem = i; + LvItem.state = LVIS_FOCUSED; + LvItem.stateMask = LVIS_FOCUSED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem); + SendMessage(hWnd, LVM_ENSUREVISIBLE, i, (LPARAM)TRUE); + break; + } + } + } + } + break; + + case FIND_NEXT : + for(i = GetCurrentItem(Win)+1; i < Num; i++) + { + GetNodeName(Win, i, Name, FMAX_PATH); + _mbslwr(Name); + + LvItem.state = 0; + if(((FindMode == 0) && (CheckFname(Name, RegExp) == SUCCESS)) || + ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL))) + { + LvItem.mask = LVIF_STATE; + LvItem.iItem = i; + LvItem.state = LVIS_FOCUSED; + LvItem.stateMask = LVIS_FOCUSED; + LvItem.iSubItem = 0; + SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem); + SendMessage(hWnd, LVM_ENSUREVISIBLE, i, (LPARAM)TRUE); + break; + } + } + break; + } + return; +} + + +#if 0 +/*----- ƒƒCƒ‹ƒhƒJ[ƒh‚𐳋K•\Œ»‚É•ÏŠ·‚·‚é ------------------------------------ +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void WildCard2RegExp(char *Str) +{ + char Tmp[FMAX_PATH+1]; + char *Org; + char *Pos; + UINT Ch; + + Org = Str; + Pos = Tmp; + + *Pos++ = '^'; + *Pos++ = '('; + while(*Str != NUL) + { + if(Pos >= Tmp + FMAX_PATH - 3) + break; + + Ch = _mbsnextc(Str); + Str = _mbsinc(Str); + + if(Ch <= 0x7F) + { + if(strchr("[]()^$.+", Ch) != NULL) + { + *Pos++ = '\\'; + *Pos++ = Ch; + } + else if(Ch == '*') + { + *Pos++ = '.'; + *Pos++ = '*'; + } + else if(Ch == '?') + *Pos++ = '.'; + else if(Ch == '|') + { + *Pos++ = '|'; + } + else + *Pos++ = Ch; + } + else + { + _mbsnset(Pos, Ch, 1); + Pos = _mbsinc(Pos); + } + } + *Pos++ = ')'; + *Pos++ = '$'; + *Pos = NUL; + strcpy(Org, Tmp); + + return; +} +#endif + + +/*----- ƒJ[ƒ\ƒ‹ˆÊ’u‚̃AƒCƒeƒ€”ԍ†‚ð•Ô‚· -------------------------------------- +* +* Parameter +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* +* Return Value +* int ƒAƒCƒeƒ€”ԍ† +*----------------------------------------------------------------------------*/ + +int GetCurrentItem(int Win) +{ + HWND hWnd; + int Ret; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + if((Ret = SendMessage(hWnd, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_ALL | LVNI_FOCUSED, 0))) == -1) + Ret = 0; + + return(Ret); +} + + +/*----- ƒAƒCƒeƒ€”‚ð•Ô‚· ------------------------------------------------------ +* +* Parameter +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* +* Return Value +* int ƒAƒCƒeƒ€” +*----------------------------------------------------------------------------*/ + +int GetItemCount(int Win) +{ + HWND hWnd; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + return(SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0)); +} + + +/*----- ‘I‘ð‚³‚ê‚Ä‚¢‚éƒAƒCƒeƒ€”‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* +* Return Value +* int ‘I‘ð‚³‚ê‚Ä‚¢‚éƒAƒCƒeƒ€” +*----------------------------------------------------------------------------*/ + +int GetSelectedCount(int Win) +{ + HWND hWnd; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + return(SendMessage(hWnd, LVM_GETSELECTEDCOUNT, 0, 0)); +} + + +/*----- ‘I‘ð‚³‚ê‚Ä‚¢‚éÅ‰‚̃AƒCƒeƒ€”ԍ†‚ð•Ô‚· -------------------------------- +* +* Parameter +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* int All : ‘I‚΂ê‚Ä‚¢‚È‚¢‚à‚Ì‚ðŠÜ‚ß‚é +* +* Return Value +* int ƒAƒCƒeƒ€”ԍ† +* -1 = ‘I‘ð‚³‚ê‚Ä‚¢‚È‚¢ +*----------------------------------------------------------------------------*/ + +int GetFirstSelected(int Win, int All) +{ + HWND hWnd; + int Ope; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + Ope = LVNI_SELECTED; + if(All == YES) + Ope = LVNI_ALL; + + return(SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(Ope, 0))); +} + + +/*----- ‘I‘ð‚³‚ê‚Ä‚¢‚鎟‚̃AƒCƒeƒ€”ԍ†‚ð•Ô‚· ---------------------------------- +* +* Parameter +* int Win : ƒEƒBƒ“ƒhƒE”ԍ† (WIN_xxxx) +* int Pos : ¡‚̃AƒCƒeƒ€”ԍ† +* int All : ‘I‚΂ê‚Ä‚¢‚È‚¢‚à‚Ì‚àŠÜ‚ß‚é +* +* Return Value +* int ƒAƒCƒeƒ€”ԍ† +* -1 = ‘I‘ð‚³‚ê‚Ä‚¢‚È‚¢ +*----------------------------------------------------------------------------*/ + +int GetNextSelected(int Win, int Pos, int All) +{ + HWND hWnd; + int Ope; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + Ope = LVNI_SELECTED; + if(All == YES) + Ope = LVNI_ALL; + + return(SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)Pos, (LPARAM)MAKELPARAM(Ope, 0))); +} + + +/*----- Žw’肳‚ꂽ–¼‘O‚̃AƒCƒeƒ€‚ð’T‚· ---------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* char *Name : –¼‘O +* +* Return Value +* int ƒAƒCƒeƒ€”ԍ† +* -1=Œ©‚‚©‚ç‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +int FindNameNode(int Win, char *Name) +{ + LV_FINDINFO FindInfo; + HWND hWnd; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + FindInfo.flags = LVFI_STRING; + FindInfo.psz = Name; + return(SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)&FindInfo)); +} + + +/*----- Žw’èˆÊ’u‚̃AƒCƒeƒ€‚Ì–¼‘O‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Pos : ˆÊ’u +* char *Buf : –¼‘O‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void GetNodeName(int Win, int Pos, char *Buf, int Max) +{ + HWND hWnd; + LV_ITEM LvItem; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 0; + LvItem.pszText = Buf; + LvItem.cchTextMax = Max; + SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); + return; +} + + +/*----- Žw’èˆÊ’u‚̃AƒCƒeƒ€‚Ì“ú•t‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Pos : ˆÊ’u +* FILETIME *Buf : “ú•t‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO=“ú•tî•ñ‚ª‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +int GetNodeTime(int Win, int Pos, FILETIME *Buf) +{ + HWND hWnd; + LV_ITEM LvItem; + char Tmp[20]; + int Ret; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 1; + LvItem.pszText = Tmp; + LvItem.cchTextMax = 20; + SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); + Ret = TimeString2FileTime(Tmp, Buf); + return(Ret); +} + + +/*----- Žw’èˆÊ’u‚̃AƒCƒeƒ€‚̃TƒCƒY‚ð•Ô‚· -------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Pos : ˆÊ’u +* int *Buf : ƒTƒCƒY‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO=ƒTƒCƒYî•ñ‚ª‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +int GetNodeSize(int Win, int Pos, LONGLONG *Buf) +{ + HWND hWnd; + LV_ITEM LvItem; + char Tmp[40]; + int Ret; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 2; + LvItem.pszText = Tmp; + LvItem.cchTextMax = 20; + SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); + *Buf = -1; + Ret = NO; + if(strlen(Tmp) > 0) + { + RemoveComma(Tmp); + *Buf = _atoi64(Tmp); + Ret = YES; + } + return(Ret); +} + + +/*----- Žw’èˆÊ’u‚̃AƒCƒeƒ€‚Ì‘®«‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Pos : ˆÊ’u +* int *Buf : ‘®«‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO=ƒTƒCƒYî•ñ‚ª‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +int GetNodeAttr(int Win, int Pos, int *Buf) +{ + LV_ITEM LvItem; + char Tmp[20]; + int Ret; + + *Buf = 0; + Ret = NO; + if(Win == WIN_REMOTE) + { + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 4; + LvItem.pszText = Tmp; + LvItem.cchTextMax = 20; + SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem); + if(strlen(Tmp) > 0) + { + *Buf = AttrString2Value(Tmp); + Ret = YES; + } + } + return(Ret); +} + + +/*----- Žw’èˆÊ’u‚̃AƒCƒeƒ€‚̃^ƒCƒv‚ð•Ô‚· -------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Pos : ˆÊ’u +* +* Return Value +* int ƒ^ƒCƒv (NODE_xxx) +*----------------------------------------------------------------------------*/ + +int GetNodeType(int Win, int Pos) +{ + char Tmp[20]; + LV_ITEM LvItem; + int Ret; + HWND hWnd; + + hWnd = GetLocalHwnd(); + if(Win == WIN_REMOTE) + hWnd = GetRemoteHwnd(); + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 2; + LvItem.pszText = Tmp; + LvItem.cchTextMax = 20; + SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); + + if(strcmp(Tmp, "") == 0) + Ret = NODE_DIR; + else if(strcmp(Tmp, "") == 0) + Ret = NODE_DRIVE; + else + Ret = NODE_FILE; + + return(Ret); +} + + +/*----- Žw’èˆÊ’u‚̃AƒCƒeƒ€‚̃I[ƒi–¼‚ð•Ô‚· ------------------------------------ +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Pos : ˆÊ’u +* char *Buf : ƒI[ƒi–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void GetNodeOwner(int Win, int Pos, char *Buf, int Max) +{ + LV_ITEM LvItem; + + strcpy(Buf, ""); + if(Win == WIN_REMOTE) + { + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Pos; + LvItem.iSubItem = 5; + LvItem.pszText = Buf; + LvItem.cchTextMax = Max; + SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem); + } + return; +} + + +/*----- ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚ðƒNƒŠƒA ------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void EraseRemoteDirForWnd(void) +{ + SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0); + SendMessage(GetRemoteHistHwnd(), CB_RESETCONTENT, 0, 0); + return; +} + + +/*----- ‘I‘ð‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚Ì‘ƒTƒCƒY‚ð•Ô‚· -------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* +* Return Value +* double ƒTƒCƒY +*----------------------------------------------------------------------------*/ + +double GetSelectedTotalSize(int Win) +{ + double Ret; + LONGLONG Size; + int Pos; + + Ret = 0; + if(GetSelectedCount(Win) > 0) + { + Pos = GetFirstSelected(Win, NO); + while(Pos != -1) + { + GetNodeSize(Win, Pos, &Size); + if(Size >= 0) + Ret += Size; + Pos = GetNextSelected(Win, Pos, NO); + } + } + return(Ret); +} + + + +/*=================================================================== + +===================================================================*/ + + + +/*----- ƒtƒ@ƒCƒ‹ˆê——‚Å‘I‚΂ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ðƒŠƒXƒg‚É“o˜^‚·‚é ------------------ +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Expand : ƒTƒuƒfƒBƒŒƒNƒgƒŠ‚ð“WŠJ‚·‚é (YES/NO) +* int All : ‘I‚΂ê‚Ä‚¢‚È‚¢‚à‚Ì‚à‚·‚ׂēo˜^‚·‚é (YES/NO) +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork) +{ + int Pos; + char Name[FMAX_PATH+1]; + char Cur[FMAX_PATH+1]; + FILELIST Pkt; + int Node; + DWORD Attr; + int Ignore; + + if((All == YES) || (GetSelectedCount(Win) > 0)) + { + /*===== ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚̃tƒ@ƒCƒ‹ =====*/ + + Pos = GetFirstSelected(Win, All); + while(Pos != -1) + { + Node = GetNodeType(Win, Pos); + if((Node == NODE_FILE) || + ((Expand == NO) && (Node == NODE_DIR))) + { + Pkt.InfoExist = 0; + GetNodeName(Win, Pos, Pkt.File, FMAX_PATH); + if(GetNodeSize(Win, Pos, &Pkt.Size) == YES) + Pkt.InfoExist |= FINFO_SIZE; + if(GetNodeAttr(Win, Pos, &Pkt.Attr) == YES) + Pkt.InfoExist |= FINFO_ATTR; + if(GetNodeTime(Win, Pos, &Pkt.Time) == YES) + Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE); + Pkt.Node = Node; + + Ignore = NO; + if((DispIgnoreHide == YES) && (Win == WIN_LOCAL)) + { + AskLocalCurDir(Cur, FMAX_PATH); + SetYenTail(Cur); + strcat(Cur, Pkt.File); + Attr = GetFileAttributes(Cur); + if((Attr != 0xFFFFFFFF) && (Attr & FILE_ATTRIBUTE_HIDDEN)) + Ignore = YES; + } + + if(Ignore == NO) + AddFileList(&Pkt, Base); + } + Pos = GetNextSelected(Win, Pos, All); + } + + if(Expand == YES) + { + /*===== ƒfƒBƒŒƒNƒgƒŠƒcƒŠ[ =====*/ + + Pos = GetFirstSelected(Win, All); + while(Pos != -1) + { + if(GetNodeType(Win, Pos) == NODE_DIR) + { + GetNodeName(Win, Pos, Name, FMAX_PATH); + strcpy(Pkt.File, Name); + ReplaceAll(Pkt.File, '\\', '/'); +//8/26 + + Ignore = NO; + if((DispIgnoreHide == YES) && (Win == WIN_LOCAL)) + { + AskLocalCurDir(Cur, FMAX_PATH); + SetYenTail(Cur); + strcat(Cur, Pkt.File); + ReplaceAll(Cur, '/', '\\'); + Attr = GetFileAttributes(Cur); + if((Attr != 0xFFFFFFFF) && (Attr & FILE_ATTRIBUTE_HIDDEN)) + Ignore = YES; + } + + if(Ignore == NO) + { + Pkt.Node = NODE_DIR; + Pkt.Attr = 0; + Pkt.Size = 0; + memset(&Pkt.Time, 0, sizeof(FILETIME)); + AddFileList(&Pkt, Base); + + if(Win == WIN_LOCAL) + MakeLocalTree(Name, Base); + else + { + AskRemoteCurDir(Cur, FMAX_PATH); + + if((AskListCmdMode() == NO) && + (AskUseNLST_R() == YES)) + MakeRemoteTree1(Name, Cur, Base, CancelCheckWork); + else + MakeRemoteTree2(Name, Cur, Base, CancelCheckWork); + +//DispListList(*Base, "LIST"); + + } + } + } + Pos = GetNextSelected(Win, Pos, All); + } + } + } + return; +} + + +/* ƒfƒoƒbƒO—p */ +/* ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì“à—e‚ð•\Ž¦ */ +static void DispListList(FILELIST *Pos, char *Title) +{ + DoPrintf("############ %s ############", Title); + while(Pos != NULL) + { + DoPrintf("%d %s", Pos->Node, Pos->File); + Pos = Pos->Next; + } + DoPrintf("############ END ############"); + return; +} + + +/*----- Drag&Drop‚³‚ꂽƒtƒ@ƒCƒ‹‚ðƒŠƒXƒg‚É“o˜^‚·‚é ----------------------------- +* +* Parameter +* WPARAM wParam : ƒhƒƒbƒv‚³‚ꂽƒtƒ@ƒCƒ‹‚̏î•ñ +* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ð•Ô‚·ƒoƒbƒtƒ@ +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base) +{ + int Max; + int i; + char Name[FMAX_PATH+1]; + char Tmp[FMAX_PATH+1]; + FILELIST Pkt; + HANDLE fHnd; + WIN32_FIND_DATA Find; + + Max = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0); + + DragQueryFile((HDROP)wParam, 0, Cur, FMAX_PATH); + GetUpperDir(Cur); + + for(i = 0; i < Max; i++) + { + DragQueryFile((HDROP)wParam, i, Name, FMAX_PATH); + + if((GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) == 0) + { + Pkt.Node = NODE_FILE; + strcpy(Pkt.File, GetFileName(Name)); + + memset(&Pkt.Time, 0, sizeof(FILETIME)); + if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE) + { + FindClose(fHnd); + Pkt.Time = Find.ftLastWriteTime; + } + AddFileList(&Pkt, Base); + } + } + + GetCurrentDirectory(FMAX_PATH, Tmp); + SetCurrentDirectory(Cur); + for(i = 0; i < Max; i++) + { + DragQueryFile((HDROP)wParam, i, Name, FMAX_PATH); + + if(GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) + { + Pkt.Node = NODE_DIR; + strcpy(Pkt.File, GetFileName(Name)); + AddFileList(&Pkt, Base); + + MakeLocalTree(Pkt.File, Base); + } + } + SetCurrentDirectory(Tmp); + + DragFinish((HDROP)wParam); + + return; +} + + +/*----- Drag&Drop‚³‚ꂽƒtƒ@ƒCƒ‹‚ª‚ ‚éƒtƒHƒ‹ƒ_‚ðŽæ“¾‚·‚é ----------------------- +* +* Parameter +* WPARAM wParam : ƒhƒƒbƒv‚³‚ꂽƒtƒ@ƒCƒ‹‚̏î•ñ +* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MakeDroppedDir(WPARAM wParam, char *Cur) +{ + int Max; + + Max = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0); + DragQueryFile((HDROP)wParam, 0, Cur, FMAX_PATH); + GetUpperDir(Cur); + DragFinish((HDROP)wParam); + + return; +} + + +/*----- ƒzƒXƒg‘¤‚̃TƒuƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚̃tƒ@ƒCƒ‹‚ðƒŠƒXƒg‚É“o˜^‚·‚éi‚Pj------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +* +* Note +* NLST -alLR ‚ðŽg‚¤ +*----------------------------------------------------------------------------*/ + +static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) +{ + int Sts; + + if(DoCWD(Path, NO, NO, NO) == FTP_COMPLETE) + { + /* ƒTƒuƒtƒHƒ‹ƒ_‚àŠÜ‚ß‚½ƒŠƒXƒg‚ðŽæ“¾ */ + Sts = DoDirListCmdSkt("R", "", 999, CancelCheckWork); /* NLST -alLR*/ + DoCWD(Cur, NO, NO, NO); + + if(Sts == FTP_COMPLETE) + AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base); + } + return; +} + + +/*----- ƒzƒXƒg‘¤‚̃TƒuƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚̃tƒ@ƒCƒ‹‚ðƒŠƒXƒg‚É“o˜^‚·‚éi‚Qj------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +* +* Note +* ŠeƒtƒHƒ‹ƒ_‚Ɉړ®‚µ‚ăŠƒXƒg‚ðŽæ“¾ +*----------------------------------------------------------------------------*/ + +static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork) +{ + int Sts; + FILELIST *CurList; + FILELIST *Pos; + FILELIST Pkt; + + /* VAX VMS ‚Í CWD xxx/yyy ‚Æ‚¢‚¤Žw’肪‚Å‚«‚È‚¢‚Ì‚Å */ + /* CWD xxx, Cwd yyy ‚Æ•¡”‚É•ª‚¯‚é */ + if(AskHostType() != HTYPE_VMS) + Sts = DoCWD(Path, NO, NO, NO); + else + { +#if defined(HAVE_OPENVMS) + /* OpenVMS‚̏ꍇAƒfƒBƒŒƒNƒgƒŠˆÚ“®Žž‚Í"HOGE.DIR;1"‚ð"HOGE"‚É‚·‚é */ + ReformVMSDirName(Path, TRUE); +#endif + Sts = DoCWDStepByStep(Path, Cur); + } + + if(Sts == FTP_COMPLETE) + { + Sts = DoDirListCmdSkt("", "", 999, CancelCheckWork); /* NLST -alL*/ + DoCWD(Cur, NO, NO, NO); + + if(Sts == FTP_COMPLETE) + { + CurList = NULL; + AddRemoteTreeToFileList(999, Path, RDIR_CWD, &CurList); + CopyTmpListToFileList(Base, CurList); + + Pos = CurList; + while(Pos != NULL) + { + if(Pos->Node == NODE_DIR) + { + /* ‚Ü‚¸ƒfƒBƒŒƒNƒgƒŠ–¼‚ðƒZƒbƒg */ + strcpy(Pkt.File, Pos->File); + Pkt.Node = NODE_DIR; + Pkt.Size = 0; + Pkt.Attr = 0; + memset(&Pkt.Time, 0, sizeof(FILETIME)); + AddFileList(&Pkt, Base); + + /* ‚»‚̃fƒBƒŒƒNƒgƒŠ‚Ì’†‚ðŒŸõ */ + MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork); + } + Pos = Pos->Next; + } + DeleteFileList(&CurList); + } + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì“à—e‚ð•Ê‚̃tƒ@ƒCƒ‹ƒŠƒXƒg‚ɃRƒs[ ---------------------- +* +* Parameter +* FILELIST **Base : ƒRƒs[æ +* FILELIST *List : ƒRƒs[Œ³ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒRƒs[‚·‚é‚̂̓tƒ@ƒCƒ‹‚̏î•ñ‚¾‚¯ +* ƒfƒBƒŒƒNƒgƒŠ‚̏î•ñ‚̓Rƒs[‚µ‚È‚¢ +*----------------------------------------------------------------------------*/ + +static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List) +{ + while(List != NULL) + { + if(List->Node == NODE_FILE) + AddFileList(List, Base); + + List = List->Next; + } + return; +} + + +/*----- ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹î•ñ‚ðƒtƒ@ƒCƒ‹ƒŠƒXƒg‚É“o˜^ -------------------------- +* +* Parameter +* int Num : ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹–¼”ԍ† (_ffftp.???) +* char *Path : ƒpƒX–¼ +* int IncDir : Ä‹AŒŸõ‚Ì•û–@ (RDIR_xxx) +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base) +{ + char Str[FMAX_PATH+1]; + char Dir[FMAX_PATH+1]; + char Name[FMAX_PATH+1]; + LONGLONG Size; + FILETIME Time; + int Attr; + FILELIST Pkt; + FILE *fd; + int Node; + int ListType; + char Owner[OWNER_NAME_LEN+1]; + int Link; + int InfoExist; + + MakeCacheFileName(Num, Str); + if((fd = fopen(Str, "rb")) != NULL) + { + strcpy(Dir, Path); + + ListType = LIST_UNKNOWN; + + while(GetListOneLine(Str, FMAX_PATH, fd) == SUCCESS) + { + if((ListType = AnalizeFileInfo(Str)) == LIST_UNKNOWN) + { + if(MakeDirPath(Str, ListType, Path, Dir) == SUCCESS) + { + if(IncDir == RDIR_NLST) + { + strcpy(Pkt.File, Dir); + Pkt.Node = NODE_DIR; + Pkt.Size = 0; + Pkt.Attr = 0; + memset(&Pkt.Time, 0, sizeof(FILETIME)); + AddFileList(&Pkt, Base); + } + } + } + else + { + Node = ResolvFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist); + + if(AskFilterStr(Name, Node) == YES) + { + if((Node == NODE_FILE) || + ((IncDir == RDIR_CWD) && (Node == NODE_DIR))) + { + strcpy(Pkt.File, Dir); + if(strlen(Pkt.File) > 0) + SetSlashTail(Pkt.File); + strcat(Pkt.File, Name); + Pkt.Node = Node; + Pkt.Link = Link; + Pkt.Size = Size; + Pkt.Attr = Attr; + Pkt.Time = Time; + Pkt.InfoExist = InfoExist; + AddFileList(&Pkt, Base); + } + } + } + } + fclose(fd); + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——î•ñ‚Ì‚Ps‚ðŽæ“¾ ------------------------------------------ +* +* Parameter +* char *Buf : ‚Ps‚̏î•ñ‚ðƒZƒbƒg‚·‚éƒoƒbƒtƒ@ +* int Max : Å‘啶Žš” +* FILE *Fd : ƒXƒgƒŠ[ƒ€ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* +* Note +* VAX VMSˆÈŠO‚ÌŽž‚Í fgets(Buf, Max, Fd) ‚Æ“¯‚¶ +* Vax VMS‚ÌŽž‚́A•¡”s‚̃tƒ@ƒCƒ‹î•ñ‚ð‚Ps‚É‚Ü‚Æ‚ß‚é +*----------------------------------------------------------------------------*/ + +static int GetListOneLine(char *Buf, int Max, FILE *Fd) +{ + char Tmp[FMAX_PATH+1]; + int Sts; + + Sts = FAIL; + while((Sts == FAIL) && (fgets(Buf, Max, Fd) != NULL)) + { + Sts = SUCCESS; + RemoveReturnCode(Buf); + ReplaceAll(Buf, '\x08', ' '); + + /* VAX VMS‚ł̓tƒ@ƒCƒ‹î•ñ‚ª•¡”s‚É‚í‚©‚ê‚Ä‚¢‚é */ + /* ‚»‚ê‚ð‚Ps‚É‚Ü‚Æ‚ß‚é */ + if(AskHostType() == HTYPE_VMS) + { + if(strchr(Buf, ';') == NULL) /* ƒtƒ@ƒCƒ‹–¼ˆÈŠO‚̍s */ + Sts = FAIL; + else + { + Max -= strlen(Buf); + while(strchr(Buf, ')') == NULL) + { + if(fgets(Tmp, FMAX_PATH, Fd) != NULL) + { + RemoveReturnCode(Tmp); + ReplaceAll(Buf, '\x08', ' '); + if((int)strlen(Tmp) > Max) + Tmp[Max] = NUL; + Max -= strlen(Tmp); + strcat(Buf, Tmp); + } + else + break; + } + } + } + } + +// DoPrintf("List : %s", Buf); + + return(Sts); +} + + +/*----- ƒTƒuƒfƒBƒŒƒNƒgƒŠî•ñ‚̉ðÍ -------------------------------------------- +* +* Parameter +* char *Str : ƒtƒ@ƒCƒ‹î•ñi‚Psj +* int ListType : ƒŠƒXƒg‚̃^ƒCƒv +* char *Path : æ“ª‚©‚ç‚̃pƒX–¼ +* char *Dir : ƒfƒBƒŒƒNƒgƒŠ–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL=ƒfƒBƒŒƒNƒgƒŠî•ñ‚Å‚È‚¢ +*----------------------------------------------------------------------------*/ + +static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir) +{ + int Sts; + + Sts = FAIL; + switch(ListType) + { + case LIST_ACOS : + case LIST_ACOS_4 : + break; + + default: + if(*(Str + strlen(Str) - 1) == ':') /* ÅŒã‚ª : ‚È‚çƒTƒuƒfƒBƒŒƒNƒgƒŠ */ + { + if(strcmp(Str, ".:") != 0) + { + if((strncmp(Str, "./", 2) == 0) || + (strncmp(Str, ".\\", 2) == 0)) + { + Str += 2; + } + + if(strlen(Str) > 1) + { + strcpy(Dir, Path); + SetSlashTail(Dir); + strcat(Dir, Str); + *(Dir + strlen(Dir) - 1) = NUL; + + ChangeFnameRemote2Local(Dir, FMAX_PATH); + + ReplaceAll(Dir, '\\', '/'); + } + } + Sts = SUCCESS; + } + break; + } + return(Sts); +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃TƒuƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚̃tƒ@ƒCƒ‹‚ðƒŠƒXƒg‚É“o˜^‚·‚é ---------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void MakeLocalTree(char *Path, FILELIST **Base) +{ + char Src[FMAX_PATH+1]; + HANDLE fHnd; + WIN32_FIND_DATA FindBuf; + FILELIST Pkt; + SYSTEMTIME TmpStime; + + strcpy(Src, Path); + SetYenTail(Src); + strcat(Src, "*"); + ReplaceAll(Src, '/', '\\'); + + if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE) + { + do + { + if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) + { + if(AskFilterStr(FindBuf.cFileName, NODE_FILE) == YES) + { + strcpy(Pkt.File, Path); + SetSlashTail(Pkt.File); + strcat(Pkt.File, FindBuf.cFileName); + ReplaceAll(Pkt.File, '\\', '/'); + Pkt.Node = NODE_FILE; + Pkt.Size = MakeLongLong(FindBuf.nFileSizeHigh, FindBuf.nFileSizeLow); + Pkt.Attr = 0; + Pkt.Time = FindBuf.ftLastWriteTime; + FileTimeToSystemTime(&Pkt.Time, &TmpStime); + TmpStime.wSecond = 0; + TmpStime.wMilliseconds = 0; + SystemTimeToFileTime(&TmpStime, &Pkt.Time); + AddFileList(&Pkt, Base); + } + } + } + while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE); + FindClose(fHnd); + } + + if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE) + { + do + { + if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + (strcmp(FindBuf.cFileName, ".") != 0) && + (strcmp(FindBuf.cFileName, "..") != 0)) + { + strcpy(Src, Path); + SetYenTail(Src); + strcat(Src, FindBuf.cFileName); + strcpy(Pkt.File, Src); + ReplaceAll(Pkt.File, '\\', '/'); + Pkt.Node = NODE_DIR; + Pkt.Size = 0; + Pkt.Attr = 0; + memset(&Pkt.Time, 0, sizeof(FILETIME)); + AddFileList(&Pkt, Base); + + MakeLocalTree(Src, Base); + } + } + while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE); + FindClose(fHnd); + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ɏî•ñ‚ð“o˜^‚·‚é ---------------------------------------- +* +* Parameter +* FILELIST *Pkt : “o˜^‚·‚éƒtƒ@ƒCƒ‹î•ñ +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddFileList(FILELIST *Pkt, FILELIST **Base) +{ + FILELIST *Pos; + FILELIST *Prev; + + DoPrintf("FileList : NODE=%d : %s", Pkt->Node, Pkt->File); + + /* ƒŠƒXƒg‚̏d•¡‚ðŽæ‚菜‚­ */ + Pos = *Base; + while(Pos != NULL) + { + if(strcmp(Pkt->File, Pos->File) == 0) + { + DoPrintf(" --> Duplicate!!"); + break; + } + Prev = Pos; + Pos = Pos->Next; + } + + if(Pos == NULL) /* d•¡‚µ‚Ä‚¢‚È‚¢‚Ì‚Å“o˜^‚·‚é */ + { + if((Pos = malloc(sizeof(FILELIST))) != NULL) + { + memcpy(Pos, Pkt, sizeof(FILELIST)); + Pos->Next = NULL; + + if(*Base == NULL) + *Base = Pos; + else + Prev->Next = Pos; + } + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ðƒNƒŠƒA‚·‚é -------------------------------------------- +* +* Parameter +* FILELIST **Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteFileList(FILELIST **Base) +{ + FILELIST *New; + FILELIST *Next; + + New = *Base; + while(New != NULL) + { + Next = New->Next; + free(New); + New = Next; + } + *Base = NULL; + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ÉŽw’è‚̃tƒ@ƒCƒ‹‚ª‚ ‚é‚©ƒ`ƒFƒbƒN ------------------------ +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* FILELIST *Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̐擪 +* int Caps : ‘啶Žš/¬•¶Žš‚Ì‹æ•Êƒ‚[ƒh (COMP_xxx) +* +* Return Value +* FILELIST *Œ©‚‚©‚Á‚½ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̃f[ƒ^ +* NULL=Œ©‚‚©‚ç‚È‚¢ +*----------------------------------------------------------------------------*/ + +FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps) +{ + char Tmp[FMAX_PATH+1]; + + while(Base != NULL) + { + if(Caps == COMP_STRICT) + { + if(_mbscmp(Fname, Base->File) == 0) + break; + } + else + { + if(_mbsicmp(Fname, Base->File) == 0) + { + if(Caps == COMP_IGNORE) + break; + else + { + strcpy(Tmp, Base->File); + _mbslwr(Tmp); + if(_mbscmp(Tmp, Base->File) == 0) + break; + } + } + } + Base = Base->Next; + } + return(Base); +} + + +/*----- ƒtƒ@ƒCƒ‹î•ñ‚©‚烊ƒXƒgƒ^ƒCƒv‚ð‹‚ß‚é ---------------------------------- +* +* Parameter +* char *Str : ƒtƒ@ƒCƒ‹î•ñi‚Psj +* +* Return Value +* int ƒŠƒXƒgƒ^ƒCƒv (LIST_xxx) +*----------------------------------------------------------------------------*/ + +static int AnalizeFileInfo(char *Str) +{ + int Ret; + char Tmp[FMAX_PATH+1]; + int Add1; + int TmpInt; + int Flag1; + WORD Month; + WORD Day; + +//DoPrintf("LIST : %s", Str); + + Ret = LIST_UNKNOWN; + Flag1 = AskHostType(); + if(Flag1 == HTYPE_ACOS) + Ret = LIST_ACOS; + else if(Flag1 == HTYPE_ACOS_4) + Ret = LIST_ACOS_4; + else if(Flag1 == HTYPE_VMS) + Ret = LIST_VMS; + else if(Flag1 == HTYPE_IRMX) + Ret = LIST_IRMX; + else if(Flag1 == HTYPE_STRATUS) + Ret = LIST_STRATUS; + else if(Flag1 == HTYPE_AGILENT) + Ret = LIST_AGILENT; + else if(Flag1 == HTYPE_SHIBASOKU) + Ret = LIST_SHIBASOKU; + else + { + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_UNIX_10, LIST_UNIX_20, LIST_UNIX_12, LIST_UNIX_22, LIST_UNIX_50, LIST_UNIX_60 */ + /* MELCOM80 */ + + if(FindField(Str, Tmp, 0, NO) == SUCCESS) + { + /* MELCOM80‚Í "d rwxrwxrwx" ‚̂悤‚ɃXƒy[ƒX‚ª‹ó‚¢‚Ä‚¢‚é */ + Flag1 = NO; + if((strlen(Tmp) == 1) && (strchr("-dDlL", Tmp[0]) != NULL)) + { + if(FindField(Str, Tmp, 1, NO) == SUCCESS) + { + if((strlen(Tmp) == 9) || + ((strlen(Tmp) > 9) && (IsDigit(Tmp[9]) != 0))) + { + memmove(Str+1, Str+2, strlen(Str+2)+1); + FindField(Str, Tmp, 0, NO); + Flag1 = YES; + } + } + } + + if(strlen(Tmp) >= 10) + { + Add1 = 0; + if((strlen(Tmp) > 10) && (IsDigit(Tmp[10]) != 0)) + { + /* ‚±‚¤‚¢‚¤Žž */ + /* drwxr-xr-x1234 owner group 1024 Nov 6 14:21 Linux/ */ + Add1 = -1; + } + +//////////// +// LIST_UNIX_60 support + if(FindField(Str, Tmp, 7+Add1, NO) == SUCCESS) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + Ret = CheckUnixType(Str, Tmp, Add1, 2, Day); + } + } +/////////// + +//////////// +// LIST_UNIX_12 support + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 6+Add1, NO) == SUCCESS)) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + Ret = CheckUnixType(Str, Tmp, Add1, 0, Day); + } + } +////////////////// + +//////////// +// LIST_UNIX_70 support + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 6+Add1, NO) == SUCCESS)) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + Ret = CheckUnixType(Str, Tmp, Add1, 1, Day); + } + } +/////////// + + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 5+Add1, NO) == SUCCESS)) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + Ret = CheckUnixType(Str, Tmp, Add1, 0, Day); + } + } + + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 4+Add1, NO) == SUCCESS)) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + Ret = CheckUnixType(Str, Tmp, Add1, -1, Day); + } + } + + if((Ret == LIST_UNKNOWN) && + (FindField(Str, Tmp, 3+Add1, NO) == SUCCESS)) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + Ret = CheckUnixType(Str, Tmp, Add1, -2, Day); + } + } + + if((Ret != LIST_UNKNOWN) && (Flag1 == YES)) + Ret |= LIST_MELCOM; + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_AS400 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 3, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0)) + { + if(FindField(Str, Tmp, 5, NO) == SUCCESS) + { + Ret = LIST_AS400; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_M1800 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 5, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, '*', NO) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + ((IsDigit(Tmp[0]) != 0) || (StrAllSameChar(Tmp, '*') == YES))) + { + if((FindField(Str, Tmp, 3, NO) == SUCCESS) && + ((IsDigit(Tmp[0]) != 0) || (StrAllSameChar(Tmp, '*') == YES))) + { + if((FindField(Str, Tmp, 0, NO) == SUCCESS) && + (strlen(Tmp) == 4)) + { + if(FindField(Str, Tmp, 6, NO) == SUCCESS) + { + Ret = LIST_M1800; + } + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_GP6000 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 5, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0)) + { + if(FindField(Str, Tmp, 6, NO) == SUCCESS) + { + Ret = LIST_GP6000; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_DOS_1, LIST_DOS_2 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0))) + { + if(FindField(Str, Tmp, 3, NO) == SUCCESS) + { + if((FindField(Str, Tmp, 0, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, YES) != 0)) + { + TmpInt = atoi(Tmp); + if((TmpInt >= 1) && (TmpInt <= 12)) + Ret = LIST_DOS_2; + else + Ret = LIST_DOS_1; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_DOS_3 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 3, NO) == SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0))) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, YES) != 0)) + { + Ret = LIST_DOS_3; + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_DOS_4 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 0, NO) == SUCCESS) && + (CheckYYYYMMDDformat(Tmp, NUL) == YES)) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0))) + { + if(FindField(Str, Tmp, 3, NO) == SUCCESS) + { + Ret = LIST_DOS_4; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_CHAMELEON */ + + if(Ret == LIST_UNKNOWN) + { + if(FindField(Str, Tmp, 2, NO) == SUCCESS) + { + GetMonth(Tmp, &Month, &Day); + if((Month != 0) && (Day == 0)) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0))) + { + if((FindField(Str, Tmp, 5, NO) == SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + Ret = LIST_CHAMELEON; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_OS2 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 3, NO) == SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + if((FindField(Str, Tmp, 0, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, YES) != 0)) + { + if(FindField(Str, Tmp, 4, NO) == SUCCESS) + { + Ret = LIST_OS2; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_OS7 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 0, NO) == SUCCESS) && + (strlen(Tmp) == 10)) + { + if((FindField(Str, Tmp, 3, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 4, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0)) + { + if(FindField(Str, Tmp, 5, NO) == SUCCESS) + { + Ret = LIST_OS7_2; + } + } + } + } + else if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if(FindField(Str, Tmp, 3, NO) == SUCCESS) + { + Ret = LIST_OS7_1; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_ALLIED */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 0, NO) == SUCCESS) && + ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0))) + { + if((FindField(Str, Tmp, 5, NO) == SUCCESS) && + (CheckHHMMformat(Tmp) == YES)) + { + if(FindField(Str, Tmp, 3, NO) == SUCCESS) + { + GetMonth(Tmp, &Month, &Day); + if(Month != 0) + { + if((FindField(Str, Tmp, 6, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0)) + { + Ret = LIST_ALLIED; + } + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_OS9 */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && + (CheckYYMMDDformat(Tmp, NUL, NO) != 0)) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0) && (strlen(Tmp) == 4)) + { + if((FindField(Str, Tmp, 5, NO) == SUCCESS) && + (IsDigit(Tmp[0]) != 0)) + { + if(FindField(Str, Tmp, 6, NO) == SUCCESS) + { + Ret = LIST_OS9; + } + } + } + } + } + + /* ˆÈ‰º‚̃tƒH[ƒ}ƒbƒg‚ðƒ`ƒFƒbƒN */ + /* LIST_IBM */ + + if(Ret == LIST_UNKNOWN) + { + if((FindField(Str, Tmp, 2, NO) == SUCCESS) && + (CheckYYYYMMDDformat(Tmp, NUL) == YES)) + { + if((FindField(Str, Tmp, 1, NO) == SUCCESS) && IsDigit(Tmp[0])) + { + if((FindField(Str, Tmp, 7, NO) == SUCCESS) && IsDigit(Tmp[0])) + { + if(FindField(Str, Tmp, 9, NO) == SUCCESS) + { + Ret = LIST_IBM; + } + } + } + } + } + + } + +DoPrintf("ListType=%d", Ret); + + return(Ret); +} + + +/*----- UNIXŒnƒŠƒXƒgƒ^ƒCƒv‚̃`ƒFƒbƒN‚ðs‚È‚¤ ---------------------------------- +* +* Parameter +* char *Str : ƒtƒ@ƒCƒ‹î•ñi‚Psj +* char *Tmp : ˆêŽžƒ[ƒN +* int Add1 : ‰ÁŽZƒpƒ‰ƒ[ƒ^1 +* int Add2 : ‰ÁŽZƒpƒ‰ƒ[ƒ^2 +* int Day : “ú (0=‚±‚±‚Ŏ擾‚·‚é) +* +* Return Value +* int ƒŠƒXƒgƒ^ƒCƒv (LIST_xxx) +*----------------------------------------------------------------------------*/ + +static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day) +{ + int Ret; + int Add3; + WORD Hour; + WORD Minute; + int Flag; + + Flag = 0; + Ret = LIST_UNKNOWN; + +//Day‚É‚æ‚Á‚ÄAdd3‚ð•Ï‚¦‚é + + Add3 = 0; + if(Day != 0) + Add3 = -1; + + // unixŒnƒ`ƒFƒbƒN + if((Day != 0) || + ((FindField(Str, Tmp, 6+Add1+Add2+Add3, NO) == SUCCESS) && + ((atoi(Tmp) >= 1) && (atoi(Tmp) <= 31)))) + { + if((FindField(Str, Tmp, 7+Add1+Add2+Add3, NO) == SUCCESS) && + ((atoi(Tmp) >= 1900) || (GetHourAndMinute(Tmp, &Hour, &Minute) == SUCCESS))) + { + if(FindField(Str, Tmp, 8+Add1+Add2+Add3, NO) == SUCCESS) + { + Flag = 1; + } + } + } + + // ’†‘ŒêSolarisê—p + if(Flag == 0) + { + if((FindField(Str, Tmp, 7+Add1+Add2+Add3, NO) == SUCCESS) && + ((atoi(Tmp) >= 1) && (atoi(Tmp) <= 31))) + { + if((FindField(Str, Tmp, 5+Add1+Add2+Add3, NO) == SUCCESS) && + (atoi(Tmp) >= 1900)) + { + if((FindField(Str, Tmp, 6+Add1+Add2+Add3, NO) == SUCCESS) && + (((atoi(Tmp) >= 1) && (atoi(Tmp) <= 9) && + ((unsigned char)Tmp[1] == 0xD4) && + ((unsigned char)Tmp[2] == 0xC2)) || + ((atoi(Tmp) >= 10) && (atoi(Tmp) <= 12) && + ((unsigned char)Tmp[2] == 0xD4) && + ((unsigned char)Tmp[3] == 0xC2)))) + { + if(FindField(Str, Tmp, 8+Add1+Add2+Add3, NO) == SUCCESS) + { + Flag = 2; + } + } + } + } + } + + if(Flag != 0) + { + if(Add2 == 2) + { + Ret = LIST_UNIX_60; + if(Flag == 2) + Ret = LIST_UNIX_64; + if(Day != 0) + Ret = LIST_UNIX_61; + + if(Add1 == -1) + { + Ret = LIST_UNIX_62; + if(Flag == 2) + Ret = LIST_UNIX_65; + if(Day != 0) + Ret = LIST_UNIX_63; + } + } + else if(Add2 == 1) + { + Ret = LIST_UNIX_70; + if(Flag == 2) + Ret = LIST_UNIX_74; + if(Day != 0) + Ret = LIST_UNIX_71; + + if(Add1 == -1) + { + Ret = LIST_UNIX_72; + if(Flag == 2) + Ret = LIST_UNIX_75; + if(Day != 0) + Ret = LIST_UNIX_73; + } + } + else if(Add2 == 0) + { + Ret = LIST_UNIX_10; + if(Flag == 2) + Ret = LIST_UNIX_14; + if(Day != 0) + Ret = LIST_UNIX_11; + + if(Add1 == -1) + { + Ret = LIST_UNIX_12; + if(Flag == 2) + Ret = LIST_UNIX_15; + if(Day != 0) + Ret = LIST_UNIX_13; + } + } + else if(Add2 == -1) + { + Ret = LIST_UNIX_20; + if(Flag == 2) + Ret = LIST_UNIX_24; + if(Day != 0) + Ret = LIST_UNIX_21; + + if(Add1 == -1) + { + Ret = LIST_UNIX_22; + if(Flag == 2) + Ret = LIST_UNIX_25; + if(Day != 0) + Ret = LIST_UNIX_23; + } + } + else + { + Ret = LIST_UNIX_50; + if(Flag == 2) + Ret = LIST_UNIX_54; + if(Day != 0) + Ret = LIST_UNIX_51; + } + } + return(Ret); +} + + +/*----- HH:MM Œ`Ž®‚Ì•¶Žš—ñ‚©‚Ç‚¤‚©‚ðƒ`ƒFƒbƒN ---------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO) +* +* Note +* ‹æØ‚蕶Žš‚͉½‚Å‚à‚æ‚¢ +* Žž•ª‚Å‚È‚­‚Ä‚à‚æ‚¢ +* Œã‚ë‚É—]•ª‚È•¶Žš‚ª•t‚¢‚Ä‚¢‚Ä‚à‚æ‚¢ +*----------------------------------------------------------------------------*/ + +static int CheckHHMMformat(char *Str) +{ + int Ret; + + Ret = NO; + if((strlen(Str) >= 3) && + (IsDigit(Str[0]) != 0)) + { + if((Str = strchr(Str, ':')) != NULL) + { + if(IsDigit(*(Str+1)) != 0) + Ret = YES; + } + } + return(Ret); +} + + +/*----- YY/MM/DD Œ`Ž®‚Ì•¶Žš—ñ‚©‚Ç‚¤‚©‚ðƒ`ƒFƒbƒN ------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char Sym : ”Žš‚Ì‘ã‚í‚è‚ÉŽg‚¦‚é‹L† (NUL=”ŽšˆÈŠOŽg‚¦‚È‚¢) +* int Dig3 : 3Œ…‚Ì”N‚ð‹–‰Â +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* 0 = ŠY“–‚µ‚È‚¢ +* 1 = ??/??/??, ??/??/??? +* 2 = ???/??/?? +* +* Note +* ‹æØ‚蕶Žš‚͉½‚Å‚à‚æ‚¢ +* ”NŒŽ“ú‚Å‚È‚­‚Ä‚à‚æ‚¢ +*----------------------------------------------------------------------------*/ + +static int CheckYYMMDDformat(char *Str, char Sym, int Dig3) +{ + int Ret; + + Ret = 0; + if((strlen(Str) == 8) && + (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && + (IsDigit(Str[2]) == 0) && + (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) && + (IsDigit(Str[5]) == 0) && + (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0)) + { + Ret = 1; + } + if(Dig3 == YES) + { + if((strlen(Str) == 9) && + (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && (IsDigitSym(Str[2], Sym) != 0) && + (IsDigit(Str[3]) == 0) && + (IsDigitSym(Str[4], Sym) != 0) && (IsDigitSym(Str[5], Sym) != 0) && + (IsDigit(Str[6]) == 0) && + (IsDigitSym(Str[7], Sym) != 0) && (IsDigitSym(Str[8], Sym) != 0)) + { + Ret = 2; + } + else if((strlen(Str) == 9) && + (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && + (IsDigit(Str[2]) == 0) && + (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) && + (IsDigit(Str[5]) == 0) && + (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) && (IsDigitSym(Str[8], Sym) != 0)) + { + Ret = 1; + } + } + return(Ret); +} + + +/*----- YYYY/MM/DD Œ`Ž®‚Ì•¶Žš—ñ‚©‚Ç‚¤‚©‚ðƒ`ƒFƒbƒN ----------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char Sym : ”Žš‚Ì‘ã‚í‚è‚ÉŽg‚¦‚é‹L† (NUL=”ŽšˆÈŠOŽg‚¦‚È‚¢) +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO) +* +* Note +* ‹æØ‚蕶Žš‚͉½‚Å‚à‚æ‚¢ +* ”NŒŽ“ú‚Å‚È‚­‚Ä‚à‚æ‚¢ +*----------------------------------------------------------------------------*/ + +static int CheckYYYYMMDDformat(char *Str, char Sym) +{ + int Ret; + + Ret = NO; + if((strlen(Str) == 10) && + (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && + (IsDigitSym(Str[2], Sym) != 0) && (IsDigitSym(Str[3], Sym) != 0) && + (IsDigit(Str[4]) == 0) && + (IsDigitSym(Str[5], Sym) != 0) && (IsDigitSym(Str[6], Sym) != 0) && + (IsDigit(Str[7]) == 0) && + (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0)) + { + Ret = YES; + } + return(Ret); +} + + +/*----- ƒtƒ@ƒCƒ‹î•ñ‚©‚çƒtƒ@ƒCƒ‹–¼AƒTƒCƒY‚È‚Ç‚ðŽæ‚èo‚· ---------------------- +* +* Parameter +* char *Str : ƒtƒ@ƒCƒ‹î•ñi‚Psj +* int ListType : ƒŠƒXƒg‚̃^ƒCƒv +* char *Name : ƒtƒ@ƒCƒ‹–¼‚̃Rƒs[æ +* LONGLONG *Size : ƒTƒCƒY‚̃Rƒs[æ +* FILETIME *Time : “ú•t‚̃Rƒs[æ +* int *Attr : ‘®«‚̃Rƒs[æ +* char *Owner : ƒI[ƒi–¼ +* int *Link : ƒŠƒ“ƒN‚©‚Ç‚¤‚© (YES/NO) +* int *InfoExist : Žž‚̏î•ñ‚ª‚ ‚Á‚½‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* int Ží—Þ (NODE_xxxx) +*----------------------------------------------------------------------------*/ + +static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist) +{ + SYSTEMTIME sTime; + SYSTEMTIME sTimeNow; + char Buf[FMAX_PATH+1]; + char *Pos; + char Flag; + int Ret; + int offs; + int offs2; + int offs3; + int OrgListType; + int err; + int Flag2; + + static const int DosPos[3][4] = { { 1, 0, 2, 3 }, { 1, 0, 2, 3 }, { 3, 2, 1, 0 } }; + static const int DosDate[3][3][2] = { { {0, 0}, {3, 4}, {6, 7} }, { {6, 7}, {0, 0}, {3, 4} }, { {6, 7}, {0, 0}, {3, 4} } }; + static const int DosLongFname[3] = { YES, YES, NO }; + + /* ‚Ü‚¸ƒNƒŠƒA‚µ‚Ä‚¨‚­ */ + Ret = NODE_NONE; + *Size = -1; + *Attr = 0; + *Link = NO; + memset(Owner, NUL, OWNER_NAME_LEN+1); + Time->dwLowDateTime = 0; + Time->dwHighDateTime = 0; + *InfoExist = 0; + offs = 0; + offs2 = 0; + offs3 = 0; + + OrgListType = ListType; + ListType &= LIST_MASKFLG; + switch(ListType) + { + case LIST_DOS_1 : + case LIST_DOS_2 : + case LIST_DOS_3 : + if(ListType == LIST_DOS_1) + offs = 0; + else if(ListType == LIST_DOS_2) + offs = 1; + else + offs = 2; + + *InfoExist |= (FINFO_DATE | FINFO_SIZE); + + /* Žž */ + FindField(Str, Buf, DosPos[offs][0], NO); + if((Pos = strchr(Buf, ':')) != NULL) + { + *InfoExist |= FINFO_TIME; + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Pos+1); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + + if(strlen(Pos) >= 4) + { + if(tolower(Pos[3]) == 'a') + { + if(sTime.wHour == 12) + sTime.wHour = 0; + } + else if(tolower(Pos[3]) == 'p') + { + if(sTime.wHour != 12) + sTime.wHour += 12; + } + } + } + + /* “ú•t */ + FindField(Str, Buf, DosPos[offs][1], NO); + if((offs2 = CheckYYMMDDformat(Buf, NUL, YES)) == 0) + break; + offs2--; + sTime.wYear = Assume1900or2000(atoi(Buf + DosDate[offs][0][offs2])); + sTime.wMonth = atoi(Buf + DosDate[offs][1][offs2]); + sTime.wDay = atoi(Buf + DosDate[offs][2][offs2]); + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, DosPos[offs][2], NO); + *Size = _atoi64(Buf); + + /* –¼‘O */ + if(FindField(Str, Fname, DosPos[offs][3], DosLongFname[offs]) == SUCCESS) + { + Ret = NODE_FILE; + if(Buf[0] == '<') + Ret = NODE_DIR; + } + break; + + case LIST_DOS_4 : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* “ú•t */ + FindField(Str, Buf, 0, NO); + sTime.wYear = atoi(Buf); + sTime.wMonth = atoi(Buf+5); + sTime.wDay = atoi(Buf+8); + + /* Žž */ + *InfoExist |= FINFO_TIME; + FindField(Str, Buf, 1, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; // atoi(Buf+6); + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 2, NO); + *Size = _atoi64(Buf); + + /* –¼‘O */ + if(FindField(Str, Fname, 3, YES) == SUCCESS) + { + Ret = NODE_FILE; + if(Buf[0] == '<') + Ret = NODE_DIR; + } + break; + + case LIST_OS2 : + *InfoExist |= (FINFO_DATE | FINFO_SIZE); + + /* Žž */ + FindField(Str, Buf, 3, NO); + if((Pos = strchr(Buf, ':')) != NULL) + { + *InfoExist |= FINFO_TIME; + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Pos+1); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + } + + /* “ú•t */ + FindField(Str, Buf, 2, NO); + sTime.wYear = Assume1900or2000(atoi(Buf+6)); + sTime.wMonth = atoi(Buf+0); + sTime.wDay = atoi(Buf+3); + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 0, NO); + *Size = _atoi64(Buf); + + /* –¼‘O */ + if(FindField(Str, Fname, 4, YES) == SUCCESS) + { + FindField(Str, Buf, 1, NO); + Ret = NODE_FILE; + if(strstr(Buf, "DIR") != NULL) + Ret = NODE_DIR; + } + break; + + case LIST_CHAMELEON : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR); + + /* ‘®« */ + FindField(Str, Buf, 6, NO); + strcat(Buf, "------"); + *Attr = AttrString2Value(Buf+1); + + /* “ú•t */ + FindField(Str, Buf, 2, NO); + GetMonth(Buf, &sTime.wMonth, &sTime.wDay); /* wDay‚͏í‚É0 */ + FindField(Str, Buf, 3, NO); + sTime.wDay = atoi(Buf); + FindField(Str, Buf, 4, NO); + sTime.wYear = atoi(Buf); + + /* Žž */ + FindField(Str, Buf, 5, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 1, NO); + *Size = _atoi64(Buf); + + /* –¼‘O */ + if(FindField(Str, Fname, 0, NO) == SUCCESS) + { + Ret = NODE_FILE; + if(Buf[0] == '<') + Ret = NODE_DIR; + } + break; + + case LIST_AS400 : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* ƒI[ƒi–¼ */ + FindField(Str, Buf, 0, NO); + strncpy(Owner, Buf, OWNER_NAME_LEN); + + /* Žž */ + FindField(Str, Buf, 3, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + + /* “ú•t */ + FindField(Str, Buf, 2, NO); + sTime.wYear = Assume1900or2000(atoi(Buf)); + sTime.wMonth = atoi(Buf + 3); + sTime.wDay = atoi(Buf + 6); + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 1, NO); + *Size = _atoi64(Buf); + + /* –¼‘O */ + if(FindField(Str, Fname, 5, YES) == SUCCESS) + { + Ret = NODE_FILE; + if((Pos = strchr(Fname, '/')) != NULL) + { + Ret = NODE_DIR; + *Pos = NUL; + } + } + break; + + case LIST_M1800 : + *InfoExist |= FINFO_ATTR; + + /* ‘®« */ + FindField(Str, Buf, 0, NO); + strcat(Buf, "------"); + *Attr = AttrString2Value(Buf+1); + + /* “ú•t */ + Time->dwLowDateTime = 0; + Time->dwHighDateTime = 0; + FindField(Str, Buf, 5, NO); + if(Buf[0] != '*') + { + *InfoExist |= FINFO_DATE; + sTime.wHour = 0; + sTime.wMinute = 0; + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + + sTime.wYear = Assume1900or2000(atoi(Buf)); + sTime.wMonth = atoi(Buf + 3); + sTime.wDay = atoi(Buf + 6); + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + } + + /* –¼‘O */ + if(FindField(Str, Fname, 6, YES) == SUCCESS) + { + RemoveTailingSpaces(Fname); + Ret = NODE_FILE; + if((Pos = strchr(Fname, '/')) != NULL) + { + Ret = NODE_DIR; + *Pos = NUL; + } + } + break; + + case LIST_GP6000 : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR); + + /* ƒI[ƒi–¼ */ + FindField(Str, Buf, 3, NO); + strncpy(Owner, Buf, OWNER_NAME_LEN); + + /* Žž */ + FindField(Str, Buf, 2, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + + /* “ú•t */ + FindField(Str, Buf, 1, NO); + sTime.wYear = Assume1900or2000(atoi(Buf)); + sTime.wMonth = atoi(Buf + 3); + sTime.wDay = atoi(Buf + 6); + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 5, NO); + *Size = _atoi64(Buf); + + /* ‘®« */ + FindField(Str, Buf, 0, NO); + *Attr = AttrString2Value(Buf+1); + + /* –¼‘O */ + if(FindField(Str, Fname, 6, YES) == SUCCESS) + { + Ret = NODE_FILE; + if(strchr("dl", Buf[0]) != NULL) + Ret = NODE_DIR; + } + break; + + case LIST_ACOS : + case LIST_ACOS_4 : + /* –¼‘O */ + FindField(Str, Fname, 0, NO); + Ret = NODE_FILE; + break; + + case LIST_VMS : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 1, NO); + *Size = _atoi64(Buf) * BLOCK_SIZE; + + /* Žž^“ú•t */ + FindField(Str, Buf, 2, NO); + GetVMSdate(Buf, &sTime.wYear, &sTime.wMonth, &sTime.wDay); + + FindField(Str, Buf, 3, NO); + GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute); + + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* –¼‘O */ + FindField(Str, Fname, 0, NO); + + Ret = NODE_FILE; + if((Pos = strchr(Fname, '.')) != NULL) + { + if(_strnicmp(Pos, ".DIR;", 5) == 0) + { + /* OpenVMS‚̏ꍇAƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠíœŽž‚É‚Í".DIR;?"‚Ü‚Å‚È‚¢‚Æ + * íœ‚Å‚«‚È‚¢‚̂ŁA‚±‚±‚ł͂‚Ԃ³‚È‚¢ */ +#if !defined(HAVE_OPENVMS) + *Pos = NUL; +#endif + Ret = NODE_DIR; + } + } + break; + + case LIST_OS7_2 : + *InfoExist |= FINFO_SIZE; + offs = 2; + + /* ƒTƒCƒY */ + FindField(Str, Buf, 2, NO); + *Size = _atoi64(Buf); + /* ‚±‚±‚Ébreak‚Í‚È‚¢ */ + + case LIST_OS7_1 : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_ATTR); + + /* “ú•t */ + FindField(Str, Buf, 1+offs, NO); + sTime.wYear = Assume1900or2000(atoi(Buf)); + sTime.wMonth = atoi(Buf + 3); + sTime.wDay = atoi(Buf + 6); + + /* Žž */ + FindField(Str, Buf, 2+offs, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ‘®« */ + FindField(Str, Buf, 0, NO); + *Attr = AttrString2Value(Buf+1); + + /* –¼‘O */ + if(FindField(Str, Fname, 3+offs, YES) == SUCCESS) + { + RemoveTailingSpaces(Fname); + Ret = NODE_FILE; + if(strchr("dl", Buf[0]) != NULL) + Ret = NODE_DIR; + } + break; + + case LIST_STRATUS : + if(FindField(Str, Buf, 0, NO) != SUCCESS) + break; + if(_strnicmp(Buf, "Files:", 6) == 0) + StratusMode = 0; + else if(_strnicmp(Buf, "Dirs:", 5) == 0) + StratusMode = 1; + else if(_strnicmp(Buf, "Links:", 6) == 0) + StratusMode = 2; + else + { + if(StratusMode == 0) + offs = 1; + else if(StratusMode == 1) + offs = 0; + else + break; + + *InfoExist |= (FINFO_TIME | FINFO_DATE); + + /* “ú•t */ + if(FindField(Str, Buf, 2+offs, NO) != SUCCESS) + break; + sTime.wYear = Assume1900or2000(atoi(Buf)); + sTime.wMonth = atoi(Buf + 3); + sTime.wDay = atoi(Buf + 6); + + /* Žž */ + if(FindField(Str, Buf, 3+offs, NO) != SUCCESS) + break; + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* –¼‘O */ + if(FindField(Str, Fname, 4+offs, YES) != SUCCESS) + break; + + if(StratusMode == 0) + { + *InfoExist |= FINFO_SIZE; + + /* ƒTƒCƒY */ + if(FindField(Str, Buf, 1, NO) != SUCCESS) + break; + *Size = _atoi64(Buf) * 4096; + + /* Ží—ށiƒI[ƒi–¼‚̃tƒB[ƒ‹ƒh‚É‚¢‚ê‚éj */ + if(FindField(Str, Buf, 2, NO) != SUCCESS) + break; + strncpy(Owner, Buf, OWNER_NAME_LEN); + + Ret = NODE_FILE; + } + else + Ret = NODE_DIR; + } + break; + + case LIST_IRMX : + *InfoExist |= (FINFO_DATE | FINFO_SIZE); + + /* “ú•t */ + for(offs = 11; offs > 7; offs--) + { + if((err = FindField(Str, Buf, offs, NO)) == SUCCESS) + break; + } + if(err != SUCCESS) + break; + if(IsDigit(*Buf) == 0) + break; + sTime.wYear = Assume1900or2000(atoi(Buf)); + if(FindField(Str, Buf, --offs, NO) != SUCCESS) + break; + GetMonth(Buf, &sTime.wMonth, &sTime.wDay); + if(FindField(Str, Buf, --offs, NO) != SUCCESS) + break; + if(IsDigit(*Buf) == 0) + break; + sTime.wDay = atoi(Buf); + sTime.wHour = 0; + sTime.wMinute = 0; + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒI[ƒi–¼ */ + if(FindField(Str, Buf, --offs, NO) != SUCCESS) + break; + strncpy(Owner, Buf, OWNER_NAME_LEN); + + /* ƒTƒCƒY */ + do + { + if((err = FindField(Str, Buf, --offs, NO)) != SUCCESS) + break; + } + while(IsDigit(*Buf) == 0); + --offs; + if((err = FindField(Str, Buf, --offs, NO)) != SUCCESS) + break; + RemoveComma(Buf); + *Size = _atoi64(Buf); + if((err = FindField(Str, Buf, --offs, NO)) != SUCCESS) + break; + if(IsDigit(*Buf) == 0) + break; + /* –¼‘O */ + if(FindField(Str, Fname, 0, NO) != SUCCESS) + break; + /* Ží—Þ */ + if(offs == 0) + Ret = NODE_FILE; + else + { + if((FindField(Str, Buf, 1, NO) == SUCCESS) && + (strcmp(Buf, "DR") == 0)) + Ret = NODE_DIR; + else + Ret = NODE_FILE; + } + break; + + case LIST_ALLIED : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* “ú•t */ + FindField(Str, Buf, 3, NO); + GetMonth(Buf, &sTime.wMonth, &sTime.wDay); /* wDay‚͏í‚É0 */ + FindField(Str, Buf, 4, NO); + sTime.wDay = atoi(Buf); + FindField(Str, Buf, 6, NO); + sTime.wYear = atoi(Buf); + + /* Žž */ + FindField(Str, Buf, 5, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 0, NO); + *Size = _atoi64(Buf); + + /* –¼‘O */ + if(FindField(Str, Fname, 1, NO) == SUCCESS) + { + Ret = NODE_FILE; + if(Buf[0] == '<') + Ret = NODE_DIR; + } + break; + + case LIST_OS9 : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* “ú•t */ + FindField(Str, Buf, 1, NO); + sTime.wYear = Assume1900or2000(atoi(Buf)); + sTime.wMonth = atoi(Buf + 3); + sTime.wDay = atoi(Buf + 6); + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* Žž */ + FindField(Str, Buf, 2, NO); + sTime.wHour = atoi_n(Buf, 2); + sTime.wMinute = atoi(Buf+2); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 5, NO); + *Size = _atoi64(Buf); + + /* ƒI[ƒi–¼ */ + FindField(Str, Buf, 0, NO); + strncpy(Owner, Buf, OWNER_NAME_LEN); + + /* ƒI[ƒi–¼ */ + FindField(Str, Buf, 3, NO); + + /* –¼‘O */ + if(FindField(Str, Fname, 6, NO) == SUCCESS) + { + if((Buf[0] == 'd') || (Buf[0] == 'D')) + Ret = NODE_DIR; + else + Ret = NODE_FILE; + } + break; + + case LIST_IBM : + *InfoExist |= FINFO_DATE; + + + /* “ú•t */ + FindField(Str, Buf, 2, NO); + sTime.wYear = atoi(Buf); + sTime.wMonth = atoi(Buf + 5); + sTime.wDay = atoi(Buf + 8); + sTime.wHour = 0; + sTime.wMinute = 0; + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* –¼‘O */ + FindField(Str, Buf, 8, NO); + if(FindField(Str, Fname, 9, NO) == SUCCESS) + { + if(strcmp(Buf, "PO") == 0) + Ret = NODE_DIR; + else if(strcmp(Buf, "PS") == 0) + Ret = NODE_FILE; + } + break; + + case LIST_AGILENT : + *InfoExist |= (FINFO_SIZE | FINFO_ATTR); + + /* ƒI[ƒi–¼ */ + FindField(Str, Buf, 2, NO); + strncpy(Owner, Buf, OWNER_NAME_LEN); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 4, NO); + *Size = _atoi64(Buf); + + /* ‘®« */ + FindField(Str, Buf, 0, NO); + *Attr = AttrString2Value(Buf+1); + + /* –¼‘O */ + if(FindField(Str, Fname, 5, YES) == SUCCESS) + { + Ret = NODE_FILE; + if(strchr("dl", Buf[0]) != NULL) + Ret = NODE_DIR; + } + break; + + case LIST_SHIBASOKU : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 0, NO); + if(IsDigit(Buf[0])) + { + *Size = _atoi64(Buf); + + /* “ú•t */ + FindField(Str, Buf, 1, NO); + Buf[3] = '\0'; + GetMonth(Buf, &sTime.wMonth, &sTime.wDay); + sTime.wDay = atoi(Buf+4); + sTime.wYear = atoi(Buf+7); + + /* Žž */ + FindField(Str, Buf, 2, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* –¼‘O */ + FindField(Str, Fname, 3, NO); + + /* Ží—Þ */ + Ret = NODE_FILE; + if(FindField(Str, Buf, 4, NO) == SUCCESS) + { + if(strcmp(Buf, "") == 0) + Ret = NODE_DIR; + } + } + break; + + case LIST_UNIX_10 : + case LIST_UNIX_11 : + case LIST_UNIX_12 : + case LIST_UNIX_13 : + case LIST_UNIX_14 : + case LIST_UNIX_15 : + case LIST_UNIX_20 : + case LIST_UNIX_21 : + case LIST_UNIX_22 : + case LIST_UNIX_23 : + case LIST_UNIX_24 : + case LIST_UNIX_25 : + case LIST_UNIX_50 : + case LIST_UNIX_51 : + case LIST_UNIX_54 : + case LIST_UNIX_60 : + case LIST_UNIX_61 : + case LIST_UNIX_62 : + case LIST_UNIX_63 : + case LIST_UNIX_64 : + case LIST_UNIX_65 : + case LIST_UNIX_70 : + case LIST_UNIX_71 : + case LIST_UNIX_72 : + case LIST_UNIX_73 : + case LIST_UNIX_74 : + case LIST_UNIX_75 : +// MELCOM‚̓rƒbƒgƒtƒ‰ƒO‚É‚È‚Á‚Ä‚¢‚é +// case LIST_MELCOM : + default: + /* offs‚̓TƒCƒY‚̈ʒu, offs=0‚̓Jƒ‰ƒ€4 */ + offs = 0; + if((ListType == LIST_UNIX_12) || + (ListType == LIST_UNIX_13) || + (ListType == LIST_UNIX_15) || + (ListType == LIST_UNIX_20) || + (ListType == LIST_UNIX_21) || + (ListType == LIST_UNIX_24)) + offs = -1; + + if((ListType == LIST_UNIX_22) || + (ListType == LIST_UNIX_23) || + (ListType == LIST_UNIX_25) || + (ListType == LIST_UNIX_50) || + (ListType == LIST_UNIX_51) || + (ListType == LIST_UNIX_54)) + offs = -2; + + if((ListType == LIST_UNIX_60) || + (ListType == LIST_UNIX_61) || + (ListType == LIST_UNIX_64)) + offs = 2; + + if((ListType == LIST_UNIX_62) || + (ListType == LIST_UNIX_63) || + (ListType == LIST_UNIX_65) || + (ListType == LIST_UNIX_70) || + (ListType == LIST_UNIX_71) || + (ListType == LIST_UNIX_74)) + offs = 1; + + /* offs2‚ÍŽžŠÔ(‚à‚µ‚­‚Í”N)‚̈ʒu */ + offs2 = 0; + if((ListType == LIST_UNIX_11) || + (ListType == LIST_UNIX_13) || + (ListType == LIST_UNIX_21) || + (ListType == LIST_UNIX_23) || + (ListType == LIST_UNIX_51) || + (ListType == LIST_UNIX_61) || + (ListType == LIST_UNIX_63) || + (ListType == LIST_UNIX_71) || + (ListType == LIST_UNIX_73)) + offs2 = -1; + + /* offs3‚̓I[ƒi–¼‚̈ʒu */ + offs3 = 0; + if((ListType == LIST_UNIX_12) || + (ListType == LIST_UNIX_13) || + (ListType == LIST_UNIX_15) || + (ListType == LIST_UNIX_22) || + (ListType == LIST_UNIX_23) || + (ListType == LIST_UNIX_25) || + (ListType == LIST_UNIX_50) || + (ListType == LIST_UNIX_51) || + (ListType == LIST_UNIX_62) || + (ListType == LIST_UNIX_63) || + (ListType == LIST_UNIX_65) || + (ListType == LIST_UNIX_72) || + (ListType == LIST_UNIX_73) || + (ListType == LIST_UNIX_75)) + offs3 = -1; + + Flag2 = 0; + if((ListType == LIST_UNIX_14) || + (ListType == LIST_UNIX_15) || + (ListType == LIST_UNIX_24) || + (ListType == LIST_UNIX_25) || + (ListType == LIST_UNIX_54) || + (ListType == LIST_UNIX_64) || + (ListType == LIST_UNIX_65) || + (ListType == LIST_UNIX_74) || + (ListType == LIST_UNIX_75)) + Flag2 = 1; + + *InfoExist |= (FINFO_DATE | FINFO_SIZE | FINFO_ATTR); + + /* ‘®« */ + FindField(Str, Buf, 0, NO); + *Attr = AttrString2Value(Buf+1); + + /* ƒI[ƒi–¼ */ + FindField(Str, Buf, 2+offs3, NO); + strncpy(Owner, Buf, OWNER_NAME_LEN); + + /* ƒTƒCƒY */ + FindField(Str, Buf, 4+offs, NO); + Pos = Buf; + if((*Pos != NUL) && (IsDigit(*Pos) == 0)) + { + Pos = strchr(Pos, NUL) - 1; + for(; Pos > Buf; Pos--) + { + if(IsDigit(*Pos) == 0) + { + Pos++; + break; + } + } + } + *Size = _atoi64(Pos); + + if(Flag2 == 0) + { + /* Žž^“ú•t */ + GetLocalTime(&sTime); + memcpy(&sTimeNow, &sTime, sizeof(SYSTEMTIME)); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + + FindField(Str, Buf, 5+offs, NO); + /* “ú•t‚ª yy/mm/dd ‚̏ꍇ‚ɑΉž */ + if(GetYearMonthDay(Buf, &sTime.wYear, &sTime.wMonth, &sTime.wDay) == SUCCESS) + { + sTime.wYear = Assume1900or2000(sTime.wYear); + + FindField(Str, Buf, 7+offs+offs2, NO); + if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == SUCCESS) + *InfoExist |= FINFO_TIME; + } + else + { + GetMonth(Buf, &sTime.wMonth, &sTime.wDay); + if(offs2 == 0) + { + FindField(Str, Buf, 6+offs, NO); + sTime.wDay = atoi(Buf); + } + + FindField(Str, Buf, 7+offs+offs2, NO); + if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FAIL) + { + sTime.wYear = atoi(Buf); + } + else + { + *InfoExist |= FINFO_TIME; + + /* ”N‚ª‚È‚¢ */ + /* Œ»Ý‚Ì“ú•t‚©‚琄’è */ + if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1)) + sTime.wYear++; + else if(sTimeNow.wMonth+1 == sTime.wMonth) + /* nothing */; + else if(sTimeNow.wMonth < sTime.wMonth) + sTime.wYear--; + + +//################# + /* ¡”N‚̍¡“úˆÈ~‚̃tƒ@ƒCƒ‹‚́AŽÀ‚Í‹Ž”N‚̃tƒ@ƒCƒ‹ */ + if((sTime.wYear == sTimeNow.wYear) && + ((sTime.wMonth > sTimeNow.wMonth) || + ((sTime.wMonth == sTimeNow.wMonth) && (sTime.wDay > sTimeNow.wDay)))) + { + sTime.wYear--; + } + } + } + } + else + { + /* LIST_UNIX_?4, LIST_UNIX_?5 ‚ÌŽž */ + FindField(Str, Buf, 5+offs, NO); + sTime.wYear = atoi(Buf); + FindField(Str, Buf, 6+offs, NO); + sTime.wMonth = atoi(Buf); + FindField(Str, Buf, 7+offs, NO); + sTime.wDay = atoi(Buf); + sTime.wHour = 0; + sTime.wMinute = 0; + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + } + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* –¼‘O */ + if(FindField(Str, Fname, 8+offs+offs2, YES) == SUCCESS) + { + Flag = 'B'; + if(OrgListType & LIST_MELCOM) + { + Flag = Fname[14]; + Fname[14] = NUL; + RemoveTailingSpaces(Fname); + } + else + { + if((Pos = strstr(Fname, " -> ")) != NULL) + *Pos = NUL; + } + + if(strchr("dl", *Str) != NULL) + { + if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) || + (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0)) + { + *(Fname + strlen(Fname) - 1) = NUL; + } + Ret = NODE_DIR; + if(*Str == 'l') + *Link = YES; + } + else if(strchr("-+f", *Str) != NULL) + Ret = NODE_FILE; + + if((Ret == NODE_FILE) && (Flag != 'B')) + Ret = NODE_NONE; + } + break; + } + + if((Ret != NODE_NONE) && (strlen(Fname) > 0)) + { + if(CheckSpecialDirName(Fname) == YES) + Ret = NODE_NONE; + else + ChangeFnameRemote2Local(Fname, FMAX_PATH); + } + return(Ret); +} + + +/*----- Žw’è‚̔ԍ†‚̃tƒB[ƒ‹ƒh‚ð‹‚ß‚é ---------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char *Buf : •¶Žš—ñ‚̃Rƒs[æ +* int Num : ƒtƒB[ƒ‹ƒh”ԍ† +* int ToLast : •¶Žš—ñ‚̍Ōã‚܂ŃRƒs[ (YES/NO) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int FindField(char *Str, char *Buf, int Num, int ToLast) +{ + char *Pos; + int Sts; + + Sts = FAIL; + *Buf = NUL; + if(Num >= 0) + { + while(*Str == ' ') + Str++; + + for(; Num > 0; Num--) + { + if((Str = strchr(Str, ' ')) != NULL) + { + while(*Str == ' ') + { + if(*Str == NUL) + { + Str = NULL; + break; + } + Str++; + } + } + else + break; + } + } + + if(Str != NULL) + { + if((ToLast == YES) || ((Pos = strchr(Str, ' ')) == NULL)) + strcpy(Buf, Str); + else + { + strncpy(Buf, Str, Pos - Str); + *(Buf + (Pos - Str)) = NUL; + } + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- •¶Žš—ñ‚©‚猎‚ð‹‚ß‚é -------------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* WORD *Month : ŒŽ (0=ŒŽ‚ð•\‚·•¶Žš—ñ‚Å‚Í‚È‚¢) +* WORD *Day : “ú (0=“ú‚ÍŠÜ‚Ü‚ê‚Ä‚¢‚È‚¢) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void GetMonth(char *Str, WORD *Month, WORD *Day) +{ + static const char DateStr[] = { "JanFebMarAprMayJunJulAugSepOctNovDec" }; + char *Pos; + + *Month = 0; + *Day = 0; + + if(IsDigit(*Str) == 0) + { + _strlwr(Str); + *Str = toupper(*Str); + if((Pos = strstr(DateStr, Str)) != NULL) + *Month = ((Pos - DateStr) / 3) + 1; + } + else + { + /* u10ŒŽv‚̂悤‚È“ú•t‚ð•Ô‚·‚à‚Ì‚ª‚ ‚é */ + /* Š¿Žš‚ªJIS‚ÌŽž‚Ì‚ÝSJIS‚É•ÏŠ· */ + ConvAutoToSJIS(Str, KANJI_NOCNV); + + Pos = Str; + while(*Pos != NUL) + { + if(!IsDigit(*Pos)) + { + if((_mbsncmp(Pos, "ŒŽ", 1) == 0) || + (memcmp(Pos, "\xB7\xEE", 2) == 0) || /* EUC‚́uŒŽv */ + (memcmp(Pos, "\xD4\xC2", 2) == 0)) /* GBƒR[ƒh‚́uŒŽv */ + { + Pos += 2; + *Month = atoi(Str); + if((*Month < 1) || (*Month > 12)) + *Month = 0; + else + { + /* u10ŒŽ11“úv‚̂悤‚É“ú‚ª‚­‚Á‚‚¢‚Ä‚¢‚鎖‚ª‚ ‚é */ + if(*Pos != NUL) + { + *Day = atoi(Pos); + if((*Day < 1) || (*Day > 31)) + *Day = 0; + } + } + } + else if(_mbsncmp(Pos, "/", 1) == 0) + { + /* u10/v‚̂悤‚È“ú•t‚ð•Ô‚·‚à‚Ì‚ª‚ ‚é */ + Pos += 1; + *Month = atoi(Str); + if((*Month < 1) || (*Month > 12)) + *Month = 0; + else + { + /* u10/11v‚̂悤‚É“ú‚ª‚­‚Á‚‚¢‚Ä‚¢‚鎖‚ª‚ ‚é */ + if(*Pos != NUL) + { + *Day = atoi(Pos); + if((*Day < 1) || (*Day > 31)) + *Day = 0; + } + } + } + break; + } + Pos++; + } + } + return; +} + + +/*----- •¶Žš—ñ‚©‚ç”NŒŽ“ú‚ð‹‚ß‚é ---------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* WORD *Year : ”N +* WORD *Month : ŒŽ +* WORD *Day : “ú +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL=“ú•t‚ð•\‚·•¶Žš‚Å‚Í‚È‚¢) +* +* Note +* ˆÈ‰º‚ÌŒ`Ž®‚ðƒTƒ|[ƒg +* 01/07/25 +* FAIL‚ð•Ô‚·Žž‚Í *Year = 0; *Month = 0; *Day = 0 +*----------------------------------------------------------------------------*/ +static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day) +{ + int Sts; + + Sts = FAIL; + if(strlen(Str) == 8) + { + if(IsDigit(Str[0]) && IsDigit(Str[1]) && !IsDigit(Str[2]) && + IsDigit(Str[3]) && IsDigit(Str[4]) && !IsDigit(Str[5]) && + IsDigit(Str[6]) && IsDigit(Str[7])) + { + *Year = atoi(&Str[0]); + *Month = atoi(&Str[3]); + *Day = atoi(&Str[6]); + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- •¶Žš—ñ‚©‚玞‚ðŽæ‚èo‚· ---------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* WORD *Hour : Žž +* WORD *Minute : •ª +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL=Žž‚ð•\‚·•¶Žš‚Å‚Í‚È‚¢) +* +* Note +* ˆÈ‰º‚ÌŒ`Ž®‚ðƒTƒ|[ƒg +* HH:MM +* HHŽžMM•ª +* FAIL‚ð•Ô‚·Žž‚Í *Hour = 0; *Minute = 0 +*----------------------------------------------------------------------------*/ + +static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute) +{ + int Ret; + char *Pos; + + Ret = FAIL; + if((_mbslen(Str) >= 3) && (isdigit(Str[0]) != 0)) + { + *Hour = atoi(Str); + if(*Hour <= 24) + { + if((Pos = _mbschr(Str, ':')) != NULL) + { + Pos++; + if(IsDigit(*Pos) != 0) + { + *Minute = atoi(Pos); + if(*Minute < 60) + Ret = SUCCESS; + } + } + else + { + /* Š¿Žš‚ªJIS‚ÌŽž‚Ì‚ÝSJIS‚É•ÏŠ· */ + ConvAutoToSJIS(Str, KANJI_NOCNV); + + Pos = Str; + while(*Pos != NUL) + { + if(IsDigit(*Pos) == 0) + { + if((_mbsncmp(Pos, "Žž", 1) == 0) || + (memcmp(Pos, "\xBB\xFE", 2) == 0)) /* EUC‚́uŽžv */ + { + Pos += 2; + if(*Pos != NUL) + { + *Minute = atoi(Pos); + if(*Minute < 60) + Ret = SUCCESS; + } + } + break; + } + Pos++; + } + } + } + } + else if((_stricmp(Str, "a:m") == 0) || (_stricmp(Str, "p:m") == 0)) + { + *Hour = 0; + *Minute = 0; + Ret = SUCCESS; + } + + if(Ret == FAIL) + { + *Hour = 0; + *Minute = 0; + } + return(Ret); +} + + +/*----- VAX VMS‚Ì“ú•t•¶Žš—ñ‚©‚ç“ú•t‚ðŽæ‚èo‚· --------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* WORD *Year : ”N +* WORD *Month : ŒŽ +* WORD *Day : “ú +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL=“ú•t‚ð•\‚·•¶Žš‚Å‚Í‚È‚¢) +* +* Note +* ˆÈ‰º‚ÌŒ`Ž®‚ðƒTƒ|[ƒg +* 18-SEP-1998 +* FAIL‚ð•Ô‚·Žž‚Í *Year = 0; *Month = 0; *Day = 0 +*----------------------------------------------------------------------------*/ + +static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day) +{ + char *Pos; + int Ret; + WORD Tmp; + char Buf[4]; + + Ret = FAIL; + *Day = atoi(Str); + if((Pos = strchr(Str, '-')) != NULL) + { + Pos++; + strncpy(Buf, Pos, 3); + Buf[3] = NUL; + GetMonth(Buf, Month, &Tmp); + if((Pos = strchr(Pos, '-')) != NULL) + { + Pos++; + *Year = atoi(Pos); + Ret = SUCCESS; + } + } + + if(Ret == FAIL) + { + *Year = 0; + *Month = 0; + *Day = 0; + } + return(Ret); +} + + +/*----- 1900”N‘ã‚©2000”N‘ã‚©‚ðŒˆ‚ß‚é ------------------------------------------ +* +* Parameter +* int Year : ”Ni‚QŒ…j +* +* Return Value +* int ”N +*----------------------------------------------------------------------------*/ + +int Assume1900or2000(int Year) +{ + if(Year >= 60) + Year += 1900; + else + Year += 2000; + return(Year); +} + + + +/*----- "."‚â".."‚©‚Ç‚¤‚©‚ð•Ô‚· ----------------------------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES="."‚©".."‚Ì‚Ç‚¿‚ç‚©/NO) +*----------------------------------------------------------------------------*/ + +static int CheckSpecialDirName(char *Fname) +{ + int Sts; + + Sts = NO; + if((strcmp(Fname, ".") == 0) || (strcmp(Fname, "..") == 0)) + Sts = YES; + + return(Sts); +} + + +/*----- ƒtƒBƒ‹ƒ^‚ÉŽw’肳‚ꂽƒtƒ@ƒCƒ‹–¼‚©‚Ç‚¤‚©‚ð•Ô‚· -------------------------- +* +* Parameter +* char Fname : ƒtƒ@ƒCƒ‹–¼ +* int Type : ƒtƒ@ƒCƒ‹‚̃^ƒCƒv (NODE_xxx) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO=•\Ž¦‚µ‚È‚¢ +* +* Note +* ƒtƒBƒ‹ƒ^•¶Žš—ñ‚͈ȉº‚ÌŒ`Ž® +* *.txt;*.log +*----------------------------------------------------------------------------*/ + +static int AskFilterStr(char *Fname, int Type) +{ + int Ret; + char *Tbl; + char *Pos; + char Tmp[FILTER_EXT_LEN+1]; + + Tbl = FilterStr; + Ret = YES; + if((strlen(Tbl) > 0) && (Type == NODE_FILE)) + { + Ret = NO; + while((Tbl != NULL) && (*Tbl != NUL)) + { + while(*Tbl == ';') + Tbl++; + if(*Tbl == NUL) + break; + + strcpy(Tmp, Tbl); + if((Pos = strchr(Tmp, ';')) != NULL) + *Pos = NUL; + + if(CheckFname(Fname, Tmp) == SUCCESS) + { + Ret = YES; + break; + } + + Tbl = strchr(Tbl, ';'); + } + } + return(Ret); +} + + +/*----- ƒtƒBƒ‹ƒ^‚ðÝ’è‚·‚é ---------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetFilter(int *CancelCheckWork) +{ + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(filter_dlg), GetMainHwnd(), FilterWndProc) == YES) + { + DispWindowTitle(); + GetLocalDirForWnd(); + GetRemoteDirForWnd(CACHE_LASTREAD, CancelCheckWork); + } + return; +} + + +/*----- ƒtƒBƒ‹ƒ^“ü—̓_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, FILTER_STR, EM_LIMITTEXT, FILTER_EXT_LEN+1, 0); + SendDlgItemMessage(hDlg, FILTER_STR, WM_SETTEXT, 0, (LPARAM)FilterStr); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, FILTER_STR, WM_GETTEXT, FILTER_EXT_LEN, (LPARAM)FilterStr); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case FILTER_NOR : + strcpy(FilterStr, "*"); + EndDialog(hDlg, YES); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000021); + break; + } + return(TRUE); + } + return(FALSE); +} + + + + + +static int atoi_n(const char *Str, int Len) +{ + char *Tmp; + int Ret; + + Ret = 0; + if((Tmp = malloc(Len+1)) != NULL) + { + memset(Tmp, 0, Len+1); + strncpy(Tmp, Str, Len); + Ret = atoi(Tmp); + free(Tmp); + } + return(Ret); +} + + + + diff --git a/ftpproc.c b/ftpproc.c new file mode 100644 index 0000000..cd217bd --- /dev/null +++ b/ftpproc.c @@ -0,0 +1,3283 @@ +/*============================================================================= +* +* ‚e‚s‚oƒRƒ}ƒ“ƒh‘€ì +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList); +static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); + +static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote); +static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base); +static int CheckLocalFile(TRANSPACKET *Pkt); +static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static void RemoveAfterSemicolon(char *Path); +static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base); +static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt); +static int AskMirrorNoTrn(char *Fname, int Mode); +static int AskUpLoadFileAttr(char *Fname); +static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); +static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); +static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static void SetAttrToDialog(HWND hWnd, int Attr); +static int GetAttrFromDialog(HWND hDlg); +static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static LRESULT CALLBACK SizeDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static int RenameUnuseableName(char *Fname); + +/*===== ŠO•”ŽQÆ ====*/ + +extern HWND hHelpWin; + +/* Ý’è’l */ +extern int FnameCnv; +extern int RecvMode; +extern int SendMode; +extern int MoveMode; +extern char MirrorNoTrn[MIRROR_LEN+1]; +extern char MirrorNoDel[MIRROR_LEN+1]; +extern int MirrorFnameCnv; +extern char DefAttrList[DEFATTRLIST_LEN+1]; +extern SIZE MirrorDlgSize; +extern int VaxSemicolon; +extern int DebugConsole; +extern int CancelFlg; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static char TmpString[FMAX_PATH+80]; /* ƒeƒ“ƒ|ƒ‰ƒŠ */ +static int CurWin; /* ƒEƒCƒ“ƒhƒE”ԍ† */ + +int UpExistMode = EXIST_OVW; /* ƒAƒbƒvƒ[ƒh‚Å“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚̈µ‚¢•û EXIST_xxx */ +int ExistMode = EXIST_OVW; /* “¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚̈µ‚¢•û EXIST_xxx */ +static int ExistNotify; /* Šm”Fƒ_ƒCƒAƒƒO‚ðo‚·‚©‚Ç‚¤‚© YES/NO */ + +static double FileSize; /* ƒtƒ@ƒCƒ‹‘—e—Ê */ + + + +/*----- ƒtƒ@ƒCƒ‹ˆê——‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚é -------------------- +* +* Parameter +* int ChName : –¼‘O‚ð•Ï‚¦‚é‚©‚Ç‚¤‚© (YES/NO) +* int ForceFile : ƒfƒBƒŒƒNƒgƒŠ‚ðƒtƒ@ƒCƒ‹Œ©‚È‚·‚©‚Ç‚¤‚© (YES/NO) +* int All : ‘S‚Ä‚ª‘I‚΂ê‚Ä‚¢‚镨‚Æ‚µ‚Ĉµ‚¤‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DownLoadProc(int ChName, int ForceFile, int All) +{ + FILELIST *FileListBase; + FILELIST *Pos; + TRANSPACKET Pkt; + + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + + ExistNotify = YES; +// KeepTransferDialog(YES); + + FileListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, (ForceFile == YES ? NO : YES), All, &FileListBase, &CancelFlg); + + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + Pos = FileListBase; + while(Pos != NULL) + { + AskLocalCurDir(Pkt.LocalFile, FMAX_PATH); + SetYenTail(Pkt.LocalFile); + strcpy(TmpString, Pos->File); + if((ChName == NO) || ((ForceFile == NO) && (Pos->Node == NODE_DIR))) + { + if(FnameCnv == FNAME_LOWER) + _mbslwr(TmpString); + else if(FnameCnv == FNAME_UPPER) + _mbsupr(TmpString); + RemoveAfterSemicolon(TmpString); + if(RenameUnuseableName(TmpString) == FAIL) + break; + } + else + { + CurWin = WIN_REMOTE; + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES) + { + if(RenameUnuseableName(TmpString) == FAIL) + break; + } + else + break; + } + strcat(Pkt.LocalFile, TmpString); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + if((ForceFile == NO) && (Pos->Node == NODE_DIR)) + { + strcpy(Pkt.Cmd, "MKD "); + strcpy(Pkt.RemoteFile, ""); + AddTransFileList(&Pkt); + } + else if((Pos->Node == NODE_FILE) || + ((ForceFile == YES) && (Pos->Node == NODE_DIR))) + { + if(AskHostType() == HTYPE_ACOS) + { + strcpy(Pkt.RemoteFile, "'"); + strcat(Pkt.RemoteFile, AskHostLsName()); + strcat(Pkt.RemoteFile, "("); + strcat(Pkt.RemoteFile, Pos->File); + strcat(Pkt.RemoteFile, ")"); + strcat(Pkt.RemoteFile, "'"); + } + else if(AskHostType() == HTYPE_ACOS_4) + { + strcpy(Pkt.RemoteFile, Pos->File); + } + else + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + strcat(Pkt.RemoteFile, Pos->File); + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + } + + strcpy(Pkt.Cmd, "RETR "); + Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType()); + Pkt.Size = Pos->Size; + Pkt.Time = Pos->Time; + Pkt.KanjiCode = AskHostKanjiCode(); + Pkt.KanaCnv = AskHostKanaCnv(); + + Pkt.Mode = CheckLocalFile(&Pkt); /* Pkt.ExistSize ‚ªƒZƒbƒg‚³‚ê‚é */ + if(Pkt.Mode == EXIST_ABORT) + break; + else if(Pkt.Mode != EXIST_IGNORE) + AddTransFileList(&Pkt); + } + Pos = Pos->Next; + } + + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "BACKCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + DeleteFileList(&FileListBase); + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + + GoForwardTransWindow(); +// KeepTransferDialog(NO); + + EnableUserOpe(); + } + return; +} + + +/*----- Žw’肳‚ꂽƒtƒ@ƒCƒ‹‚ðˆê‚ƒ_ƒEƒ“ƒ[ƒh‚·‚é ------------------------------ +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DirectDownLoadProc(char *Fname) +{ + TRANSPACKET Pkt; + + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + + ExistNotify = YES; +// KeepTransferDialog(YES); + + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + if(strlen(Fname) > 0) + { + AskLocalCurDir(Pkt.LocalFile, FMAX_PATH); + SetYenTail(Pkt.LocalFile); + strcpy(TmpString, Fname); + if(FnameCnv == FNAME_LOWER) + _mbslwr(TmpString); + else if(FnameCnv == FNAME_UPPER) + _mbsupr(TmpString); + RemoveAfterSemicolon(TmpString); + + if(RenameUnuseableName(TmpString) == SUCCESS) + { + strcat(Pkt.LocalFile, TmpString); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + if(AskHostType() == HTYPE_ACOS) + { + strcpy(Pkt.RemoteFile, "'"); + strcat(Pkt.RemoteFile, AskHostLsName()); + strcat(Pkt.RemoteFile, "("); + strcat(Pkt.RemoteFile, Fname); + strcat(Pkt.RemoteFile, ")"); + strcat(Pkt.RemoteFile, "'"); + } + else if(AskHostType() == HTYPE_ACOS_4) + { + strcpy(Pkt.RemoteFile, Fname); + } + else + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + strcat(Pkt.RemoteFile, Fname); + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + } + + strcpy(Pkt.Cmd, "RETR-S "); + Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType()); + + /* ƒTƒCƒY‚Æ“ú•t‚Í“]‘—‘¤ƒXƒŒƒbƒh‚Ŏ擾‚µAƒZƒbƒg‚·‚é */ + + Pkt.KanjiCode = AskHostKanjiCode(); + Pkt.KanaCnv = AskHostKanaCnv(); + + Pkt.Mode = CheckLocalFile(&Pkt); /* Pkt.ExistSize ‚ªƒZƒbƒg‚³‚ê‚é */ + if((Pkt.Mode != EXIST_ABORT) && (Pkt.Mode != EXIST_IGNORE)) + AddTransFileList(&Pkt); + } + } + + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "BACKCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + + GoForwardTransWindow(); +// KeepTransferDialog(NO); + + EnableUserOpe(); + } + return; +} + + +/*----- “ü—Í‚³‚ꂽƒtƒ@ƒCƒ‹–¼‚̃tƒ@ƒCƒ‹‚ðˆê‚ƒ_ƒEƒ“ƒ[ƒh‚·‚é ------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void InputDownLoadProc(void) +{ + char Path[FMAX_PATH+1]; + int Tmp; + +// DisableUserOpe(); + + strcpy(Path, ""); + if(InputDialogBox(downname_dlg, GetMainHwnd(), NULL, Path, FMAX_PATH, &Tmp, IDH_HELP_TOPIC_0000001) == YES) + { + DirectDownLoadProc(Path); + } + +// EnableUserOpe(); + + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ðs‚¤ ---------------------------------------- +* +* Parameter +* int Notify : Šm”F‚ðs‚¤‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MirrorDownloadProc(int Notify) +{ + FILELIST *LocalListBase; + FILELIST *RemoteListBase; + FILELIST *LocalPos; + FILELIST *RemotePos; + TRANSPACKET Pkt; + TRANSPACKET *Base; + char Name[FMAX_PATH+1]; + char *Cat; + int Level; + int Mode; + + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + + Base = NULL; + + if(Notify == YES) + Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_down_dlg), GetMainHwnd(), MirrorNotifyCallBack, 0); + else + Notify = YES; + + if((Notify == YES) || (Notify == YES_LIST)) + { + /*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒgŽæ“¾ =====*/ + + LocalListBase = NULL; + MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg); + RemoteListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg); + + RemotePos = RemoteListBase; + while(RemotePos != NULL) + { + RemotePos->Attr = YES; /* RemotePos->Attr‚Í“]‘—‚·‚é‚©‚Ç‚¤‚©‚̃tƒ‰ƒO‚ÉŽg—p (YES/NO) */ + RemotePos = RemotePos->Next; + } + + LocalPos = LocalListBase; + while(LocalPos != NULL) + { + if(AskMirrorNoTrn(LocalPos->File, 1) == NO) + { + LocalPos->Attr = YES; + LocalPos = LocalPos->Next; + } + else + { + LocalPos->Attr = NO; /* LocalPos->Attr‚͍폜‚·‚é‚©‚Ç‚¤‚©‚̃tƒ‰ƒO‚ÉŽg—p (YES/NO) */ + + if(LocalPos->Node == NODE_DIR) + { + Level = AskDirLevel(LocalPos->File); + LocalPos = LocalPos->Next; + while(LocalPos != NULL) + { + if((LocalPos->Node == NODE_DIR) && + (AskDirLevel(LocalPos->File) <= Level)) + { + break; + } + LocalPos->Attr = NO; + LocalPos = LocalPos->Next; + } + } + else + LocalPos = LocalPos->Next; + } + } + + /*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒg”äŠr =====*/ + + RemotePos = RemoteListBase; + while(RemotePos != NULL) + { + if(AskMirrorNoTrn(RemotePos->File, 0) == NO) + { + strcpy(Name, RemotePos->File); +// ReplaceAll(Name, '/', '\\'); + + if(MirrorFnameCnv == YES) + Mode = COMP_LOWERMATCH; + else + Mode = COMP_STRICT; + + if((LocalPos = SearchFileList(Name, LocalListBase, Mode)) != NULL) + { + if((RemotePos->Node == NODE_DIR) && (LocalPos->Node == NODE_DIR)) + { + LocalPos->Attr = NO; + RemotePos->Attr = NO; + } + else if((RemotePos->Node == NODE_FILE) && (LocalPos->Node == NODE_FILE)) + { + LocalPos->Attr = NO; + if(CompareFileTime(&RemotePos->Time, &LocalPos->Time) <= 0) + RemotePos->Attr = NO; + } + } + RemotePos = RemotePos->Next; + } + else + { + if(RemotePos->Node == NODE_FILE) + { + RemotePos->Attr = NO; + RemotePos = RemotePos->Next; + } + else + { + RemotePos->Attr = NO; + Level = AskDirLevel(RemotePos->File); + RemotePos = RemotePos->Next; + while(RemotePos != NULL) + { + if((RemotePos->Node == NODE_DIR) && + (AskDirLevel(RemotePos->File) <= Level)) + { + break; + } + RemotePos->Attr = NO; + RemotePos = RemotePos->Next; + } + } + } + } + + DispMirrorFiles(LocalListBase, RemoteListBase); + + /*===== íœ^ƒAƒbƒvƒ[ƒh =====*/ + + LocalPos = LocalListBase; + while(LocalPos != NULL) + { + if((LocalPos->Attr == YES) && (LocalPos->Node == NODE_FILE)) + { + AskLocalCurDir(Pkt.LocalFile, FMAX_PATH); + SetYenTail(Pkt.LocalFile); + strcat(Pkt.LocalFile, LocalPos->File); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + strcpy(Pkt.RemoteFile, ""); + strcpy(Pkt.Cmd, "L-DELE "); + AddTmpTransFileList(&Pkt, &Base); + } + LocalPos = LocalPos->Next; + } + MirrorDeleteAllLocalDir(LocalListBase, &Pkt, &Base); + + + RemotePos = RemoteListBase; + while(RemotePos != NULL) + { + if(RemotePos->Attr == YES) + { + AskLocalCurDir(Pkt.LocalFile, FMAX_PATH); + SetYenTail(Pkt.LocalFile); + Cat = strchr(Pkt.LocalFile, NUL); + strcat(Pkt.LocalFile, RemotePos->File); + + if(MirrorFnameCnv == YES) + _mbslwr(Cat); + + RemoveAfterSemicolon(Cat); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + if(RemotePos->Node == NODE_DIR) + { + strcpy(Pkt.RemoteFile, ""); + strcpy(Pkt.Cmd, "L-MKD "); + AddTmpTransFileList(&Pkt, &Base); + } + else if(RemotePos->Node == NODE_FILE) + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + strcat(Pkt.RemoteFile, RemotePos->File); + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + + strcpy(Pkt.Cmd, "RETR "); + Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType()); + Pkt.Size = RemotePos->Size; + Pkt.Time = RemotePos->Time; +// Pkt.Attr = 0; + Pkt.KanjiCode = AskHostKanjiCode(); + Pkt.KanaCnv = AskHostKanaCnv(); + Pkt.Mode = EXIST_OVW; + AddTmpTransFileList(&Pkt, &Base); + } + } + RemotePos = RemotePos->Next; + } + + if((Notify == YES) || + (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirrordown_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES)) + { + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + AppendTransFileList(Base); + + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "BACKCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + } + else + EraseTmpTransFileList(&Base); + + DeleteFileList(&LocalListBase); + DeleteFileList(&RemoteListBase); + + GoForwardTransWindow(); + } + + EnableUserOpe(); + } + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒO‚̃tƒ@ƒCƒ‹ˆê——‚ð•\Ž¦ -------------------------------------- +* +* Parameter +* FILELIST *Local : ƒ[ƒJƒ‹‘¤ +* FILELIST *Remote : ƒŠƒ‚[ƒg‘¤ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote) +{ + char Date[80]; + SYSTEMTIME sTime; + FILETIME fTime; + + if(DebugConsole == YES) + { + DoPrintf("---- MIRROR FILE LIST ----"); + while(Local != NULL) + { + FileTimeToLocalFileTime(&Local->Time, &fTime); + FileTimeToSystemTime(&fTime, &sTime); + sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", + sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds); + DoPrintf("LOCAL : %s %s [%s] %s", Local->Attr==1?"YES":"NO ", Local->Node==NODE_DIR?"DIR ":"FILE", Date, Local->File); + Local = Local->Next; + } + while(Remote != NULL) + { + FileTimeToLocalFileTime(&Remote->Time, &fTime); + FileTimeToSystemTime(&fTime, &sTime); + sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", + sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds); + DoPrintf("REMOTE : %s %s [%s] %s", Remote->Attr==1?"YES":"NO ", Remote->Node==NODE_DIR?"DIR ":"FILE", Date, Remote->File); + Remote = Remote->Next; + } + DoPrintf("---- END ----"); + } + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOŽž‚̃[ƒJƒ‹‘¤‚̃tƒHƒ‹ƒ_íœ ------------------------------ +* +* Parameter +* FILELIST *Local : ƒtƒ@ƒCƒ‹ƒŠƒXƒg +* TRANSPACKET *Pkt : +* TRANSPACKET **Base : +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base) +{ + while(Local != NULL) + { + if(Local->Node == NODE_DIR) + { + MirrorDeleteAllLocalDir(Local->Next, Pkt, Base); + + if(Local->Attr == YES) + { + AskLocalCurDir(Pkt->LocalFile, FMAX_PATH); + SetYenTail(Pkt->LocalFile); + strcat(Pkt->LocalFile, Local->File); + ReplaceAll(Pkt->LocalFile, '/', '\\'); + strcpy(Pkt->RemoteFile, ""); + strcpy(Pkt->Cmd, "L-RMD "); + AddTmpTransFileList(Pkt, Base); + } + break; + } + Local = Local->Next; + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹–¼‚̃Zƒ~ƒRƒƒ“ˆÈ~‚ðŽæ‚菜‚­ ---------------------------------- +* +* Parameter +* char *Path : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* Path‚Ì“à—e‚ª‘‚«Š·‚¦‚ç‚ê‚é +* ƒIƒvƒVƒ‡ƒ“Ý’è‚É‚æ‚Á‚ďˆ—‚ðØ‘Ö‚¦‚é +*----------------------------------------------------------------------------*/ + +static void RemoveAfterSemicolon(char *Path) +{ + char *Pos; + + if(VaxSemicolon == YES) + { + if((Pos = strchr(Path, ';')) != NULL) + *Pos = NUL; + } + return; +} + + +/*----- ƒ[ƒJƒ‹‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚È‚¢‚©ƒ`ƒFƒbƒN -------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* int ˆ—•û–@ +* EXIST_OVW/EXIST_RESUME/EXIST_IGNORE +* +* Note +* Pkt.ExistSize, ExistModeAExistNotify ‚ª•ÏX‚³‚ê‚é +*----------------------------------------------------------------------------*/ + +static int CheckLocalFile(TRANSPACKET *Pkt) +{ + HANDLE fHnd; + WIN32_FIND_DATA Find; + int Ret; + + Ret = EXIST_OVW; + Pkt->ExistSize = 0; + if(RecvMode != TRANS_OVW) + { + if((fHnd = FindFirstFile(Pkt->LocalFile, &Find)) != INVALID_HANDLE_VALUE) + { + FindClose(fHnd); + + Pkt->ExistSize = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow); + + if(ExistNotify == YES) + { + SoundPlay(SND_ERROR); + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(down_exist_dlg), GetMainHwnd(), DownExistDialogCallBack, (LPARAM)Pkt) == NO) + Ret = EXIST_ABORT; + else + Ret = ExistMode; + } + else + Ret = ExistMode; + + if(Ret == EXIST_NEW) + { + /*ƒtƒ@ƒCƒ‹“ú•tƒ`ƒFƒbƒN */ + if(CompareFileTime(&Find.ftLastWriteTime, &Pkt->Time) < 0) + Ret = EXIST_OVW; + else + Ret = EXIST_IGNORE; + } + } + } + return(Ret); +} + + +/*----- ƒ[ƒJƒ‹‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚ÌŠm”Fƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ---- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static TRANSPACKET *Pkt; + static const RADIOBUTTON DownExistButton[] = { + { DOWN_EXIST_OVW, EXIST_OVW }, + { DOWN_EXIST_NEW, EXIST_NEW }, + { DOWN_EXIST_RESUME, EXIST_RESUME }, + { DOWN_EXIST_IGNORE, EXIST_IGNORE } + }; + #define DOWNEXISTBUTTONS (sizeof(DownExistButton)/sizeof(RADIOBUTTON)) + + switch (iMessage) + { + case WM_INITDIALOG : + Pkt = (TRANSPACKET *)lParam; + SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, WM_SETTEXT, 0, (LPARAM)Pkt->LocalFile); + + if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0)) + EnableWindow(GetDlgItem(hDlg, DOWN_EXIST_RESUME), FALSE); + + SetRadioButtonByValue(hDlg, ExistMode, DownExistButton, DOWNEXISTBUTTONS); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK_ALL : + ExistNotify = NO; + /* ‚±‚±‚É break ‚Í‚È‚¢ */ + + case IDOK : + ExistMode = AskRadioButtonValue(hDlg, DownExistButton, DOWNEXISTBUTTONS); + SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, WM_GETTEXT, FMAX_PATH, (LPARAM)Pkt->LocalFile); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : +// ExistMode = EXIST_ABORT; + EndDialog(hDlg, NO); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000009); + break; + } + return(TRUE); + } + return(FALSE); +} + + + + + + +/*----- ƒtƒ@ƒCƒ‹ˆê——‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚·‚é -------------------- +* +* Parameter +* int ChName : –¼‘O‚ð•Ï‚¦‚é‚©‚Ç‚¤‚© (YES/NO) +* int All : ‘S‚Ä‚ª‘I‚΂ê‚Ä‚¢‚镨‚Æ‚µ‚Ĉµ‚¤‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void UpLoadListProc(int ChName, int All) +{ + FILELIST *FileListBase; + FILELIST *Pos; + TRANSPACKET Pkt; + TRANSPACKET Pkt1; + char *Cat; + FILELIST *RemoteList; + char Tmp[FMAX_PATH+1]; + int FirstAdd; + + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + + // ƒ[ƒJƒ‹‘¤‚Å‘I‚΂ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ðFileListBase‚É“o˜^ + FileListBase = NULL; + MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg); + + // Œ»ÝƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ðRemoteList‚É“o˜^ + // “¯–¼ƒtƒ@ƒCƒ‹ƒ`ƒFƒbƒN—p + RemoteList = NULL; + AddRemoteTreeToFileList(AskCurrentFileListNum(), "", RDIR_NONE, &RemoteList); + + FirstAdd = YES; + ExistNotify = YES; + + Pos = FileListBase; + while(Pos != NULL) + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + Cat = strchr(Pkt.RemoteFile, NUL); + if((ChName == NO) || (Pos->Node == NODE_DIR)) + { + strcat(Pkt.RemoteFile, Pos->File); + if(FnameCnv == FNAME_LOWER) + _mbslwr(Cat); + else if(FnameCnv == FNAME_UPPER) + _mbsupr(Cat); + } + else + { + // –¼‘O‚ð•ÏX‚·‚é + strcpy(TmpString, Pos->File); + CurWin = WIN_LOCAL; + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES) + strcat(Pkt.RemoteFile, TmpString); + else + break; + } + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + + if(AskHostType() == HTYPE_ACOS) + { + strcpy(Pkt.RemoteFile, "'"); + strcat(Pkt.RemoteFile, AskHostLsName()); + strcat(Pkt.RemoteFile, "("); + strcat(Pkt.RemoteFile, Cat); + strcat(Pkt.RemoteFile, ")"); + strcat(Pkt.RemoteFile, "'"); + } + else if(AskHostType() == HTYPE_ACOS_4) + strcpy(Pkt.RemoteFile, Cat); + + if(Pos->Node == NODE_DIR) + { + // ƒtƒHƒ‹ƒ_‚̏ꍇ + + // ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ðRemoteList‚É“o˜^ + // “¯–¼ƒtƒ@ƒCƒ‹ƒ`ƒFƒbƒN—p + if(RemoteList != NULL) + DeleteFileList(&RemoteList); + RemoteList = NULL; + + AskRemoteCurDir(Tmp, FMAX_PATH); + if(DoCWD(Pkt.RemoteFile, NO, NO, NO) == FTP_COMPLETE) + { + if(DoDirListCmdSkt("", "", 998, &CancelFlg) == FTP_COMPLETE) + AddRemoteTreeToFileList(998, "", RDIR_NONE, &RemoteList); + DoCWD(Tmp, NO, NO, NO); + } + else + { + // ƒtƒHƒ‹ƒ_‚ðì¬ + if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt1.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt1); + } + FirstAdd = NO; + strcpy(Pkt.Cmd, "MKD "); + strcpy(Pkt.LocalFile, ""); + AddTransFileList(&Pkt); + } + } + else if(Pos->Node == NODE_FILE) + { + // ƒtƒ@ƒCƒ‹‚̏ꍇ + AskLocalCurDir(Pkt.LocalFile, FMAX_PATH); + SetYenTail(Pkt.LocalFile); + strcat(Pkt.LocalFile, Pos->File); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + strcpy(Pkt.Cmd, "STOR "); + Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType()); + Pkt.Size = 0; + Pkt.Time = Pos->Time; + Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile); + Pkt.KanjiCode = AskHostKanjiCode(); + Pkt.KanaCnv = AskHostKanaCnv(); + Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); + if(Pkt.Mode == EXIST_ABORT) + break; + else if(Pkt.Mode != EXIST_IGNORE) + { + if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt1.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt1); + } + FirstAdd = NO; + AddTransFileList(&Pkt); + } + } + Pos = Pos->Next; + } + + if((FirstAdd == NO) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt.Cmd, "BACKCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + if(RemoteList != NULL) + DeleteFileList(&RemoteList); + + DeleteFileList(&FileListBase); + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + + GoForwardTransWindow(); + + EnableUserOpe(); + } + return; +} + + +/*----- ƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚·‚é -------------- +* +* Parameter +* WPARAM wParam : ƒhƒƒbƒv‚³‚ꂽƒtƒ@ƒCƒ‹‚̏î•ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void UpLoadDragProc(WPARAM wParam) +{ + FILELIST *FileListBase; + FILELIST *Pos; + TRANSPACKET Pkt; + TRANSPACKET Pkt1; + char *Cat; + FILELIST *RemoteList; + char Tmp[FMAX_PATH+1]; + int FirstAdd; + char Cur[FMAX_PATH+1]; + + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + + // ƒ[ƒJƒ‹‘¤‚Å‘I‚΂ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ðFileListBase‚É“o˜^ + FileListBase = NULL; + MakeDroppedFileList(wParam, Cur, &FileListBase); + + // Œ»ÝƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚é‚à‚Ì‚ðRemoteList‚É“o˜^ + // “¯–¼ƒtƒ@ƒCƒ‹ƒ`ƒFƒbƒN—p + RemoteList = NULL; + AddRemoteTreeToFileList(AskCurrentFileListNum(), "", RDIR_NONE, &RemoteList); + + FirstAdd = YES; + ExistNotify = YES; + + Pos = FileListBase; + while(Pos != NULL) + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + Cat = strchr(Pkt.RemoteFile, NUL); + + strcat(Pkt.RemoteFile, Pos->File); + if(FnameCnv == FNAME_LOWER) + _mbslwr(Cat); + else if(FnameCnv == FNAME_UPPER) + _mbsupr(Cat); + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + + if(AskHostType() == HTYPE_ACOS) + { + strcpy(Pkt.RemoteFile, "'"); + strcat(Pkt.RemoteFile, AskHostLsName()); + strcat(Pkt.RemoteFile, "("); + strcat(Pkt.RemoteFile, Cat); + strcat(Pkt.RemoteFile, ")"); + strcat(Pkt.RemoteFile, "'"); + } + else if(AskHostType() == HTYPE_ACOS_4) + strcpy(Pkt.RemoteFile, Cat); + + if(Pos->Node == NODE_DIR) + { + // ƒtƒHƒ‹ƒ_‚̏ꍇ + + // ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ðRemoteList‚É“o˜^ + // “¯–¼ƒtƒ@ƒCƒ‹ƒ`ƒFƒbƒN—p + if(RemoteList != NULL) + DeleteFileList(&RemoteList); + RemoteList = NULL; + + AskRemoteCurDir(Tmp, FMAX_PATH); + if(DoCWD(Pkt.RemoteFile, NO, NO, NO) == FTP_COMPLETE) + { + if(DoDirListCmdSkt("", "", 998, &CancelFlg) == FTP_COMPLETE) + AddRemoteTreeToFileList(998, "", RDIR_NONE, &RemoteList); + DoCWD(Tmp, NO, NO, NO); + } + else + { + if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt1.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt1); + } + FirstAdd = NO; + strcpy(Pkt.Cmd, "MKD "); + strcpy(Pkt.LocalFile, ""); + AddTransFileList(&Pkt); + } + } + else if(Pos->Node == NODE_FILE) + { + // ƒtƒ@ƒCƒ‹‚̏ꍇ + strcpy(Pkt.LocalFile, Cur); + SetYenTail(Pkt.LocalFile); + strcat(Pkt.LocalFile, Pos->File); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + strcpy(Pkt.Cmd, "STOR "); + Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType()); + Pkt.Size = 0; + Pkt.Time = Pos->Time; + Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile); + Pkt.KanjiCode = AskHostKanjiCode(); + Pkt.KanaCnv = AskHostKanaCnv(); + Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); + if(Pkt.Mode == EXIST_ABORT) + break; + else if(Pkt.Mode != EXIST_IGNORE) + { + if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt1.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt1); + } + FirstAdd = NO; + AddTransFileList(&Pkt); + } + } + Pos = Pos->Next; + } + + if((FirstAdd == NO) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt.Cmd, "BACKCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + if(RemoteList != NULL) + DeleteFileList(&RemoteList); + + DeleteFileList(&FileListBase); + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + + GoForwardTransWindow(); + + EnableUserOpe(); + } + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðs‚¤ ---------------------------------------- +* +* Parameter +* int Notify : Šm”F‚ðs‚¤‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MirrorUploadProc(int Notify) +{ + FILELIST *LocalListBase; + FILELIST *RemoteListBase; + FILELIST *LocalPos; + FILELIST *RemotePos; + TRANSPACKET Pkt; + TRANSPACKET *Base; + char Name[FMAX_PATH+1]; + char *Cat; + int Level; + int Mode; + SYSTEMTIME TmpStime; + FILETIME TmpFtimeL; + FILETIME TmpFtimeR; + + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + + Base = NULL; + + if(Notify == YES) + Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_up_dlg), GetMainHwnd(), MirrorNotifyCallBack, 1); + else + Notify = YES; + + if((Notify == YES) || (Notify == YES_LIST)) + { + /*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒgŽæ“¾ =====*/ + + LocalListBase = NULL; + MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg); + RemoteListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg); + + LocalPos = LocalListBase; + while(LocalPos != NULL) + { + LocalPos->Attr = YES; /* LocalPos->Attr‚Í“]‘—‚·‚é‚©‚Ç‚¤‚©‚̃tƒ‰ƒO‚ÉŽg—p (YES/NO) */ + LocalPos = LocalPos->Next; + } + + RemotePos = RemoteListBase; + while(RemotePos != NULL) + { + if(AskMirrorNoTrn(RemotePos->File, 1) == NO) + { + RemotePos->Attr = YES; + RemotePos = RemotePos->Next; + } + else + { + RemotePos->Attr = NO; /* RemotePos->Attr‚͍폜‚·‚é‚©‚Ç‚¤‚©‚̃tƒ‰ƒO‚ÉŽg—p (YES/NO) */ + + if(RemotePos->Node == NODE_DIR) + { + Level = AskDirLevel(RemotePos->File); + RemotePos = RemotePos->Next; + while(RemotePos != NULL) + { + if((RemotePos->Node == NODE_DIR) && + (AskDirLevel(RemotePos->File) <= Level)) + { + break; + } + RemotePos->Attr = NO; + RemotePos = RemotePos->Next; + } + } + else + RemotePos = RemotePos->Next; + } + } + + /*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒg”äŠr =====*/ + + LocalPos = LocalListBase; + while(LocalPos != NULL) + { + if(AskMirrorNoTrn(LocalPos->File, 0) == NO) + { + strcpy(Name, LocalPos->File); + ReplaceAll(Name, '\\', '/'); + + if(MirrorFnameCnv == YES) + Mode = COMP_LOWERMATCH; + else + Mode = COMP_STRICT; + + if(LocalPos->Node == NODE_DIR) + { + if((RemotePos = SearchFileList(Name, RemoteListBase, Mode)) != NULL) + { + if(RemotePos->Node == NODE_DIR) + { + RemotePos->Attr = NO; + LocalPos->Attr = NO; + } + } + } + else if(LocalPos->Node == NODE_FILE) + { + if((RemotePos = SearchFileList(Name, RemoteListBase, Mode)) != NULL) + { + if(RemotePos->Node == NODE_FILE) + { + FileTimeToLocalFileTime(&LocalPos->Time, &TmpFtimeL); + FileTimeToLocalFileTime(&RemotePos->Time, &TmpFtimeR); + if((RemotePos->InfoExist & FINFO_TIME) == 0) + { + FileTimeToSystemTime(&TmpFtimeL, &TmpStime); + TmpStime.wHour = 0; + TmpStime.wMinute = 0; + TmpStime.wSecond = 0; + TmpStime.wMilliseconds = 0; + SystemTimeToFileTime(&TmpStime, &TmpFtimeL); + + FileTimeToSystemTime(&TmpFtimeR, &TmpStime); + TmpStime.wHour = 0; + TmpStime.wMinute = 0; + TmpStime.wSecond = 0; + TmpStime.wMilliseconds = 0; + SystemTimeToFileTime(&TmpStime, &TmpFtimeR); + } + RemotePos->Attr = NO; + if(CompareFileTime(&TmpFtimeL, &TmpFtimeR) <= 0) + LocalPos->Attr = NO; + } + } + } + + LocalPos = LocalPos->Next; + } + else + { + if(LocalPos->Node == NODE_FILE) + { + LocalPos->Attr = NO; + LocalPos = LocalPos->Next; + } + else + { + LocalPos->Attr = NO; + Level = AskDirLevel(LocalPos->File); + LocalPos = LocalPos->Next; + while(LocalPos != NULL) + { + if((LocalPos->Node == NODE_DIR) && + (AskDirLevel(LocalPos->File) <= Level)) + { + break; + } + LocalPos->Attr = NO; + LocalPos = LocalPos->Next; + } + } + } + } + + DispMirrorFiles(LocalListBase, RemoteListBase); + + /*===== íœ^ƒAƒbƒvƒ[ƒh =====*/ + + RemotePos = RemoteListBase; + while(RemotePos != NULL) + { + if((RemotePos->Attr == YES) && (RemotePos->Node == NODE_FILE)) + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + strcat(Pkt.RemoteFile, RemotePos->File); + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + strcpy(Pkt.LocalFile, ""); + strcpy(Pkt.Cmd, "R-DELE "); + AddTmpTransFileList(&Pkt, &Base); + } + RemotePos = RemotePos->Next; + } + MirrorDeleteAllDir(RemoteListBase, &Pkt, &Base); + + LocalPos = LocalListBase; + while(LocalPos != NULL) + { + if(LocalPos->Attr == YES) + { + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + SetSlashTail(Pkt.RemoteFile); + Cat = strchr(Pkt.RemoteFile, NUL); + strcat(Pkt.RemoteFile, LocalPos->File); + + if(MirrorFnameCnv == YES) + _mbslwr(Cat); + + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + + if(LocalPos->Node == NODE_DIR) + { + strcpy(Pkt.LocalFile, ""); + strcpy(Pkt.Cmd, "R-MKD "); + AddTmpTransFileList(&Pkt, &Base); + } + else if(LocalPos->Node == NODE_FILE) + { + AskLocalCurDir(Pkt.LocalFile, FMAX_PATH); + SetYenTail(Pkt.LocalFile); + strcat(Pkt.LocalFile, LocalPos->File); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + strcpy(Pkt.Cmd, "STOR "); + Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType()); + Pkt.Size = 0; + Pkt.Time = LocalPos->Time; + Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile); + Pkt.KanjiCode = AskHostKanjiCode(); + Pkt.KanaCnv = AskHostKanaCnv(); + Pkt.Mode = EXIST_OVW; + AddTmpTransFileList(&Pkt, &Base); + } + } + LocalPos = LocalPos->Next; + } + + if((Notify == YES) || + (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES)) + { + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + AppendTransFileList(Base); + + if(AskNoFullPathMode() == YES) + { + strcpy(Pkt.Cmd, "BACKCUR"); + AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt); + } + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + } + else + EraseTmpTransFileList(&Base); + + DeleteFileList(&LocalListBase); + DeleteFileList(&RemoteListBase); + + GoForwardTransWindow(); + } + + EnableUserOpe(); + } + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOŽž‚̃zƒXƒg‘¤‚̃tƒHƒ‹ƒ_íœ -------------------------------- +* +* Parameter +* FILELIST *Base : ƒtƒ@ƒCƒ‹ƒŠƒXƒg +* TRANSPACKET *Pkt : +* TRANSPACKET **Base : +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base) +{ + while(Remote != NULL) + { + if(Remote->Node == NODE_DIR) + { + MirrorDeleteAllDir(Remote->Next, Pkt, Base); + + if(Remote->Attr == YES) + { + AskRemoteCurDir(Pkt->RemoteFile, FMAX_PATH); + SetSlashTail(Pkt->RemoteFile); + strcat(Pkt->RemoteFile, Remote->File); + ReplaceAll(Pkt->RemoteFile, '\\', '/'); + strcpy(Pkt->LocalFile, ""); + strcpy(Pkt->Cmd, "R-RMD "); + AddTmpTransFileList(Pkt, Base); + } + break; + } + Remote = Remote->Next; + } + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒhŠJŽnŠm”FƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static int Mode; + + switch (iMessage) + { + case WM_INITDIALOG : + Mode = lParam; + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case MIRRORUP_DISP : + EndDialog(hDlg, YES_LIST); + break; + + case IDHELP : + if(Mode == 0) + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000013); + else + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000012); + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒhˆ—“à—eŠm”FƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static DIALOGSIZE DlgSize = { + { MIRROR_DEL, MIRROR_SIZEGRIP, -1 }, + { IDOK, IDCANCEL, IDHELP, MIRROR_DEL, MIRROR_COPYNUM, MIRROR_MAKENUM, MIRROR_DELNUM, MIRROR_SIZEGRIP, -1 }, + { MIRROR_LIST, -1 }, + { 0, 0 }, + { 0, 0 } + }; + + static TRANSPACKET **Base; + TRANSPACKET *Pos; + char Tmp[FMAX_PATH+1+6]; + int Num; + int *List; + + switch (iMessage) + { + case WM_INITDIALOG : + Base = (TRANSPACKET **)lParam; + Pos = *Base; + while(Pos != NULL) + { + strcpy(Tmp, ""); + if((strncmp(Pos->Cmd, "R-DELE", 6) == 0) || + (strncmp(Pos->Cmd, "R-RMD", 5) == 0)) + sprintf(Tmp, MSGJPN052, Pos->RemoteFile); + else if(strncmp(Pos->Cmd, "R-MKD", 5) == 0) + sprintf(Tmp, MSGJPN053, Pos->RemoteFile); + else if(strncmp(Pos->Cmd, "STOR", 4) == 0) + sprintf(Tmp, MSGJPN054, Pos->RemoteFile); + else if((strncmp(Pos->Cmd, "L-DELE", 6) == 0) || + (strncmp(Pos->Cmd, "L-RMD", 5) == 0)) + sprintf(Tmp, MSGJPN055, Pos->LocalFile); + else if(strncmp(Pos->Cmd, "L-MKD", 5) == 0) + sprintf(Tmp, MSGJPN056, Pos->LocalFile); + else if(strncmp(Pos->Cmd, "RETR", 4) == 0) + sprintf(Tmp, MSGJPN057, Pos->LocalFile); + + if(strlen(Tmp) > 0) + SendDlgItemMessage(hDlg, MIRROR_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp); + Pos = Pos->Next; + } + CountMirrorFiles(hDlg, *Base); + DlgSizeInit(hDlg, &DlgSize, &MirrorDlgSize); + EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), FALSE); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + AskDlgSize(hDlg, &DlgSize, &MirrorDlgSize); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + AskDlgSize(hDlg, &DlgSize, &MirrorDlgSize); + EndDialog(hDlg, NO); + break; + + case MIRROR_DEL : + Num = SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELCOUNT, 0, 0); + if((List = malloc(Num * sizeof(int))) != NULL) + { + Num = SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELITEMS, Num, (LPARAM)List); + for(Num--; Num >= 0; Num--) + { + if(RemoveTmpTransFileListItem(Base, List[Num]) == SUCCESS) + SendDlgItemMessage(hDlg, MIRROR_LIST, LB_DELETESTRING, List[Num], 0); + else + MessageBeep(-1); + } + free(List); + CountMirrorFiles(hDlg, *Base); + } + break; + + case MIRROR_LIST : + switch(GET_WM_COMMAND_CMD(wParam, lParam)) + { + case LBN_SELCHANGE : + if(SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELCOUNT, 0, 0) > 0) + EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), TRUE); + else + EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), FALSE); + break; + } + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000012); + } + return(TRUE); + + case WM_SIZING : + DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam); + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒO‚Å“]‘—^íœ‚·‚éƒtƒ@ƒCƒ‹‚̐”‚𐔂¦ƒ_ƒCƒAƒƒO‚É•\Ž¦--------- +* +* Parameter +* HWND hWnd : +* TRANSPACKET *Pkt : +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt) +{ + char Tmp[80]; + int Del; + int Make; + int Copy; + + Del = 0; + Make = 0; + Copy = 0; + while(Pkt != NULL) + { + if((strncmp(Pkt->Cmd, "R-DELE", 6) == 0) || + (strncmp(Pkt->Cmd, "R-RMD", 5) == 0) || + (strncmp(Pkt->Cmd, "L-DELE", 6) == 0) || + (strncmp(Pkt->Cmd, "L-RMD", 5) == 0)) + { + Del += 1; + } + else if((strncmp(Pkt->Cmd, "R-MKD", 5) == 0) || + (strncmp(Pkt->Cmd, "L-MKD", 5) == 0)) + { + Make += 1; + } + else if((strncmp(Pkt->Cmd, "STOR", 4) == 0) || + (strncmp(Pkt->Cmd, "RETR", 4) == 0)) + { + Copy += 1; + } + Pkt = Pkt->Next; + } + + if(Copy != 0) + sprintf(Tmp, MSGJPN058, Copy); + else + sprintf(Tmp, MSGJPN059); + SendDlgItemMessage(hDlg, MIRROR_COPYNUM, WM_SETTEXT, 0, (LPARAM)Tmp); + + if(Make != 0) + sprintf(Tmp, MSGJPN060, Make); + else + sprintf(Tmp, MSGJPN061); + SendDlgItemMessage(hDlg, MIRROR_MAKENUM, WM_SETTEXT, 0, (LPARAM)Tmp); + + if(Del != 0) + sprintf(Tmp, MSGJPN062, Del); + else + sprintf(Tmp, MSGJPN063); + SendDlgItemMessage(hDlg, MIRROR_DELNUM, WM_SETTEXT, 0, (LPARAM)Tmp); + + return; +} + + + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒO‚Å“]‘—^íœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------ +* +* Parameter +* char Fname : ƒtƒ@ƒCƒ‹–¼ +* int Mode : ƒ‚[ƒh +* 0=“]‘—‚µ‚È‚¢ƒtƒ@ƒCƒ‹, 1=íœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES=“]‘—Eíœ‚µ‚È‚¢/NO +*----------------------------------------------------------------------------*/ + +static int AskMirrorNoTrn(char *Fname, int Mode) +{ + int Ret; + char *Tbl; + + Tbl = MirrorNoTrn; + if(Mode == 1) + Tbl = MirrorNoDel; + + Ret = NO; + if(StrMultiLen(Tbl) > 0) + { + Fname = GetFileName(Fname); + while(*Tbl != NUL) + { + if(CheckFname(Fname, Tbl) == SUCCESS) + { + Ret = YES; + break; + } + Tbl += strlen(Tbl) + 1; + } + } + return(Ret); +} + + +/*----- ƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Ì‘®«‚ð•Ô‚· ---------------------------------- +* +* Parameter +* char Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ‘®« (-1=Ý’è‚È‚µ) +*----------------------------------------------------------------------------*/ + +static int AskUpLoadFileAttr(char *Fname) +{ + int Ret; + int Sts; + char *Tbl; + + Tbl = DefAttrList; + Fname = GetFileName(Fname); + Ret = -1; + while(*Tbl != NUL) + { + Sts = CheckFname(Fname, Tbl); + Tbl += strlen(Tbl) + 1; + + if((Sts == SUCCESS) && (*Tbl != NUL)) + { + Ret = xtoi(Tbl); + break; + } + Tbl += strlen(Tbl) + 1; + } + return(Ret); +} + + +/*----- ƒzƒXƒg‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚È‚¢‚©ƒ`ƒFƒbƒN- ---------------------------a +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* FILELIST *ListList : +* +* Return Value +* int ˆ—•û–@ +* EXIST_OVW/EXIST_UNIQUE/EXIST_IGNORE +* +* Note +* Pkt.ExistSize, UpExistModeAExistNotify ‚ª•ÏX‚³‚ê‚é +*----------------------------------------------------------------------------*/ + +static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList) +{ + int Ret; + FILELIST *Exist; + + Ret = EXIST_OVW; + Pkt->ExistSize = 0; + if(SendMode != TRANS_OVW) + { + if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL) + { + Pkt->ExistSize = Exist->Size; + + if(ExistNotify == YES) + { + SoundPlay(SND_ERROR); + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(up_exist_dlg), GetMainHwnd(), UpExistDialogCallBack, (LPARAM)Pkt) == NO) + Ret = EXIST_ABORT; + else + Ret = UpExistMode; + } + else + Ret = UpExistMode; + + if(Ret == EXIST_NEW) + { + /*ƒtƒ@ƒCƒ‹“ú•tƒ`ƒFƒbƒN */ + if(CompareFileTime(&Exist->Time, &Pkt->Time) < 0) + Ret = EXIST_OVW; + else + Ret = EXIST_IGNORE; + } + } + } + return(Ret); +} + + +/*----- ƒzƒXƒg‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚ÌŠm”Fƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static TRANSPACKET *Pkt; + static const RADIOBUTTON UpExistButton[] = { + { UP_EXIST_OVW, EXIST_OVW }, + { UP_EXIST_NEW, EXIST_NEW }, + { UP_EXIST_RESUME, EXIST_RESUME }, + { UP_EXIST_UNIQUE, EXIST_UNIQUE }, + { UP_EXIST_IGNORE, EXIST_IGNORE } + }; + #define UPEXISTBUTTONS (sizeof(UpExistButton)/sizeof(RADIOBUTTON)) + + switch (iMessage) + { + case WM_INITDIALOG : + Pkt = (TRANSPACKET *)lParam; + SendDlgItemMessage(hDlg, UP_EXIST_NAME, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, UP_EXIST_NAME, WM_SETTEXT, 0, (LPARAM)Pkt->RemoteFile); + + if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0)) + EnableWindow(GetDlgItem(hDlg, UP_EXIST_RESUME), FALSE); + + SetRadioButtonByValue(hDlg, UpExistMode, UpExistButton, UPEXISTBUTTONS); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK_ALL : + ExistNotify = NO; + /* ‚±‚±‚É break ‚Í‚È‚¢ */ + + case IDOK : + UpExistMode = AskRadioButtonValue(hDlg, UpExistButton, UPEXISTBUTTONS); + SendDlgItemMessage(hDlg, UP_EXIST_NAME, WM_GETTEXT, FMAX_PATH, (LPARAM)Pkt->RemoteFile); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : +// Pkt->Abort = ABORT_USER; +// UpExistMode = EXIST_IGNORE; + EndDialog(hDlg, NO); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000011); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒAƒbƒvƒ[ƒh^ƒ_ƒEƒ“ƒ[ƒhƒtƒ@ƒCƒ‹–¼“ü—̓_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + if(CurWin == WIN_LOCAL) + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064); + else + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065); + + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString); + EndDialog(hDlg, YES); + break; + + case UPDOWNAS_STOP : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚ðíœ‚·‚é ---------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteProc(void) +{ + int Win; + FILELIST *FileListBase; + FILELIST *Pos; + int DelFlg; + int Sts; + char CurDir[FMAX_PATH+1]; + char Tmp[FMAX_PATH+1]; + + Sts = YES; + AskRemoteCurDir(CurDir, FMAX_PATH); + FileListBase = NULL; + if(GetFocus() == GetLocalHwnd()) + { + Win = WIN_LOCAL; + MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg); + } + else + { + Win = WIN_REMOTE; + if(CheckClosedAndReconnect() == SUCCESS) + MakeSelectedFileList(Win, YES, NO, &FileListBase, &CancelFlg); + else + Sts = NO; + } + + if(Sts == YES) + { + DisableUserOpe(); + + DelFlg = NO; + Sts = NO; + Pos = FileListBase; + while(Pos != NULL) + { + if(Pos->Node == NODE_FILE) + { + DelNotifyAndDo(Pos, Win, &Sts, &DelFlg, CurDir); + if(Sts == NO_ALL) + break; + } + Pos = Pos->Next; + } + + if(Sts != NO_ALL) + DeleteAllDir(FileListBase, Win, &Sts, &DelFlg, CurDir); + + if(Win == WIN_REMOTE) + { + AskRemoteCurDir(Tmp, FMAX_PATH); + if(strcmp(Tmp, CurDir) != 0) + DoCWD(Tmp, NO, NO, NO); + } + + DeleteFileList(&FileListBase); + + if(DelFlg == YES) + { + if(Win == WIN_LOCAL) + GetLocalDirForWnd(); + else + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + } + + EnableUserOpe(); + } + return; +} + + +/*----- ƒTƒuƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚ð‘S‚č폜‚·‚é ------------------------------------ +* +* Parameter +* FILELIST *Dt : íœ‚·‚éƒtƒ@ƒCƒ‹‚̃ŠƒXƒg +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int *Sw : ‘€ì•û–@ (YES/NO/YES_ALL/NO_ALL) +* int *Flg : ƒtƒ@ƒCƒ‹‚ðíœ‚µ‚½‚©‚Ç‚¤‚©‚̃tƒ‰ƒO (YES/NO) +* char *CurDir : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir) +{ + while(Dt != NULL) + { + if(Dt->Node == NODE_DIR) + { + DeleteAllDir(Dt->Next, Win, Sw, Flg, CurDir); + if(*Sw == NO_ALL) + break; + + DelNotifyAndDo(Dt, Win, Sw, Flg, CurDir); + break; + } + Dt = Dt->Next; + } + return; +} + + +/*----- íœ‚·‚é‚©‚Ç‚¤‚©‚ÌŠm”F‚ƍ폜ŽÀs -------------------------------------- +* +* Parameter +* FILELIST *Dt : íœ‚·‚éƒtƒ@ƒCƒ‹‚̃ŠƒXƒg +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int *Sw : ‘€ì•û–@ (YES/NO/YES_ALL/NO_ALL) +* int *Flg : ƒtƒ@ƒCƒ‹‚ðíœ‚µ‚½‚©‚Ç‚¤‚©‚̃tƒ‰ƒO (YES/NO) +* char *CurDir : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir) +{ + char Path[FMAX_PATH+1]; + + if(Win == WIN_LOCAL) + { + AskLocalCurDir(Path, FMAX_PATH); + SetYenTail(Path); + strcat(Path, Dt->File); + ReplaceAll(Path, '/', '\\'); + } + else + { + AskRemoteCurDir(Path, FMAX_PATH); + SetSlashTail(Path); + strcat(Path, Dt->File); + ReplaceAll(Path, '\\', '/'); + } + + if(*Sw != YES_ALL) + { + sprintf(TmpString, "%s", Path); + + if(AskHostType() == HTYPE_VMS) + ReformToVMSstylePathName(TmpString); + + CurWin = Win; + *Sw = DialogBox(GetFtpInst(), MAKEINTRESOURCE(delete_dlg), GetMainHwnd(), DeleteDialogCallBack); + } + + if((*Sw == YES) || (*Sw == YES_ALL)) + { + if(Win == WIN_LOCAL) + { + if(Dt->Node == NODE_FILE) + DoLocalDELE(Path); + else + DoLocalRMD(Path); + *Flg = YES; + } + else + { + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢Žž‚Ì‚½‚߂̏ˆ— */ + if(ProcForNonFullpath(Path, CurDir, GetMainHwnd(), 0) == FAIL) + *Sw = NO_ALL; + + if(*Sw != NO_ALL) + { + if(Dt->Node == NODE_FILE) + DoDELE(Path); + else + DoRMD(Path); + *Flg = YES; + } + } + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹íœƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + if(CurWin == WIN_LOCAL) + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN066); + else + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN067); + SendDlgItemMessage(hDlg, DELETE_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case DELETE_NO : + EndDialog(hDlg, NO); + break; + + case DELETE_ALL : + EndDialog(hDlg, YES_ALL); + break; + + case IDCANCEL : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚Ì–¼‘O‚ð•ÏX‚·‚é ---------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void RenameProc(void) +{ + int Win; + FILELIST *FileListBase; + FILELIST *Pos; + char New[FMAX_PATH+1]; + int RenFlg; + int Sts; + + Sts = SUCCESS; + if(GetFocus() == GetLocalHwnd()) + Win = WIN_LOCAL; + else + { + Win = WIN_REMOTE; + Sts = CheckClosedAndReconnect(); + } + + if(Sts == SUCCESS) + { + DisableUserOpe(); + + FileListBase = NULL; + MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg); + + RenFlg = NO; + Sts = NO; + Pos = FileListBase; + while(Pos != NULL) + { + if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR)) + { + strcpy(TmpString, Pos->File); + CurWin = Win; + Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(rename_dlg), GetMainHwnd(), RenameDialogCallBack); + + if(Sts == NO_ALL) + break; + + if((Sts == YES) && (strlen(TmpString) != 0)) + { + strcpy(New, TmpString); + if(Win == WIN_LOCAL) + DoLocalRENAME(Pos->File, New); + else + DoRENAME(Pos->File, New); + RenFlg = YES; + } + } + Pos = Pos->Next; + } + DeleteFileList(&FileListBase); + + if(RenFlg == YES) + { + if(Win == WIN_LOCAL) + GetLocalDirForWnd(); + else + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + } + + EnableUserOpe(); + } + return; +} + + +// +// ƒŠƒ‚[ƒg‘¤‚ł̃tƒ@ƒCƒ‹‚̈ړ®iƒŠƒl[ƒ€j‚ðs‚¤ +// +// RenameProc()‚ðƒx[ƒX‚ɉü‘¢B(2007.9.5 yutaka) +// +void MoveRemoteFileProc(int drop_index) +{ + int Win; + FILELIST *FileListBase; + FILELIST *Pos; + FILELIST Pkt; + char New[FMAX_PATH+1]; + char Old[FMAX_PATH+1]; + char HostDir[FMAX_PATH+1]; + int RenFlg; + int Sts; + + if(MoveMode == MOVE_DISABLE) + { + return; + } + + AskRemoteCurDir(HostDir, FMAX_PATH); + + // ƒhƒƒbƒvæ‚̃tƒHƒ‹ƒ_–¼‚𓾂é + GetNodeName(WIN_REMOTE, drop_index, Pkt.File, FMAX_PATH); + + if(MoveMode == MOVE_DLG) + { + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(move_notify_dlg), GetRemoteHwnd(), ExeEscTextDialogProc, (LPARAM)Pkt.File) == NO) + { + return; + } + } + + Sts = SUCCESS; +#if 0 + if(GetFocus() == GetLocalHwnd()) + Win = WIN_LOCAL; + else + { + Win = WIN_REMOTE; + Sts = CheckClosedAndReconnect(); + } +#else + Win = WIN_REMOTE; + Sts = CheckClosedAndReconnect(); +#endif + + if(Sts == SUCCESS) + { + DisableUserOpe(); + + FileListBase = NULL; + MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg); + + RenFlg = NO; + Sts = NO; + Pos = FileListBase; + while(Pos != NULL) + { + if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR)) + { + strcpy(TmpString, Pos->File); + CurWin = Win; +#if 0 + Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(rename_dlg), GetMainHwnd(), RenameDialogCallBack); + + if(Sts == NO_ALL) + break; +#else + Sts = YES; +#endif + + if((Sts == YES) && (strlen(TmpString) != 0)) + { + // ƒpƒX‚̐ݒè(local) + strncpy_s(Old, sizeof(Old), HostDir, _TRUNCATE); + strncat_s(Old, sizeof(Old), "/", _TRUNCATE); + strncat_s(Old, sizeof(Old), Pos->File, _TRUNCATE); + + // ƒpƒX‚̐ݒè(remote) + strncpy_s(New, sizeof(New), HostDir, _TRUNCATE); + strncat_s(New, sizeof(New), "/", _TRUNCATE); + strncat_s(New, sizeof(New), Pkt.File, _TRUNCATE); + strncat_s(New, sizeof(New), "/", _TRUNCATE); + strncat_s(New, sizeof(New), Pos->File, _TRUNCATE); + + if(Win == WIN_LOCAL) + DoLocalRENAME(Old, New); + else + DoRENAME(Old, New); + RenFlg = YES; + } + } + Pos = Pos->Next; + } + DeleteFileList(&FileListBase); + + if(RenFlg == YES) + { + if(Win == WIN_LOCAL) { + GetLocalDirForWnd(); + } else { + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + + strncpy_s(New, sizeof(New), HostDir, _TRUNCATE); + strncat_s(New, sizeof(New), "/", _TRUNCATE); + strncat_s(New, sizeof(New), Pkt.File, _TRUNCATE); + DoCWD(New, YES, YES, YES); + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + } + } + + EnableUserOpe(); + } + return; +} + + + +/*----- Vƒtƒ@ƒCƒ‹–¼“ü—̓_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + if(CurWin == WIN_LOCAL) + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN068); + else + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN069); + SendDlgItemMessage(hDlg, RENAME_NEW, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, RENAME_NEW, WM_SETTEXT, 0, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, RENAME_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, RENAME_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case RENAME_STOP : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- V‚µ‚¢ƒfƒBƒŒƒNƒgƒŠ‚ðì¬‚·‚é ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MkdirProc(void) +{ + int Sts; + int Win; + char Path[FMAX_PATH+1]; + char *Title; + int Tmp; + + if(GetFocus() == GetLocalHwnd()) + { + Win = WIN_LOCAL; + Title = MSGJPN070; + } + else + { + Win = WIN_REMOTE; + Title = MSGJPN071; + } + + strcpy(Path, ""); + Sts = InputDialogBox(mkdir_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001); + + if((Sts == YES) && (strlen(Path) != 0)) + { + if(Win == WIN_LOCAL) + { + DisableUserOpe(); + DoLocalMKD(Path); + GetLocalDirForWnd(); + EnableUserOpe(); + } + else + { + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + DoMKD(Path); + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + EnableUserOpe(); + } + } + } + return; +} + + +/*----- ƒqƒXƒgƒŠƒŠƒXƒg‚ðŽg‚Á‚½ƒfƒBƒŒƒNƒgƒŠ‚̈ړ® ------------------------------ +* +* Parameter +* HWND hWnd : ƒRƒ“ƒ{ƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ChangeDirComboProc(HWND hWnd) +{ + char Tmp[FMAX_PATH+1]; + int i; + + if((i = SendMessage(hWnd, CB_GETCURSEL, 0, 0)) != CB_ERR) + { + SendMessage(hWnd, CB_GETLBTEXT, i, (LPARAM)Tmp); + + if(hWnd == GetLocalHistHwnd()) + { + DisableUserOpe(); + DoLocalCWD(Tmp); + GetLocalDirForWnd(); + EnableUserOpe(); + } + else + { + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + if(DoCWD(Tmp, YES, NO, YES) < FTP_RETRY) + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + EnableUserOpe(); + } + } + } + return; +} + + +/*----- ƒuƒbƒNƒ}[ƒN‚ðŽg‚Á‚½ƒfƒBƒŒƒNƒgƒŠ‚̈ړ® -------------------------------- +* +* Parameter +* int MarkID : ƒuƒbƒNƒ}[ƒN‚̃ƒjƒ…[ID +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ChangeDirBmarkProc(int MarkID) +{ + char Local[FMAX_PATH+1]; + char Remote[FMAX_PATH+1]; + int Sts; + + Sts = AskBookMarkText(MarkID, Local, Remote, FMAX_PATH+1); + if((Sts == BMARK_TYPE_LOCAL) || (Sts == BMARK_TYPE_BOTH)) + { + DisableUserOpe(); + if(DoLocalCWD(Local) == SUCCESS) + GetLocalDirForWnd(); + EnableUserOpe(); + } + + if((Sts == BMARK_TYPE_REMOTE) || (Sts == BMARK_TYPE_BOTH)) + { + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + if(DoCWD(Remote, YES, NO, YES) < FTP_RETRY) + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + EnableUserOpe(); + } + } + return; +} + + +/*----- ƒfƒBƒŒƒNƒgƒŠ–¼‚ð“ü—Í‚µ‚ăfƒBƒŒƒNƒgƒŠ‚̈ړ® ---------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ChangeDirDirectProc(int Win) +{ + int Sts; + char Path[FMAX_PATH+1]; + char *Title; + int Tmp; + + if(Win == WIN_LOCAL) + Title = MSGJPN072; + else + Title = MSGJPN073; + + strcpy(Path, ""); + if(Win == WIN_LOCAL) + Sts = InputDialogBox(chdir_br_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001); + else + Sts = InputDialogBox(chdir_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001); + + if((Sts == YES) && (strlen(Path) != 0)) + { + if(Win == WIN_LOCAL) + { + DisableUserOpe(); + DoLocalCWD(Path); + GetLocalDirForWnd(); + EnableUserOpe(); + } + else + { + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + if(DoCWD(Path, YES, NO, YES) < FTP_RETRY) + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + EnableUserOpe(); + } + } + } + return; +} + + +/*----- Drop‚³‚ꂽƒtƒ@ƒCƒ‹‚É‚æ‚éƒfƒBƒŒƒNƒgƒŠ‚̈ړ® ---------------------------- +* +* Parameter +* WPARAM wParam : ƒhƒƒbƒv‚³‚ꂽƒtƒ@ƒCƒ‹‚̏î•ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ChangeDirDropFileProc(WPARAM wParam) +{ + char Path[FMAX_PATH+1]; + + DisableUserOpe(); + MakeDroppedDir(wParam, Path); + DoLocalCWD(Path); + GetLocalDirForWnd(); + EnableUserOpe(); + return; +} + + +/*----- ƒtƒ@ƒCƒ‹‚Ì‘®«•ÏX ---------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ChmodProc(void) +{ + int ChmodFlg; + FILELIST *FileListBase; + FILELIST *Pos; + char Tmp[5]; + char *Buf; + char *BufTmp; + int BufLen; + + if(GetFocus() == GetRemoteHwnd()) + { + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + FileListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg); + if(FileListBase != NULL) + { + sprintf(Tmp, "%03X", FileListBase->Attr); + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(chmod_dlg), GetMainHwnd(), ChmodDialogCallBack, (LPARAM)Tmp) == YES) + { + ChmodFlg = NO; + Pos = FileListBase; + while(Pos != NULL) + { + if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR)) + { + DoCHMOD(Pos->File, Tmp); + ChmodFlg = YES; + } + Pos = Pos->Next; + } + if(ChmodFlg == YES) + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + } + } + DeleteFileList(&FileListBase); + EnableUserOpe(); + } + } + else if(GetFocus() == GetLocalHwnd()) + { + DisableUserOpe(); + FileListBase = NULL; + MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg); + if(FileListBase != NULL) + { + if((Buf = malloc(1)) != NULL) + { + *Buf = NUL; + BufLen = 0; + Pos = FileListBase; + while(Pos != NULL) + { + if((BufTmp = realloc(Buf, BufLen + strlen(Pos->File) + 2)) != NULL) + { + Buf = BufTmp; + strcpy(Buf+BufLen, Pos->File); + BufLen += strlen(Pos->File) + 1; + } + Pos = Pos->Next; + } + + memset(Buf+BufLen, NUL, 1); + DispFileProperty(Buf); + free(Buf); + } + } + DeleteFileList(&FileListBase); + EnableUserOpe(); + } + return; +} + + +/*----- ‘®«•ÏXƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + char Str[5]; + static char *Buf; + int Tmp; + + switch (iMessage) + { + case WM_INITDIALOG : + Buf = (char *)lParam; + SendDlgItemMessage(hDlg, PERM_NOW, EM_LIMITTEXT, 4, 0); + SendDlgItemMessage(hDlg, PERM_NOW, WM_SETTEXT, 0, (LPARAM)Buf); + SetAttrToDialog(hDlg, xtoi(Buf)); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, PERM_NOW, WM_GETTEXT, 5, (LPARAM)Buf); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case PERM_O_READ : + case PERM_O_WRITE : + case PERM_O_EXEC : + case PERM_G_READ : + case PERM_G_WRITE : + case PERM_G_EXEC : + case PERM_A_READ : + case PERM_A_WRITE : + case PERM_A_EXEC : + Tmp = GetAttrFromDialog(hDlg); + sprintf(Str, "%03X", Tmp); + SendDlgItemMessage(hDlg, PERM_NOW, WM_SETTEXT, 0, (LPARAM)Str); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000017); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ‘®«‚ðƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚ɐݒè ---------------------------------------- +* +* Parameter +* HWND hWnd : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Attr : ‘®« +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void SetAttrToDialog(HWND hDlg, int Attr) +{ + if(Attr & 0x400) + SendDlgItemMessage(hDlg, PERM_O_READ, BM_SETCHECK, 1, 0); + if(Attr & 0x200) + SendDlgItemMessage(hDlg, PERM_O_WRITE, BM_SETCHECK, 1, 0); + if(Attr & 0x100) + SendDlgItemMessage(hDlg, PERM_O_EXEC, BM_SETCHECK, 1, 0); + + if(Attr & 0x40) + SendDlgItemMessage(hDlg, PERM_G_READ, BM_SETCHECK, 1, 0); + if(Attr & 0x20) + SendDlgItemMessage(hDlg, PERM_G_WRITE, BM_SETCHECK, 1, 0); + if(Attr & 0x10) + SendDlgItemMessage(hDlg, PERM_G_EXEC, BM_SETCHECK, 1, 0); + + if(Attr & 0x4) + SendDlgItemMessage(hDlg, PERM_A_READ, BM_SETCHECK, 1, 0); + if(Attr & 0x2) + SendDlgItemMessage(hDlg, PERM_A_WRITE, BM_SETCHECK, 1, 0); + if(Attr & 0x1) + SendDlgItemMessage(hDlg, PERM_A_EXEC, BM_SETCHECK, 1, 0); + + return; +} + + +/*----- ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚Ì“à—e‚©‚ç‘®«‚ðŽæ“¾ -------------------------------- +* +* Parameter +* HWND hWnd : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* +* Return Value +* int ‘®« +*----------------------------------------------------------------------------*/ + +static int GetAttrFromDialog(HWND hDlg) +{ + int Ret; + + Ret = 0; + + if(SendDlgItemMessage(hDlg, PERM_O_READ, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x400; + if(SendDlgItemMessage(hDlg, PERM_O_WRITE, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x200; + if(SendDlgItemMessage(hDlg, PERM_O_EXEC, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x100; + + if(SendDlgItemMessage(hDlg, PERM_G_READ, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x40; + if(SendDlgItemMessage(hDlg, PERM_G_WRITE, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x20; + if(SendDlgItemMessage(hDlg, PERM_G_EXEC, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x10; + + if(SendDlgItemMessage(hDlg, PERM_A_READ, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x4; + if(SendDlgItemMessage(hDlg, PERM_A_WRITE, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x2; + if(SendDlgItemMessage(hDlg, PERM_A_EXEC, BM_GETCHECK, 0, 0) == 1) + Ret |= 0x1; + + return(Ret); +} + + + + +/*----- ”CˆÓ‚̃Rƒ}ƒ“ƒh‚ð‘—‚é -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SomeCmdProc(void) +{ + char Cmd[81]; + int Tmp; + FILELIST *FileListBase; + + if(GetFocus() == GetRemoteHwnd()) + { + if(CheckClosedAndReconnect() == SUCCESS) + { + DisableUserOpe(); + FileListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg); + memset(Cmd, NUL, 81); + if(FileListBase != NULL) + { + strncpy(Cmd, FileListBase->File, 80); + } + DeleteFileList(&FileListBase); + + if(InputDialogBox(somecmd_dlg, GetMainHwnd(), NULL, Cmd, 81, &Tmp, IDH_HELP_TOPIC_0000023) == YES) + { + DoQUOTE(Cmd); + } + EnableUserOpe(); + } + } + return; +} + + + + +/*----- ƒtƒ@ƒCƒ‹‘—e—Ê‚ÌŒvŽZ‚ðs‚¤ -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CalcFileSizeProc(void) +{ + FILELIST *ListBase; + FILELIST *Pos; + int Win; + int All; + int Sts; + + if((All = DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_notify_dlg), GetMainHwnd(), SizeNotifyDlgWndProc)) != NO_ALL) + { + Sts = SUCCESS; + if(GetFocus() == GetLocalHwnd()) + Win = WIN_LOCAL; + else + { + Win = WIN_REMOTE; + Sts = CheckClosedAndReconnect(); + } + + if(Sts == SUCCESS) + { + ListBase = NULL; + MakeSelectedFileList(Win, YES, All, &ListBase, &CancelFlg); + + FileSize = 0; + Pos = ListBase; + while(Pos != NULL) + { + if(Pos->Node != NODE_DIR) + FileSize += Pos->Size; + Pos = Pos->Next; + } + DeleteFileList(&ListBase); + DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_dlg), GetMainHwnd(), SizeDlgWndProc); + } + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹—e—ÊŒŸõŠm”Fƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN -------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + if(GetFocus() == GetLocalHwnd()) + SendDlgItemMessage(hDlg, FSNOTIFY_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN074); + else + SendDlgItemMessage(hDlg, FSNOTIFY_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN075); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + if(SendDlgItemMessage(hDlg, FSNOTIFY_SEL_ONLY, BM_GETCHECK, 0, 0) == 1) + EndDialog(hDlg, NO); + else + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒ@ƒCƒ‹—e—ÊŒŸõƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK SizeDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + char Tmp[FMAX_PATH+1]; + + switch (message) + { + case WM_INITDIALOG : + if(GetFocus() == GetLocalHwnd()) + SendDlgItemMessage(hDlg, FSIZE_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN076); + else + SendDlgItemMessage(hDlg, FSIZE_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN077); + + MakeSizeString(FileSize, Tmp); + SendDlgItemMessage(hDlg, FSIZE_SIZE, WM_SETTEXT, 0, (LPARAM)Tmp); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + case IDCANCEL : + EndDialog(hDlg, YES); + break; + + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒfƒBƒŒƒNƒgƒŠˆÚ“®Ž¸”sŽž‚̃Gƒ‰[‚ð•\Ž¦ ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispCWDerror(HWND hWnd) +{ + DialogBox(GetFtpInst(), MAKEINTRESOURCE(cwderr_dlg), hWnd, ExeEscDialogProc); + return; +} + + +/*----- URL‚ðƒNƒŠƒbƒvƒ{[ƒh‚ɃRƒs[ ------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CopyURLtoClipBoard(void) +{ + FILELIST *FileListBase; + FILELIST *Pos; + char *Buf; + char Path[FMAX_PATH+1]; + char Host[HOST_ADRS_LEN+1]; + char Port[10]; + int Set; + int Total; + + if(GetFocus() == GetRemoteHwnd()) + { + FileListBase = NULL; + MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg); + if(FileListBase != NULL) + { + strcpy(Host, AskHostAdrs()); + Total = 0; + Buf = NULL; + Pos = FileListBase; + while(Pos != NULL) + { + AskRemoteCurDir(Path, FMAX_PATH); + SetSlashTail(Path); + strcat(Path, Pos->File); + + if(AskHostType() == HTYPE_VMS) + ReformToVMSstylePathName(Path); + + strcpy(Port, ""); + if(AskHostPort() != PORT_NOR) + sprintf(Port, ":%d", AskHostPort()); + + Set = Total; + Total += strlen(Path) + strlen(Host) + strlen(Port) + 8; /* 8‚Í "ftp://\r\n" ‚Ì‚Ô‚ñ */ + if(AskHostType() == HTYPE_VMS) + Total++; + + if((Buf = realloc(Buf, Total+1)) == NULL) + break; + + if(AskHostType() != HTYPE_VMS) + sprintf(Buf + Set, "ftp://%s%s%s\r\n", Host, Port, Path); + else + sprintf(Buf + Set, "ftp://%s%s/%s\r\n", Host, Port, Path); + + Pos = Pos->Next; + } + + if(Buf != NULL) + { + CopyStrToClipBoard(Buf); + free(Buf); + } + } + DeleteFileList(&FileListBase); + } + return; +} + + +/*----- ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢ƒtƒ@ƒCƒ‹ƒAƒNƒZƒX‚̏€”õ ------------------------------ +* +* Parameter +* char *Path : ƒpƒX–¼ +* char *CurDir : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* HWND hWnd : ƒGƒ‰[ƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚·‚éÛ‚̐eƒEƒCƒ“ƒhƒE +* int Type : Žg—p‚·‚éƒ\ƒPƒbƒg‚ÌŽí—Þ +* 0=ƒRƒ}ƒ“ƒhƒ\ƒPƒbƒg, 1=“]‘—ƒ\ƒPƒbƒg +* +* Return Value +* int ƒXƒe[ƒ^ƒX(SUCCESS/FAIL) +* +* Note +* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢Žž‚́A +* ‚±‚̃‚ƒWƒ…[ƒ‹“à‚Å CWD ‚ðs‚È‚¢A +* Path ‚Ƀtƒ@ƒCƒ‹–¼‚Ì‚ÝŽc‚·BiƒpƒX–¼‚͏Á‚·j +*----------------------------------------------------------------------------*/ + +int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type) +{ + int Sts; + int Cmd; + char Tmp[FMAX_PATH+1]; + + Sts = SUCCESS; + if(AskNoFullPathMode() == YES) + { + strcpy(Tmp, Path); + if(AskHostType() == HTYPE_VMS) + { + GetUpperDirEraseTopSlash(Tmp); + ReformToVMSstyleDirName(Tmp); + } + else if(AskHostType() == HTYPE_STRATUS) + GetUpperDirEraseTopSlash(Tmp); + else + GetUpperDir(Tmp); + + if(strcmp(Tmp, CurDir) != 0) + { + if(Type == 0) + Cmd = CommandProcCmd(NULL, "CWD %s", Tmp); + else + Cmd = CommandProcTrn(NULL, "CWD %s", Tmp); + + if(Cmd/100 != FTP_COMPLETE) + { + DispCWDerror(hWnd); + Sts = FAIL; + } + else + strcpy(CurDir, Tmp); + } + strcpy(Path, GetFileName(Path)); + } + return(Sts); +} + + +/*----- ƒfƒBƒŒƒNƒgƒŠ–¼‚ðVAX VMSƒXƒ^ƒCƒ‹‚É•ÏŠ·‚·‚é ----------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* ddd:[xxx.yyy]/rrr/ppp --> ddd:[xxx.yyy.rrr.ppp] +*----------------------------------------------------------------------------*/ + +void ReformToVMSstyleDirName(char *Path) +{ + char *Pos; + char *Btm; + + if((Btm = strchr(Path, ']')) != NULL) + { + Pos = Btm; + while((Pos = strchr(Pos, '/')) != NULL) + *Pos = '.'; + + memmove(Btm, Btm+1, strlen(Btm+1)+1); + Pos = strchr(Path, NUL); + if(*(Pos-1) == '.') + { + Pos--; + *Pos = NUL; + } + strcpy(Pos, "]"); + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹–¼‚ðVAX VMSƒXƒ^ƒCƒ‹‚É•ÏŠ·‚·‚é --------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* ddd:[xxx.yyy]/rrr/ppp --> ddd:[xxx.yyy.rrr]ppp +*----------------------------------------------------------------------------*/ + +void ReformToVMSstylePathName(char *Path) +{ + char Fname[FMAX_PATH+1]; + + strcpy(Fname, GetFileName(Path)); + + GetUpperDirEraseTopSlash(Path); + ReformToVMSstyleDirName(Path); + + strcat(Path, Fname); + + return; +} + + +#if defined(HAVE_OPENVMS) +/*----- VMS‚Ì"HOGE.DIR;?"‚Æ‚¢‚¤ƒfƒBƒŒƒNƒgƒŠ–¼‚©‚ç"HOGE"‚ðŽæ‚èo‚· --------------- +* +* Parameter +* char *DirName : "HOGE.DIR;?"Œ`Ž®‚̃fƒBƒŒƒNƒgƒŠ–¼ +* int Flg : ";"‚̃`ƒFƒbƒN‚ð‚·‚é(TRUE)‚©‚µ‚È‚¢(FALSE)‚© +* +* Return Value +* ‚È‚µ +* +* Note +* DirName‚𒼐ڏ‘‚«‚©‚¦‚é +*----------------------------------------------------------------------------*/ + +void ReformVMSDirName(char *DirName, int Flg) +{ + char *p; + + if (Flg == TRUE) { + /* ';'‚ª‚È‚¢ê‡‚ÍVMSŒ`Ž®‚¶‚á‚È‚³‚»‚¤‚Ȃ̂ʼn½‚à‚µ‚È‚¢ */ + if ((p = strrchr(DirName, ';')) == NULL) + return; + } + + /* ".DIR"‚ª‚ ‚Á‚½‚ç‚‚Ԃ· */ + if ((p = strrchr(DirName, '.'))) { + if (memcmp(p + 1, "DIR", 3) == 0) + *p = '\0'; + } +} +#endif + + +/*----- ƒtƒ@ƒCƒ‹–¼‚ÉŽg‚¦‚È‚¢•¶Žš‚ª‚È‚¢‚©ƒ`ƒFƒbƒN‚µ–¼‘O‚ð•ÏX‚·‚é -------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL=’†Ž~‚·‚é +* +* Note +* Fname‚𒼐ڏ‘‚«‚©‚¦‚é +*----------------------------------------------------------------------------*/ + +static int RenameUnuseableName(char *Fname) +{ + int Tmp; + int Ret; + + Ret = SUCCESS; + while(1) + { + if((_mbschr(Fname, ':') != NULL) || + (_mbschr(Fname, '*') != NULL) || + (_mbschr(Fname, '?') != NULL) || + (_mbschr(Fname, '<') != NULL) || + (_mbschr(Fname, '>') != NULL) || + (_mbschr(Fname, '|') != NULL) || + (_mbschr(Fname, '\x22') != NULL) || + (_mbschr(Fname, '\\') != NULL)) + { + if(InputDialogBox(forcerename_dlg, GetMainHwnd(), NULL, Fname, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001) == NO) + { + Ret = FAIL; + break; + } + } + else + break; + } + return(Ret); +} + + diff --git a/getput.c b/getput.c new file mode 100644 index 0000000..46dffeb --- /dev/null +++ b/getput.c @@ -0,0 +1,2520 @@ +/*============================================================================= +* +* ƒ_ƒEƒ“ƒ[ƒh^ƒAƒbƒvƒ[ƒh +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +/* ‚±‚̃\[ƒX‚͈ꕔAWS_FTP Version 93.12.05 ‚̃\[ƒX‚ðŽQl‚É‚µ‚Ü‚µ‚½B */ +/* ƒXƒŒƒbƒh‚̍쐬^I—¹‚ÉŠÖ‚µ‚āA”óŒû“aì¬‚̃pƒbƒ`‚ð‘g‚ݍž‚Ý‚Ü‚µ‚½B */ + +/* + ˆê•”A‚‘¬‰»‚Ì‚½‚߂̃R[ƒh’ljÁ by H.Shirouzu at 2002/10/02 +*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#define SET_BUFFER_SIZE + +/* Add by H.Shirouzu at 2002/10/02 */ +#undef BUFSIZE +#define BUFSIZE (32 * 1024) +#define SOCKBUF_SIZE (256 * 1024) +/* End */ + +#define TIMER_DISPLAY 1 /* •\Ž¦XV—pƒ^ƒCƒ}‚ÌID */ +#define DISPLAY_TIMING 500 /* •\Ž¦XVŽžŠÔ 0.5•b */ + +#define ERR_MSG_LEN 1024 + + +/* íœŠm”Fƒ_ƒCƒAƒƒO‚̏î•ñ */ +typedef struct { + int Cur; + TRANSPACKET *Pkt; +} MIRRORDELETEINFO; + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static void DispTransPacket(TRANSPACKET *Pkt); +static void EraseTransFileList(void); +static ULONG WINAPI TransferThread(void *Dummy); +static int MakeNonFullPath(TRANSPACKET *Pkt, char *CurDir, char *Tmp); +static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork); +static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork); +static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork); +static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode); +static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname); +static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static int SetDownloadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode, int *CancelCheckWork); +static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt); +static int UpLoadNonPassive(TRANSPACKET *Pkt); +static int UpLoadPassive(TRANSPACKET *Pkt); +static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt); +static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii); +static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode); +static int SetUploadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode); +static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); +static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt); +static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int Info); +static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max); +static int IsSpecialDevice(char *Fname); +static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt); +static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static void SetErrorMsg(char *fmt, ...); + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HANDLE hTransferThread; +static int fTransferThreadExit = FALSE; + +static HANDLE hRunMutex; /* “]‘—ƒXƒŒƒbƒhŽÀsƒ~ƒ…[ƒeƒbƒNƒX */ +static HANDLE hListAccMutex; /* “]‘—ƒtƒ@ƒCƒ‹ƒAƒNƒZƒX—pƒ~ƒ…[ƒeƒbƒNƒX */ + +static int TransFiles = 0; /* “]‘—‘Ò‚¿ƒtƒ@ƒCƒ‹” */ +static TRANSPACKET *TransPacketBase = NULL; /* “]‘—ƒtƒ@ƒCƒ‹ƒŠƒXƒg */ + +static int Canceled; /* ’†Ž~ƒtƒ‰ƒO YES/NO */ +static int ClearAll; /* ‘S‚Ä’†Ž~ƒtƒ‰ƒO YES/NO */ + +static int ForceAbort; /* “]‘—’†Ž~ƒtƒ‰ƒO */ + /* ‚±‚̃tƒ‰ƒO‚̓XƒŒƒbƒh‚ðI—¹‚³‚¹‚é‚Æ‚«‚ÉŽg‚¤ */ + +static LONGLONG AllTransSizeNow; /* ¡‰ñ‚Ì“]‘—‚Å“]‘—‚µ‚½ƒTƒCƒY */ +static time_t TimeStart; /* “]‘—ŠJŽnŽžŠÔ */ + +static int KeepDlg = NO; /* “]‘—’†ƒ_ƒCƒAƒƒO‚ðÁ‚³‚È‚¢‚©‚Ç‚¤‚© (YES/NO) */ +static int MoveToForeground = NO; /* ƒEƒCƒ“ƒhƒE‚ð‘O–ʂɈړ®‚·‚é‚©‚Ç‚¤‚© (YES/NO) */ + +static char CurDir[FMAX_PATH+1] = { "" }; +static char ErrMsg[ERR_MSG_LEN+7]; + +/*===== ŠO•”ŽQÆ =====*/ + +/* Ý’è’l */ +extern int SaveTimeStamp; +extern int RmEOF; +// extern int TimeOut; +extern int FwallType; +extern int MirUpDelNotify; +extern int MirDownDelNotify; +extern int FolderAttr; +extern int FolderAttrNum; + + +/*----- ƒtƒ@ƒCƒ‹“]‘—ƒXƒŒƒbƒh‚ð‹N“®‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +int MakeTransferThread(void) +{ + DWORD dwID; + + hListAccMutex = CreateMutex( NULL, FALSE, NULL ); + hRunMutex = CreateMutex( NULL, TRUE, NULL ); + + ClearAll = NO; + ForceAbort = NO; + + fTransferThreadExit = FALSE; + hTransferThread = (HANDLE)_beginthreadex(NULL, 0, TransferThread, 0, 0, &dwID); + if (hTransferThread == NULL) + return(FAIL); /* XXX */ + + return(SUCCESS); +} + + +/*----- ƒtƒ@ƒCƒ‹“]‘—ƒXƒŒƒbƒh‚ðI—¹‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CloseTransferThread(void) +{ + Canceled = YES; + ClearAll = YES; + ForceAbort = YES; + + fTransferThreadExit = TRUE; + while(WaitForSingleObject(hTransferThread, 10) == WAIT_TIMEOUT) + { + BackgrndMessageProc(); + Canceled = YES; + } + CloseHandle(hTransferThread); + + ReleaseMutex( hRunMutex ); + + CloseHandle( hListAccMutex ); + CloseHandle( hRunMutex ); + return; +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹î•ñ‚ðƒŠƒXƒg‚ɒljÁ‚·‚é -------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* TRANSPACKET **Base : ƒŠƒXƒg‚̐擪 +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int AddTmpTransFileList(TRANSPACKET *Pkt, TRANSPACKET **Base) +{ + TRANSPACKET *Pos; + TRANSPACKET *Prev; + int Sts; + + Sts = FAIL; + if((Pos = malloc(sizeof(TRANSPACKET))) != NULL) + { + memcpy(Pos, Pkt, sizeof(TRANSPACKET)); + Pos->Next = NULL; + + if(*Base == NULL) + *Base = Pos; + else + { + Prev = *Base; + while(Prev->Next != NULL) + Prev = Prev->Next; + Prev->Next = Pos; + } + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹î•ñƒŠƒXƒg‚ðƒNƒŠƒA‚·‚é -------------------------------- +* +* Parameter +* TRANSPACKET **Base : ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void EraseTmpTransFileList(TRANSPACKET **Base) +{ + TRANSPACKET *Pos; + TRANSPACKET *Next; + + Pos = *Base; + while(Pos != NULL) + { + Next = Pos->Next; + free(Pos); + Pos = Next; + } + *Base = NULL; + return; +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹î•ñƒŠƒXƒg‚©‚ç‚P‚‚̏î•ñ‚ðŽæ‚菜‚­ -------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* TRANSPACKET **Base : ƒŠƒXƒg‚̐擪 +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int RemoveTmpTransFileListItem(TRANSPACKET **Base, int Num) +{ + TRANSPACKET *Pos; + TRANSPACKET *Prev; + int Sts; + + Sts = FAIL; + Pos = *Base; + if(Num == 0) + { + *Base = Pos->Next; + free(Pos); + Sts = SUCCESS; + } + else + { + while(Pos != NULL) + { + Prev = Pos; + Pos = Pos->Next; + if(--Num == 0) + { + Prev->Next = Pos->Next; + free(Pos); + Sts = SUCCESS; + break; + } + } + } + return(Sts); +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹î•ñ‚ð“]‘—ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚É“o˜^‚·‚é -------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AddTransFileList(TRANSPACKET *Pkt) +{ + DispTransPacket(Pkt); + + WaitForSingleObject(hListAccMutex, INFINITE); + + if(AddTmpTransFileList(Pkt, &TransPacketBase) == SUCCESS) + { + if((strncmp(Pkt->Cmd, "RETR", 4) == 0) || + (strncmp(Pkt->Cmd, "STOR", 4) == 0)) + { + TransFiles++; + PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); + } + } + ReleaseMutex(hListAccMutex); + + return; +} + + +/*----- “]‘—ƒtƒ@ƒCƒ‹î•ñ‚ð“]‘—ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ɒljÁ‚·‚é ------------------------ +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* TRANSPACKET **Base : ƒŠƒXƒg‚̐擪 +* +* Return Value +* ‚È‚µ +* +* Note +* PktŽ©‘Ì‚ðƒŠƒXƒg‚ɘAŒ‹‚·‚é +*----------------------------------------------------------------------------*/ + +void AppendTransFileList(TRANSPACKET *Pkt) +{ + TRANSPACKET *Pos; + + WaitForSingleObject(hListAccMutex, INFINITE); + + if(TransPacketBase == NULL) + TransPacketBase = Pkt; + else + { + Pos = TransPacketBase; + while(Pos->Next != NULL) + Pos = Pos->Next; + Pos->Next = Pkt; + } + + while(Pkt != NULL) + { + DispTransPacket(Pkt); + + if((strncmp(Pkt->Cmd, "RETR", 4) == 0) || + (strncmp(Pkt->Cmd, "STOR", 4) == 0)) + { + TransFiles++; + PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); + } + Pkt = Pkt->Next; + } + + ReleaseMutex(hListAccMutex); + return; +} + + +/*----- “]‘—ƒtƒ@ƒCƒ‹î•ñ‚ð•\Ž¦‚·‚é -------------------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispTransPacket(TRANSPACKET *Pkt) +{ + if((strncmp(Pkt->Cmd, "RETR", 4) == 0) || (strncmp(Pkt->Cmd, "STOR", 4) == 0)) + DoPrintf("TransList Cmd=%s : %s : %s", Pkt->Cmd, Pkt->RemoteFile, Pkt->LocalFile); + else if(strncmp(Pkt->Cmd, "R-", 2) == 0) + DoPrintf("TransList Cmd=%s : %s", Pkt->Cmd, Pkt->RemoteFile); + else if(strncmp(Pkt->Cmd, "L-", 2) == 0) + DoPrintf("TransList Cmd=%s : %s", Pkt->Cmd, Pkt->LocalFile); + else if(strncmp(Pkt->Cmd, "MKD", 3) == 0) + { + if(strlen(Pkt->LocalFile) > 0) + DoPrintf("TransList Cmd=%s : %s", Pkt->Cmd, Pkt->LocalFile); + else + DoPrintf("TransList Cmd=%s : %s", Pkt->Cmd, Pkt->RemoteFile); + } + else + DoPrintf("TransList Cmd=%s", Pkt->Cmd); + return; +} + + +/*----- “]‘—ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ðƒNƒŠƒA‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EraseTransFileList(void) +{ + TRANSPACKET *New; + TRANSPACKET *Next; + TRANSPACKET *NotDel; + TRANSPACKET Pkt; + + NotDel = NULL; + + WaitForSingleObject(hListAccMutex, INFINITE); + New = TransPacketBase; + while(New != NULL) + { + /* ÅŒã‚Ì"BACKCUR"‚Í•K—v‚Ȃ̂ŏÁ‚³‚È‚¢ */ + if(strcmp(New->Cmd, "BACKCUR") == 0) + { + if(NotDel != NULL) + free(NotDel); + NotDel = New; + New = New->Next; + NotDel->Next = NULL; + } + else + { + Next = New->Next; + free(New); + New = Next; + } + } + TransPacketBase = NotDel; + TransFiles = 0; + PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); + ReleaseMutex(hListAccMutex); + + strcpy(Pkt.Cmd, "GOQUIT"); + AddTransFileList(&Pkt); + return; +} + + +/*----- “]‘—’†ƒ_ƒCƒAƒƒO‚ðÁ‚³‚È‚¢‚悤‚É‚·‚é‚©‚Ç‚¤‚©‚ðÝ’è -------------------- +* +* Parameter +* int Sw : “]‘—’†ƒ_ƒCƒAƒƒO‚ðÁ‚³‚È‚¢‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void KeepTransferDialog(int Sw) +{ + KeepDlg = Sw; + return; +} + + +/*----- Œ»Ý“]‘—’†‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO=“]‘—’†‚Å‚Í‚È‚¢) +*----------------------------------------------------------------------------*/ + +int AskTransferNow(void) +{ + return(TransPacketBase != NULL ? YES : NO); +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹‚̐”‚ð•Ô‚· -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int “]‘—‚·‚éƒtƒ@ƒCƒ‹‚̐” +*----------------------------------------------------------------------------*/ + +int AskTransferFileNum(void) +{ + return(TransFiles); +} + + +/*----- “]‘—’†ƒEƒCƒ“ƒhƒE‚ð‘O–ʂɏo‚· ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void GoForwardTransWindow(void) +{ + MoveToForeground = YES; + return; +} + + +/*----- “]‘—ƒ\ƒPƒbƒg‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠî•ñ‚ð‰Šú‰» ------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void InitTransCurDir(void) +{ + strcpy(CurDir, ""); + return; +} + + +/*----- ƒtƒ@ƒCƒ‹“]‘—ƒXƒŒƒbƒh‚̃ƒCƒ“ƒ‹[ƒv ------------------------------------ +* +* Parameter +* void *Dummy : Žg‚í‚È‚¢ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static ULONG WINAPI TransferThread(void *Dummy) +{ + TRANSPACKET *Pos; + HWND hWndTrans; + char Tmp[FMAX_PATH+1]; + int CwdSts; + int GoExit; + int Down; + int Up; + int DelNotify; + + hWndTrans = NULL; + Down = NO; + Up = NO; + GoExit = NO; + DelNotify = NO; + + while((TransPacketBase != NULL) || + (WaitForSingleObject(hRunMutex, 200) == WAIT_TIMEOUT)) + { + if(fTransferThreadExit == TRUE) + break; + + WaitForSingleObject(hListAccMutex, INFINITE); + memset(ErrMsg, NUL, ERR_MSG_LEN+7); + + Canceled = NO; + + if(TransPacketBase != NULL) + { + ReleaseMutex(hListAccMutex); + if(hWndTrans == NULL) + { + if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) || + (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) || + (strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) || + (strncmp(TransPacketBase->Cmd, "L-", 2) == 0) || + (strncmp(TransPacketBase->Cmd, "R-", 2) == 0)) + { + hWndTrans = CreateDialog(GetFtpInst(), MAKEINTRESOURCE(transfer_dlg), HWND_DESKTOP, (DLGPROC)TransDlgProc); + if(MoveToForeground == YES) + SetForegroundWindow(hWndTrans); + ShowWindow(hWndTrans, SW_SHOWNOACTIVATE); + } + } + TransPacketBase->hWndTrans = hWndTrans; + + if(hWndTrans != NULL) + { + if(MoveToForeground == YES) + { + SetForegroundWindow(hWndTrans); + MoveToForeground = NO; + } + } + + if(hWndTrans != NULL) + SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)TransPacketBase); + + /* ƒ_ƒEƒ“ƒ[ƒh */ + if(strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) + { + /* •s³‚ȃpƒX‚ðŒŸo */ + if(CheckPathViolation(TransPacketBase) == NO) + { + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢‚½‚߂̏ˆ— */ + if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == SUCCESS) + { + if(strncmp(TransPacketBase->Cmd, "RETR-S", 6) == 0) + { + /* ƒTƒCƒY‚Æ“ú•t‚ðŽæ“¾ */ + DoSIZE(TransPacketBase->RemoteFile, &TransPacketBase->Size); + DoMDTM(TransPacketBase->RemoteFile, &TransPacketBase->Time); + strcpy(TransPacketBase->Cmd, "RETR "); + } + + Down = YES; +// if(DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO) == 429) +// { +// if(ReConnectTrnSkt() == SUCCESS) + DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled); +// } + } + } + } + /* ƒAƒbƒvƒ[ƒh */ + else if(strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) + { + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢‚½‚߂̏ˆ— */ + if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == SUCCESS) + { + Up = YES; +// if(DoUpLoad(AskTrnCtrlSkt(), TransPacketBase) == 429) +// { +// if(ReConnectTrnSkt() == SUCCESS) + DoUpLoad(AskTrnCtrlSkt(), TransPacketBase); +// } + } + } + /* ƒtƒHƒ‹ƒ_ì¬iƒ[ƒJƒ‹‚Ü‚½‚̓zƒXƒgj */ + else if(strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN078, FALSE, YES); + + if(strlen(TransPacketBase->RemoteFile) > 0) + { + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢‚½‚߂̏ˆ— */ + CwdSts = FTP_COMPLETE; + + strcpy(Tmp, TransPacketBase->RemoteFile); + if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, 1) == FAIL) + { + ClearAll = YES; + CwdSts = FTP_ERROR; + } + + if(CwdSts == FTP_COMPLETE) + { + Up = YES; + CommandProcTrn(NULL, "MKD %s", Tmp); + /* ‚·‚łɃtƒHƒ‹ƒ_‚ª‚ ‚éê‡‚à‚ ‚é‚̂ŁA */ + /* ‚±‚±‚ł̓Gƒ‰[ƒ`ƒFƒbƒN‚Í‚µ‚È‚¢ */ + + if(FolderAttr) + CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp); + } + } + else if(strlen(TransPacketBase->LocalFile) > 0) + { + Down = YES; + DoLocalMKD(TransPacketBase->LocalFile); + } + } + /* ƒfƒBƒŒƒNƒgƒŠì¬ií‚ɃzƒXƒg‘¤j */ + else if(strncmp(TransPacketBase->Cmd, "R-MKD", 5) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN079, FALSE, YES); + + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢‚½‚߂̏ˆ— */ + if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == SUCCESS) + { + Up = YES; + CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); + + if(FolderAttr) + CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, TransPacketBase->RemoteFile); + } + } + /* ƒfƒBƒŒƒNƒgƒŠíœií‚ɃzƒXƒg‘¤j */ + else if(strncmp(TransPacketBase->Cmd, "R-RMD", 5) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN080, FALSE, YES); + + DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase); + if((DelNotify == YES) || (DelNotify == YES_ALL)) + { + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢‚½‚߂̏ˆ— */ + if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == SUCCESS) + { + Up = YES; + CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); + } + } + } + /* ƒtƒ@ƒCƒ‹íœií‚ɃzƒXƒg‘¤j */ + else if(strncmp(TransPacketBase->Cmd, "R-DELE", 6) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN081, FALSE, YES); + + DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase); + if((DelNotify == YES) || (DelNotify == YES_ALL)) + { + /* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢‚½‚߂̏ˆ— */ + if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == SUCCESS) + { + Up = YES; + CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); + } + } + } + /* ƒfƒBƒŒƒNƒgƒŠì¬ií‚Ƀ[ƒJƒ‹‘¤j */ + else if(strncmp(TransPacketBase->Cmd, "L-MKD", 5) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN082, FALSE, YES); + + Down = YES; + DoLocalMKD(TransPacketBase->LocalFile); + } + /* ƒfƒBƒŒƒNƒgƒŠíœií‚Ƀ[ƒJƒ‹‘¤j */ + else if(strncmp(TransPacketBase->Cmd, "L-RMD", 5) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN083, FALSE, YES); + + DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase); + if((DelNotify == YES) || (DelNotify == YES_ALL)) + { + Down = YES; + DoLocalRMD(TransPacketBase->LocalFile); + } + } + /* ƒtƒ@ƒCƒ‹íœií‚Ƀ[ƒJƒ‹‘¤j */ + else if(strncmp(TransPacketBase->Cmd, "L-DELE", 6) == 0) + { + DispTransFileInfo(TransPacketBase, MSGJPN084, FALSE, YES); + + DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase); + if((DelNotify == YES) || (DelNotify == YES_ALL)) + { + Down = YES; + DoLocalDELE(TransPacketBase->LocalFile); + } + } + /* ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðÝ’è */ + else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0) + { + if(AskShareProh() == YES) + { + if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) + { + if(CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile)/100 != FTP_COMPLETE) + { + DispCWDerror(hWndTrans); + ClearAll = YES; + } + } + } + strcpy(CurDir, TransPacketBase->RemoteFile); + } + /* ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ð–ß‚· */ + else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0) + { + if(AskShareProh() == NO) + { + if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) + CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile); + strcpy(CurDir, TransPacketBase->RemoteFile); + } + } + /* Ž©“®I—¹‚Ì‚½‚ß‚Ì’Ê’m */ + else if(strcmp(TransPacketBase->Cmd, "GOQUIT") == 0) + { + GoExit = YES; + } + + /*===== ‚P‚‚̏ˆ—I‚í‚è =====*/ + + if(ForceAbort == NO) + { + WaitForSingleObject(hListAccMutex, INFINITE); + if(ClearAll == YES) + EraseTransFileList(); + else + { + if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) || + (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0)) + { + TransFiles--; + PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); + } + Pos = TransPacketBase; + TransPacketBase = TransPacketBase->Next; + free(Pos); + } + ClearAll = NO; + ReleaseMutex(hListAccMutex); + + if(BackgrndMessageProc() == YES) + { + WaitForSingleObject(hListAccMutex, INFINITE); + EraseTransFileList(); + ReleaseMutex(hListAccMutex); + } + } + } + else + { + DelNotify = NO; + + ReleaseMutex(hListAccMutex); + if(KeepDlg == NO) + { + if(hWndTrans != NULL) + { + DestroyWindow(hWndTrans); + hWndTrans = NULL; + + if(GoExit == YES) + { + SoundPlay(SND_TRANS); + + if(AskAutoExit() == NO) + { + if(Down == YES) + PostMessage(GetMainHwnd(), WM_REFRESH_LOCAL_FLG, 0, 0); + if(Up == YES) + PostMessage(GetMainHwnd(), WM_REFRESH_REMOTE_FLG, 0, 0); + } + Down = NO; + Up = NO; + } + } + } + BackgrndMessageProc(); + + if(GoExit == YES) + { + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_AUTO_EXIT, 0), 0); + GoExit = NO; + } + } + } + return 0; +} + + +/*----- ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢ƒtƒ@ƒCƒ‹ƒAƒNƒZƒX‚̏€”õ ------------------------------ +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒpƒPƒbƒg +* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* char *Tmp : ì‹Æ—pƒGƒŠƒA +* +* Return Value +* int ƒXƒe[ƒ^ƒX(SUCCESS/FAIL) +* +* Note +* ƒtƒ‹ƒpƒX‚ðŽg‚í‚È‚¢Žž‚́A +* ‚±‚̃‚ƒWƒ…[ƒ‹“à‚Å CWD ‚ðs‚È‚¢A +* Pkt->RemoteFile ‚Ƀtƒ@ƒCƒ‹–¼‚Ì‚ÝŽc‚·BiƒpƒX–¼‚͏Á‚·j +*----------------------------------------------------------------------------*/ + +static int MakeNonFullPath(TRANSPACKET *Pkt, char *Cur, char *Tmp) +{ + int Sts; + + Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, 1); + if(Sts == FAIL) + ClearAll = YES; + + return(Sts); +} + + + + +/*----- ƒ_ƒEƒ“ƒ[ƒh‚ðs‚È‚¤ -------------------------------------------------- +* +* Parameter +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* int DirList : ƒfƒBƒŒƒNƒgƒŠƒŠƒXƒg‚̃_ƒEƒ“ƒ[ƒh(YES/NO) +* +* Return Value +* int ‰ž“šƒR[ƒh +* +* Note +* ‚±‚̃‚ƒWƒ…[ƒ‹‚́Aƒtƒ@ƒCƒ‹ˆê——‚̎擾‚È‚Ç‚ðs‚È‚¤Û‚ɃƒCƒ“‚̃XƒŒƒbƒh +* ‚©‚ç‚àŒÄ‚΂ê‚éBƒƒCƒ“‚̃XƒŒƒbƒh‚©‚çŒÄ‚΂ê‚鎞‚Í Pkt->hWndTrans == NULLB +*----------------------------------------------------------------------------*/ + +int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork) +{ + int iRetCode; + char Reply[ERR_MSG_LEN+7]; + + Pkt->ctrl_skt = cSkt; + if(IsSpecialDevice(GetFileName(Pkt->LocalFile)) == YES) + { + iRetCode = 500; + SetTaskMsg(MSGJPN085, GetFileName(Pkt->LocalFile)); + DispDownloadFinishMsg(Pkt, iRetCode); + } + else if(Pkt->Mode != EXIST_IGNORE) + { + if(Pkt->Type == TYPE_I) + Pkt->KanjiCode = KANJI_NOCNV; + + iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "TYPE %c", Pkt->Type); + if(iRetCode/100 < FTP_RETRY) + { + if(Pkt->hWndTrans != NULL) + { + AllTransSizeNow = 0; + + if(DirList == NO) + DispTransFileInfo(Pkt, MSGJPN086, TRUE, YES); + else + DispTransFileInfo(Pkt, MSGJPN087, FALSE, NO); + } + + if(BackgrndMessageProc() == NO) + { + if(AskPasvMode() != YES) + iRetCode = DownLoadNonPassive(Pkt, CancelCheckWork); + else + iRetCode = DownLoadPassive(Pkt, CancelCheckWork); + } + else + iRetCode = 500; + } + else + SetErrorMsg(Reply); + } + else + { + DispTransFileInfo(Pkt, MSGJPN088, TRUE, YES); + SetTaskMsg(MSGJPN089, Pkt->RemoteFile); + iRetCode = 200; + } + return(iRetCode); +} + + +/*----- ’ʏ탂[ƒh‚Ńtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh ------------------------------------ +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) +{ + int iRetCode; + int iLength; + SOCKET data_socket = INVALID_SOCKET; // data channel socket + SOCKET listen_socket = INVALID_SOCKET; // data listen socket + char Buf[1024]; + int CreateMode; + struct sockaddr_in saSockAddr1; + char Reply[ERR_MSG_LEN+7]; + + if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, CancelCheckWork)) != INVALID_SOCKET) + { + if(SetDownloadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &CreateMode, CancelCheckWork) == YES) + { + sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); + iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "%s", Buf); + if(iRetCode/100 == FTP_PRELIM) + { + if(SocksGet2ndBindReply(listen_socket, &data_socket) == FAIL) + { + iLength = sizeof(saSockAddr1); + data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength); + + if(shutdown(listen_socket, 1) != 0) + ReportWSError("shutdown listen", WSAGetLastError()); + listen_socket = DoClose(listen_socket); + + if(data_socket == INVALID_SOCKET) + { + SetErrorMsg(MSGJPN280); + ReportWSError("accept", WSAGetLastError()); + iRetCode = 500; + } + else + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); + } + + if(data_socket != INVALID_SOCKET) + { + iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork); +// data_socket = DoClose(data_socket); + } + } + else + { + SetErrorMsg(Reply); + SetTaskMsg(MSGJPN090); + listen_socket = DoClose(listen_socket); + iRetCode = 500; + } + } + else + iRetCode = 500; + } + else + { + iRetCode = 500; + SetErrorMsg(MSGJPN279); + } + DispDownloadFinishMsg(Pkt, iRetCode); + + return(iRetCode); +} + + +/*----- Passiveƒ‚[ƒh‚Ńtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh --------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork) +{ + int iRetCode; + SOCKET data_socket = INVALID_SOCKET; // data channel socket + char Buf[1024]; + int CreateMode; + char Adrs[20]; + int Port; + int Flg; + char Reply[ERR_MSG_LEN+7]; + + iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); + if(iRetCode/100 == FTP_COMPLETE) + { + if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == SUCCESS) + { + if((data_socket = connectsock(Adrs, Port, MSGJPN091, CancelCheckWork)) != INVALID_SOCKET) + { + if(setsockopt(data_socket, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + + if(SetDownloadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &CreateMode, CancelCheckWork) == YES) + { + sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); + iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "%s", Buf); + if(iRetCode/100 == FTP_PRELIM) + { + iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork); +// data_socket = DoClose(data_socket); + } + else + { + SetErrorMsg(Reply); + SetTaskMsg(MSGJPN092); + data_socket = DoClose(data_socket); + iRetCode = 500; + } + } + else + iRetCode = 500; + } + else + iRetCode = 500; + } + else + { + SetErrorMsg(MSGJPN093); + SetTaskMsg(MSGJPN093); + iRetCode = 500; + } + } + else + SetErrorMsg(Buf); + + DispDownloadFinishMsg(Pkt, iRetCode); + + return(iRetCode); +} + + +/*----- ƒ_ƒEƒ“ƒ[ƒh‚ÌŽÀs ---------------------------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* SOCKET dSkt : ƒf[ƒ^ƒ\ƒPƒbƒg +* int CreateMode : ƒtƒ@ƒCƒ‹ì¬ƒ‚[ƒh (CREATE_ALWAYS/OPEN_ALWAYS) +* +* Return Value +* int ‰ž“šƒR[ƒh +* +* Note +* “]‘—‚ÌŒo‰ß•\Ž¦‚Í +* ƒ_ƒCƒAƒƒO‚ðo‚·(Pkt->hWndTrans!=NULL)ê‡AƒCƒ“ƒ^[ƒoƒ‹ƒ^ƒCƒ}‚ÅŒo‰ß‚ð•\Ž¦‚·‚é +* ƒ_ƒCƒAƒƒO‚ðo‚³‚È‚¢ê‡A‚±‚̃‹[ƒ`ƒ“‚©‚çDispDownloadSize()‚ðŒÄ‚Ô +*----------------------------------------------------------------------------*/ + +static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork) +{ + int iNumBytes; + char Buf[BUFSIZE]; + char Buf2[BUFSIZE+3]; + HANDLE iFileHandle; + SECURITY_ATTRIBUTES Sec; + DWORD Writed; + CODECONVINFO cInfo; + int Continue; +// fd_set ReadFds; +// struct timeval Tout; +// struct timeval *ToutPtr; + int iRetCode; + int TimeOutErr; + char TmpBuf[ONELINE_BUF_SIZE]; + DWORD dwFileAttributes; + +#ifdef SET_BUFFER_SIZE +/* Add by H.Shirouzu at 2002/10/02 */ + int buf_size = SOCKBUF_SIZE; + for ( ; buf_size > 0; buf_size /= 2) + if (setsockopt(dSkt, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size)) == 0) + break; +/* End */ +#endif + + Pkt->Abort = ABORT_NONE; + + Sec.nLength = sizeof(SECURITY_ATTRIBUTES); + Sec.lpSecurityDescriptor = NULL; + Sec.bInheritHandle = FALSE; + + dwFileAttributes = GetFileAttributes(Pkt->LocalFile); + if (dwFileAttributes != INVALID_FILE_ATTRIBUTES && (dwFileAttributes & FILE_ATTRIBUTE_READONLY)) { + // “Ç‚ÝŽæ‚èê—p + if (MessageBox(GetMainHwnd(), MSGJPN296, MSGJPN086, MB_YESNO) == IDYES) { + // ‘®«‚ð‰ðœ + SetFileAttributes(Pkt->LocalFile, dwFileAttributes ^ FILE_ATTRIBUTE_READONLY); + } + } + + if((iFileHandle = CreateFile(Pkt->LocalFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &Sec, CreateMode, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) + { + if(CreateMode == OPEN_ALWAYS) + SetFilePointer(iFileHandle, 0, 0, FILE_END); + + if(Pkt->hWndTrans != NULL) + { + TimeStart = time(NULL); + SetTimer(Pkt->hWndTrans, TIMER_DISPLAY, DISPLAY_TIMING, NULL); + } + + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = Pkt->KanaCnv; + + /*===== ƒtƒ@ƒCƒ‹‚ðŽóM‚·‚郋[ƒv =====*/ + while((Pkt->Abort == ABORT_NONE) && (ForceAbort == NO)) + { +// FD_ZERO(&ReadFds); +// FD_SET(dSkt, &ReadFds); +// ToutPtr = NULL; +// if(TimeOut != 0) +// { +// Tout.tv_sec = TimeOut; +// Tout.tv_usec = 0; +// ToutPtr = &Tout; +// } +// iNumBytes = select(0, &ReadFds, NULL, NULL, ToutPtr); +// if(iNumBytes == SOCKET_ERROR) +// { +// ReportWSError("select", WSAGetLastError()); +// if(Pkt->Abort == ABORT_NONE) +// Pkt->Abort = ABORT_ERROR; +// break; +// } +// else if(iNumBytes == 0) +// { +// SetErrorMsg(MSGJPN094); +// SetTaskMsg(MSGJPN094); +// Pkt->Abort = ABORT_ERROR; +// break; +// } + + if((iNumBytes = do_recv(dSkt, Buf, BUFSIZE, 0, &TimeOutErr, CancelCheckWork)) <= 0) + { + if(TimeOutErr == YES) + { + SetErrorMsg(MSGJPN094); + SetTaskMsg(MSGJPN094); + if(Pkt->hWndTrans != NULL) + ClearAll = YES; + if(Pkt->Abort == ABORT_NONE) + Pkt->Abort = ABORT_ERROR; + } + else if(iNumBytes == SOCKET_ERROR) + { + if(Pkt->Abort == ABORT_NONE) + Pkt->Abort = ABORT_ERROR; + } + break; + } + + /* Š¿ŽšƒR[ƒh•ÏŠ· */ + if(Pkt->KanjiCode != KANJI_NOCNV) + { + cInfo.Str = Buf; + cInfo.StrLen = iNumBytes; + cInfo.Buf = Buf2; + cInfo.BufSize = BUFSIZE+3; + do + { + if(Pkt->KanjiCode == KANJI_JIS) + Continue = ConvJIStoSJIS(&cInfo); + else + Continue = ConvEUCtoSJIS(&cInfo); + if(WriteFile(iFileHandle, Buf2, cInfo.OutLen, &Writed, NULL) == FALSE) + Pkt->Abort = ABORT_DISKFULL; + } + while((Continue == YES) && (Pkt->Abort == ABORT_NONE)); + } + else + { + if(WriteFile(iFileHandle, Buf, iNumBytes, &Writed, NULL) == FALSE) + Pkt->Abort = ABORT_DISKFULL; + } + + Pkt->ExistSize += iNumBytes; + if(Pkt->hWndTrans != NULL) + AllTransSizeNow += iNumBytes; + else + { + /* “]‘—ƒ_ƒCƒAƒƒO‚ðo‚³‚È‚¢Žž‚ÌŒo‰ß•\Ž¦ */ + DispDownloadSize(Pkt->ExistSize); + } + + if(BackgrndMessageProc() == YES) + ForceAbort = YES; + } + + /* ‘‚«Žc‚µ‚½ƒf[ƒ^‚ð‘‚«ž‚Þ */ + if(Pkt->KanjiCode != KANJI_NOCNV) + { + cInfo.Buf = Buf2; + cInfo.BufSize = BUFSIZE+3; + FlushRestData(&cInfo); + if(WriteFile(iFileHandle, Buf2, cInfo.OutLen, &Writed, NULL) == FALSE) + Pkt->Abort = ABORT_DISKFULL; + } + + /* ƒOƒ‰ƒt•\Ž¦‚ðXV */ + if(Pkt->hWndTrans != NULL) + { + KillTimer(Pkt->hWndTrans, TIMER_DISPLAY); + DispTransferStatus(Pkt->hWndTrans, YES, Pkt); + TimeStart = time(NULL) - TimeStart + 1; + } + else + { + /* “]‘—ƒ_ƒCƒAƒƒO‚ðo‚³‚È‚¢Žž‚ÌŒo‰ß•\Ž¦‚ðÁ‚· */ + DispDownloadSize(-1); + } + + /* ƒtƒ@ƒCƒ‹‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ð‡‚í‚¹‚é */ + if((SaveTimeStamp == YES) && + ((Pkt->Time.dwLowDateTime != 0) || (Pkt->Time.dwHighDateTime != 0))) + { + SetFileTime(iFileHandle, &Pkt->Time, &Pkt->Time, &Pkt->Time); + } + + CloseHandle(iFileHandle); + + if(iNumBytes == SOCKET_ERROR) + ReportWSError("recv",WSAGetLastError()); + } + else + { + SetErrorMsg(MSGJPN095, Pkt->LocalFile); + SetTaskMsg(MSGJPN095, Pkt->LocalFile); + Pkt->Abort = ABORT_ERROR; + } + + + if(shutdown(dSkt, 1) != 0) + ReportWSError("shutdown", WSAGetLastError()); + + DoClose(dSkt); + + if(ForceAbort == NO) + { + /* Abort‚ðƒzƒXƒg‚É“`‚¦‚é */ + if(Pkt->Abort != ABORT_NONE && iFileHandle != INVALID_HANDLE_VALUE) + { + SendData(Pkt->ctrl_skt, "\xFF\xF4\xFF", 3, MSG_OOB, CancelCheckWork); /* MSG_OOB‚É’ˆÓ */ + SendData(Pkt->ctrl_skt, "\xF2", 1, 0, CancelCheckWork); + command(Pkt->ctrl_skt, NULL, CancelCheckWork, "ABOR"); + } + } + + iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, CancelCheckWork, TmpBuf); + +//#pragma aaa +//DoPrintf("##DOWN REPLY : %s", Buf); + + if(Pkt->Abort == ABORT_DISKFULL) + { + SetErrorMsg(MSGJPN096); + SetTaskMsg(MSGJPN096); + } + if(iRetCode >= FTP_RETRY) + SetErrorMsg(Buf); + if(Pkt->Abort != ABORT_NONE) + iRetCode = 500; + + return(iRetCode); +} + + +/*----- ƒ_ƒEƒ“ƒ[ƒhI—¹^’†Ž~Žž‚̃ƒbƒZ[ƒW‚ð•\Ž¦ ---------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* int iRetCode : ‰ž“šƒR[ƒh +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) +{ + char Fname[FMAX_PATH+1]; + + if(ForceAbort == NO) + { + if((iRetCode/100) >= FTP_CONTINUE) + { + strcpy(Fname, Pkt->RemoteFile); + +#if defined(HAVE_OPENVMS) + /* OpenVMS‚̏ꍇA‹óƒfƒBƒŒƒNƒgƒŠ‚ÖˆÚ“®‚·‚é‚Æ550 File not found‚É‚È‚Á‚Ä + * ƒGƒ‰[ƒ_ƒCƒAƒƒO‚âƒGƒ‰[ƒƒbƒZ[ƒW‚ªo‚é‚̂ʼn½‚à‚µ‚È‚¢ */ + if (AskHostType() == HTYPE_VMS) + return; +#endif + + if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0)) + { + SetTaskMsg(MSGJPN097); + strcpy(Fname, MSGJPN098); + } + else if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) + SetTaskMsg(MSGJPN099, TimeStart, Pkt->ExistSize/TimeStart); + else + SetTaskMsg(MSGJPN100); + + if(Pkt->Abort != ABORT_USER) + { + if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) + ClearAll = YES; + } + } + else + { + if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0)) + SetTaskMsg(MSGJPN101, Pkt->ExistSize); + else if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) + SetTaskMsg(MSGJPN102, TimeStart, Pkt->ExistSize/TimeStart); + else + SetTaskMsg(MSGJPN103, Pkt->ExistSize); + } + } + return; +} + + +/*----- ƒ_ƒEƒ“ƒ[ƒh^ƒAƒbƒvƒ[ƒhƒGƒ‰[‚̃_ƒCƒAƒƒO‚ð•\Ž¦ -------------------- +* +* Parameter +* int RedID : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃Šƒ\[ƒXID +* HWND hWnd : ‘‚«ž‚Ý’†ƒ_ƒCƒAƒƒO‚̃EƒCƒ“ƒhƒE +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES=’†Ž~/NO=‘S‚Ä’†Ž~) +*----------------------------------------------------------------------------*/ + +static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname) +{ + if(hWnd == NULL) + hWnd = GetMainHwnd(); + + SoundPlay(SND_ERROR); + return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Fname)); +} + + +/*----- ƒ_ƒEƒ“ƒ[ƒhƒGƒ‰[^ƒAƒbƒvƒ[ƒhƒGƒ‰[ƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN -------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)lParam); + SendDlgItemMessage(hDlg, UPDOWN_ERR_MSG, WM_SETTEXT, 0, (LPARAM)ErrMsg); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒ_ƒEƒ“ƒ[ƒh‚̃ŠƒWƒ…[ƒ€‚̏€”õ‚ðs‚¤ ---------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* iont ProcMode : ˆ—ƒ‚[ƒh(EXIST_xxx) +* LONGLONG Size : ƒ[ƒhÏ‚݂̃tƒ@ƒCƒ‹‚̃TƒCƒY +* int *Mode : ƒtƒ@ƒCƒ‹ì¬ƒ‚[ƒh (CREATE_xxxx) +* +* Return Value +* int “]‘—‚ðs‚¤‚©‚Ç‚¤‚©(YES/NO=‚±‚̃tƒ@ƒCƒ‹‚𒆎~/NO_ALL=‘S‚Ä’†Ž~) +* +* Note +* Pkt->ExistSize‚̃Zƒbƒg‚ðs‚È‚¤ +*----------------------------------------------------------------------------*/ + +static int SetDownloadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode, int *CancelCheckWork) +{ + int iRetCode; + int Com; + char Reply[ERR_MSG_LEN+7]; + char Tmp[40]; + + Com = YES; + + Pkt->ExistSize = 0; + *Mode = CREATE_ALWAYS; + + if(ProcMode == EXIST_RESUME) + { + iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "REST %s", MakeNumString(Size, Tmp, FALSE)); + if(iRetCode/100 < FTP_RETRY) + { + /* ƒŠƒWƒ…[ƒ€ */ + if(Pkt->hWndTrans != NULL) + Pkt->ExistSize = Size; + *Mode = OPEN_ALWAYS; + } + else + { + Com = DialogBox(GetFtpInst(), MAKEINTRESOURCE(noresume_dlg), Pkt->hWndTrans, NoResumeWndProc); + if(Com != YES) + { + if(Com == NO_ALL) /* ‘S‚Ä’†Ž~ */ + ClearAll = YES; + Pkt->Abort = ABORT_USER; + } + } + } + return(Com); +} + + +/*----- resumeƒGƒ‰[ƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case RESUME_CANCEL_ALL : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} + + + +/*----- ƒAƒbƒvƒ[ƒh‚ðs‚È‚¤ -------------------------------------------------- +* +* Parameter +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt) +{ + int iRetCode; + char Reply[ERR_MSG_LEN+7]; + + Pkt->ctrl_skt = cSkt; + + if(Pkt->Mode != EXIST_IGNORE) + { + if(CheckFileReadable(Pkt->LocalFile) == SUCCESS) + { + if(Pkt->Type == TYPE_I) + Pkt->KanjiCode = KANJI_NOCNV; + + iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "TYPE %c", Pkt->Type); + if(iRetCode/100 < FTP_RETRY) + { + if(Pkt->Mode == EXIST_UNIQUE) + strcpy(Pkt->Cmd, "STOU "); + + if(Pkt->hWndTrans != NULL) + DispTransFileInfo(Pkt, MSGJPN104, TRUE, YES); + + if(BackgrndMessageProc() == NO) + { + if(AskPasvMode() != YES) + iRetCode = UpLoadNonPassive(Pkt); + else + iRetCode = UpLoadPassive(Pkt); + } + else + iRetCode = 500; + } + else + SetErrorMsg(Reply); + + /* ‘®«•ÏX */ + if((Pkt->Attr != -1) && ((iRetCode/100) == FTP_COMPLETE)) + command(Pkt->ctrl_skt, Reply, &Canceled, "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile); + } + else + { + SetErrorMsg(MSGJPN105, Pkt->LocalFile); + SetTaskMsg(MSGJPN105, Pkt->LocalFile); + iRetCode = 500; + Pkt->Abort = ABORT_ERROR; + DispUploadFinishMsg(Pkt, iRetCode); + } + } + else + { + DispTransFileInfo(Pkt, MSGJPN106, TRUE, YES); + SetTaskMsg(MSGJPN107, Pkt->LocalFile); + iRetCode = 200; + } + return(iRetCode); +} + + +/*----- ’ʏ탂[ƒh‚Ńtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh ------------------------------------ +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int UpLoadNonPassive(TRANSPACKET *Pkt) +{ + int iRetCode; + int iLength; + SOCKET data_socket = INVALID_SOCKET; // data channel socket + SOCKET listen_socket = INVALID_SOCKET; // data listen socket + char Buf[1024]; + struct sockaddr_in saSockAddr1; + int Resume; + char Reply[ERR_MSG_LEN+7]; + + if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled)) != INVALID_SOCKET) + { + SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); + if(Resume == NO) + sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); + else + sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); + + iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf); + if((iRetCode/100) == FTP_PRELIM) + { + if(SocksGet2ndBindReply(listen_socket, &data_socket) == FAIL) + { + iLength=sizeof(saSockAddr1); + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength); + + if(shutdown(listen_socket, 1) != 0) + ReportWSError("shutdown listen", WSAGetLastError()); + listen_socket = DoClose(listen_socket); + + if(data_socket == INVALID_SOCKET) + { + SetErrorMsg(MSGJPN280); + ReportWSError("accept", WSAGetLastError()); + iRetCode = 500; + } + else + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); + } + + if(data_socket != INVALID_SOCKET) + { + iRetCode = UpLoadFile(Pkt, data_socket); + data_socket = DoClose(data_socket); + } + } + else + { + SetErrorMsg(Reply); + SetTaskMsg(MSGJPN108); + listen_socket = DoClose(listen_socket); + iRetCode = 500; + } + } + else + { + SetErrorMsg(MSGJPN279); + iRetCode = 500; + } + DispUploadFinishMsg(Pkt, iRetCode); + + return(iRetCode); +} + + +/*----- Passiveƒ‚[ƒh‚Ńtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh --------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int UpLoadPassive(TRANSPACKET *Pkt) +{ + int iRetCode; + SOCKET data_socket = INVALID_SOCKET; // data channel socket + char Buf[1024]; + char Adrs[20]; + int Port; + int Flg; + int Resume; + char Reply[ERR_MSG_LEN+7]; + + iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV"); + if(iRetCode/100 == FTP_COMPLETE) + { + if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == SUCCESS) + { + if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET) + { + if(setsockopt(data_socket, IPPROTO_TCP, TCP_NODELAY, (LPSTR)&Flg, sizeof(Flg)) == SOCKET_ERROR) + ReportWSError("setsockopt", WSAGetLastError()); + + SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); + if(Resume == NO) + sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); + else + sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); + + iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf); + if(iRetCode/100 == FTP_PRELIM) + { + iRetCode = UpLoadFile(Pkt, data_socket); + + data_socket = DoClose(data_socket); + } + else + { + SetErrorMsg(Reply); + SetTaskMsg(MSGJPN110); + data_socket = DoClose(data_socket); + iRetCode = 500; + } + } + else + { + SetErrorMsg(MSGJPN281); + iRetCode = 500; + } + } + else + { + SetErrorMsg(Buf); + SetTaskMsg(MSGJPN111); + iRetCode = 500; + } + } + else + SetErrorMsg(Buf); + + DispUploadFinishMsg(Pkt, iRetCode); + + return(iRetCode); +} + + +/*----- ƒAƒbƒvƒ[ƒh‚ÌŽÀs ---------------------------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* SOCKET dSkt : ƒf[ƒ^ƒ\ƒPƒbƒg +* +* Return Value +* int ‰ž“šƒR[ƒh +* +* Note +* “]‘—‚ÌŒo‰ß•\Ž¦‚́AƒCƒ“ƒ^[ƒoƒ‹ƒ^ƒCƒ}‚ÅŒo‰ß‚ð•\Ž¦‚·‚é +* “]‘—ƒ_ƒCƒAƒƒO‚ðo‚³‚È‚¢‚ŃAƒbƒvƒ[ƒh‚·‚邱‚Æ‚Í‚È‚¢ +*----------------------------------------------------------------------------*/ + +static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) +{ + DWORD iNumBytes; + HANDLE iFileHandle; + SECURITY_ATTRIBUTES Sec; + char Buf[BUFSIZE]; + char Buf2[BUFSIZE+3]; + CODECONVINFO cInfo; + TERMCODECONVINFO tInfo; + int Continue; + char *EofPos; + int iRetCode; +#if 0 + int TimeOutErr; +#endif + char TmpBuf[ONELINE_BUF_SIZE]; + DWORD Low; + DWORD High; + +#ifdef SET_BUFFER_SIZE +/* Add by H.Shirouzu at 2002/10/02 */ + int buf_size = SOCKBUF_SIZE; + for ( ; buf_size > 0; buf_size /= 2) + if (setsockopt(dSkt, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size)) == 0) + break; +/* End */ +#endif + + Pkt->Abort = ABORT_NONE; + + Sec.nLength = sizeof(SECURITY_ATTRIBUTES); + Sec.lpSecurityDescriptor = NULL; + Sec.bInheritHandle = FALSE; + + if((iFileHandle = CreateFile(Pkt->LocalFile, GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE, &Sec, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE) + { + if(Pkt->hWndTrans != NULL) + { + Low = GetFileSize(iFileHandle, &High); + Pkt->Size = MakeLongLong(High, Low); + + High = (DWORD)HIGH32(Pkt->ExistSize); + Low = (DWORD)LOW32(Pkt->ExistSize); + SetFilePointer(iFileHandle, Low, &High, FILE_BEGIN); + + AllTransSizeNow = 0; + TimeStart = time(NULL); + SetTimer(Pkt->hWndTrans, TIMER_DISPLAY, DISPLAY_TIMING, NULL); + } + + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = Pkt->KanaCnv; + InitTermCodeConvInfo(&tInfo); + + /*===== ƒtƒ@ƒCƒ‹‚𑗐M‚·‚郋[ƒv =====*/ + while((Pkt->Abort == ABORT_NONE) && + (ForceAbort == NO) && + (ReadFile(iFileHandle, Buf, BUFSIZE, &iNumBytes, NULL) == TRUE)) + { + if(iNumBytes == 0) + break; + + /* EOFœ‹Ž */ + EofPos = NULL; + if((RmEOF == YES) && (Pkt->Type == TYPE_A)) + { + if((EofPos = memchr(Buf, 0x1A, iNumBytes)) != NULL) + iNumBytes = EofPos - Buf; + } + + /* Š¿ŽšƒR[ƒh•ÏŠ· */ + if(Pkt->KanjiCode != KANJI_NOCNV) + { + cInfo.Str = Buf; + cInfo.StrLen = iNumBytes; + cInfo.Buf = Buf2; + cInfo.BufSize = BUFSIZE+3; + do + { + if(Pkt->KanjiCode == KANJI_JIS) + Continue = ConvSJIStoJIS(&cInfo); + else + Continue = ConvSJIStoEUC(&cInfo); + + if(TermCodeConvAndSend(&tInfo, dSkt, Buf2, cInfo.OutLen, Pkt->Type) == FAIL) + { + Pkt->Abort = ABORT_ERROR; + break; + } + } + while(Continue == YES); + } + else + { + if(TermCodeConvAndSend(&tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FAIL) + Pkt->Abort = ABORT_ERROR; + } + + Pkt->ExistSize += iNumBytes; + if(Pkt->hWndTrans != NULL) + AllTransSizeNow += iNumBytes; + + if(BackgrndMessageProc() == YES) + ForceAbort = YES; + + if(EofPos != NULL) + break; + } + + if((ForceAbort == NO) && (Pkt->Abort == ABORT_NONE)) + { + /* ‘—‚èŽc‚µ‚½ƒf[ƒ^‚𑗐M */ + if(Pkt->KanjiCode != KANJI_NOCNV) + { + cInfo.Buf = Buf2; + cInfo.BufSize = BUFSIZE+3; + FlushRestData(&cInfo); + + if(TermCodeConvAndSend(&tInfo, dSkt, Buf2, cInfo.OutLen, Pkt->Type) == FAIL) + Pkt->Abort = ABORT_ERROR; + } + + tInfo.Buf = Buf2; + tInfo.BufSize = BUFSIZE+3; + FlushRestTermCodeConvData(&tInfo); + if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled) == FAIL) + Pkt->Abort = ABORT_ERROR; + } + + /* ƒOƒ‰ƒt•\Ž¦‚ðXV */ + if(Pkt->hWndTrans != NULL) + { + KillTimer(Pkt->hWndTrans, TIMER_DISPLAY); + DispTransferStatus(Pkt->hWndTrans, YES, Pkt); + TimeStart = time(NULL) - TimeStart + 1; + } + CloseHandle(iFileHandle); + } + else + { + SetErrorMsg(MSGJPN112, Pkt->LocalFile); + SetTaskMsg(MSGJPN112, Pkt->LocalFile); + Pkt->Abort = ABORT_ERROR; + } + + if(shutdown(dSkt, 1) != 0) + ReportWSError("shutdown", WSAGetLastError()); + +#if 0 + /* clean up */ + while(do_recv(dSkt, Buf, BUFSIZE, 0, &TimeOutErr, &Canceled) > 0) + ; +#endif + + iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled, TmpBuf); + +//#pragma aaa +//DoPrintf("##UP REPLY : %s", Buf); + + if(iRetCode >= FTP_RETRY) + SetErrorMsg(Buf); + + if(Pkt->Abort != ABORT_NONE) + iRetCode = 500; + + return(iRetCode); +} + + +/*----- ƒoƒbƒtƒ@‚Ì“à—e‚ð‰üsƒR[ƒh•ÏŠ·‚µ‚Ä‘—M -------------------------------- +* +* Parameter +* TERMCODECONVINFO *tInfo : ‰üsƒR[ƒh•ÏŠ·ƒpƒPƒbƒg +* SOCKET Skt : ƒ\ƒPƒbƒg +* char *Data : ƒf[ƒ^ +* int Size : ƒf[ƒ^‚̃TƒCƒY +* int Ascii : ƒ‚[ƒh@@(TYPE_xx) +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii) +{ + char Buf3[BUFSIZE*2]; + int Continue; + int Ret; + + Ret = SUCCESS; + +// CR-LFˆÈŠO‚̉üsƒR[ƒh‚ð•ÏŠ·‚µ‚È‚¢ƒ‚[ƒh‚Í‚±‚±‚֒ljÁ + if(Ascii == TYPE_A) + { + tInfo->Str = Data; + tInfo->StrLen = Size; + tInfo->Buf = Buf3; + tInfo->BufSize = BUFSIZE*2; + do + { + Continue = ConvTermCodeToCRLF(tInfo); + if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled)) == FAIL) + break; + } + while(Continue == YES); + } + else + Ret = SendData(Skt, Data, Size, 0, &Canceled); + + return(Ret); +} + + +/*----- ƒAƒbƒvƒ[ƒhI—¹^’†Ž~Žž‚̃ƒbƒZ[ƒW‚ð•\Ž¦ ---------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* int iRetCode : ‰ž“šƒR[ƒh +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode) +{ + if(ForceAbort == NO) + { + if((iRetCode/100) >= FTP_CONTINUE) + { + if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) + SetTaskMsg(MSGJPN113, TimeStart, Pkt->ExistSize/TimeStart); + else + SetTaskMsg(MSGJPN114); + + if(Pkt->Abort != ABORT_USER) + { + if(DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO) + ClearAll = YES; + } + } + else + { + if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) + SetTaskMsg(MSGJPN115, TimeStart, Pkt->ExistSize/TimeStart); + else + SetTaskMsg(MSGJPN116); + } + } + return; +} + + +/*----- ƒAƒbƒvƒ[ƒh‚̃ŠƒWƒ…[ƒ€‚̏€”õ‚ðs‚¤ ---------------------------------- +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* iont ProcMode : ˆ—ƒ‚[ƒh(EXIST_xxx) +* LONGLONG Size : ƒzƒXƒg‚É‚ ‚éƒtƒ@ƒCƒ‹‚̃TƒCƒY +* int *Mode : ƒŠƒWƒ…[ƒ€‚ðs‚¤‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* int ƒXƒe[ƒ^ƒX = YES +* +* Note +* Pkt->ExistSize‚̃Zƒbƒg‚ðs‚È‚¤ +*----------------------------------------------------------------------------*/ + +static int SetUploadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode) +{ + Pkt->ExistSize = 0; + *Mode = NO; + if(ProcMode == EXIST_RESUME) + { + if(Pkt->hWndTrans != NULL) + { + Pkt->ExistSize = Size; + *Mode = YES; + } + } + return(YES); +} + + +/*----- “]‘—’†ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃R[ƒ‹ƒoƒbƒN -------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + RECT RectDlg; + RECT RectPar; + HMENU hMenu; + static TRANSPACKET *Pkt; + + switch(Msg) + { + case WM_INITDIALOG : + GetWindowRect(hDlg, &RectDlg); + RectDlg.right -= RectDlg.left; + RectDlg.bottom -= RectDlg.top; + GetWindowRect(GetMainHwnd(), &RectPar); + MoveWindow(hDlg, + ((RectPar.right + RectPar.left) / 2) - (RectDlg.right / 2), + ((RectPar.bottom + RectPar.top) / 2) - (RectDlg.bottom / 2), + RectDlg.right, + RectDlg.bottom, + FALSE); + + hMenu = GetSystemMenu(hDlg, FALSE); + EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED); + break; + + case WM_COMMAND : + switch(LOWORD(wParam)) + { + case TRANS_STOP_NEXT : + ClearAll = YES; + break; + + case TRANS_STOP_ALL : + ClearAll = YES; + /* ‚±‚±‚É break ‚Í‚È‚¢ */ + + case IDCANCEL : + Pkt->Abort = ABORT_USER; + Canceled = YES; + break; + } + break; + + case WM_TIMER : + if(wParam == TIMER_DISPLAY) + { + if(MoveToForeground == YES) + SetForegroundWindow(hDlg); + MoveToForeground = NO; + KillTimer(hDlg, TIMER_DISPLAY); + DispTransferStatus(hDlg, NO, Pkt); + SetTimer(hDlg, TIMER_DISPLAY, DISPLAY_TIMING, NULL); + } + break; + + case WM_SET_PACKET : + Pkt = (TRANSPACKET *)lParam; + break; + } + return(FALSE); +} + + +/*----- “]‘—ƒXƒe[ƒ^ƒX‚ð•\Ž¦ -------------------------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int End : “]‘—‚ªŠ®—¹‚µ‚½‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt) +{ + time_t TotalLap; + int Per; + LONGLONG Bps; + LONGLONG Transed; + char Num1[40]; + char Num2[40]; + char Tmp[80]; + char Str[80]; + char *Pos; + + if(hWnd != NULL) + { + SendMessage(hWnd, WM_GETTEXT, 79, (LPARAM)Str); + if((Pos = strchr(Str, ')')) != NULL) + Pos ++; + else + Pos = Str; + sprintf(Tmp, "(%d)%s", AskTransferFileNum(), Pos); + SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)Tmp); + + if(Pkt->Abort == ABORT_NONE) + { + if(End == NO) + { + TotalLap = time(NULL) - TimeStart + 1; + + Bps = 0; + if(TotalLap != 0) + Bps = AllTransSizeNow / TotalLap; + Transed = Pkt->Size - Pkt->ExistSize; + + if(Pkt->Size <= 0) + sprintf(Tmp, "%d ", Pkt->ExistSize); + else if(Pkt->Size < 1024) + sprintf(Tmp, "%s / %s ", MakeNumString(Pkt->ExistSize, Num1, TRUE), MakeNumString(Pkt->Size, Num2, TRUE)); + else + sprintf(Tmp, "%sk / %sk ", MakeNumString(Pkt->ExistSize/1024, Num1, TRUE), MakeNumString(Pkt->Size/1024, Num2, TRUE)); + strcpy(Str, Tmp); + + if(Bps == 0) + sprintf(Tmp, "( 0 B/S )"); + else if(Bps < 1000) + sprintf(Tmp, "( %s B/S )", MakeNumString(Bps, Num1, TRUE)); + else + sprintf(Tmp, "( %s.%02d KB/S )", MakeNumString(Bps/1000, Num1, TRUE), (int)((Bps%1000)/10)); + strcat(Str, Tmp); + + if((Bps > 0) && (Pkt->Size > 0) && (Transed >= 0)) + { + sprintf(Tmp, " %d:%02d", (int)((Transed/Bps)/60), (int)((Transed/Bps)%60)); + strcat(Str, Tmp); + } + else + strcat(Str, " ??:??"); + } + else + strcpy(Str, MSGJPN117); + } + else + strcpy(Str, MSGJPN118); + + SendDlgItemMessage(hWnd, TRANS_STATUS, WM_SETTEXT, 0, (LPARAM)Str); + + if(Pkt->Size <= 0) + Per = 0; + else if(Pkt->Size < 1024*1024) + Per = (int)(Pkt->ExistSize * 100 / Pkt->Size); + else + Per = (int)((Pkt->ExistSize/1024) * 100 / (Pkt->Size/1024)); + SendDlgItemMessage(hWnd, TRANS_TIME_BAR, PBM_SETPOS, Per, 0); + } + return; +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹‚̏î•ñ‚ð•\Ž¦ ------------------------------------------ +* +* Parameter +* TRANSPACKET *Pkt : “]‘—ƒtƒ@ƒCƒ‹î•ñ +* char *Title : ƒEƒCƒ“ƒhƒE‚̃^ƒCƒgƒ‹ +* int SkipButton : u‚±‚̃tƒ@ƒCƒ‹‚𒆎~vƒ{ƒ^ƒ“‚Ì—L–³ (TRUE/FALSE) +* int Info : ƒtƒ@ƒCƒ‹î•ñ‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int Info) +{ + char Tmp[40]; + + if(Pkt->hWndTrans != NULL) + { + EnableWindow(GetDlgItem(Pkt->hWndTrans, IDCANCEL), SkipButton); + + sprintf(Tmp, "(%d)%s", AskTransferFileNum(), Title); + SendMessage(Pkt->hWndTrans, WM_SETTEXT, 0, (LPARAM)Tmp); + SendDlgItemMessage(Pkt->hWndTrans, TRANS_STATUS, WM_SETTEXT, 0, (LPARAM)""); + + SendDlgItemMessage(Pkt->hWndTrans, TRANS_TIME_BAR, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); + SendDlgItemMessage(Pkt->hWndTrans, TRANS_TIME_BAR, PBM_SETSTEP, 1, 0); + SendDlgItemMessage(Pkt->hWndTrans, TRANS_TIME_BAR, PBM_SETPOS, 0, 0); + + if(Info == YES) + { + DispStaticText(GetDlgItem(Pkt->hWndTrans, TRANS_REMOTE), Pkt->RemoteFile); + DispStaticText(GetDlgItem(Pkt->hWndTrans, TRANS_LOCAL), Pkt->LocalFile); + + if(Pkt->Type == TYPE_I) + SendDlgItemMessage(Pkt->hWndTrans, TRANS_MODE, WM_SETTEXT, 0, (LPARAM)MSGJPN119); + else if(Pkt->Type == TYPE_A) + SendDlgItemMessage(Pkt->hWndTrans, TRANS_MODE, WM_SETTEXT, 0, (LPARAM)MSGJPN120); + + if(Pkt->KanjiCode == KANJI_NOCNV) + SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)MSGJPN121); + else if(Pkt->KanjiCode == KANJI_JIS) + SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)MSGJPN122); + else if(Pkt->KanjiCode == KANJI_EUC) + SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)MSGJPN123); + } + else + { + SendDlgItemMessage(Pkt->hWndTrans, TRANS_REMOTE, WM_SETTEXT, 0, (LPARAM)""); + SendDlgItemMessage(Pkt->hWndTrans, TRANS_LOCAL, WM_SETTEXT, 0, (LPARAM)""); + SendDlgItemMessage(Pkt->hWndTrans, TRANS_MODE, WM_SETTEXT, 0, (LPARAM)""); + SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)""); + } + } + return; +} + + +/*----- PASVƒRƒ}ƒ“ƒh‚Ì–ß‚è’l‚©‚çƒAƒhƒŒƒX‚ƃ|[ƒg”ԍ†‚𒊏o -------------------- +* +* Parameter +* char *Str : PASVƒRƒ}ƒ“ƒh‚̃Šƒvƒ‰ƒC +* char *Adrs : ƒAƒhƒŒƒX‚̃Rƒs[æ ("www.xxx.yyy.zzz") +* int *Port : ƒ|[ƒg”ԍ†‚ðƒZƒbƒg‚·‚郏[ƒN +* int Max : ƒAƒhƒŒƒX•¶Žš—ñ‚̍ő咷 +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) +{ + char *Pos; + char *Btm; + int Sts; + + Sts = FAIL; + + Pos = strchr(Str, '('); + if(Pos != NULL) + { + Pos++; + Btm = strchr(Pos, ','); + if(Btm != NULL) + { + Btm++; + Btm = strchr(Btm, ','); + if(Btm != NULL) + { + Btm++; + Btm = strchr(Btm, ','); + if(Btm != NULL) + { + Btm++; + Btm = strchr(Btm, ','); + if(Btm != NULL) + { + if((Btm - Pos) <= Max) + { + strncpy(Adrs, Pos, Btm - Pos); + *(Adrs + (Btm - Pos)) = NUL; + ReplaceAll(Adrs, ',', '.'); + + Pos = Btm + 1; + Btm = strchr(Pos, ','); + if(Btm != NULL) + { + Btm++; + *Port = (atoi(Pos) * 0x100) + atoi(Btm); + Sts = SUCCESS; + } + } + } + } + } + } + } + return(Sts); +} + + +/*----- Windows‚̃XƒyƒVƒƒƒ‹ƒfƒoƒCƒX‚©‚Ç‚¤‚©‚ð•Ô‚· ----------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO) +*----------------------------------------------------------------------------*/ + +static int IsSpecialDevice(char *Fname) +{ + int Sts; + + Sts = NO; + if((_stricmp(Fname, "CON") == 0) || + (_stricmp(Fname, "PRN") == 0) || + (_stricmp(Fname, "AUX") == 0) || + (_strnicmp(Fname, "CON.", 4) == 0) || + (_strnicmp(Fname, "PRN.", 4) == 0) || + (_strnicmp(Fname, "AUX.", 4) == 0)) + { + Sts = YES; + } + return(Sts); +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒO‚ł̃tƒ@ƒCƒ‹íœŠm”F -------------------------------------- +* +* Parameter +* int Cur +* int Notify +* TRANSPACKET *Pkt +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt) +{ + MIRRORDELETEINFO DelInfo; + HWND hWnd; + + if(((Cur == WIN_LOCAL) && (MirDownDelNotify == NO)) || + ((Cur == WIN_REMOTE) && (MirUpDelNotify == NO))) + { + Notify = YES_ALL; + } + + if(Notify != YES_ALL) + { + DelInfo.Cur = Cur; + DelInfo.Pkt = Pkt; + hWnd = Pkt->hWndTrans; + if(hWnd == NULL) + hWnd = GetMainHwnd(); + Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(delete_dlg), hWnd, MirrorDeleteDialogCallBack, (LPARAM)&DelInfo); + } + return(Notify); +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒO‚ł̃tƒ@ƒCƒ‹íœƒ_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + static MIRRORDELETEINFO *DelInfo; + switch (iMessage) + { + case WM_INITDIALOG : + DelInfo = (MIRRORDELETEINFO *)lParam; + + if(DelInfo->Cur == WIN_LOCAL) + { + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN124); + SendDlgItemMessage(hDlg, DELETE_TEXT, WM_SETTEXT, 0, (LPARAM)DelInfo->Pkt->LocalFile); + } + else + { + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN125); + SendDlgItemMessage(hDlg, DELETE_TEXT, WM_SETTEXT, 0, (LPARAM)DelInfo->Pkt->RemoteFile); + } + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case DELETE_NO : + EndDialog(hDlg, NO); + break; + + case DELETE_ALL : + EndDialog(hDlg, YES_ALL); + break; + + case IDCANCEL : + ClearAll = YES; + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} + + + + + +static void SetErrorMsg(char *fmt, ...) +{ + va_list Args; + + if(strlen(ErrMsg) == 0) + { + va_start(Args, fmt); + wvsprintf(ErrMsg, fmt, Args); + va_end(Args); + } + return; +} + + + + + + +/*----- ƒ_ƒEƒ“ƒ[ƒhŽž‚Ì•s³‚ȃpƒX‚ðƒ`ƒFƒbƒN ---------------------------------- +* +* Parameter +* TRANSPACKET *packet : ƒ_ƒEƒ“ƒ[ƒhî•ñ +* +* Return Value +* int YES=•s³‚ȃpƒX/NO=–â‘è‚È‚¢ƒpƒX +*----------------------------------------------------------------------------*/ +int CheckPathViolation(TRANSPACKET *packet) +{ + int result = NO; + char *msg; + + if((strncmp(packet->RemoteFile, "..\\", 3) == 0) || + (strncmp(packet->RemoteFile, "../", 3) == 0) || + (strstr(packet->RemoteFile, "\\..\\") != NULL) || + (strstr(packet->RemoteFile, "/../") != NULL)) + { + msg = malloc(strlen(MSGJPN297) + strlen(packet->RemoteFile) + 1); + if(msg) + { + sprintf(msg, MSGJPN297, packet->RemoteFile); + MessageBox(GetMainHwnd(), msg, MSGJPN086, MB_OK); + free(msg); + } + result = YES; + } + return(result); +} + + diff --git a/helpid.h b/helpid.h new file mode 100644 index 0000000..b900b31 --- /dev/null +++ b/helpid.h @@ -0,0 +1,59 @@ +#define IDH_HELP_TOPIC_0000001 1 /* ‚Í‚¶‚ß‚É */ +#define IDH_HELP_TOPIC_0000002 2 /* Žg‚¢•û */ +#define IDH_HELP_TOPIC_0000003 3 /* ‰æ–Ê‚Ìà–¾ */ +#define IDH_HELP_TOPIC_0000005 5 /* ƒzƒXƒg‚ւ̐ڑ±‚Ɛؒf */ +#define IDH_HELP_TOPIC_0000006 6 /* ƒtƒ@ƒCƒ‹ˆê—— */ +#define IDH_HELP_TOPIC_0000007 7 /* “]‘—ƒ‚[ƒh */ +#define IDH_HELP_TOPIC_0000008 8 /* ƒ_ƒEƒ“ƒ[ƒh */ +#define IDH_HELP_TOPIC_0000009 9 /* ƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”F */ +#define IDH_HELP_TOPIC_0000010 10 /* ƒAƒbƒvƒ[ƒh */ +#define IDH_HELP_TOPIC_0000011 11 /* ƒAƒbƒvƒ[ƒh‚ÌŠm”F */ +#define IDH_HELP_TOPIC_0000012 12 /* ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh */ +#define IDH_HELP_TOPIC_0000013 13 /* ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh */ +#define IDH_HELP_TOPIC_0000014 14 /* ƒtƒ@ƒCƒ‹‚ðŠJ‚­ */ +#define IDH_HELP_TOPIC_0000015 15 /* ƒtƒ@ƒCƒ‹íœ */ +#define IDH_HELP_TOPIC_0000016 16 /* ƒtƒ@ƒCƒ‹–¼•ÏX */ +#define IDH_HELP_TOPIC_0000017 17 /* ‘®«•ÏX */ +#define IDH_HELP_TOPIC_0000018 18 /* ƒtƒHƒ‹ƒ_ì¬ */ +#define IDH_HELP_TOPIC_0000019 19 /* ƒuƒbƒNƒ}[ƒN */ +#define IDH_HELP_TOPIC_0000020 20 /* ƒtƒ@ƒCƒ‹‚ÌŒŸõ */ +#define IDH_HELP_TOPIC_0000021 21 /* ƒtƒBƒ‹ƒ^ */ +#define IDH_HELP_TOPIC_0000022 22 /* ƒtƒHƒ‹ƒ_‚Ì“¯ŽžˆÚ“® */ +#define IDH_HELP_TOPIC_0000023 23 /* ”CˆÓ‚̃Rƒ}ƒ“ƒh */ +#define IDH_HELP_TOPIC_0000024 24 /* ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ */ +#define IDH_HELP_TOPIC_0000025 25 /* ƒCƒ“ƒ|[ƒg */ +#define IDH_HELP_TOPIC_0000027 27 /* ƒzƒXƒgˆê—— */ +#define IDH_HELP_TOPIC_0000028 28 /* Šî–{ */ +#define IDH_HELP_TOPIC_0000029 29 /* Šg’£ */ +#define IDH_HELP_TOPIC_0000030 30 /* •¶ŽšƒR[ƒh */ +#define IDH_HELP_TOPIC_0000031 31 /* ƒ_ƒCƒAƒ‹ƒAƒbƒv */ +#define IDH_HELP_TOPIC_0000032 32 /* ‚“x */ +#define IDH_HELP_TOPIC_0000034 34 /* Ú‘± */ +#define IDH_HELP_TOPIC_0000035 35 /* ƒRƒ}ƒ“ƒh */ +#define IDH_HELP_TOPIC_0000036 36 /* •\Ž¦ */ +#define IDH_HELP_TOPIC_0000037 37 /* ƒc[ƒ‹ */ +#define IDH_HELP_TOPIC_0000038 38 /* ƒIƒvƒVƒ‡ƒ“ */ +#define IDH_HELP_TOPIC_0000039 39 /* ƒwƒ‹ƒv */ +#define IDH_HELP_TOPIC_0000040 40 /* ŠÂ‹«Ý’è */ +#define IDH_HELP_TOPIC_0000041 41 /* ƒ†[ƒU */ +#define IDH_HELP_TOPIC_0000042 42 /* “]‘—‚P */ +#define IDH_HELP_TOPIC_0000043 43 /* “]‘—‚Q */ +#define IDH_HELP_TOPIC_0000044 44 /* “]‘—‚R */ +#define IDH_HELP_TOPIC_0000045 45 /* ƒ~ƒ‰[ƒŠƒ“ƒO */ +#define IDH_HELP_TOPIC_0000046 46 /* ‘€ì */ +#define IDH_HELP_TOPIC_0000047 47 /* •\Ž¦ */ +#define IDH_HELP_TOPIC_0000048 48 /* Ú‘±/Ø’f */ +#define IDH_HELP_TOPIC_0000049 49 /* FireWall */ +#define IDH_HELP_TOPIC_0000050 50 /* ƒc[ƒ‹ */ +#define IDH_HELP_TOPIC_0000051 51 /* ƒTƒEƒ“ƒh */ +#define IDH_HELP_TOPIC_0000052 52 /* ‚»‚Ì‘¼ */ +#define IDH_HELP_TOPIC_0000054 54 /* JISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000055 55 /* Š¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000056 56 /* ƒpƒXƒ[ƒh‚ÌŽæ‚舵‚¢‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000057 57 /* jre32.dll‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000058 58 /* ƒo[ƒWƒ‡ƒ“ƒAƒbƒv‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000059 59 /* ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000060 60 /* ì¬ */ +#define IDH_HELP_TOPIC_0000061 61 /* ƒtƒ@ƒCƒ‹‚Ì‘I‘ð */ +#define IDH_HELP_TOPIC_0000062 62 /* ƒuƒbƒNƒ}[ƒN */ +#define IDH_HELP_TOPIC_0000064 64 /* ƒ}ƒXƒ^[ƒpƒXƒ[ƒh */ diff --git a/history.c b/history.c new file mode 100644 index 0000000..fe2ab64 --- /dev/null +++ b/history.c @@ -0,0 +1,432 @@ +/*============================================================================= +* +* ƒqƒXƒgƒŠ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New); +static void AddOneFnameToMenu(char *Host, char *User, char *Remote, int Num); +static void RemoveAllHistoryFromMenu(void); + +/*===== ŠO•”ŽQÆ =====*/ + +/* Ý’è’l */ +extern int FileHist; +extern int PassToHist; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HISTORYDATA *HistoryBase = NULL; +static int HistoryNum = 0; + +/* ƒqƒXƒgƒŠ‚̃ƒjƒ…[€–Ú‚ÌID */ +static int MenuHistId[HISTORY_MAX] = { + MENU_HIST_1, MENU_HIST_2, MENU_HIST_3, MENU_HIST_4, MENU_HIST_5, + MENU_HIST_6, MENU_HIST_7, MENU_HIST_8, MENU_HIST_9, MENU_HIST_10, + MENU_HIST_11, MENU_HIST_12, MENU_HIST_13, MENU_HIST_14, MENU_HIST_15, + MENU_HIST_16, MENU_HIST_17, MENU_HIST_18, MENU_HIST_19, MENU_HIST_20 +}; + + + +/*----- ƒzƒXƒgî•ñ‚ðƒqƒXƒgƒŠƒŠƒXƒg‚̐擪‚ɒljÁ‚·‚é ---------------------------- +* +* Parameter +* HOSTDATA *Host : ƒzƒXƒgƒf[ƒ^ +* int TrMode : “]‘—ƒ‚[ƒh +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AddHostToHistory(HOSTDATA *Host, int TrMode) +{ + HISTORYDATA New; + + CopyHostToHistory(Host, &New); + New.Type = TrMode; + AddHistoryToHistory(&New); + return; +} + + +/*----- ƒqƒXƒgƒŠ‚ðƒqƒXƒgƒŠƒŠƒXƒg‚̐擪‚ɒljÁ‚·‚é ------------------------------ +* +* Parameter +* HISTORYDATA *Hist : ƒqƒXƒgƒŠƒf[ƒ^ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AddHistoryToHistory(HISTORYDATA *Hist) +{ + HISTORYDATA *New; + + CheckHistoryNum(1); + if(FileHist > HistoryNum) + { + New = malloc(sizeof(HISTORYDATA)); + if(New != NULL) + { + memcpy(New, Hist, sizeof(HISTORYDATA)); + New->Next = HistoryBase; + HistoryBase = New; + HistoryNum++; + } + } + return; +} + + +/*----- ƒqƒXƒgƒŠ‚̐”‚ð•Ô‚· ---------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒqƒXƒgƒŠ‚̐” +*----------------------------------------------------------------------------*/ + +int AskHistoryNum(void) +{ + return(HistoryNum); +} + + +/*----- ƒqƒXƒgƒŠ‚̐”‚ðƒ`ƒFƒbƒN‚µ‘½‚·‚¬‚½‚çíœ -------------------------------- +* +* Parameter +* int Space : ‹ó‚¯‚Ä‚¨‚­ŒÂ” (0`) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CheckHistoryNum(int Space) +{ + int i; + HISTORYDATA *Prev; + HISTORYDATA *Pos; + HISTORYDATA *Next; + + if(HistoryNum > FileHist-Space) + { + /* Žc‚·‚ׂ«ƒqƒXƒgƒŠ‚ð’T‚· */ + Pos = HistoryBase; + Prev = NULL; + for(i = 0; i < FileHist-Space; i++) + { + Prev = Pos; + Pos = Pos->Next; + } + + /* ‚¢‚ç‚È‚¢ƒqƒXƒgƒŠ‚ðÁ‚· */ + if(Prev == NULL) + HistoryBase = NULL; + else + Prev->Next = NULL; + + while(Pos != NULL) + { + Next = Pos->Next; + free(Pos); + Pos = Next; + HistoryNum--; + } + } + return; +} + + +/*----- ƒzƒXƒgî•ñ‚ðƒqƒXƒgƒŠ‚ɃZƒbƒg ------------------------------------------ +* +* Parameter +* HOSTDATA *Host : ƒzƒXƒgƒf[ƒ^ +* HISTORYDATA *New : ƒqƒXƒgƒŠ‚ðƒZƒbƒg‚·‚郏[ƒN +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New) +{ + strcpy(New->HostAdrs, Host->HostAdrs); + strcpy(New->UserName, Host->UserName); + if(PassToHist == YES) + strcpy(New->PassWord, Host->PassWord); + else + strcpy(New->PassWord, ""); + strcpy(New->Account, Host->Account); + strcpy(New->LocalInitDir, Host->LocalInitDir); + strcpy(New->RemoteInitDir, Host->RemoteInitDir); + strcpy(New->ChmodCmd, Host->ChmodCmd); + strcpy(New->LsName, Host->LsName); + strcpy(New->InitCmd, Host->InitCmd); + New->Port = Host->Port; + New->KanjiCode = Host->KanjiCode; + New->KanaCnv = Host->KanaCnv; + New->NameKanjiCode = Host->NameKanjiCode; + New->NameKanaCnv = Host->NameKanaCnv; + New->Pasv = Host->Pasv; + New->FireWall = Host->FireWall; + New->ListCmdOnly = Host->ListCmdOnly; + New->UseNLST_R = Host->UseNLST_R; + New->TimeZone = Host->TimeZone; + New->HostType = Host->HostType; + New->SyncMove = Host->SyncMove; + New->NoFullPath = Host->NoFullPath; + New->Sort = Host->Sort; + New->Security = Host->Security; + New->Dialup = Host->Dialup; + New->DialupAlways = Host->DialupAlways; + New->DialupNotify = Host->DialupNotify; + strcpy(New->DialEntry, Host->DialEntry); + return; +} + + +/*----- ƒqƒXƒgƒŠî•ñ‚ðƒzƒXƒgî•ñ‚ɃZƒbƒg -------------------------------------- +* +* Parameter +* HISTORYDATA *Hist : ƒqƒXƒgƒŠ +* HOSTDATA *Host : ƒzƒXƒgƒf[ƒ^‚ðƒZƒbƒg‚·‚郏[ƒN +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host) +{ + CopyDefaultHost(Host); + + strcpy(Host->HostAdrs, Hist->HostAdrs); + strcpy(Host->UserName, Hist->UserName); + if(PassToHist == YES) + strcpy(Host->PassWord, Hist->PassWord); + else + strcpy(Host->PassWord, ""); + strcpy(Host->Account, Hist->Account); + strcpy(Host->LocalInitDir, Hist->LocalInitDir); + strcpy(Host->RemoteInitDir, Hist->RemoteInitDir); + strcpy(Host->ChmodCmd, Hist->ChmodCmd); + strcpy(Host->LsName, Hist->LsName); + strcpy(Host->InitCmd, Hist->InitCmd); + Host->Port = Hist->Port; + Host->KanjiCode = Hist->KanjiCode; + Host->KanaCnv = Hist->KanaCnv; + Host->NameKanjiCode = Hist->NameKanjiCode; + Host->NameKanaCnv = Hist->NameKanaCnv; + Host->Pasv = Hist->Pasv; + Host->FireWall = Hist->FireWall; + Host->ListCmdOnly = Hist->ListCmdOnly; + Host->UseNLST_R = Hist->UseNLST_R; + Host->TimeZone = Hist->TimeZone; + Host->HostType = Hist->HostType; + Host->SyncMove = Hist->SyncMove; + Host->NoFullPath = Hist->NoFullPath; + Host->Sort = Hist->Sort; + Host->Security = Hist->Security; + Host->Dialup = Hist->Dialup; + Host->DialupAlways = Hist->DialupAlways; + Host->DialupNotify = Hist->DialupNotify; + strcpy(Host->DialEntry, Hist->DialEntry); + return; +} + + +/*----- ƒqƒXƒgƒŠî•ñ‚̏‰Šú’l‚ðŽæ“¾ -------------------------------------------- +* +* Parameter +* HISTORYDATA *Set : ƒqƒXƒgƒŠ‚ðƒZƒbƒg‚·‚郏[ƒN +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CopyDefaultHistory(HISTORYDATA *Set) +{ + HOSTDATA Host; + + CopyDefaultHost(&Host); + CopyHostToHistory(&Host, Set); + return; +} + + +/*----- ‘SƒqƒXƒgƒŠ‚ðƒƒjƒ…[‚ɃZƒbƒg ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetAllHistoryToMenu(void) +{ + int i; + HISTORYDATA *Pos; + + RemoveAllHistoryFromMenu(); + + Pos = HistoryBase; + for(i = 0; i < HistoryNum; i++) + { + AddOneFnameToMenu(Pos->HostAdrs, Pos->UserName, Pos->RemoteInitDir, i); + Pos = Pos->Next; + } + return; +} + + +/*----- ƒqƒXƒgƒŠ‚ðƒƒjƒ…[‚ɒljÁ ---------------------------------------------- +* +* Parameter +* char *Host : ƒzƒXƒg–¼ +* char *User : ƒ†[ƒU–¼ +* char *Remote : ƒzƒXƒg‚̃tƒHƒ‹ƒ_ +* int Num : ”ԍ† +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddOneFnameToMenu(char *Host, char *User, char *Remote, int Num) +{ + HMENU hMenu; + char Tmp[HOST_ADRS_LEN+USER_NAME_LEN+INIT_DIR_LEN+7+1]; + + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), 0); + + if(Num == 0) + AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); + + if(Num < 9) + sprintf(Tmp, "&%d %s (%s) %s", Num+1, Host, User, Remote); + else if(Num == 9) + sprintf(Tmp, "&0 %s (%s) %s", Host, User, Remote); + else + sprintf(Tmp, "&* %s (%s) %s", Host, User, Remote); + + AppendMenu(hMenu, MF_STRING, MenuHistId[Num], Tmp); + + return; +} + + +/*----- ‘SƒqƒXƒgƒŠ‚ðƒƒjƒ…[‚©‚çíœ ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void RemoveAllHistoryFromMenu(void) +{ + HMENU hMenu; + int Cnt; + int i; + + hMenu = GetSubMenu(GetMenu(GetMainHwnd()), 0); + Cnt = GetMenuItemCount(hMenu); + for(i = DEF_FMENU_ITEMS; i < Cnt; i++) + { + DeleteMenu(hMenu, DEF_FMENU_ITEMS, MF_BYPOSITION); + } + return; +} + + +/*----- Žw’胁ƒjƒ…[ƒRƒ}ƒ“ƒh‚ɑΉž‚·‚éƒqƒXƒgƒŠ‚ð•Ô‚· -------------------------- +* +* Parameter +* int MenuCmd : Žæ‚èo‚·ƒqƒXƒgƒŠ‚ÉŠ„‚è“–‚Ä‚ç‚ꂽƒƒjƒ…[ƒRƒ}ƒ“ƒh (MENU_xxx) +* HISTORYDATA *Buf : ƒqƒXƒgƒŠƒf[ƒ^‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int GetHistoryByCmd(int MenuCmd, HISTORYDATA *Buf) +{ + int Sts; + int i; + HISTORYDATA *Pos; + + Sts = FAIL; + Pos = HistoryBase; + for(i = 0; i < HistoryNum; i++) + { + if(MenuHistId[i] == MenuCmd) + { + memcpy(Buf, Pos, sizeof(HISTORYDATA)); + Sts = SUCCESS; + } + Pos = Pos->Next; + } + return(Sts); +} + + +/*----- Žw’è”ԍ†‚ɑΉž‚·‚éƒqƒXƒgƒŠ‚ð•Ô‚· -------------------------------------- +* +* Parameter +* int Num : ”ԍ†(0`) +* HISTORYDATA *Buf : ƒqƒXƒgƒŠƒf[ƒ^‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int GetHistoryByNum(int Num, HISTORYDATA *Buf) +{ + return(GetHistoryByCmd(MenuHistId[Num], Buf)); +} + + diff --git a/history.txt b/history.txt new file mode 100644 index 0000000..7191ef3 --- /dev/null +++ b/history.txt @@ -0,0 +1,1242 @@ +‚e‚e‚e‚s‚o@‰ü”ŃŠƒXƒg + +¡Ver 1.97b + +EƒzƒXƒg‘¤‚©‚çƒGƒNƒXƒvƒ[ƒ‰‚Ƀhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚½ŽžAƒtƒ@ƒCƒ‹‚âƒtƒHƒ‹ƒ_‚ð +@2‚ˆȏã‘I‘ð‚µ‚Ä‚¢‚½ê‡‚ɁA³í‚É“®ì‚µ‚È‚¢ê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@iWindows 7‚ÆVista‚ł́Aƒtƒ@ƒCƒ‹‚ª‚È‚¢‚Æ‚¢‚¤ƒGƒ‰[‚ª•\Ž¦‚³‚ê‚Ü‚·B +@Widnows XP‚ł́AƒGƒNƒXƒvƒ[ƒ‰‚ª–³”½‰ž‚É‚È‚è‚Ü‚·Bj + +¡Ver 1.97a + +EƒzƒXƒg‚ɐڑ±‚·‚éƒpƒXƒ[ƒh‚ª32•¶ŽšˆÈã‚̏ꍇAÅ‰‚Ì32•¶Žš‚Ü‚Å‚µ‚© +@•Û‘¶‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +EWindows 2000‚ŃAƒvƒŠƒP[ƒVƒ‡ƒ“ƒGƒ‰[‚É‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +Eƒwƒ‹ƒv‚̃gƒbƒvƒy[ƒW‚©‚çuŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚āv‚ɃWƒƒƒ“ƒv‚Å‚«‚È‚¢ +@‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.97 + +Eƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚Ì‹@”\‚𓱓ü‚µ‚Ü‚µ‚½B +@‚±‚Ì‹@”\‚́A‚°‚ñ‚°‚ñ‚³‚ñ‚ªŠJ”­‚µ‚Ä‚­‚¾‚³‚Á‚½‚à‚Ì‚Å‚·B‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B +@‚±‚̃o[ƒWƒ‡ƒ“‚ÌFFFTP‚ðÅ‰‚É‹N“®‚µ‚½ŽžAÚ‘±ƒƒjƒ…[‚̐ݒ聨 +@ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚̐ݒè‚Ń}ƒXƒ^[ƒpƒXƒ[ƒh‚ðÝ’肵‚ÄŽg—p‚µ‚Ä‚­‚¾‚³‚¢B +@ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ðÝ’è‚·‚é‚ƁAFFFTP‹N“®Žž‚Ƀ}ƒXƒ^[ƒpƒXƒ[ƒh‚Ì“ü—Í‚ª +@‹‚ß‚ç‚ê‚Ü‚·‚̂ŁA“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B +@i‚°‚ñ‚°‚ñ‚³‚ñ‚̃TƒCƒg‚ÅŒöŠJ‚³‚ê‚Ä‚¢‚½FFFTP 1.96d+009‘Š“–‚Ì‹@”\‚Å‚·Bj + +EƒpƒXƒ[ƒh‚̈͆‰»‚ðAES‚ðŽg—p‚µ‚čs‚¤‚悤‚É‚µ‚Ü‚µ‚½B +@‚±‚Ì‹@”\‚ÍMoca‚³‚ñ‚ªŠJ”­‚µ‚Ä‚­‚¾‚³‚Á‚½‚à‚Ì‚Å‚·B‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B +@ƒpƒXƒ[ƒh•Û‘¶Žž‚̈͆‰»‚Ì‹­“x‚ª‚‚­‚È‚è‚Ü‚µ‚½B +@iMoca‚³‚ñ‚̃TƒCƒg‚ÅŒöŠJ‚³‚ê‚Ä‚¢‚½FFFTP 1.96d+009+aes002‘Š“–‚Å‚·Bj + +Eã‹L‚ÌFFFTP 1.96d+009+aes002‚ɁAˆÈ‰º‚̕ύX‚ð‰Á‚¦‚Ü‚µ‚½B +@Eƒwƒ‹ƒv‚ð’ljÁ‚µ‚Ü‚µ‚½B +@EFFFTP‹N“®Žž‚̃}ƒXƒ^[ƒpƒXƒ[ƒh‚Ì“ü—̓EƒCƒ“ƒhƒE‚ɁAƒLƒƒƒ“ƒZƒ‹ƒ{ƒ^ƒ“‚ð +@@’ljÁ‚µ‚Ü‚µ‚½Bƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ªŽv‚¢o‚¹‚¸A‚¢‚Á‚½‚ñFFFTP‚Ì‹N“®‚ð +@@ƒLƒƒƒ“ƒZƒ‹‚µ‚½‚¢Žž‚ÉŽg‚¦‚Ü‚·B +@Eƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚Ì“ü—͂ł́A“ü—Í‚µ‚½ƒpƒXƒ[ƒh‚́œ‚Å•\Ž¦‚³‚ê‚é‚悤‚É +@@‚µ‚Ü‚µ‚½B‚»‚ꂪŠµ—á‚̂悤‚Å‚·‚̂ŁB + +@‚È‚¨A‚±‚̃o[ƒWƒ‡ƒ“‚ðŽg—p‚µ‚½‚ ‚Æ‚Å1.96dˆÈ‘O‚̃o[ƒWƒ‡ƒ“‚É–ß‚µ‚½ê‡A +@ƒzƒXƒg‚̐ݒè‚̃pƒXƒ[ƒh‚Í“ü—Í‚µ’¼‚·•K—v‚ª‚ ‚è‚Ü‚·B + +¡Ver 1.96d + +EƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh‚ðEUC‚Ü‚½‚ÍJIS‚ɐݒ肵‚½‚Æ‚«AIBMŠg’£•¶ŽšiƒVƒtƒgJISƒR[ƒh +@‚Å0xFA40`0xFC4Bj‚ª•ÏŠ·‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@‚±‚͈̔͂̕¶Žš‚́ANEC‘I’èIBMŠg’£•¶Žš“™‚É•ÏŠ·‚µ‚Ü‚·B + +Eƒwƒ‹ƒv‚̃EƒCƒ“ƒhƒE‚ÅBackSpaceƒL[‚âEnterƒL[‚ð‰Ÿ‚·‚ƁAFFFTP–{‘Ì‚ª”½‰ž‚µ‚Ä +@‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.96c + +EƒfƒBƒŒƒNƒgƒŠƒgƒ‰ƒo[ƒTƒ‹‚̐Ǝ㐫‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.96b + +EƒzƒXƒgã‚ł̃tƒ@ƒCƒ‹ˆÚ“®‚ðs‚¤‚Æ‚«‚É•\Ž¦‚·‚éŠm”Fƒ_ƒCƒAƒƒO‚ªAWindows 9x +@‚Å‚Í•¶Žš‰»‚¯‚µ‚Ä‚¢‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.96a + +EƒOƒ‹[ƒv–¼‚ɃXƒy[ƒX‚ªˆê‚Š܂܂ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹ˆê——Œ`Ž®‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.96 + +EƒzƒXƒgã‚ł̃tƒ@ƒCƒ‹ˆÚ“®‚ðs‚¤‚Æ‚«‚ɁAŠm”Fƒ_ƒCƒAƒƒO‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü +@‚µ‚½B•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚̐ݒè‚͕ύX‚Å‚«‚Ü‚·B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‘€ìj + +Eƒc[ƒ‹ƒo[ã‚Ń}ƒEƒX‚Ì—¼ƒ{ƒ^ƒ“‚𓯎ž‚ɃNƒŠƒbƒN‚·‚é‚ƁAFFFTP‚ª–³”½‰ž‚É‚È‚é +@ê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½Bi‚·‚È‚·‚ȃ~ƒbƒNƒX‚³‚ñAC³‚ ‚肪‚Æ‚¤‚²‚´‚¢ +@‚Ü‚·Bj + +Eƒtƒ@ƒCƒ‹ˆê——iÚ×•\Ž¦Žžj‚̃^ƒCƒgƒ‹s‚Ƀhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚½‚Æ‚«‚ɁA +@“®ì‚ª‚¨‚©‚µ‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.95 + +‚±‚̃o[ƒWƒ‡ƒ“‚̉ü‘¢‚́A‚·‚ׂÄmiau‚³‚ñ‚ª‰ü‘¢‚³‚ꂽ‚à‚Ì‚Å‚·B + +Eƒtƒ@ƒCƒ‹ƒŠƒXƒg•”•ª‚Å Alt+D ‰Ÿ‰º‚·‚é‚ƁAƒAƒhƒŒƒXƒo[•”•ª‚ɃtƒH[ƒJƒX‚ðˆÚ“® +@‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +EƒAƒhƒŒƒXƒo[•”•ª‚Å TAB ‰Ÿ‰º‚·‚é‚ƁAƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ɃtƒH[ƒJƒX‚ðˆÚ“®‚·‚é +@‚悤‚É‚µ‚Ü‚µ‚½B + +Eƒtƒ@ƒCƒ‹ƒŠƒXƒg•”•ª‚Å Ctrl+M ‰Ÿ‰º‚·‚é‚ƁA“]‘—ƒ‚[ƒh‚ðASCII¨BINARY¨AUTO‚Ì +@‡‚ŕύX‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +Eƒtƒ@ƒCƒ‹ˆê——‚̓ǂݍž‚Ý’¼ŒãAæ“ª‚̃tƒ@ƒCƒ‹‚ɃtƒH[ƒJƒX‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +Eƒtƒ@ƒCƒ‹ˆê——‚̓ǂݍž‚Ý’†‚́AƒAƒNƒZƒ‰ƒŒ[ƒ^ƒL[‚𖳌ø‚É‚µ‚Ü‚µ‚½B + +EuƒIƒvƒVƒ‡ƒ“v¨uƒc[ƒ‹v‚ÅŽw’è‚·‚éƒrƒ…[ƒA‚Q‚ƃrƒ…[ƒA‚R‚ª "d " +@id+”¼ŠpƒXƒy[ƒXj‚ÅŽn‚Ü‚Á‚Ä‚¢‚éê‡‚́A·•ªƒrƒ…[ƒA‚Æ‚µ‚Ä“®ì‚·‚é‚悤‚É +@‚µ‚Ü‚µ‚½BÚ×‚̓wƒ‹ƒv‚́uŠÂ‹«Ý’è|ƒc[ƒ‹v‚ð‚²——‚­‚¾‚³‚¢B + +Eƒ[ƒJƒ‹ƒtƒ@ƒCƒ‹‚ª“Ç‚ÝŽæ‚èê—p^”r‘¼§Œä’†‚Ì‚½‚߃_ƒEƒ“ƒ[ƒh‚ÉŽ¸”s‚µ‚½ +@ê‡‚à’ʐMƒGƒ‰[‚Æ‚Ý‚È‚³‚êAƒT[ƒo‚Ƃ̐ڑ±‚ªØ‚ê‚Ä‚µ‚Ü‚¤–â‘è‚ðC³‚µ‚Ü‚µ‚½B + +Eƒ_ƒEƒ“ƒ[ƒhæ‚̃tƒ@ƒCƒ‹‚ª“Ç‚ÝŽæ‚èê—p‚̏ꍇAu“Ç‚ÝŽæ‚èê—pƒtƒ@ƒCƒ‹‚Å‚·B +@“Ç‚ÝŽæ‚èê—p‘®«‚ð‰ðœ‚µ‚Ü‚·‚©Hv‚Ý‚½‚¢‚ȃ_ƒCƒAƒƒO‚ðo‚·‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.94a + +Eƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚ł̃eƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚̈µ‚¢‚ð•ÏX‚µ‚Ü‚µ‚½Bi•½“c–L‚³‚ñj + +Eƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚ł̃tƒ@ƒCƒ‹“]‘—’†‚́AFFFTP‚̃EƒCƒ“ƒhƒE‚𑀍ì‚Å‚«‚È‚¢ +@‚悤‚É‚µ‚Ü‚µ‚½Bi•½“c–L‚³‚ñj + +¡Ver 1.94 + +E•½“c–L‚³‚ñ‚ªnakka‚³‚ñ‚̃‰ƒCƒuƒ‰ƒŠ‚ðŽg‚Á‚āAOLEƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚ðŽÀ‘• +@‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½BFFFTP‚©‚çƒGƒNƒXƒvƒ[ƒ‰‚Ȃǂւ̃hƒ‰ƒbƒO•ƒhƒƒbƒv‚ª +@‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½B + +E•½“c–L‚³‚ñ‚ªAƒzƒXƒgã‚ł̃tƒ@ƒCƒ‹‚̈ړ®‚ðŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½B +@ƒzƒXƒg‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹‚ðAŽqƒtƒHƒ‹ƒ_‚Ɉړ®‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·B + +¡Ver 1.93 + +EƒT[ƒo‘¤‚̃tƒ@ƒCƒ‹–¼‚Æ‚µ‚ÄUTF-8‚ð‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|•¶ŽšƒR[ƒhj + +EƒVƒtƒg{F10ƒL[‚ŃAƒvƒŠƒP[ƒVƒ‡ƒ“ƒƒjƒ…[‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.92c + +E“]‘—‚‘¬‰»‚Ì‚½‚߂̃oƒbƒtƒ@ƒTƒCƒYŠg’£‚ªA–³Œø‚É‚È‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.92b + +Eƒwƒ‹ƒv‚ªWindows Vista‚Å•\Ž¦‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EuÝ’è‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶v‚ƁuÝ’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³v‚ªWindows Vista‚ŃGƒ‰[‚É +@‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.92a + +Eƒtƒ@ƒCƒ‹ˆê——‚ðŽæ“¾‚·‚é‚Æ‚«‚ɁALISTƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EPASVƒ‚[ƒh‚ðŽg—p‚·‚é‚Ì‚ð•W€‚É‚µ‚Ü‚µ‚½B +EFFFTP‚ðÅ‰‚É‹N“®‚µ‚½Žž‚ɁAnaanonymous FTP‚ð‚ ‚ç‚©‚¶‚ß“o˜^‚µ‚Ä‚¨‚­‚Ì‚ð +@‚â‚ß‚Ü‚µ‚½B‚Ü‚½‚±‚ê‚É”º‚¢Aƒ[ƒ‹ƒAƒhƒŒƒX‚ð•·‚­‚Ì‚ð‚â‚ß‚Ü‚µ‚½B +@ianonymous FTP‚ÍŽg—p‚µ‚È‚¢l‚ª‘½‚¢‚½‚߁Bj + +@i¡‰ñ‚̃o[ƒWƒ‡ƒ“‚̕ύX‚ÉŠÖ‚µ‚ẮAˆÈ‘O‚̃o[ƒWƒ‡ƒ“‚ō쐬‚µ‚½ƒzƒXƒg‚Ì +@@Ý’è‚́AˆÈ‘O‚̐ݒè‚Ì‚Ü‚Ü•Ï‚í‚è‚Ü‚¹‚ñBV‚µ‚­ì¬‚·‚éƒzƒXƒg‚̐ݒè‚Å +@@ã‹L‚̕ύX‚ª”½‰f‚³‚ê‚Ü‚·Bj + +¡Ver 1.92 + +EPASVƒ‚[ƒh‚ÌŽž‚ɁAƒT[ƒo‚©‚ç•Ô‚³‚ê‚镶Žš—ñ‚É‚æ‚Á‚Ă̓AƒvƒŠƒP[ƒVƒ‡ƒ“ƒGƒ‰[ +@‚É‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚̏ã‚É‚ ‚éAƒtƒHƒ‹ƒ_–¼ƒEƒCƒ“ƒhƒE‚É“ü—Í‚Å‚«‚镶Žš”‚ªA +@ƒEƒCƒ“ƒhƒE•‚ɐ§ŒÀ‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E’†‘ŒêSolaris‚̃tƒ@ƒCƒ‹ˆê——Œ`Ž®‚ɑΉž‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒAƒEƒH[ƒ‹‚̐ݒè‚Łuƒ†[ƒU–¼@ƒzƒXƒg–¼v‚̂悤‚Ȑݒè‚Ì‚Æ‚«Au@v‚ð +@•Ê‚Ì•¶Žš‚ɕύX‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Ì"-n"ƒIƒvƒVƒ‡ƒ“‚ÅINIƒtƒ@ƒCƒ‹‚ðŽw’肵‚½‚Æ‚«AINIƒtƒ@ƒCƒ‹‚ª +@–³‚©‚Á‚½‚Æ‚«‚ɃŒƒWƒXƒgƒŠ‚ɏ‘‚«ž‚ñ‚Å‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EXV•—‘ö‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.91 + +EƒzƒXƒg‚̐ݒè‚́uƒzƒXƒg‚̃^ƒCƒ€ƒ][ƒ“v‚̍€–Ú‚ªA‚¨‚©‚µ‚È•\Ž¦‚É‚È‚Á‚Ä‚¢‚½ +@‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒVƒoƒ\ƒNWLƒVƒŠ[ƒY‚̃tƒ@ƒCƒ‹ˆê——Œ`Ž®‚ɑΉž‚µ‚Ü‚µ‚½B +@iƒzƒXƒg‚̐ݒè|‚“x|ƒzƒXƒg‚ÌŽí—Þ ‚ŁuƒVƒoƒ\ƒNWLv‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢j + +¡Ver 1.90 + +E“]‘—‘¬“x‚ðŒüã‚³‚¹‚Ü‚µ‚½Bi”’…—l‚̃R[ƒh‚ð‘g‚ݍž‚Ý‚Ü‚µ‚½B‚Ç‚¤‚à‚ ‚肪‚Æ‚¤ +@‚²‚´‚¢‚Ü‚·Bj +EFireWall‚ÌŽí—ނɁuUSER FWƒ†[ƒU–¼:FWƒpƒXƒ[ƒh@ƒzƒXƒg–¼v‚ð’ljÁ‚µ‚Ü‚µ‚½B +@ƒvƒƒLƒVƒT[ƒoSidewinder‚ÌŒ`Ž®‚̂悤‚Å‚·BiˆÀ•”—l‚̃R[ƒh‚ð‘g‚ݍž‚Ý‚Ü‚µ‚½B +@‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·Bj +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj +E2ƒMƒKƒoƒCƒgˆÈã‚̃tƒ@ƒCƒ‹‚ŁAƒTƒCƒY‚Ì•\Ž¦A“]‘—ƒEƒCƒ“ƒhƒE‚Ì•\Ž¦‚ª‚¨‚©‚µ‚­ +@‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒ_ƒEƒ“ƒ[ƒh‚Ì’†Ž~‚̏ˆ—‚ðŒ©’¼‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹ƒTƒCƒY‚Ì•\Ž¦‚ð‚RŒ…‚²‚Æ‚É‹æØ‚é‚悤‚É‚µ‚Ü‚µ‚½B +Eƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ɁAƒhƒ‰ƒCƒu–¼‚ð•\Ž¦‚·‚é‚Ì‚ð‚â‚ß‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|•\Ž¦ ‚Å•\Ž¦‚·‚é‚悤‚É‚àÝ’è‚Å‚«‚Ü‚·j +EuÝ’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³vƒRƒ}ƒ“ƒh‚ŁAuMy Documentv‚ȂǁAƒtƒHƒ‹ƒ_–¼‚É +@‹ó”’‚ª‚ ‚é‚Æ‚«‚ɃGƒ‰[‚É‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@iÚ‘±|Ý’è|Ý’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³j +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚Ńtƒ@ƒCƒ‹‚ðíœ‚·‚é‚Æ‚«‚ɁAŠm”F‚·‚éÝ’è‚ð‰Šú +@ó‘Ô‚Å‚ÍON‚É‚µ‚Ü‚µ‚½BiFFFTP‚ð‚·‚Å‚ÉŽg‚Á‚Ä‚¢‚é‚Æ‚«‚̐ݒè‚͕ύX‚µ‚Ü‚¹‚ñBj + +¡Ver 1.89a‚̕ύX“_ + +EƒAƒbƒvƒ[ƒhŒã‚ɁAƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ªXV‚³‚ê‚È‚¢‚±‚Æ‚ª‚ ‚é‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B + +¡Ver 1.89 + +EƒAƒbƒvƒ[ƒh‚Ì‘¬“x‚ð‰ü‘P‚µ‚Ü‚µ‚½BiŒ´“c‚³‚܁A‰ðÍ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·j +EƒAƒbƒvƒ[ƒhŠ®—¹Žž‚ɁAƒAƒbƒvƒ[ƒh’†‚̃EƒCƒ“ƒhƒE‚ª‚È‚©‚È‚©•Â‚¶‚È‚¢ê‡‚ª +@‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½BiRaidenFTPDŽg—pŽž‚Ȃǁj +EPASVƒ‚[ƒhŽg—pŽž‚ɁAFFFTP‚ªŠú‘Ò‚µ‚È‚¢•¶Žš—ñ‚ðƒT[ƒo‚ª•Ô‚·Žž‚É—Ž‚¿‚é‚Ì‚ð +@C³‚µ‚Ü‚µ‚½Bi‘ºŽR—lA‰ðÍ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·j +Eƒ}ƒ‹ƒ`ƒXƒŒƒbƒh“®ì‚ŁAƒT[ƒo‚©‚ç‚̃ƒbƒZ[ƒWˆ—‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚±‚Æ‚ª +@‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½Bi‘ºŽR—lA‰ðÍ‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·j +Eƒtƒ@ƒCƒ‹‚É•Û‘¶‚µ‚½Ý’è‚𕜌³‚·‚郁ƒjƒ…[€–Ú‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iÚ‘±|Ý’è|Ý’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³j +EƒAƒWƒŒƒ“ƒgŽÐ‚̃ƒWƒbƒNƒAƒiƒ‰ƒCƒU‚ÉFTPÚ‘±‚µ‚½Žž‚Ƀtƒ@ƒCƒ‹ˆê——‚ª•\Ž¦‚³‚ê‚é +@‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒg‚̐ݒè|‚“x|ƒzƒXƒg‚ÌŽí—Þ‚Å Agilent ‚ð‘I‚Ô•K—v‚ª‚ ‚è‚Ü‚·Bj + +¡Ver 1.88b + +E‰pŒê”ÅFFFTP‚̉p•¶‚ðŒ©’¼‚µ‚Ü‚µ‚½BiƒWƒ€—lA‚²‹¦—Í‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·j + +¡Ver 1.88a + +EuFFFTP‚ªíœ‚Å‚«‚Ü‚¹‚ñv‚Æ‚¢‚¤ƒGƒ‰[‚ª•\Ž¦‚³‚ê‚éê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.88 + +EFFFTP‚ð‚±‚Ìƒo[ƒWƒ‡ƒ“‚©‚çŽg‚¢‚Í‚¶‚ß‚éê‡AÝ’è‚ðƒŒƒWƒXƒgƒŠ‚É•Û‘¶‚·‚é‚悤‚É +@‚µ‚Ü‚µ‚½Bƒ}ƒ‹ƒ`ƒ†[ƒUŠÂ‹«‚Å‚Ì–â‘è‚ð‰ðÁ‚·‚邽‚ß‚Å‚·B +@i‚·‚Å‚ÉFFFTP‚ð‚‚©‚Á‚Ä‚¨‚ç‚ꂽê‡‚́A•ÏX‚Í‚ ‚è‚Ü‚¹‚ñBj +EƒŒƒWƒXƒgƒŠ‚̐ݒè‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iÚ‘±|Ý’è|Ý’è‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶j +Eƒtƒ@ƒCƒ‹ˆê——‚̃I[ƒi–¼‚ð40•¶Žš‚Ü‚Å•\Ž¦‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒGƒNƒXƒvƒ[ƒ‰‚©‚烍[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚Ƀtƒ@ƒCƒ‹‚ðƒhƒ‰ƒbƒO• +@ƒhƒƒbƒv‚µ‚½Žž‚́A‚»‚̃tƒ@ƒCƒ‹‚ª‚ ‚éƒtƒHƒ‹ƒ_‚Ɉړ®‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒg‘¤‚Ƀhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚½Žž‚́A]—ˆ’Ê‚èƒAƒbƒvƒ[ƒh‚Ì“®ì‚ð +@‚µ‚Ü‚·Bj +EƒVƒtƒgƒL[{ƒ}ƒEƒXƒzƒC[ƒ‹‚ŃXƒNƒ[ƒ‹‚·‚鎞‚́Aƒy[ƒW’PˆÊ‚ŃXƒNƒ[ƒ‹‚·‚é +@‚悤‚É‚µ‚Ü‚µ‚½BiŽR–{—lA•ÏX‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·Bj +Eƒ}ƒ‹ƒ`ƒ‚ƒjƒ^ŠÂ‹«‚Ń}ƒEƒXƒzƒC[ƒ‹‚É‚æ‚éƒXƒNƒ[ƒ‹‚ªs‚í‚ê‚È‚¢ê‡‚ª‚ ‚é‚Ì‚ð +@C³‚µ‚Ü‚µ‚½BiŽR–{—lAC³‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·Bj +EƒrƒfƒIƒJ[ƒh‚É‚æ‚Á‚ẮAƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚̘g‚Ì•”•ª‚ɃSƒ~‚ª•\Ž¦‚³‚ê‚Ä +@‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.87a + +EBookmark‚ª•Û‘¶‚³‚ê‚È‚¢‚±‚Æ‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.87 + +EWindows98‚ŁAƒ_ƒCƒAƒ‹ƒAƒbƒv‚̃Gƒ“ƒgƒŠ‚ª•\Ž¦‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EÚ‘±‚ðØ‚ç‚È‚¢‚܂܃^ƒCƒ€ƒAƒEƒg‚É‚È‚èAƒzƒXƒg‚©‚çÚ‘±‚ªØ‚ç‚ꂽŽžAŽŸ‚Ì‘€ì‚Å +@Ž©“®“I‚ɐڑ±‚ðÄŠJ‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.86a + +EVer.1.86‚ŁAƒ_ƒEƒ“ƒ[ƒh‚ª“r’†‚ŏI‚í‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.86 + +EVer.1.85‚Å‚àƒtƒ@ƒCƒ‹‚Ì“]‘—‚ªƒXƒgƒbƒv‚µ‚Ä‚µ‚Ü‚¤Ž–‚ª‚ ‚é‚悤‚Ȃ̂ŁAˆ—‚ð +@Œ©’¼‚µ‚Ü‚µ‚½B +EVer.1.83‚ŒljÁ‚µ‚½AƒzƒXƒg–¼‚©‚ç"http://"‚È‚Ç‚ðŽæ‚菜‚­ˆ—‚ð‚â‚ß‚Ü‚µ‚½B +EWindows XP‚̉æ–ʃfƒUƒCƒ“iƒe[ƒ}j‚ɑΉž‚µ‚Ü‚µ‚½B@ +Eƒtƒ@ƒCƒ‹–¼‚É"&"‚ªŽg‚í‚ê‚Ä‚¢‚鎞‚ɁAƒ_ƒCƒAƒƒO‚Å‚Ì•\Ž¦‚ª‚¨‚©‚µ‚¢‚Ì‚ðC³ +@‚µ‚Ü‚µ‚½B +ERASƒ‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚µ‚È‚¢ƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚µ‚Ü‚µ‚½B +@‹N“®Žž‚ÉRASƒ‰ƒCƒuƒ‰ƒŠ‚̃Gƒ‰[‚ªo‚éê‡‚́Aƒ`ƒFƒbƒNƒ}[ƒN‚ð•t‚¯‚Ä‚­‚¾‚³‚¢B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|Ú‘±/Ø’f|RAS‚̐§Œä‚ðs‚í‚È‚¢j +EƒzƒXƒg‚ªStratus‚ÌŽž‚́AƒpƒX‚Ì‹æØ‚蕶Žš‚ð">"‚ɕύX‚µ‚Ä‚©‚çƒzƒXƒg‚É‘—‚é‚悤‚É +@‚µ‚Ü‚µ‚½B +EOS9‚̃T[ƒo‚̃TƒuƒfƒBƒŒƒNƒgƒŠ‚ɑΉž‚µ‚Ü‚µ‚½B +EŽŸ‚̂悤‚ȏ‘Ž®‚̃tƒ@ƒCƒ‹ˆê——‚ð•Ô‚·ƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B + -rwxrwxrwx SEQ 36203776 01/07/07 12:38:28 ABCDEFG +EŽŸ‚̂悤‚ȏ‘Ž®‚̃tƒ@ƒCƒ‹ˆê——‚ð•Ô‚·ƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B(IBMƒzƒXƒg) + MTS940 3390 2001/07/26 1 1 FB 80 3120 PS FTPOUT.CNTL +E‘‹‚ÌŽè‚âTweak UI‚Őݒè‚Å‚«‚é‰B‚µƒhƒ‰ƒCƒu‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.85 + +EVer.1.84‚Ńtƒ@ƒCƒ‹‚Ì“]‘—‚ª’†Ž~‚³‚ê‚Ä‚µ‚Ü‚¤Ž–‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.84 + +EVer.1.83‚Ńtƒ@ƒCƒ‹“]‘—‚ªŽn‚Ü‚ç‚È‚¢A“r’†‚ÅŽ~‚܂邱‚Æ‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EVer.1.83‚ÅCPU‚̐è—L—¦‚ª‚‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E‰Šúó‘ԂŐݒ肷‚éanonymous FTPƒTƒCƒg‚̃ŠƒXƒg‚ð•ÏX‚µ‚Ü‚µ‚½B + +¡Ver 1.83 + +Eƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚̏ã‚É‚ ‚éAŒ»Ý‚̃tƒHƒ‹ƒ_–¼‚ð•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ŁA +@ƒtƒHƒ‹ƒ_–¼‚ð“ü—Í‚µ‚Ĉړ®‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +Eˆ—“à—eƒEƒCƒ“ƒhƒE‚Ì“à—e‚ðAƒ}ƒEƒX‚Ŕ͈͎w’肵‚ăRƒs[‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +EunixŒn‚̃zƒXƒg‚ŁAƒtƒ@ƒCƒ‹ˆê——‚̃I[ƒi–¼AƒOƒ‹[ƒv–¼‚ÌŒã‚ë‚ɉ½‚©‚ª‚ ‚éê‡‚É +@‘Ήž‚µ‚Ü‚µ‚½B +@—áj-rw-r--r-- 1 owner m group m 20407 Jul 13 07:03 filename.txt +EƒzƒXƒgÝ’èƒEƒCƒ“ƒhƒE‚̃zƒXƒg–¼iƒAƒhƒŒƒXj—“‚ɁA"ftp://xxx.com/pub/" ‚悤‚È +@URL‚ð“ü—Í‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½Bi"xxx.com" ˆÈŠO‚Í–³Ž‹‚µ‚Ü‚·Bj +Eƒlƒbƒgƒ[ƒN‚ªd‚¢Žž‚ɁAƒf[ƒ^‚Ì‘—ŽóM’†‚Ƀ^ƒCƒ€ƒAƒEƒg‚Ü‚Å‚ÌŠÔ–³”½‰ž‚É‚È‚é +@Ž–‚ª‚ ‚é‚Ì‚ð‰ü—Ç‚µ‚Ü‚µ‚½B +E’ʐM’†‚ÉFFFTP‚̃EƒCƒ“ƒhƒE‚ð•Â‚¶‚½ŽžAFFFTP‚ª³‚µ‚­I—¹‚µ‚È‚È‚©‚Á‚½‚Ì‚ðC³ +@‚µ‚Ü‚µ‚½B + +¡Ver 1.82 + +EƒJƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚̎擾‚ŁAXPWDƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B +@iXPWD‚ªŽg‚¦‚È‚¢‚Æ‚«‚ÍPWD‚ðŽg‚¢‚Ü‚·Bj +Eƒ[ƒJƒ‹‘¤‚̃tƒHƒ‹ƒ_•ÏXƒEƒCƒ“ƒhƒE‚ŁAƒtƒHƒ‹ƒ_ˆê——‚ð•\Ž¦‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ -n ‚ð’ljÁ‚µ‚Ü‚µ‚½BƒIƒvƒVƒ‡ƒ“‚ÅŽw’肵‚½INIƒtƒ@ƒCƒ‹‚Ì +@Ý’è‚Å‹N“®‚µ‚Ü‚·B +@iÚ×‚Í ffftp -h ‚ðŽQÆ‚Ì‚±‚Ɓj +E“ú•t‚ðu5/14v‚̂悤‚É•Ô‚·ƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B +EOS9‚̃T[ƒo‚ɑΉž‚µ‚Ü‚µ‚½Biˆê•”‹@”\ŒÀ’聨ƒTƒuƒfƒBƒŒƒNƒgƒŠ‚ÌŒ©•ª‚¯•û‚ª•ª‚©‚è +@‚Ü‚¹‚ñB‚Ç‚È‚½‚©‚²‘¶‚¶‚È‚¢Hj + +¡Ver 1.81 + +Eƒtƒ@ƒCƒ‹ˆê——‚Ì’†‚É Ctrl-H ‚ªŠÜ‚Ü‚ê‚Ä‚¢‚éƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹“]‘—Žž‚̃Gƒ‰[•\Ž¦ƒEƒCƒ“ƒhƒE‚ɃGƒ‰[‚Ì——R‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EURL‚ðƒNƒŠƒbƒvƒ{[ƒh‚ÖƒRƒs[‚·‚éÛ‚ɁAƒ|[ƒg”ԍ†‚ª•W€‚Å‚È‚¢‚Æ‚«‚̓|[ƒg”ԍ†‚à +@•t‰Á‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒAƒbƒvƒ[ƒhŽž‚ɍ쐬‚·‚éƒtƒHƒ‹ƒ_‚Ì‘®«iƒp[ƒ~ƒbƒVƒ‡ƒ“j‚ð‚ ‚ç‚©‚¶‚ߎw’è +@‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Rj +EƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——•\Ž¦‚ŁA“ú•t‚ª–¢—ˆ‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü +@‚µ‚½B + +¡Ver 1.80 + +ECtrl-Shift-D‚Ń~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ª‚Å‚«‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E‰ƒCƒ“ƒXƒg[ƒ‹‚Ì‚Æ‚«‚́AINIƒtƒ@ƒCƒ‹‚ðŽg‚¤‚Ù‚¤‚ðƒfƒtƒHƒ‹ƒg‚É‚µ‚Ü‚µ‚½B +EƒŒƒWƒXƒgƒŠ‚ÆINIƒtƒ@ƒCƒ‹‚Ì—¼•û‚ɐݒ肪‚ ‚éê‡‚́AINIƒtƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ð—Dæ‚·‚é +@‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.79a + +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ŁAƒzƒXƒg‘¤‚ƃ[ƒJƒ‹‘¤‚Ì“ú•t‚ª“¯‚¶‚ÅŽž‚ª‚¾‚¯‚ªˆá +@‚¤ƒtƒ@ƒCƒ‹‚ªAƒAƒbƒvƒ[ƒh‚³‚ê‚È‚¢ê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.79 + +EƒŠƒ“ƒN‚É‚È‚Á‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚̃AƒCƒRƒ“‚ð•Ï‚¦‚鎖‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B + iƒzƒXƒg‚̐ݒè‚ÅNLSTƒRƒ}ƒ“ƒhƒIƒvƒVƒ‡ƒ“‚ð•ÏX‚·‚é•K—v‚ª‚ ‚è‚Ü‚·Bj +Eƒc[ƒ‹‚̐ݒè‚ŃpƒX–¼‚ÌŒã‚ë‚É /e ‚È‚Ç‚ð•t‚¯‚ÄŽw’肵‚½‚Æ‚«A‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚Å +@‚Ì•\Ž¦‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒc[ƒ‹‚ð‹N“®‚·‚éÛAŒ»Ý‚̃[ƒJƒ‹ƒtƒHƒ‹ƒ_‚ðƒJƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚Æ‚µ‚Ä‹N“®‚·‚é‚æ +@‚¤‚ɕύX‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚©‚ç‘—‚ç‚ê‚Ä‚­‚éƒtƒ@ƒCƒ‹î•ñ‚É“ú•tAŽž‚ª‚È‚¢ê‡‚́Aƒtƒ@ƒCƒ‹ˆê——‰æ–Ê +@‚Å‚Í‹ó”’‚É‚·‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚̍ہAƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹‚ÌŽž‚ª‚í‚©‚ç‚È‚¢ê‡i—Ⴆ +@‚΁AunixŒnƒzƒXƒg‚Å”¼”NˆÈãŒo‰ß‚µ‚½ê‡j‚́A“ú•t‚¾‚¯‚ð”äŠr‚·‚é‚悤‚ɕύX‚µ‚Ü +@‚µ‚½B + +¡Ver 1.78 + +Eƒ~ƒ‰[ƒŠƒ“ƒOŽž‚̃tƒ@ƒCƒ‹íœ‚Ì‘O‚ÉŠm”F‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒ~ƒ‰[ƒŠƒ“ƒOj +Eƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ł́A“]‘—^íœƒtƒ@ƒCƒ‹ˆê——‚ð•K‚¸Šm”F‚·‚é‚悤‚É +@‚µ‚Ü‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒO‚Ì“]‘—^íœƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚ŁA•¡”‚̃tƒ@ƒCƒ‹‚ð‘I‘ð‚Å‚«‚é +@‚悤‚É‚µ‚Ü‚µ‚½B +Eˆê•”ƒ_ƒCƒAƒƒO‚Ì‹Lq•ÏXB +EFireWall‚ÌŽí—Þ‚É FWƒ†[ƒU¨FWƒpƒXƒ[ƒh ‚ð’ljÁB +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj +EFireWallŽg—pŽž‚ÌSITEƒRƒ}ƒ“ƒhAOPENƒRƒ}ƒ“ƒh‚ð¬•¶Žš‚É‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj + +¡Ver 1.77 + +Eƒc[ƒ‹ƒo[‚Ƀ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚̃{ƒ^ƒ“‚ð—pˆÓ‚µ‚Ü‚µ‚½B +E–¼‘O‚ð•Ï‚¦‚ăAƒbƒvƒ[ƒh‚ðs‚È‚¤ÛAƒzƒXƒg‘¤‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚é‚©‚Ç‚¤ +@‚©‚̃`ƒFƒbƒN‚ªs‚í‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E–¼‘O‚ð•Ï‚¦‚ăAƒbƒvƒ[ƒh‚ŁAÅ‰‚ɃAƒbƒvƒ[ƒhI—¹‚̃TƒEƒ“ƒh‚ª–‚Á‚Ä‚µ‚Ü‚¤‚Ì +@‚ðC³‚µ‚Ü‚µ‚½B +EƒAƒbƒvƒ[ƒhŽž‚̃zƒXƒg‘¤‚̃tƒ@ƒCƒ‹‚̃`ƒFƒbƒN‚̏ˆ—‚ð‘啝‚ɕύX‚µ‚Ü‚µ‚½B +Eƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚ÌŠÔ‚Ì‹æØ‚è‚ðˆê”ԍ¶‘¤‚É‚µ‚½ŽžiƒzƒXƒg‘¤‚Ì‚Ý•\Ž¦jAŽŸ‚Ì +@‹N“®Žž‚ɏ­‚µˆÚ“®‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒ[ƒJƒ‹‘¤‚̉B‚µ‘®«‚̃tƒ@ƒCƒ‹‚Í•\Ž¦‚µ‚È‚¢Ý’è‚ð’ljÁ‚µ‚Ü‚µ‚½Bƒ~ƒ‰[ƒŠƒ“ƒO +@ƒAƒbƒvƒ[ƒh‚Å‚àA‰B‚µ‘®«‚̃tƒ@ƒCƒ‹‚Í–³Ž‹‚·‚é‚悤‚É‚È‚è‚Ü‚·B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|•\Ž¦j +EƒtƒHƒ“ƒg‚̐ݒè‚ðƒIƒvƒVƒ‡ƒ“‚Ɉړ®‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|•\Ž¦j +EƒAƒ‰ƒCƒhƒeƒŒƒVƒX‚ÌPC—pFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B +EStratus‚̃T[ƒo‚Å“]‘—‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.76a + +E“]‘—’†ƒEƒCƒ“ƒhƒE‚ªƒƒCƒ“‚̃EƒCƒ“ƒhƒE‚ÌŒã‚ë‚ɉB‚ê‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.76 + +EƒAƒvƒŠƒP[ƒVƒ‡ƒ“ƒL[i109ƒL[ƒ{[ƒh‚̉ECtrlƒL[‚ׂ̗̃L[j‚ŁA‰Eƒ{ƒ^ƒ“ +@ƒƒjƒ…[‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EWindows‚âOS/2‚ÌFTPƒT[ƒo‚ŁA2000”N‚ð100”N‚Æ‚µ‚Ä•Ô‚·•¨‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.75 + +EƒuƒbƒNƒ}[ƒN‚Ƀ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚ðƒyƒA‚Å“o˜^‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒuƒbƒNƒ}[ƒN|’ljÁ-—¼•ûj +Eƒ_ƒCƒAƒ‹ƒAƒbƒvƒlƒbƒgƒ[ƒN‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚È‚¢Žž‚ɁAƒGƒ‰[ƒƒbƒZ[ƒW‚ª +@‚µ‚‚±‚­o‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E“]‘—Šm”F‚̃EƒCƒ“ƒhƒE‚ªA“]‘—’†ƒEƒCƒ“ƒhƒE‚ɉB‚ê‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EunixƒzƒXƒg‚Å‚Ì”N‚̈µ‚¢‚ð­‚µ•ÏXB +EWindows95, Windows98‚э[ƒJƒ‹‘¤‚̃fƒBƒXƒN‹ó‚«—e—Ê‚Ì•\Ž¦‚ª2GˆÈã‚Ì‚Æ‚«‚É +@‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B(Windows95‚ÍOSR2ˆÈãj + +¡Ver 1.74 + +EƒzƒXƒg‚²‚ƂɃ_ƒCƒAƒ‹ƒAƒbƒv‚̐ڑ±æ‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|ƒ_ƒCƒAƒ‹ƒAƒbƒvj +Eƒtƒ@ƒCƒ‹ˆê——‚Ì”N‚Ì•\Ž¦‚ð4Œ…‚É‚µ‚Ü‚µ‚½Biˆê——‚̉¡•‚ªL‚­‚È‚Á‚Ä‚µ‚Ü‚¢‚Ü‚µ‚½j +ESOCKSÚ‘±Žž‚̃Gƒ‰[‚ð­‚µÚ‚µ‚­•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½A + +¡Ver 1.73 + +ESOCKS Ver.5‚ŃzƒXƒg‚ÌŒŸõ‚ðSOCKSƒT[ƒo‚É”C‚¹‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj +EƒAƒbƒvƒ[ƒh‚ÌŠm”FAƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”Fƒ_ƒCƒAƒƒO‚ŁA‘I‘ð‚µ‚½€–Ú‚ð‹L‰¯‚·‚é +@‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.72 + +ESOCKS Ver.5‚ɑΉž‚µ‚Ü‚µ‚½B(GSS-API”FØ‚É‚Í–¢‘Ήž‚Å‚·) +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj + +¡Ver 1.71 + +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚Łuƒtƒ@ƒCƒ‹–¼‚ð¬•¶Žš‚É‚µ‚Ä“]‘—v‚̐ݒè‚ð‚µ‚Ä‚¢‚é +@ŽžAƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹–¼‚ª‘啶Žš‚¾‚Æ–ˆ‰ñƒAƒbƒvƒ[ƒh‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü +@‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚Łuƒtƒ@ƒCƒ‹–¼‚ð¬•¶Žš‚É‚µ‚Ä“]‘—v‚ð‘I‚ԂƁAƒtƒHƒ‹ƒ_ +@–¼‚à¬•¶Žš‚É‚µ‚Ä‚µ‚Ü‚Á‚Ä‚¢‚Ü‚µ‚½B“®ì‚ð•Ï‚¦‚È‚¢‚½‚߁A‚±‚ê‚ðŽd—l‚É‚µ‚Ü‚µ‚½B +@uƒtƒHƒ‹ƒ_–¼‚ð¬•¶Žš‚É‚µ‚Ä“]‘—v‚̐ݒè‚͈Ӗ¡‚ª‚È‚¢‚̂ŁA‚È‚­‚µ‚Ü‚µ‚½B +EIRMX‚ÌFTPƒT[ƒo‚Ńtƒ@ƒCƒ‹ˆê——‚ª•\Ž¦‚Å‚«‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B +@iƒzƒXƒg‚ÌŽí—Þ‚Å IRMX ‚ð‘I‚Ô•K—v‚ª‚ ‚è‚Ü‚·Bj +EStratus‚ÌFTPƒT[ƒo‚Ńtƒ@ƒCƒ‹ˆê——‚ª•\Ž¦‚Å‚«‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B +@iƒzƒXƒg‚ÌŽí—Þ‚Å Stratus ‚ð‘I‚Ô•K—v‚ª‚ ‚è‚Ü‚·Bj +EACOS‚Ńtƒ@ƒCƒ‹–¼‚ð()‚ÅŠ‡‚ç‚È‚¢Ý’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒzƒXƒg‚ÌŽí—Þ‚Å ACOS-4 ‚ð‘I‚Ô•K—v‚ª‚ ‚è‚Ü‚·Bj + +¡Ver 1.70 + +EMS-Word‚ÅŠJ‚¢‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚Å‚«‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚ňꂏã‚̃tƒHƒ‹ƒ_‚Ɉړ®‚·‚鎞‚Ì“®ì‚ð•ÏX‚µ‚Ü‚µ‚½B +EƒvƒƒOƒ‰ƒ€I—¹Žž‚ɃXƒŒƒbƒh‚Ì‚P‚‚ªŽc‚Á‚½‚Ü‚Ü‚É‚È‚éê‡‚ª‚ ‚é‚炵‚¢‚̂ŁA +@I—¹Žž‚̏ˆ—‚ð•ÏX‚µ‚Ü‚µ‚½B +EOpenVMS‚ŃfƒBƒŒƒNƒgƒŠ‚̍폜‚ª‚Å‚«‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½BVMS‚ňȑO‚æ‚è‚à“®ì‚ª +@‚¨‚©‚µ‚­‚È‚éê‡‚Í‚²˜A—‚¢‚½‚¾‚¯‚ê‚΍K‚¢‚Å‚·B +E\‚È‚Ç‚ðŠÜ‚Þƒtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚鎞‚́Aƒtƒ@ƒCƒ‹–¼‚ð•ÏX‚·‚éƒ_ƒCƒAƒƒO‚ð +@•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.69 + +EƒAƒbƒvƒ[ƒh‚̃ŠƒWƒ…[ƒ€‚ɑΉž‚µ‚Ü‚µ‚½B +EƒŠƒWƒ…[ƒ€ƒRƒ}ƒ“ƒh‚ªŽó‚¯•t‚¯‚ç‚ê‚È‚¢‚Æ‚«‚ɁAƒGƒ‰[ƒ_ƒCƒAƒƒO‚ðo‚·‚悤‚É +@‚µ‚Ü‚µ‚½B +EFireWall‚ðŽg‚¤‚Æ‚«AÚ‘±æ‚̃|[ƒg‚ª•W€(21)‚Å‚È‚¢‚Æ‚«‚ɂ̓|[ƒg”ԍ†‚ð•t‰Á‚µ +@‚Đڑ±‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +@i—áFUSER user@host 1234j +EFireWall‚ɃƒOƒCƒ“‚·‚鎞‚Ƀƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ðŽg‚¦‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹–¼‚͑啶ŽšA¬•¶Žš‚ð‹æ•Ê‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +@ia.txt ‚Æ A.TXT ‚Í‚»‚ꂼ‚ê•Ê‚̃tƒ@ƒCƒ‹‚Æ‚µ‚Ĉµ‚¢‚Ü‚·Bj +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ --saveoff --saveon ‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iÚ×‚Í ffftp -h ‚ðŽQÆ‚Ì‚±‚Ɓj +EƒIƒvƒVƒ‡ƒ“‚́u“]‘—‚Rvƒ^ƒu‚Ì‚Æ‚±‚ë‚ŁA‘®«•ÏXƒEƒCƒ“ƒhƒE‚Ì’l‚ª³‚µ‚­Žæ‚è +@ž‚Ü‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚ðì¬‚·‚éƒtƒHƒ‹ƒ_‚ª–³‚¢Žž‚ɁAƒGƒ‰[‚ð•\Ž¦‚·‚é‚悤‚É +@‚µ‚Ü‚µ‚½B + +¡Ver 1.68a + +EƒzƒXƒgˆê——ƒEƒCƒ“ƒhƒE‚ŃJ[ƒ\ƒ‹‚ª‰B‚ê‚Ä‚µ‚Ü‚¢AƒXƒNƒ[ƒ‹‚µ‚È‚¢‚Æ•\Ž¦‚³‚ê‚È‚­ +@‚È‚éê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EPWDƒRƒ}ƒ“ƒh‚Å”ñí‚É’·‚¢ƒpƒX–¼‚ª•Ô‚³‚ꂽ‚Æ‚«AˆÙíI—¹‚·‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.68 + +EƒzƒXƒg‚̐ݒè‚ðƒOƒ‹[ƒv•Ê‚ÉŠÇ—‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +EunixŒnƒzƒXƒg‚Ńtƒ@ƒCƒ‹‚̃TƒCƒY‚ª0ƒoƒCƒg‚É‚È‚éê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EVAX VMS‚̃zƒXƒg‚ŃTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚Þƒtƒ@ƒCƒ‹‚̃Aƒbƒvƒ[ƒh‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Ì‚ð +@C³‚Å‚«‚½‚©‚à‚µ‚ê‚È‚¢B + +¡Ver 1.67a + +EWindowsƒtƒHƒ‹ƒ_‚ÌPROTOCOLƒtƒ@ƒCƒ‹‚ª‚È‚­‚Ä‚àƒGƒ‰[‚É‚È‚ç‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.67 + +E‰üsƒR[ƒh‚ªLF‚̂݁A‚Ü‚½‚ÍCR‚݂̂̃eƒLƒXƒg‚ðAƒAƒXƒL[ƒ‚[ƒh‚Ő³‚µ‚­‘—M +@‚Å‚«‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒtƒBƒ‹ƒ^‹@”\‚ð’ljÁ‚µ‚Ü‚µ‚½B +@i•\Ž¦|ƒtƒBƒ‹ƒ^j +E‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚Ɂu‘S‚Ä‚ðƒ_ƒEƒ“ƒ[ƒhvu‘S‚Ä‚ðƒAƒbƒvƒ[ƒhv‚ð’ljÁ‚µ‚Ü +@‚µ‚½B +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Å -q ƒIƒvƒVƒ‡ƒ“‚ð•t‚¯‚ă~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðs‚¤‚ƁA +@FFFTP‚ª³‚µ‚­I—¹‚Å‚«‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.66 + +E“ŒŽÅ‚ÌOS7‚ðŽg‚Á‚½ƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹‚Ì‘®«•ÏX‚ŁA‚SŒ…‚܂Ő”’l‚ð“ü—Í‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +Eƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ÅSeed‚ÌŒã‚ë‚É‹L†‚È‚Ç‚ª•t‚¢‚Ä‚¢‚éê‡‚ɁA‹L†‚Í–³Ž‹‚·‚é +@‚悤‚ɕύX‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚©‚çØ’f‚·‚鎞AQUITƒRƒ}ƒ“ƒh‚𑗂邱‚Æ‚ð‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|Ú‘±/Ø’fj +EƒvƒƒOƒ‰ƒ€I—¹Žž‚ɃXƒŒƒbƒh‚Ì‚P‚‚ªŽc‚Á‚½‚Ü‚Ü‚É‚È‚éê‡‚ª‚ ‚é‚炵‚¢‚̂ŁA +@I—¹Žž‚̏ˆ—‚ð•ÏX‚µ‚Ü‚µ‚½BiŒ»Û‚ª‰ðÁ‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚Í–¢Šm”F‚Å‚·j + +¡Ver 1.65 + +EŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚̃tƒ@ƒCƒ‹‚Ì‘®«•ÏX‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Ń~ƒ‰[ƒŠƒ“ƒO‚ÌŽw’è‚ð‚µ‚½‚Æ‚«AƒzƒXƒg‚ւ̐ڑ±‚ÉŽ¸”s‚µ‚Ä‚à +@ƒ~ƒ‰[ƒŠƒ“ƒO‚𑱍s‚µ‚悤‚Æ‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EŽž‚ð a:mAp:m ‚Æ‚¢‚¤‚Ó‚¤‚É•Ô‚·ƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.64 + +Eƒtƒ@ƒCƒ‹“]‘—’†ƒEƒCƒ“ƒhƒE‚ɁuŽŸˆÈ~’†Ž~vƒ{ƒ^ƒ“‚ð’ljÁ‚µ‚Ü‚µ‚½B•¡”‚̃tƒ@ƒCƒ‹ +@‚ð“]‘—‚·‚éÛ‚ɁA¡“]‘—’†‚̃tƒ@ƒCƒ‹‚ÌŽŸ‚̃tƒ@ƒCƒ‹ˆÈ~‚Ì“]‘—‚𒆎~‚µ‚Ü‚·B +@i¡“]‘—‚µ‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚͍Ōã‚Ü‚Å“]‘—‚µ‚Ü‚·j +EƒzƒXƒg‚©‚çØ’f‚·‚鎞AQUITƒRƒ}ƒ“ƒh‚ð‘—‚ç‚È‚¢‚悤‚É‚µ‚Ä‚Ý‚Ü‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ŁAƒzƒXƒg‚ÌŽí—Þ‚É‚æ‚Á‚Ă͏Á‚·‚ׂ«‚Å‚Í‚È‚¢ƒzƒXƒg‘¤‚Ì +@ƒtƒHƒ‹ƒ_‚ðÁ‚»‚¤‚Æ‚·‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ɁAƒtƒ@ƒCƒ‹‚̏Š—LŽÒ‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.63 + +EƒzƒXƒgˆê——‚ɐݒ肳‚ê‚Ä‚¢‚È‚¢ƒzƒXƒg‚ÍPASVƒ‚[ƒh‚ðŽg‚¤Ý’è‚É‚µ‚Ä‚àAƒRƒ}ƒ“ƒh +@ƒ‰ƒCƒ“‚ŃzƒXƒg‚ðŽw’肵‚½Žž‚͐ݒ肪—LŒø‚É‚È‚ç‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̉ðÍ‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢Ž–‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.62 + +Eƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ðŽg—p‚µ‚Ä‚¢‚éƒzƒXƒg‚ŁAƒpƒXƒ[ƒh“ü—Í‘O‚̃zƒXƒg‚Ì +@ƒŠƒvƒ‰ƒC‚ª•¡”s‚Ì‚Æ‚«AƒpƒXƒ[ƒh‚̍쐬‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒzƒXƒgˆê——‚ɐݒ肳‚ê‚Ä‚¢‚È‚¢ƒzƒXƒg‚Å‚ÍPASVƒ‚[ƒh‚ðŽg‚¤Ý’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|FireWallj +EƒNƒCƒbƒNÚ‘±‚̃_ƒCƒAƒƒO‚ÅPASVƒ‚[ƒh‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.61 + +Eƒtƒ@ƒCƒ‹ˆê——ƒLƒƒƒbƒVƒ…‚ðŽg‚í‚È‚¢Ý’è‚É‚µ‚½ŽžAƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚ªŽc‚Á‚Ä +@‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒ[ƒJƒ‹ƒtƒ@ƒCƒ‹‚ɑ΂µ‚Ä‘®«•ÏX‚ðs‚Á‚½Žž‚́Aƒtƒ@ƒCƒ‹‚̃vƒƒpƒeƒBƒEƒCƒ“ƒhƒE +@‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½Bi•¡”ƒtƒ@ƒCƒ‹‚ðˆêŠ‡‚µ‚čs‚¤‚±‚Æ‚Í‚Å‚«‚Ü‚¹‚ñj +EƒzƒXƒg‚֐ڑ±Žž‚É”CˆÓ‚̃Rƒ}ƒ“ƒh‚𑗂邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j +EƒuƒbƒNƒ}[ƒN‚Ƀ[ƒJƒ‹‘¤‚̃pƒX‚à“o˜^‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒuƒbƒNƒ}[ƒNj + +¡Ver 1.60 + +EWindows95‚э[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹‚ðíœ‚·‚é‚ƁA•s³‚ȏˆ—‚Æ‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B +EF2ƒL[‚Ńtƒ@ƒCƒ‹–¼•ÏXAAlt+ReturnƒL[‚Å‘®«•ÏX‚ðs‚¤‚悤‚É‚µ‚Ü‚µ‚½B +EVMS‚̃zƒXƒg‚ŃtƒHƒ‹ƒ_‚ðˆÚ“®‚·‚鎞AƒzƒXƒg‚É‘—‚éƒtƒHƒ‹ƒ_–¼‚̏‘Ž®‚ð•ÏX +@‚µ‚Ü‚µ‚½Bi"CWD PUB" ¨ "CWD [.PUB]"j + +¡Ver 1.59a + +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ -m ‚ªƒGƒ‰[‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.59 + +Eƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹‚̍폜‚̓Sƒ~” ‚ðŽg‚¤‚悤‚É‚µ‚Ü‚µ‚½B +EMELCOM80iRX7000ƒVƒŠ[ƒYj‚ÌFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ -d iƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒhj‚ð’ljÁ‚µ‚Ü‚µ‚½B +EãˆÊƒtƒHƒ‹ƒ_‚Ɉړ®‚·‚鎞 CDUP ƒRƒ}ƒ“ƒh‚ðŽg‚¤‚悤‚É‚µ‚Ü‚µ‚½Bi¡‚Ü‚Å‚Í CWD .. +@‚ðŽg—p‚µ‚Ä‚¢‚Ü‚µ‚½j +EÝ’è‚ðINIƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚éÝ’è‚̐ؑւ¦‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‚»‚Ì‘¼j + +¡Ver 1.58 + +EVAX VMS‚ÌFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|‚“xj +Eƒtƒ@ƒCƒ‹–¼‚̃Zƒ~ƒRƒƒ“ˆÈ~‚ðŽæ‚菜‚¢‚½–¼‘O‚Ń_ƒEƒ“ƒ[ƒh‚Å‚«‚é‚悤‚É +@‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Pj +EƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹‚ÌURL‚ðƒNƒŠƒbƒvƒ{[ƒh‚ÖƒRƒs[‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@i‰Eƒ{ƒ^ƒ“ƒƒjƒ…[j +Eƒ_ƒEƒ“ƒ[ƒh‚Ì“r’†‚ŃGƒ‰[‚É‚È‚Á‚½ŒãAƒAƒvƒŠƒP[ƒVƒ‡ƒ“ƒGƒ‰[‚ª‹N‚±‚鎖‚ª +@‚ ‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.57 + +EÚ‘±‚µ‚½ƒzƒXƒg‚̃qƒXƒgƒŠiÚ‘±ƒƒjƒ…[‚É•\Ž¦‚³‚ê‚é‚à‚́j‚ŁAƒzƒXƒg‘¤‚Ì +@ƒtƒHƒ‹ƒ_–¼‚à•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EVAX VMS‚ÌFTPƒT[ƒo‚ɑΉž’†i“®ìŠm”F‚ª‚Å‚«‚Ä‚¢‚Ü‚¹‚ñjB‚Ç‚È‚½‚©VAX‚ɐڑ± +@‚Å‚«‚é‚©ŽŽ‚µ‚Ä‚¢‚½‚¾‚¯‚é‚Ə•‚©‚è‚Ü‚·BuƒzƒXƒg‚̐ݒèv‚́u‚“xvƒ^ƒu‚É‚ ‚é +@uƒzƒXƒg‚ÌŽí—ށv‚ÅVAX‚ð‘I‚Ô•K—v‚ª‚ ‚è‚Ü‚·B + +¡Ver 1.56 + +Eƒrƒ…[ƒ‚Ì‹N“®•û–@‚ð•ÏX‚µ‚Ü‚µ‚½B +EÚ‘±‚µ‚½ƒzƒXƒg‚̃qƒXƒgƒŠ‚ɃpƒXƒ[ƒh‚ð•Û‘¶‚µ‚È‚¢Ý’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|Ú‘±/Ø’fj +EƒNƒCƒbƒNÚ‘±ƒEƒCƒ“ƒhƒE‚̃†[ƒU–¼‚ɁA"anonymous"‚ðƒZƒbƒg‚µ‚È‚¢Ý’è‚ð’ljÁ +@‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|Ú‘±/Ø’fj + +¡Ver 1.55 + +EÚ‘±‚µ‚½ƒzƒXƒg‚̃qƒXƒgƒŠiÚ‘±ƒƒjƒ…[‚É•\Ž¦‚³‚ê‚é‚à‚́j‚ц[ƒU–¼A +@ƒpƒXƒ[ƒh“™‚à‹L‰¯‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +@anonymousˆÈŠO‚Å‚àƒqƒXƒgƒŠ‚ªŽg‚¦‚é‚悤‚É‚È‚è‚Ü‚µ‚½B +@išš •ÏX‚É”º‚¢A¡‚܂ł̐ڑ±ƒqƒXƒgƒŠƒf[ƒ^‚͏Á‚¦‚Ü‚·B•K—v‚È‚à‚̂̓ƒ‚ +@‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B ššj +EƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN“™‚̃tƒ@ƒCƒ‹‚ðŠÔˆá‚¦‚ăfƒBƒŒƒNƒgƒŠ‚Æ”»’f‚µ‚½ê‡‚Ì‚½‚߂ɁA +@‚»‚ê‚ðƒtƒ@ƒCƒ‹‚Æ‚Ý‚È‚µ‚ă_ƒEƒ“ƒ[ƒh‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒh|ƒtƒ@ƒCƒ‹‚Æ‚µ‚ă_ƒEƒ“ƒ[ƒhj +EƒƒCƒ‹ƒhƒJ[ƒh‚ÌŽd—l‚ðWindows‚ÌŽd—l‚ɋ߂¯‚Ü‚µ‚½B +@u*.v‚ÆŽw’è‚·‚鎖‚ŁAŠg’£Žq‚Ì–³‚¢ƒtƒ@ƒCƒ‹‚ÌŽw’è‚à‚Å‚«‚é‚悤‚É‚È‚è‚Ü‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ŁA“]‘—’†ƒEƒCƒ“ƒhƒE‚ÌŽc‚莞ŠÔ•\Ž¦‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B +E“]‘—I—¹ŽžŠÔ‚ÌŒvŽZ‚ª‚Å‚«‚È‚¢ó‘Ô‚ÌŽžA“]‘—’†ƒEƒCƒ“ƒhƒE‚ÌŽc‚莞ŠÔ•\Ž¦‚ª +@‚¨‚©‚µ‚­‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹–¼‚ª CON.*APRN.*AAUX.*‚̃tƒ@ƒCƒ‹‚̓Gƒ‰[‚É‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.54a + +EHP-UX“™‚̃zƒXƒg‚Ńtƒ@ƒCƒ‹–¼‚ª•\Ž¦‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.54 + +EŽž‚ð“ú–{Œê¬‚¶‚è‚Å•Ô‚·unix‚̃zƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B‚Ü‚½A“ú•t‚ð“ú–{Œê¬‚¶‚è +@‚Å•Ô‚·ƒzƒXƒg‚ŁAˆê•”‚̃tƒ@ƒCƒ‹‚ª•\Ž¦‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒzƒXƒg‘¤‚ÌŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚ªEUC,JIS‚ÌŽžA”¼ŠpƒJƒ^ƒJƒi‚̃tƒ@ƒCƒ‹–¼‚ð‘SŠp‚É +@•ÏŠ·‚µ‚È‚¢‚悤‚É‚ào—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|•¶ŽšƒR[ƒhj +E“]‘—’†ƒ_ƒCƒAƒƒO‚ÌCPS•\Ž¦‚ð‚¿‚å‚Á‚ƕύX‚µ‚Ü‚µ‚½B + +¡Ver 1.53 + +Eƒrƒ…[ƒ‚Ńtƒ@ƒCƒ‹‚ðŠJ‚­ŽžAƒtƒ@ƒCƒ‹–¼‚ɃXƒy[ƒX‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚¾‚¯ƒ_ƒuƒ‹ +@ƒNƒI[ƒg‚ÅŠ‡‚é‚悤‚É‚µ‚Ü‚µ‚½B +Eƒ^ƒCƒ€ƒAƒEƒg‚ðŒv‘ª‚µ‚È‚¢‚悤‚ɏo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½Biƒ^ƒCƒ€ƒAƒEƒgŽžŠÔ‚ð0‚É +@‚·‚é‚ƃ^ƒCƒ€ƒAƒEƒg‚µ‚È‚¢‚悤‚É‚È‚è‚Ü‚·Bj +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Qj +Eƒtƒ@ƒCƒ‹ˆê——‚ð“ú•t‡AƒTƒCƒY‡‚ȂǂŃ\[ƒg‚·‚鎞A“¯‚¶“ú•tA‚Ü‚½‚̓TƒCƒY‚Ì +@ƒtƒ@ƒCƒ‹‚Í–¼‘O‡‚Ń\[ƒg‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EFFFTP‚𕡐”‹N“®‚µ‚½Žž‚ɃzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚ðA*‚¨‚¨‚Þ‚Ë* +@C³‚µ‚Ü‚µ‚½Bi”ñŠ®àøƒo[ƒWƒ‡ƒ“j + +¡Ver 1.52 + +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ŁAƒzƒXƒg‘¤‚Ì•s—v‚ȃtƒHƒ‹ƒ_‚̍폜‚ªŽ¸”s‚·‚é‚Ì‚ðC³ +@‚µ‚Ü‚µ‚½B +EOS/2‚ÌFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ -k -u -i ‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iÚ×‚Í ffftp -h ‚ðŽQÆ‚Ì‚±‚Ɓj +Eƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒh|ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒhj + +¡Ver 1.51 + +EuLISTƒRƒ}ƒ“ƒh‚Ńtƒ@ƒCƒ‹ˆê——‚ðŽæ“¾v‚ðŽg‚¤Žž‚Å‚àAƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚ñ‚¾ +@ƒtƒ@ƒCƒ‹‚Ì“]‘—Aƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚È‚Ç‚ªo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚É‚æ‚Á‚āAƒTƒuƒtƒHƒ‹ƒ_‚Ì“à—e‚ðŠÜ‚ß‚½ƒ_ƒEƒ“ƒ[ƒh‚âƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒv +@ƒ[ƒh‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚̂ɑΉž‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|‚“xj +E•xŽm’ÊGP6000ƒ‚ƒfƒ‹900‚ÌFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.50 + +E”N‚ð4Œ…‚Å•Ô‚·ƒ^ƒCƒv‚ÌNT—pFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðŠJŽn‚·‚鎞Aˆ—‘O‚ɂǂ̂悤‚ȃtƒ@ƒCƒ‹‚𕡎ʁ^íœ +@‚·‚é‚Ì‚©‚ð•\Ž¦‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒh|ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh|ƒ~ƒ‰[ƒŠƒ“ƒOŠm”FƒEƒCƒ“ƒhƒEj +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“ -e -j -a -b -x ‚ð’ljÁ‚µ‚Ü‚µ‚½B‚Ü‚½Aƒtƒ@ƒCƒ‹‚Ì +@ƒ_ƒEƒ“ƒ[ƒh‚Å‚à -q ƒIƒvƒVƒ‡ƒ“‚ðŽg‚¦‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iÚ×‚Í ffftp -h ‚ðŽQÆ‚Ì‚±‚Ɓj +E‹ó‚̃pƒXƒ[ƒh‚𑗂邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½BiƒpƒXƒ[ƒh‚Ì—v‹‚ɃŠƒ^[ƒ“ +@ƒL[‚¾‚¯‚Å“š‚¦‚é‚悤‚ȃCƒ[ƒW‚Å‚·j@ƒpƒXƒ[ƒh—“‚ɃXƒy[ƒX‚P•¶Žš‚ð‘‚¢‚Ä +@‚­‚¾‚³‚¢B +Eƒrƒ…[ƒ‚Ńtƒ@ƒCƒ‹‚ðŠJ‚­ŽžAƒtƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒI[ƒg‚ÅŠ‡‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.49 + +Eƒtƒ@ƒCƒ‹ˆê——‚̃LƒƒƒbƒVƒ…‚âAì‹Æƒtƒ@ƒCƒ‹‚ðì¬‚·‚éƒtƒHƒ‹ƒ_‚ðŽw’è‚Å‚«‚é‚悤‚É +@‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‚»‚Ì‘¼j +Eƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ɑΉž‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒgÝ’è|Šg’£j +EWindows 3.1‚ÌChameleon FTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.48 + +EƒzƒXƒg–ˆ‚Ƀ\[ƒg•û–@‚ð•Û‘¶‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@i•\Ž¦|ƒ\[ƒgj +Eƒ}ƒEƒX‚̉Eƒ{ƒ^ƒ“ƒƒjƒ…[‚Ɂuƒtƒ@ƒCƒ‹—e—ÊŒvŽZv‚ð’ljÁ‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚̃^ƒu‚ðƒNƒŠƒbƒN‚µ‚ă\[ƒg•û–@‚ð•ÏX‚µ‚½ŽžAƒtƒHƒ‹ƒ_–¼ +@‚̃\[ƒg‚ª•ÏX‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒAƒbƒvƒ[ƒh‚µ‚悤‚Æ‚µ‚½ƒtƒ@ƒCƒ‹‚ª“ǂݏo‚µ‹ÖŽ~‚ÌŽžAƒTƒCƒY‚ª0ƒoƒCƒg‚Ì +@ƒtƒ@ƒCƒ‹‚ðƒzƒXƒg‘¤‚ɍì‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E–¼‘O‚̑啶Žš^¬•¶Žš‚ªˆá‚¤‚¾‚¯‚Ì‚Q‚‚̃tƒHƒ‹ƒ_‚ªƒzƒXƒg‚É‚ ‚鎞A“¯‚¶ +@ƒLƒƒƒbƒVƒ…ƒf[ƒ^‚ðŽg—p‚µ‚Ä‚¢‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚Łuíœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹v‚ðÝ’肵‚Ä‚¢‚鎞A•s³‚ȏˆ— +@‚Æ‚È‚éê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒIƒvƒVƒ‡ƒ“ƒEƒCƒ“ƒhƒE‚Ńwƒ‹ƒv‚ð•\Ž¦‚µ‚½ŽžAŠÔˆá‚Á‚½ƒy[ƒW‚ð•\Ž¦‚·‚éê‡‚ª +@‚ ‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.47 + +E•xŽm’ÊM1800‚ÌFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹ˆê——‚̎擾’†A‚Ü‚½‚̓tƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒNi‚à‚µ‚­‚́uŠJ‚­vj +@‚µ‚½Žž‚̃_ƒEƒ“ƒ[ƒh’†A“r’†Œo‰ß‚ðƒXƒe[ƒ^ƒXƒo[‚É•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +@‚Ü‚½A‚±‚ê‚ç‚̏ˆ—‚𒆎~o—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒc[ƒ‹ƒo[‚ÌŽóM’†Ž~ƒ{ƒ^ƒ“j +EƒEƒCƒ“ƒhƒE‚ðÅ‘剻‚µ‚½ŽžAƒTƒCƒY‚ª•Û‘¶‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B‚Ü‚½AÅ¬‰» +@‚µ‚Ä‹N“®‚µ‚½ŽžAƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ƒŠƒXƒg‚ªƒEƒCƒ“ƒhƒE‚¢‚Á‚Ï‚¢‚ɍL‚ª‚Á‚Ä‚µ‚Ü‚¤ +@‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.46a + +ESOCKS‚ðŽg‚¤ŽžAPASVƒ‚[ƒh‚Å‚È‚¢ê‡‚ɁAƒf[ƒ^“]‘—‚ª³‚µ‚­s‚í‚ê‚È‚¢‚Ì‚ðC³ +@‚µ‚Ü‚µ‚½B + +¡Ver 1.46 + +EƒzƒXƒgˆê——ƒEƒCƒ“ƒhƒE‚ƁAƒuƒbƒNƒ}[ƒN•ÒWƒEƒCƒ“ƒhƒE‚̃TƒCƒY‚ð•ÏX‚Å‚«‚é‚悤‚É +@‚µ‚Ü‚µ‚½B +EƒNƒCƒbƒNÚ‘±‚̃_ƒCƒAƒƒO‚ÅFireWall‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +EƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Ì‘®«‚̐ݒ肪AƒAƒbƒvƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚ɐ³‚µ‚­”½‰f +@‚³‚ê‚È‚¢Ž–‚ª‚ ‚éi‘½•ª‚¾‚߂ȏꍇ‚ª‘½‚¢j‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.45 + +ESOCKS(Ver.4)‚ɑΉž‚µ‚Ü‚µ‚½BiVer.5‚É‚Í–¢‘ΉžBj +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚µ‚Ü‚µ‚½Bi-qA--quitj +EƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Ì‘®«iƒp[ƒ~ƒbƒVƒ‡ƒ“j‚ðA‚ ‚ç‚©‚¶‚ߐݒè‚Å‚«‚é +@‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Rj +EAS/400‚ÌFTPƒT[ƒo‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.44 + +E’ʐM‚̃^ƒCƒ€ƒAƒEƒg‚̏ˆ—AƒGƒ‰[ˆ—‚ðŒ©’¼‚µ‚Ü‚µ‚½B +EƒƒbƒZ[ƒW‚̈ꕔ‚ð“ú–{Œê‚É‚µ‚Ü‚µ‚½B +EWin95/98‚ŁAƒ^ƒXƒNƒEƒCƒ“ƒhƒE‚Ì•\Ž¦‚ªŽ~‚Ü‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E‰‰ñ‹N“®Žž‚É“o˜^‚·‚éƒTƒ“ƒvƒ‹‚̃zƒXƒg‚U‚‚̐ݒ肪A‚¨‚©‚µ‚­‚È‚Á‚Ä‚µ‚Ü‚Á‚Ä‚¢‚½ +@‚Ì‚ðC³‚µ‚Ü‚µ‚½BiƒvƒƒOƒ‰ƒ€‚ð•ÏX‚µ‚½ŽžA‚ ‚킹‚ăf[ƒ^‚ð•ÏX‚µ‚Ä +@‚¢‚È‚©‚Á‚½‚½‚߁B‚¨‚©‚µ‚­‚È‚é‚̂̓Tƒ“ƒvƒ‹ƒzƒXƒg‚¾‚¯‚Å‚·BjˆÈ‘O‚̃o[ƒWƒ‡ƒ“‚ð +@Žg‚Á‚Ä‚¢‚āAƒTƒ“ƒvƒ‹ƒzƒXƒg‚̐ݒ肪‚¨‚©‚µ‚­‚È‚Á‚Ä‚¢‚鎞‚́A +@(1)ƒzƒXƒg‚̐ݒè|Šg’£|ƒ|[ƒg”ԍ† +@(2)ƒzƒXƒg‚̐ݒè|‚“x|NLSTƒtƒ@ƒCƒ‹–¼/ƒIƒvƒVƒ‡ƒ“ +@‚Ì‚Q‚‚ðAu•W€vƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚ďC³‚µ‚Ä‚­‚¾‚³‚¢B + +¡Ver 1.43 + +E“ú•t‚ðŠ¿Žš¬‚¶‚è‚Å•Ô‚·UNIXŒnƒzƒXƒg‚ŁAƒtƒ@ƒCƒ‹–¼‚̈ꕔ‚ª•\Ž¦‚³‚ê‚È‚¢ê‡‚ª +@‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.42 + +EMAC‚ÌFTPƒT[ƒo[‚ňꕔ‚̃tƒHƒ‹ƒ_‚ª•\Ž¦‚³‚ê‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒNƒCƒbƒNÚ‘±‚Ì‚Æ‚«AƒzƒXƒg–¼Aƒ†[ƒU–¼AƒpƒXƒ[ƒh‚ð‚P‚‚̃EƒCƒ“ƒhƒE‚Å“ü—Í +@‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +EÚ‘±‚µ‚½ƒzƒXƒg‚̃qƒXƒgƒŠ‚ðAƒtƒ@ƒCƒ‹ƒƒjƒ…[‚ƃNƒCƒbƒNÚ‘±ƒEƒCƒ“ƒhƒE‚É•\Ž¦ +@‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|Ú‘±/Ø’fj + +¡Ver 1.41 + +EPWDƒRƒ}ƒ“ƒh‚ªŽg‚¦‚È‚¢ƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B +@iÝ’è‚È‚µBŽ©“®”FŽ¯j +@PWDƒRƒ}ƒ“ƒh‚ªŽg‚¦‚È‚¢ƒzƒXƒg‚̏ꍇAˆÈ‰º‚̐§ŒÀŽ–€‚ª‚ ‚è‚Ü‚·B + (1)ƒfƒBƒŒƒNƒgƒŠ‚ªƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚È‚Ç‚ÌŽžA³‚µ‚¢ƒfƒBƒŒƒNƒgƒŠ–¼‚ð•\Ž¦‚Å‚« +@@@‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·Bj + (2)ƒzƒXƒg‚̐ݒè‚ŁuƒzƒXƒg‚̏‰ŠúƒtƒHƒ‹ƒ_v‚ð•K‚¸Žw’肵‚Ä‚­‚¾‚³‚¢B +Eƒtƒ‹ƒpƒX‚Ńtƒ@ƒCƒ‹‚ɃAƒNƒZƒX‚Å‚«‚È‚¢ê‡‚Ì‚½‚߂ɁAƒtƒ‹ƒpƒX‚ðŽg—p‚µ‚È‚¢•û–@‚ð +@‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +@ƒ`ƒFƒ“ƒWƒfƒBƒŒƒNƒgƒŠ‚µ‚È‚ª‚çƒtƒ@ƒCƒ‹‚ðƒAƒNƒZƒX‚·‚é‚̂ŁA‘¬“x‚ªŽáŠ±’x‚­‚È‚è‚Ü +@‚·B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|‚“xj +Eƒ[ƒJƒ‹‘¤‚̃qƒXƒgƒŠiƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̏ã‚É‚ ‚éƒRƒ“ƒ{ƒ{ƒbƒNƒXj‚ɁA‚ ‚ç‚©‚¶‚ß +@ƒhƒ‰ƒCƒu–¼‚ðƒZƒbƒg‚µ‚Ä‚¨‚­‚悤‚É‚µ‚Ü‚µ‚½B +EƒEƒCƒ“ƒhƒE‚̃TƒCƒY‚ð•ÏX‚µ‚½ŽžAƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE‚Ì•\Ž¦‚ª—‚ê‚é‚Ì‚ðC³‚µ +@‚Ü‚µ‚½B +EFFFTP‚ðI—¹‚·‚鎞Aƒwƒ‹ƒv‚ªŠJ‚©‚ê‚Ä‚¢‚½‚ç•Â‚¶‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚̐ݒèƒEƒCƒ“ƒhƒE‚̍\¬‚ð•ÏX‚µ‚Ü‚µ‚½B +EÚ×•\Ž¦‚ŁA’·‚¢ƒtƒ@ƒCƒ‹–¼‚ÌTipƒwƒ‹ƒv•\Ž¦‚ª•K—vˆÈã‚ɏo‚Ä‚¢‚½‚̂ŁA’²®‚µ‚Ü +@‚µ‚½B +Eƒ_ƒEƒ“ƒ[ƒh’†‚ɃzƒXƒg‘¤‚©‚ç‰ñü‚ðØ‚ç‚ꂽŽžA•s•K—v‚ɍĐڑ±‚µ‚ă_ƒEƒ“ƒ[ƒh +@‚ðÄŠJ‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.40a + +ESolaris‚âHP-UX‚̈ꕔ‚̃zƒXƒg‚Ńtƒ@ƒCƒ‹–¼‚ª•\Ž¦‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.40 + +EMAC‚ÌFTPƒT[ƒo[‚ɑΉž‚µ‚Ü‚µ‚½BiƒtƒHƒ‹ƒ_–¼‚ª•\Ž¦‚³‚ê‚È‚©‚Á‚½j +EDOSŒ`Ž®‚̃tƒ@ƒCƒ‹ˆê——‚ð•Ô‚·FTPƒT[ƒo[‚ɑΉž‚µ‚Ü‚µ‚½B +EƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚̏‰Šúó‘Ô‚ðÝ’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j + +¡Ver 1.39 + +EƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ªEUC‚ÌŽžAuƒƒ‚v“™‚̃tƒ@ƒCƒ‹–¼‚ª³‚µ‚­ˆµ‚¦‚È‚©‚Á‚½‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B + +¡Ver 1.38 + +Eƒ_ƒEƒ“ƒ[ƒh‚̃ŒƒWƒ…[ƒ€‚ðs‚¤ŽžA“]‘—ƒŒ[ƒg‚Ì•\Ž¦‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü +@‚µ‚½B +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚́uíœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹v‚̐ݒè‚ðAƒtƒHƒ‹ƒ_‚É‚à“K—p‚µ +@‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒ~ƒ‰[ƒŠƒ“ƒOj +EƒtƒHƒ‹ƒ_‚ð“ú•t‡‚Ƀ\[ƒg‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@i•\Ž¦|ƒ\[ƒgj +EFireWall‚ðŽg‚Á‚Ä‚¢‚鎞AÚ‘±Ž¸”s‚ÌŽžA‚ ‚é‚¢‚͉ñüØ’f‚Ì‚Æ‚«‚Ƀnƒ“ƒOƒAƒbƒv‚· +@‚邱‚Æ‚ª‚ ‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.37 + +EƒvƒƒOƒ‰ƒ€I—¹Žž‚Ƀ_ƒCƒAƒ‹ƒAƒbƒv‚ðØ’f‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|Ú‘±/Ø’fj +Eƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚»‚ꂼ‚ê‚̃tƒ@ƒCƒ‹‚Ì—e—ʁiƒTƒuƒtƒHƒ‹ƒ_ŠÜ‚ށj‚ð•\Ž¦‚Å‚«‚é +@‚悤‚É‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒhj +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚µ‚Ü‚µ‚½BiƒzƒXƒgÝ’è–¼‚ðŽw’肵‚Ă̐ڑ±Aƒ~ +@ƒ‰[ƒŠƒ“ƒO‚ÌŠJŽnƒIƒvƒVƒ‡ƒ“j +E‚½‚­‚³‚ñ‚̏ˆ—‚ð‚·‚é‚Əˆ—“à—e‚Ì•\Ž¦‚ªŽ~‚Ü‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.36 + +E‰Eƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½ŽžA‚»‚̈ʒu‚̃tƒ@ƒCƒ‹‚ª‘I‚΂ê‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +ESunOS 5.x‚̃zƒXƒg‚Ƀ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚·‚éÛA•s•K—v‚ɍăAƒbƒvƒ[ƒh‚· +@‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.35 + +Eƒtƒ@ƒCƒ‹–¼‚̍Ōã‚Ì•¶Žš‚ªu•\v‚ÌŽž‚ɁAƒtƒ@ƒCƒ‹–¼‚ª³‚µ‚­•\Ž¦‚Å‚«‚È‚¢‚Ì‚ðC³ +@‚µ‚Ü‚µ‚½B +E‘Ò‹@Œ‹‡ƒtƒ@ƒCƒ‹‚ðŽw’è‚·‚é•K—v‚Ì‚ ‚éACOS‚̃zƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½Bi‹@”\“I‚É‚¢ +@‚­‚‚©‚̐§ŒÀ‚ª‚ ‚è‚Ü‚·j + +¡Ver 1.34 + +EƒzƒXƒg‚ÌIPƒAƒhƒŒƒX‚𒼐ڎw’肵‚½ŽžADNS‚ðŒ©‚És‚©‚È‚¢‚悤‚ɕύX‚µ‚Ü‚µ‚½B +E”¼ŠpƒJƒ^ƒJƒi‚ð‘SŠp‚É•ÏŠ·‚·‚鎞A‘÷“_A”¼‘÷“_‚ª•ÊX‚É‚È‚ç‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B +@iuƒJJv¨uƒKvj + +¡Ver 1.33 + +E”CˆÓ‚̃Rƒ}ƒ“ƒh‚ðƒzƒXƒg‚É‘—‚ê‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒhj +Eu–¼‘O‚ðŽw’肵‚ă_ƒEƒ“ƒ[ƒhv‹@”\‚ð’ljÁ‚µ‚Ü‚µ‚½Bƒtƒ@ƒCƒ‹ˆê——•\Ž¦‚Ì‹–‰Â‚ª—^ +@‚¦‚ç‚ê‚Ä‚¢‚È‚¢ƒtƒ@ƒCƒ‹‚Å‚àƒ_ƒEƒ“ƒ[ƒh‚Å‚«‚Ü‚·B +@iƒRƒ}ƒ“ƒhj +EƒLƒƒƒbƒVƒ…‚ðŽg‚¤‚ª•Û‘¶‚µ‚È‚¢‚悤‚ɐݒ肵‚½ŽžAˆÈ‘O‚É•Û‘¶‚µ‚½ƒLƒƒƒbƒVƒ…ƒf[ƒ^ +@‚ð“ǂݍž‚ñ‚Å‚µ‚Ü‚¤Ž–‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E“¯‚¶ƒzƒXƒg‚ɕʂ̃†[ƒU–¼‚Őڑ±‚µ‚½Žž‚́Aƒtƒ@ƒCƒ‹ˆê——‚̃LƒƒƒbƒVƒ…‚ðA‚»‚ꂼ‚ê +@•ÊX‚ɍs‚È‚¤‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.32 + +Eƒtƒ@ƒCƒ‹–¼‚̏¬•¶Žš•ÏŠ·‚̐ݒè‚ðAƒ~ƒ‰[ƒŠƒ“ƒO‚ÌŽž‚Æ‚»‚¤‚Å‚È‚¢Žž‚Ì‚Q‚‚ɕª‚¯‚Ü +@‚µ‚½Bišš ¬•¶Žš•ÏŠ·‚ðŽg—p‚µ‚Ä‚¢‚鎞‚́AÄÝ’肵‚Ä‚­‚¾‚³‚¢ ššj +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒ~ƒ‰[ƒŠƒ“ƒOj +EƒzƒXƒgˆê——‚ð•Â‚¶‚½Žž‚É‚àAƒzƒXƒg‚̐ݒè‚ðƒŒƒWƒXƒgƒŠ‚ɏ‘‚«ž‚ނ悤‚É‚µ‚Ü‚µ‚½B +@i]—ˆ‚̓vƒƒOƒ‰ƒ€I—¹Žž‚̂݁j +EWelcomeƒƒbƒZ[ƒW‚ª³‚µ‚­Žó‚¯Žæ‚ê‚È‚¢ê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@(ftp.microsoft.com‚È‚Ç) + +¡Ver 1.31 + +Eƒtƒ@ƒCƒ‹‚Ì‘®«•ÏX‚ŁA’¼Ú”’l‚ð“ü—Í‚µ‚ÄŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒh|‘®«•ÏXj +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚́u“]‘—‚µ‚È‚¢ƒtƒ@ƒCƒ‹v‚̐ݒè‚ðAƒtƒHƒ‹ƒ_‚É‚à“K—p‚µ +@‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒ~ƒ‰[ƒŠƒ“ƒOj + +¡Ver 1.30 + +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ŁA“]‘—‚µ‚È‚¢ƒtƒ@ƒCƒ‹AƒzƒXƒg‚©‚çíœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹ +@‚̐ݒè‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒ~ƒ‰[ƒŠƒ“ƒOj + +¡Ver 1.29 + +EƒT[ƒo‚̃Šƒvƒ‰ƒC‚ðŽó‚¯Žæ‚éÛ‚ɁA•s³‚ȃƒ‚ƒŠƒAƒNƒZƒX‚Æ‚È‚éê‡‚ª‚ ‚é‚Ì‚ðC³ +@‚µ‚Ü‚µ‚½B +EƒtƒHƒ‹ƒ_‚Ì“¯ŽžˆÚ“®ƒ‚[ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½Bƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Å“¯‚¶–¼‘O‚̃Tƒu +@ƒtƒHƒ‹ƒ_‚ª‚ ‚鎞AƒtƒHƒ‹ƒ_‚̈ړ®‚𓯎ž‚ɍs‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B + +¡Ver 1.28 + +EƒƒOƒCƒ“Žž‚ɃAƒJƒEƒ“ƒg‚𑗂邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j + +¡Ver 1.27 + +Eƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‹@”\‚ð’ljÁ‚µ‚Ü‚µ‚½B +@ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_\¬‚ðAƒ[ƒJƒ‹‘¤‚ɍ‡‚킹‚Ü‚·BWebƒy[ƒW‚̃tƒ@ƒC +@ƒ‹“]‘—‚È‚Ç‚É•Ö—˜‚Å‚·B +EƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ªXV‚³‚ê‚È‚¢‚±‚Æ‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.26 + +EƒtƒHƒ‹ƒ_‘I‘ð‚Å‘I‚ׂȂ¢ƒtƒHƒ‹ƒ_‚ª‚ ‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@iƒtƒHƒ‹ƒ_‘I‘ð‰æ–Ê‚ðAWin95•W€?‚Ì•¨‚É‚µ‚Ü‚µ‚½Bj +Eƒ_ƒEƒ“ƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Æ“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ªƒ[ƒJƒ‹‘¤‚É‚ ‚鎞‚̃_ƒEƒ“ƒ[ +@ƒh‚ÌŠm”F‚ðAƒ_ƒEƒ“ƒ[ƒhŠJŽnŽž‚ɂ܂Ƃ߂čs‚È‚¤‚悤‚É‚µ‚Ü‚µ‚½BŠm”F‚̏I‚í‚Á‚½ +@‚à‚Ì‚©‚珇ŽŸƒoƒbƒNƒOƒ‰ƒEƒ“ƒh‚Å“]‘—‚µ‚Ü‚·BŠm”F‚Æ“]‘—‚ª“¯Žžis‚ōs‚È‚¦‚é‚Ì +@‚ŁAƒTƒCƒY‚Ì‘å‚«‚È‘½”‚̃tƒ@ƒCƒ‹‚ð“]‘—‚·‚鎞‚ɁAŽžŠÔ‚̐ߖñ‚É‚È‚è‚Ü‚·B +@i¡‚܂ł́Aˆê‚‚̃tƒ@ƒCƒ‹‚Ì“]‘—‚ªI‚í‚Á‚½Œã‚ŁAŽŸ‚̃tƒ@ƒCƒ‹‚ÌŠm”F‚ðs‚È‚Á‚Ä +@‚¢‚Ü‚µ‚½Bj +@ƒAƒbƒvƒ[ƒh‚͏””Ê‚ÌŽ–î‚ŏ]—ˆ’Ê‚èB + +¡Ver 1.25a + +EƒEƒCƒ“ƒhƒEƒTƒCƒY‚̕ύX‚ðs‚¤‚Ɖæ–Ê‚ª—‚ê‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.25 + +Eƒ}ƒEƒXƒzƒC[ƒ‹‚ðŽg‚Á‚½ƒXƒNƒ[ƒ‹‚́Aƒ}ƒEƒXƒJ[ƒ\ƒ‹‚Ì‚ ‚éƒEƒCƒ“ƒhƒE‚ɑ΂µ‚čs +@‚¤‚悤‚É‚µ‚Ü‚µ‚½BiWinNT‚̂݁j +Eƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒEŠÔ‚̃hƒ‰ƒbƒO•ƒhƒƒbƒv‚ɑΉž‚µ‚Ü‚µ‚½B + +¡Ver 1.24 + +Eu‘I‘ðv‚Ɓu‘S‘I‘ðv‚ŁAƒhƒ‰ƒCƒu–¼‚Í‘I‘ð‚µ‚È‚¢‚悤‚É‚µ‚Ü‚µ‚½B +Eu‘I‘ðv‚ŁA“ú•t”äŠr‚È‚Ç‚ÌðŒ‚ð•t‚¯‚鎖‚ªo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹“]‘—’†ƒEƒCƒ“ƒhƒE‚̃^ƒCƒgƒ‹‚ɁA“]‘—‘Ò‚¿ƒtƒ@ƒCƒ‹”‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü +@‚µ‚½B + +¡Ver 1.23 + +E‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ɁuƒtƒHƒ‹ƒ_ì¬v‚ð’ljÁ‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚ɂ‚Ȃ¬‚Á‚Ï‚È‚µ‚Ń^ƒCƒ€ƒAƒEƒg‚Őڑ±‚ðØ‚ç‚ꂽŒã‚ÌŽ©“®ÄÚ‘±‚ŁAƒpƒX +@ƒ[ƒh‚Ì“ü—Í‚ð—v‹‚·‚鎖‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒpƒXƒ[ƒh‚ªŠÔˆá‚Á‚Ä‚¢‚½ŽžA‚à‚¤ˆê“x³‚µ‚¢ƒpƒXƒ[ƒh‚ð“ü—Í‚Å‚«‚é‚悤‚ɕύX‚µ +@‚Ü‚µ‚½B +Eƒ^ƒXƒNƒo[‚ð¶A‚Ü‚½‚͏ã‚É•\Ž¦‚µ‚Ä‚¢‚鎞AƒEƒCƒ“ƒhƒE‚̈ʒu‚𐳂µ‚­•Û‘¶‚Å‚«‚È +@‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.22 + +ENTŒ`Ž®‚̃tƒ@ƒCƒ‹ˆê——‚ŁA“ú•t‚𠌎-“ú-”N ‚̏‡‚Å•Ô‚·ƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B +@i2000”N12ŒŽ31“úˆÈ‘O‚Ì“ú•t‚̃tƒ@ƒCƒ‹‚Ì‚Ý‚ÉŽb’è‘Ήžj + +¡Ver 1.21 + +EÝ’è‚ðƒŒƒWƒXƒgƒŠ‚Å‚È‚­INIƒtƒ@ƒCƒ‹‚É•Û‘¶‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½Bƒ}ƒ‹ƒ`ƒ†[ƒUŠÂ +@‹«‚Å‚È‚¢Žž‚́AINIƒtƒ@ƒCƒ‹‚Ì•û‚ªŠÈ’P‚ɃoƒbƒNƒAƒbƒv‚Å‚«‚é‚Ì‚Å•Ö—˜‚Å‚·B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‚»‚Ì‘¼j +E“]‘—ƒŒ[ƒg‚Ì•\Ž¦‚ª•Ï‚É‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.20 + +EƒeƒLƒXƒgƒ‚[ƒh‚ł̃Aƒbƒvƒ[ƒhŽž‚ɁAEOF(Ctrl-Z)ƒR[ƒh‚ðŽæ‚菜‚­Ý’è‚ð’ljÁ‚µ‚Ü +@‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Pj + +¡Ver 1.19a + +Eanonymous-FTP‚̃zƒXƒg‚̃pƒXƒ[ƒh‚ªA“ü—Í‚³‚ê‚È‚¢ó‘Ô‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ +@‚Ü‚µ‚½B + +¡Ver 1.19 + +E–¼‘O‚ð•Ï‚¦‚ă_ƒEƒ“ƒ[ƒhA–¼‘O‚ð•Ï‚¦‚ăAƒbƒvƒ[ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒRƒ}ƒ“ƒhji‰Eƒ{ƒ^ƒ“ƒƒjƒ…[j +Eƒtƒ@ƒCƒ‹‚̐”‚ª‚Q‚‚¾‚¯‚Ì‚Æ‚«Aƒ\[ƒg•û–@‚̕ύX‚ð‚µ‚Ä‚à•ÏX‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC +@³‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚ªWinNT3.5‚ÌFTPƒT[ƒo‚ÌŽžAƒtƒ@ƒCƒ‹‚Ì“ú•tAŽžŠÔ‚Ì•\Ž¦‚ª‚¨‚©‚µ‚©‚Á‚½‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B + +¡Ver 1.18 + +EƒzƒXƒg‚©‚çƒRƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒC‚ª–³‚¢Žž‚̃^ƒCƒ€ƒAƒEƒgˆ—‚ð’ljÁ‚µ‚Ü‚µ‚½B +@i‚¤‚Ü‚­“®‚¢‚Ä‚é‚©‚ȁcHj +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Qj +Eƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚È‚¢ƒtƒ@ƒCƒ‹‚ª‚ ‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +@iˆê——‚̍ŏ‰‚Ì•û‚ª "drwxr--r--123 ..." ‚̂悤‚É123‚Ì‘O‚ɃXƒy[ƒX‚ª–³‚¢‚à‚́j +Eˆ—“à—eƒEƒCƒ“ƒhƒE‚ŁAƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Æ“¯‚¶ƒtƒHƒ“ƒg‚ðŽg‚¤‚悤‚ɕύX‚µ‚Ü‚µ‚½B +EÚ‘±‚µ‚½ó‘ԂŁAƒVƒXƒeƒ€ƒƒjƒ…[‚́u•Â‚¶‚év‚ŏI—¹‚µ‚½ê‡‚ɁAƒuƒbƒNƒ}[ƒN‚ª +@•Û‘¶‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.17 + +EƒzƒXƒg‚ª‘—‚Á‚Ä‚«‚½ƒtƒ@ƒCƒ‹ˆê——‚ðA‚»‚̂܂܃rƒ…[ƒ‚ÅŒ©‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ +@‚Ü‚µ‚½B +@i•\Ž¦|ƒtƒ@ƒCƒ‹ˆê——‚ðƒrƒ…[ƒ‚Å•\Ž¦j +Eˆ—“à—e‚ðƒrƒ…[ƒ‚ÅŒ©‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@i•\Ž¦|ˆ—“à—e‚ðƒrƒ…[ƒ‚Å•\Ž¦j +EƒrƒMƒi[‚ðŠÜ‚Þ•¡”l‚ÅŽg‚¤ŠÂ‹«‚ŁA‚¤‚Á‚©‚èÝ’è‚ð•Ï‚¦‚ç‚ê‚È‚¢‚悤‚ɁAÚ‘±ƒ +@ƒjƒ…[‚ƃzƒXƒgÝ’胁ƒjƒ…[‚𕪂¯‚Ü‚µ‚½BVer1.16ˆÈ‘O‚Æ“¯—l‚ɐڑ±ƒƒjƒ…[‚Ńz +@ƒXƒg‚̐ݒè‚às‚¢‚½‚¢‚Æ‚«‚́AƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‚»‚Ì‘¼‚́uÚ‘±ƒEƒCƒ“ƒhƒE‚Å +@ƒzƒXƒg‚̐ݒè‚às‚¤v‚ðƒ`ƒFƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B +E—pŒê‚ðˆê•”•ÏX‚µ‚Ü‚µ‚½B + +¡Ver 1.16 + +EƒzƒXƒg‘¤‚̉Eƒ{ƒ^ƒ“ƒƒjƒ…[‚É‘®«•ÏX‚ð’ljÁ‚µ‚Ü‚µ‚½B +EWin95‚ÅŽg—p‚·‚é‚ƁAƒzƒXƒg‘¤‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚Ì•\Ž¦‚ª‚¨‚©‚µ‚­‚È‚é‚Ì‚ðC³‚µ‚Ü‚µ +@‚½B(WinNT‚É‚µ‚©‚È‚¢API‚ðŽg‚Á‚Ä‚¢‚Ü‚µ‚½j + +¡Ver 1.15 + +Eƒtƒ@ƒCƒ‹“]‘—‚ŁA“]‘—æ‚ÉŠù‚Ƀtƒ@ƒCƒ‹‚ª‚ ‚鎞‚̏ˆ—•û–@‚ð•Ï‚¦‚Ü‚µ‚½Bƒ^ƒCƒ€ƒX +@ƒ^ƒ“ƒv‚ð”äŠr‚µAV‚µ‚¯‚ê‚Γ]‘—‚·‚é‚Æ‚¢‚¤Ž–‚ào—ˆ‚é‚悤‚É‚È‚è‚Ü‚µ‚½B +@‚±‚ê‚É”º‚¢AƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‘€ì‚̐ݒè•û–@‚ð•ÏX‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ð“ú–{ŽžŠÔ‚ɍ‡‚킹‚邽‚߂ɁAƒzƒXƒg‚̃^ƒCƒ€ƒ][ƒ“‚ÌÝ +@’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j +E‘S‚Ă̐ݒè’l‚ðÁ‹Ž‚·‚é‹@”\‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒwƒ‹ƒv|‘SÝ’è‚̏Á‹Žj + +¡Ver 1.14 + +Eƒrƒ…[ƒ‚ð‚R‚“o˜^‚µA‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚Å‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒc[ƒ‹j +EƒpƒXƒ[ƒh‚ð“ü—Í‚µ‚È‚¢‚ŃzƒXƒg‚ð“o˜^‚µ‚½‚Æ‚«AŽŸ‚Ì‹N“®Žž‚ɃSƒ~‚̃pƒXƒ[ƒh‚É +@‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒAƒXƒL[ƒ‚[ƒh‚Å“]‘—‚·‚éƒtƒ@ƒCƒ‹–¼‚̐ݒè•û–@‚ðAŠg’£Žq‚¾‚¯Žw’è‚·‚é•û–@‚©‚çA +@ƒƒCƒ‹ƒhƒJ[ƒh‚ªŽg‚¦‚é•û–@‚ɕύX‚µ‚Ü‚µ‚½B"*.txt"‚Æ‚©"Makefile.*"‚̂悤‚ÉŽw +@’è‚Å‚«‚Ü‚·B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Pj +Eƒtƒ@ƒCƒ‹–¼‚ð‘啶ŽšA‚Ü‚½‚͏¬•¶Žš‚É•ÏŠ·‚µ‚Ä“]‘—‚·‚éÝ’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—‚Qj + +¡Ver 1.13 + +E"%"‚ðŠÜ‚Þƒtƒ@ƒCƒ‹–¼‚Ì“]‘—‚ª‚¤‚Ü‚­‚¢‚©‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚̐ݒèƒEƒCƒ“ƒhƒE‚̍\¬‚ð•Ï‚¦‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹‚Ì‘®«•ÏXƒRƒ}ƒ“ƒh‚ðŽ©—R‚ɐݒè‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B‚±‚ê‚É”º‚¢A +@Ver1.12a ‚ł̕ύX‚ðŽæ‚è‚â‚ß‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j +EƒŒƒWƒXƒgƒŠ‚Ö•Û‘¶‚·‚éî•ñ‚ð‚¿‚å‚Á‚Æ‚¾‚¯¬‚³‚­‚µ‚Ü‚µ‚½B + +¡Ver 1.12a + +Eƒtƒ@ƒCƒ‹‚Ì‘®«•ÏX‚Å"SITE CHMOD"‚ðŽÀs‚µ‚ăGƒ‰[‚É‚È‚Á‚½‚çA"CHMOD"‚ðŽÀs‚µ +@‚Ä‚Ý‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B + +¡Ver 1.12 + +E“]‘—’†‚̃EƒCƒ“ƒhƒE‚ɍŏ¬‰»ƒ{ƒ^ƒ“‚ð•t‚¯‚Ü‚µ‚½B + +¡Ver 1.11 + +EƒvƒƒOƒ‰ƒ€I—¹Žž‚É•s³‚ȏˆ—‚ƂȂ鎖‚ª‚ ‚é‚̂ŁAŽÀŒ±‚Æ‚µ‚āAƒvƒƒOƒ‰ƒ€‚̏I—¹ +@Žž‚̃Šƒ\[ƒX‚ÌŠJ•ú‚ðƒVƒXƒeƒ€”C‚¹‚É‚µ‚Ä‚Ý‚Ü‚µ‚½B–â‘肪‚È‚¯‚ê‚΂±‚Ì‚Ü‚Ü‚É‚µ‚Ü +@‚·B +EEUCAJISƒR[ƒh‚Ì”¼ŠpƒJƒi‚ɑΉž‚µ‚Ü‚µ‚½B”¼ŠpƒJƒi‚ð‘SŠp‚É‚·‚é‚©”¼Šp‚Ì‚Ü‚Ü‚É‚· +@‚é‚©‚ð‘I‚ÔŽ–‚ªo—ˆ‚Ü‚·B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£Aƒc[ƒ‹ƒo[j +Eƒtƒ@ƒCƒ‹‚Ì‘I‘ðAŒŸõ‚ȂǂŁA³‹K•\Œ»‚ðŽg‚í‚È‚¢Žž‚Å‚à "|" ‚Ńtƒ@ƒCƒ‹–¼‚𕡐” +@Žw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½Bi—á *.lzh|*.zipj + +¡Ver 1.10 + +EÚ‘±ŽžAƒGƒ‰[Žž‚ȂǂɃTƒEƒ“ƒh‚ð–‚炷‚±‚Æ‚ðo—ˆ‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|ƒTƒEƒ“ƒhj +Eƒ_ƒEƒ“ƒ[ƒhAƒAƒbƒvƒ[ƒh‚ª‚¤‚Ü‚­‚¢‚©‚È‚©‚Á‚½ŽžAƒGƒ‰[‚̃EƒCƒ“ƒhƒE‚ðo‚·‚æ +@‚¤‚ɕύX‚µ‚Ü‚µ‚½Bi¡‚܂ł́AƒƒO‚ðŒ©‚ÄŠm”F‚·‚é•K—v‚ª‚ ‚è‚Ü‚µ‚½j + +¡Ver 1.09b + +E‰æ–ʂ̃vƒƒpƒeƒB‚Å3DƒIƒuƒWƒFƒNƒg‚̐F‚ð•ÏX‚µ‚Ä‚¢‚鎞Aƒc[ƒ‹ƒo[‚̃{ƒ^ƒ“‚̐F +@‚ª’²ß‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.09a + +E•¡”ƒtƒ@ƒCƒ‹‚̃Aƒbƒvƒ[ƒh’†‚Ɂu‚±‚̃tƒ@ƒCƒ‹‚𒆎~vƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAˆÈ~“]‘— +@‚µ‚½ƒtƒ@ƒCƒ‹‚̃TƒCƒY‚ª0ƒoƒCƒg‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.09 + +EƒNƒCƒbƒNÚ‘±‚̃zƒXƒg–¼“ü—̓EƒCƒ“ƒhƒE‚ŁAURL‚ðŽó‚¯•t‚¯‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒzƒXƒg‚̃AƒhƒŒƒXAƒ[ƒ‹ƒAƒhƒŒƒX‚È‚Ç‚Ì•¶Žš”‚̏ãŒÀ‚ðˆø‚«ã‚°‚Ü‚µ‚½B + +¡Ver 1.08a + +E‰ŠúƒfƒBƒŒƒNƒgƒŠ‚̃oƒbƒtƒ@ƒTƒCƒY‚ð‘å‚«‚­‚µ‚Ü‚µ‚½B + +¡Ver 1.08 + +E‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ɁuŠJ‚­v‚ð’ljÁ‚µ‚Ü‚µ‚½B +Eƒ_ƒuƒ‹ƒNƒŠƒbƒN‚ŁuŠJ‚­v‚Ɓuƒ_ƒEƒ“ƒ[ƒhv‚Ì‚Ç‚¿‚ç‚©‚ð‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‘€ìj +EƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹“à—e‚ðuŠJ‚­v‚ ‚é‚¢‚̓_ƒuƒ‹ƒNƒŠƒbƒN‚Å•\Ž¦‚µ‚½Žž‚̃eƒ“ƒ| +@ƒ‰ƒŠƒtƒ@ƒCƒ‹‚ðAI—¹Žž‚ɍ폜‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EWS_FTP‚©‚çƒzƒXƒgˆê——‚ðƒCƒ“ƒ|[ƒg‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iÚ‘±|ƒCƒ“ƒ|[ƒg|WS_FTP) +EƒzƒXƒgÚ‘±ŽžA‚»‚̃zƒXƒg‚ɍŌã‚ɐڑ±‚µ‚½‚Æ‚«‚̃tƒHƒ‹ƒ_‚ð‰ŠúƒtƒHƒ‹ƒ_‚É‚·‚éÝ +@’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šî–{j + +¡Ver 1.07 + +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ÅŽw’肵‚½ƒzƒXƒg‚ªƒzƒXƒgˆê——‚É“o˜^‚³‚ê‚Ä‚¢‚é‚Æ‚«‚́A“o˜^‚³‚ê‚Ä +@‚¢‚éFireWall‚ÆPASVƒ‚[ƒh‚̐ݒè‚ðŽg‚¤‚悤‚ɕύX‚µ‚Ü‚µ‚½B +EƒzƒXƒgˆê——‚É“o˜^‚³‚ê‚Ä‚¢‚È‚¢ƒzƒXƒg‚ɐڑ±‚·‚é‚Æ‚«AFireWall‚ðŽg‚¤‚©‚Ç‚¤‚©‚ÌÝ +@’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|FireWallj +EƒzƒXƒg‚̃tƒ@ƒCƒ‹ˆê——‚𓾂é‚Ì‚É "LIST" ƒRƒ}ƒ“ƒh‚ðŽg—p‚·‚éƒIƒvƒVƒ‡ƒ“‚ð’ljÁ‚µ‚Ü +@‚µ‚½Biˆê•”‹@”\‚ɐ§ŒÀ‚ª‚ ‚è‚Ü‚·) +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j +Eƒ^ƒXƒNƒEƒCƒ“ƒhƒE‚Ì‘å‚«‚³‚ð•ÏX‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.06 + +EƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ŃzƒXƒg^ƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚āAƒ_ƒEƒ“ƒ[ƒh‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ +@‚½B +EƒvƒƒOƒ‰ƒ€‹N“®Žž‚́iƒƒOƒCƒ“‘O‚́jƒ[ƒJƒ‹ƒtƒHƒ‹ƒ_‚̐ݒè‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—j +Eƒ_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ðˆÛŽ‚·‚éÝ’è‚ð’ljÁ‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—j +E‘I‘ðƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B +@i•\Ž¦|‘I‘ðA•\Ž¦|‘S‘I‘ð^‰ðœ) +EŒŸõƒRƒ}ƒ“ƒh‚ð’ljÁ‚µ‚Ü‚µ‚½B +@i•\Ž¦|ŒŸõA•\Ž¦|ŽŸ‚ðŒŸõ) +E"."‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚̐ݒè‚ð’ljÁ‚µ‚Ü‚µ‚½B +@i•\Ž¦|D‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹‚ð•\Ž¦j +EƒzƒXƒg‚̐ڑ±ƒ|[ƒg‚ðŽw’è‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè|Šg’£j +EƒTƒ“ƒvƒ‹ƒzƒXƒg‚ð“ü‚ê‚Ä‚¨‚«‚Ü‚µ‚½Bi‰‚ß‚Ä‹N“®‚µ‚½‚Æ‚«‚É—LŒø) +Eƒtƒ@ƒCƒ‹“]‘—‚ªI‚í‚Á‚½ŽžAƒ^ƒXƒNƒEƒCƒ“ƒhƒEiˆ—“à—e‚ð•\Ž¦‚·‚éƒEƒCƒ“ƒhƒEj‚É +@“]‘—ƒŒ[ƒg‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒzƒXƒgˆê——‚ð•ÒW‚µ‚½ŽžAƒuƒbƒNƒ}[ƒN‚ªˆá‚¤ƒzƒXƒg‚Ì•¨‚É“ü‚ê‘Ö‚í‚Á‚Ä‚µ‚Ü‚¤‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B +Eƒ_ƒEƒ“ƒ[ƒh’†‚ɃfƒBƒXƒN‚ª‚¢‚Á‚Ï‚¢‚É‚È‚Á‚½Žž‚ɁAƒGƒ‰[‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ +@‚½B +EŠg’£Žq‚ªHTML‚̃tƒ@ƒCƒ‹‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½‚Æ‚«A‚»‚̃tƒ@ƒCƒ‹‚ªWebƒuƒ‰ƒEƒU‚Å +@•\Ž¦‚³‚ê‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.05 + +EƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ð‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +E"ftp"‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹–¼‚ðƒ}ƒEƒX‚̃_ƒuƒ‹ƒNƒŠƒbƒN‚ÅŠJ‚±‚¤‚Æ‚·‚é‚ƁAWebƒuƒ‰ƒEƒU +@‚ª‹N“®‚µ‚Ä‚µ‚Ü‚¤‚Ì‚ðC³‚µ‚Ü‚µ‚½B +E‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ð’ljÁ‚µ‚Ü‚µ‚½B + +¡Ver 1.04a + +EÅ‰‚ª . ‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹‚à•\Ž¦‚·‚邽‚߂ɁA-a ƒIƒvƒVƒ‡ƒ“‚ð‚‚¯‚ătƒ@ƒCƒ‹ˆê—— +@‚ðŽæ“¾‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B(ƒzƒXƒg‚É‘—‚éƒRƒ}ƒ“ƒhFNLST -alL) +EWindows95‚ŁAƒ[ƒJƒ‹ƒhƒ‰ƒCƒu‚̃‹[ƒgƒfƒBƒŒƒNƒgƒŠ‚̃tƒ@ƒCƒ‹ˆê——‚ª•\Ž¦‚³‚ê‚È +@‚©‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B +Eð”N‚̃tƒ@ƒCƒ‹‚ð¡”N‚̃tƒ@ƒCƒ‹‚Æ‚µ‚Ä•\Ž¦‚·‚éê‡‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.04 + +EƒŠƒ‚[ƒgƒzƒXƒg‚ÌŒ»Ý‚̃fƒBƒŒƒNƒgƒŠ‚ðA‰ŠúƒfƒBƒŒƒNƒgƒŠ‚ɐݒè‚Å‚«‚é‚悤‚É‚µ +@‚Ü‚µ‚½BiƒzƒXƒgˆê——|ƒzƒXƒg‚̐ݒè) +EƒzƒXƒg‚̐ݒèƒEƒCƒ“ƒhƒE‚̑̍قð•ÏX‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹‚Ì“ú•t‚ð“ú–{Œê‚Å•Ô‚·ƒzƒXƒg‚ɑΉž‚µ‚Ü‚µ‚½B +EƒVƒ“ƒ{ƒŠƒbƒNƒŠƒ“ƒN‚𐳂µ‚­ˆµ‚¤‚½‚߂ɁA-L ƒIƒvƒVƒ‡ƒ“‚ð‚‚¯‚ătƒ@ƒCƒ‹ˆê——‚ðŽæ +@“¾‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B(ƒzƒXƒg‚É‘—‚éƒRƒ}ƒ“ƒhFNLST -lL) + +¡Ver 1.03a + +Ectl3d32.dll ‚ðŽg‚í‚È‚¢‚悤‚ɕύX‚µ‚Ü‚µ‚½B + +¡Ver 1.03 + +Eƒtƒ@ƒCƒ‹‘€ì‚ð Ctrl+? ‚Å‚às‚È‚¦‚é‚悤‚É‚µ‚Ü‚µ‚½B +EBackSpaceƒL[‚ŁAˆê‚ã‚̃fƒBƒŒƒNƒgƒŠ‚ÖˆÚ“®‚·‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B +EReturnƒL[‚́Aƒ}ƒEƒX‚̃_ƒuƒ‹ƒNƒŠƒbƒN‚Æ“¯‚¶“®ì‚ð‚·‚é‚悤‚ɕύX‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹–¼‚ÌTipƒwƒ‹ƒv•\Ž¦‚ŁA‚²‚Ý‚ð•\Ž¦‚·‚鎖‚ª‚ ‚é‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.02 + +EƒGƒNƒXƒvƒ[ƒ‰‚È‚Ç‚©‚ç‚ÌDrag&Drop‚Å‚àAƒTƒuƒfƒBƒŒƒNƒgƒŠ‚ðŠÜ‚ß‚½ƒAƒbƒvƒ[ƒh +@‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 1.01b + +EƒƒOƒCƒ“Œã‚ÌWelcomeƒƒbƒZ[ƒW‚ª’·‚¢‚Æ‚«‚ɁA•s³‚ȃƒ‚ƒŠƒAƒNƒZƒX‚É‚È‚é‚Ì‚ð +@C³‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹ˆê——î•ñ‚̉ðÍ‚ð‚¿‚å‚Á‚ƏC³‚µ‚Ü‚µ‚½B + +¡Ver 1.01a + +EƒTƒuƒfƒBƒŒƒNƒgƒŠ‚ðŠÜ‚Þƒ_ƒEƒ“ƒ[ƒh‚ŁAƒTƒuƒfƒBƒŒƒNƒgƒŠ‚̍X‚ɃTƒuƒfƒBƒŒƒNƒg +@ƒŠˆÈ‰º‚̃tƒ@ƒCƒ‹‚ªƒ_ƒEƒ“ƒ[ƒh‚Å‚«‚È‚¢ê‡‚ª‚ ‚Á‚½‚Ì‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 1.01 + +EÚ×•\Ž¦‚ŁAƒJƒ‰ƒ€‚É•\Ž¦‚µ‚«‚ê‚È‚¢’·‚¢ƒtƒ@ƒCƒ‹–¼‚ðTipƒwƒ‹ƒv‚Å•\Ž¦‚·‚é‚悤‚É +@‚µ‚Ü‚µ‚½B + +¡Ver 1.00 + +EFireWall‚ɑΉžB +Eƒc[ƒ‹ƒo[‚ÉŠ¿ŽšƒR[ƒh•ÏŠ·‚̃{ƒ^ƒ“‚ð’ljÁ‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹‚̃_ƒuƒ‹ƒNƒŠƒbƒN‚ŁAŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚ðŽg‚í‚È‚¢‚±‚Æ‚ª‚ ‚é‚Ì +@‚ðC³‚µ‚Ü‚µ‚½B + +¡Ver 0.92 + +Eƒtƒ@ƒCƒ‹ˆê——‚ðƒLƒƒƒbƒVƒ…‚·‚é‚悤‚É‚µ‚Ü‚µ‚½BiÅ‘å20ƒtƒHƒ‹ƒ_j +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‚»‚Ì‘¼j +EPASVƒ‚[ƒh‚ð’ljÁB +@iƒzƒXƒg‚̐ݒèj +Eƒtƒ@ƒCƒ‹‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½ŽžAŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚ª‚ ‚é‚Æ‚«‚Í‚»‚ê‚ð‹N +@“®‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 0.91 + +EMicrosoft‚ÌFTPƒT[ƒo‚ɑΉžB + +¡Ver 0.90 + +EƒuƒbƒNƒ}[ƒN‚ð’ljÁB +@iƒuƒbƒNƒ}[ƒNj +EŠ¿ŽšƒR[ƒh‚Ì•ÏŠ·‹@”\‚ð’ljÁB +@iƒzƒXƒgˆê——|ƒzƒXƒgÝ’èj +Eƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì•\Ž¦‚ðAˆê——•\Ž¦‚Əڍו\Ž¦‚©‚ç‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +@i•\Ž¦|Œ`Ž®j + +¡Ver 0.85 + +E“]‘—’†‚̃EƒCƒ“ƒhƒE‚ðAƒƒCƒ“‚̃EƒCƒ“ƒhƒE‚Ì’†‰›‚É•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒvƒƒOƒ‰ƒ€I—¹Žž‚É•s³‚ȏˆ—‚Æ‚È‚éê‡‚ª‚ ‚é‚Ì‚ðC³B + +¡Ver 0.80 + +Eƒ_ƒEƒ“ƒ[ƒh‚ð’†’f‚µ‚½ê‡AŽc‚è‚Ì•”•ª‚ð‚ ‚Æ‚©‚ç’ljÁƒ_ƒEƒ“ƒ[ƒh‚Å‚«‚é‚悤 +@‚É‚µ‚Ü‚µ‚½B +Eƒ[ƒJƒ‹ƒfƒBƒXƒN‚Ì‹ó‚«—e—Ê‚ð•\Ž¦‚·‚é‚悤‚ɕύX +E‘I‘ð‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚̐”‚Æ—e—Ê‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B + +¡Ver 0.70 + +Eƒtƒ@ƒCƒ‹“]‘—‚Ì’†’f‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Ì‚ðC³‚µ‚Ü‚µ‚½B +EÚ‘±“r’†‚ɁAÚ‘±‚𒆎~‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +@iØ’fƒ{ƒ^ƒ“j +E“]‘—æ‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚ɁA‚Ç‚¤‚·‚é‚©‚ð‘I‚ׂé‚悤‚É‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|‘€ìj +E“]‘—ƒ‚[ƒh‚̐ݒè‚ðA“]‘—ƒƒjƒ…[‚©‚çƒIƒvƒVƒ‡ƒ“ƒƒjƒ…[‚ÖˆÚ“®‚µ‚Ü‚µ‚½B +@iƒIƒvƒVƒ‡ƒ“|ŠÂ‹«Ý’è|“]‘—ƒ‚[ƒhj + +¡Ver 0.60 + +EƒTƒuƒfƒBƒŒƒNƒgƒŠ‚ðŠÜ‚ß‚½ƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚ª‚Å‚«‚é‚悤‚É‚µ‚Ü‚µ‚½B +EƒNƒCƒbƒNÚ‘±‚ð’ljÁ‚µ‚Ü‚µ‚½B +E“]‘—ƒ‚[ƒh‚ÌŽ©“®”»•Ê‚ð’ljÁ‚µ‚Ü‚µ‚½B +E‘®«iƒp[ƒ~ƒbƒVƒ‡ƒ“j‚̕ύX‹@”\‚ð’ljÁ‚µ‚Ü‚µ‚½B +Eƒtƒ@ƒCƒ‹‚ÌŽí—ށA‘®«‚ð•\Ž¦‚·‚é‚悤‚É‚µ‚Ü‚µ‚½B +E‘¼A•ÏX“_‘½”B + diff --git a/hostman.c b/hostman.c new file mode 100644 index 0000000..f151997 --- /dev/null +++ b/hostman.c @@ -0,0 +1,2065 @@ +/*============================================================================= +* +* ƒzƒXƒgˆê—— +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL CALLBACK SelectHostProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static LRESULT CALLBACK HostListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static HOSTLISTDATA *GetNextNode(HOSTLISTDATA *Pos); +static int GetNodeLevel(int Num); +static int GetNodeLevelByData(HOSTLISTDATA *Data); +static int GetNodeNumByData(HOSTLISTDATA *Data); +static HOSTLISTDATA *GetNodeByNum(int Num); +static int SetNodeLevelAll(void); +static int UpdateHostToList(int Num, HOSTDATA *Set); +static int DelHostFromList(int Num); +static int DeleteChildAndNext(HOSTLISTDATA *Pos); +static void SendAllHostNames(HWND hWnd, int Cur); +static int IsNodeGroup(int Num); +static int DispHostSetDlg(HWND hDlg); +static BOOL CALLBACK MainSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK AdvSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); + +/*===== ŠO•”ŽQÆ =====*/ + +extern HWND hHelpWin; + +/* Ý’è’l */ +extern char UserMailAdrs[USER_MAIL_LEN+1]; +extern HFONT ListFont; +extern char DefaultLocalPath[FMAX_PATH+1]; +extern int ConnectAndSet; +extern SIZE HostDlgSize; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static int Hosts = 0; /* ƒzƒXƒg” */ +static int ConnectingHost; /* Ú‘±’†‚̃zƒXƒg */ +static int CurrentHost; /* ƒJ[ƒ\ƒ‹ˆÊ’u‚̃zƒXƒg */ +static HOSTLISTDATA *HostListTop = NULL; /* ƒzƒXƒgˆê——ƒf[ƒ^ */ +static HOSTDATA TmpHost; /* ƒzƒXƒgî•ñƒRƒs[—p */ +static int Apply; /* ƒvƒƒpƒeƒBƒV[ƒg‚ÅOK‚ð‰Ÿ‚µ‚½ƒtƒ‰ƒO */ +static WNDPROC HostListProcPtr; + + + +/*----- ƒzƒXƒgˆê——ƒEƒCƒ“ƒhƒE -------------------------------------------------- +* +* Parameter +* int Type : ƒ_ƒCƒAƒƒO‚̃^ƒCƒv (DLG_TYPE_xxx) +* +* Return Value +* ƒXƒe[ƒ^ƒX (YES=ŽÀs/NO=ŽæÁ) +*----------------------------------------------------------------------------*/ + +int SelectHost(int Type) +{ + int Sts; + int Dlg; + + Dlg = hostconnect_dlg; + if((ConnectAndSet == YES) || (Type == DLG_TYPE_SET)) + Dlg = hostlist_dlg; + + Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(Dlg), GetMainHwnd(), SelectHostProc); + + /* ƒzƒXƒgÝ’è‚ð•Û‘¶ */ + SetNodeLevelAll(); + SaveRegistory(); + + return(Sts); +} + + +/*----- ƒzƒXƒgˆê——ƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK SelectHostProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static DIALOGSIZE DlgSize = { + { HOST_NEW, HOST_FOLDER, HOST_SET, HOST_COPY, HOST_DEL, HOST_DOWN, HOST_UP, IDHELP, HOST_SIZEGRIP, -1 }, + { IDOK, IDCANCEL, HOST_SIZEGRIP, -1 }, + { HOST_LIST, -1 }, + { 0, 0 }, + { 0, 0 } + }; + static HIMAGELIST hImage; + HTREEITEM hItem; + TV_ITEM Item; + int Level1; + int Level2; + HOSTLISTDATA *Data1; + HOSTLISTDATA *Data2; + NM_TREEVIEW *tView; + HTREEITEM tViewPos; + TV_HITTESTINFO HitInfo; + + switch (message) + { + case WM_INITDIALOG : + /* TreeView‚ł̃_ƒuƒ‹ƒNƒŠƒbƒN‚ð‚‚©‚Ü‚¦‚邽‚ß */ + HostListProcPtr = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, HOST_LIST), GWL_WNDPROC, (LONG)HostListWndProc); + + +// SetClassLong(hDlg, GCL_HICON, (LONG)LoadIcon(GetFtpInst(), MAKEINTRESOURCE(ffftp))); + + if(AskConnecting() == YES) + { + /* Ú‘±’†‚́u•ÏXv‚Ì‚Ý‹–‰Â */ + EnableWindow(GetDlgItem(hDlg, HOST_NEW), FALSE); + EnableWindow(GetDlgItem(hDlg, HOST_FOLDER), FALSE); + EnableWindow(GetDlgItem(hDlg, HOST_COPY), FALSE); + EnableWindow(GetDlgItem(hDlg, HOST_DEL), FALSE); + EnableWindow(GetDlgItem(hDlg, HOST_DOWN), FALSE); + EnableWindow(GetDlgItem(hDlg, HOST_UP), FALSE); + } + if(ListFont != NULL) + SendDlgItemMessage(hDlg, HOST_LIST, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + hImage = ImageList_LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(hlist_bmp), 16, 8, RGB(255,0,0)); + SendDlgItemMessage(hDlg, HOST_LIST, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImage); + CurrentHost = 0; + if(ConnectingHost >= 0) + CurrentHost = ConnectingHost; + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + DlgSizeInit(hDlg, &DlgSize, &HostDlgSize); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + CurrentHost = Item.lParam; + ConnectingHost = CurrentHost; + AskDlgSize(hDlg, &DlgSize, &HostDlgSize); + ImageList_Destroy(hImage); + EndDialog(hDlg, YES); + break; + } + /* ‚±‚±‚Ébreak‚Í‚È‚¢ */ + + case IDCANCEL : + AskDlgSize(hDlg, &DlgSize, &HostDlgSize); + ImageList_Destroy(hImage); + EndDialog(hDlg, NO); + break; + + case HOST_NEW : + CopyDefaultHost(&TmpHost); + if(DispHostSetDlg(hDlg) == YES) + { + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + + TmpHost.Level = GetNodeLevel(Item.lParam); + Level1 = Item.lParam + 1; + CurrentHost = Level1; + } + else + { + TmpHost.Level = 0; + Level1 = -1; + CurrentHost = Hosts; + } + AddHostToList(&TmpHost, Level1, SET_LEVEL_SAME); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + break; + + case HOST_FOLDER : + CopyDefaultHost(&TmpHost); + if(InputDialogBox(group_dlg, hDlg, NULL, TmpHost.HostName, HOST_NAME_LEN+1, &Level1, IDH_HELP_TOPIC_0000001) == YES) + { + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + + TmpHost.Level = GetNodeLevel(Item.lParam) | SET_LEVEL_GROUP ; + Level1 = Item.lParam + 1; + CurrentHost = Level1; + } + else + { + TmpHost.Level = 0 | SET_LEVEL_GROUP; + Level1 = -1; + CurrentHost = Hosts; + } + AddHostToList(&TmpHost, Level1, SET_LEVEL_SAME); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + break; + + case HOST_SET : + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + CurrentHost = Item.lParam; + + CopyHostFromList(CurrentHost, &TmpHost); + Level1 = IsNodeGroup(CurrentHost); + if(((Level1 == NO) && (DispHostSetDlg(hDlg) == YES)) || + ((Level1 == YES) && (InputDialogBox(group_dlg, hDlg, NULL, TmpHost.HostName, HOST_NAME_LEN+1, &Level1, IDH_HELP_TOPIC_0000001) == YES))) + { + UpdateHostToList(CurrentHost, &TmpHost); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + } + break; + + case HOST_COPY : + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + CurrentHost = Item.lParam; + + CopyHostFromList(CurrentHost, &TmpHost); + strcpy(TmpHost.BookMark, "\0"); + CurrentHost++; + AddHostToList(&TmpHost, CurrentHost, SET_LEVEL_SAME); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + break; + + case HOST_DEL : + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + CurrentHost = Item.lParam; + Level1 = IsNodeGroup(CurrentHost); + + if(((Level1 == YES) && (DialogBox(GetFtpInst(), MAKEINTRESOURCE(groupdel_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)) || + ((Level1 == NO) && (DialogBox(GetFtpInst(), MAKEINTRESOURCE(hostdel_dlg), GetMainHwnd(), ExeEscDialogProc) == YES))) + { + DelHostFromList(CurrentHost); + if(CurrentHost >= Hosts) + CurrentHost = max1(0, Hosts-1); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + } + break; + + case HOST_UP : + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + CurrentHost = Item.lParam; + + if(CurrentHost > 0) + { + Data1 = HostListTop; + for(Level1 = CurrentHost; Level1 > 0; Level1--) + Data1 = GetNextNode(Data1); + Level1 = GetNodeLevel(CurrentHost); + + Data2 = HostListTop; + for(Level2 = CurrentHost-1; Level2 > 0; Level2--) + Data2 = GetNextNode(Data2); + Level2 = GetNodeLevel(CurrentHost-1); + + if((Level1 == Level2) && (Data2->Set.Level & SET_LEVEL_GROUP)) + { + //Data2‚Ìchild‚Ö + if(Data1->Next != NULL) + Data1->Next->Prev = Data1->Prev; + if(Data1->Prev != NULL) + Data1->Prev->Next = Data1->Next; + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data1->Next; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data1->Next; + + Data1->Next = Data2->Child; + Data1->Prev = NULL; + Data1->Parent = Data2; + Data2->Child = Data1; + } + else if(Level1 < Level2) + { + //Data1‚ÌPrev‚ÌChild‚ÌNext‚Ì––”ö‚Ö + Data2 = Data1->Prev->Child; + while(Data2->Next != NULL) + Data2 = Data2->Next; + + if(Data1->Next != NULL) + Data1->Next->Prev = Data1->Prev; + if(Data1->Prev != NULL) + Data1->Prev->Next = Data1->Next; + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data1->Next; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data1->Next; + + Data2->Next = Data1; + Data1->Prev = Data2; + Data1->Next = NULL; + Data1->Parent = Data2->Parent; + } + else + { + //Data2‚Ìprev‚Ö + if(Data1->Next != NULL) + Data1->Next->Prev = Data1->Prev; + if(Data1->Prev != NULL) + Data1->Prev->Next = Data1->Next; + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data1->Next; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data1->Next; + + if(Data2->Prev != NULL) + Data2->Prev->Next = Data1; + Data1->Prev = Data2->Prev; + Data2->Prev = Data1; + Data1->Next = Data2; + Data1->Parent = Data2->Parent; + + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data2)) + Data1->Parent->Child = Data1; + if((Data1->Parent == NULL) && (HostListTop == Data2)) + HostListTop = Data1; + } + + CurrentHost = GetNodeNumByData(Data1); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + } + break; + + case HOST_DOWN : + if((hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0)) != NULL) + { + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + CurrentHost = Item.lParam; + + Data1 = HostListTop; + for(Level1 = CurrentHost; Level1 > 0; Level1--) + Data1 = GetNextNode(Data1); + Level1 = GetNodeLevel(CurrentHost); + + Data2 = NULL; + Level2 = SET_LEVEL_SAME; + if(CurrentHost < Hosts-1) + { + Data2 = HostListTop; + for(Level2 = CurrentHost+1; Level2 > 0; Level2--) + Data2 = GetNextNode(Data2); + Level2 = GetNodeLevel(CurrentHost+1); + + if(Level1 < Level2) + { + if(Data1->Next != NULL) + { + //Data2 = Data1‚ÌNext + Data2 = Data1->Next; + Level2 = GetNodeLevelByData(Data2); + } + else if(Data1->Parent != NULL) + { + Data2 = NULL; + Level2 = SET_LEVEL_SAME; + } + } + } + + if(((Data2 == NULL) && (Level1 > 0)) || + (Level1 > Level2)) + { + //Data1‚ÌParent‚ÌNext‚Ö + Data2 = Data1->Parent; + + if(Data1->Next != NULL) + Data1->Next->Prev = Data1->Prev; + if(Data1->Prev != NULL) + Data1->Prev->Next = Data1->Next; + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data1->Next; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data1->Next; + + if(Data2->Next != NULL) + Data2->Next->Prev = Data1; + Data1->Next = Data2->Next; + Data2->Next = Data1; + Data1->Prev = Data2; + Data1->Parent = Data2->Parent; + + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data2; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data2; + } + else if(Level1 == Level2) + { + if(Data2->Set.Level & SET_LEVEL_GROUP) + { + //Data2‚ÌChild‚Ö + if(Data1->Next != NULL) + Data1->Next->Prev = Data1->Prev; + if(Data1->Prev != NULL) + Data1->Prev->Next = Data1->Next; + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data1->Next; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data1->Next; + + if(Data2->Child != NULL) + Data2->Child->Prev = Data1; + Data1->Next = Data2->Child; + Data1->Prev = NULL; + Data1->Parent = Data2; + Data2->Child = Data1; + } + else + { + //Data2‚ÌNext‚Ö + if(Data1->Next != NULL) + Data1->Next->Prev = Data1->Prev; + if(Data1->Prev != NULL) + Data1->Prev->Next = Data1->Next; + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data1->Next; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data1->Next; + + if(Data2->Next != NULL) + Data2->Next->Prev = Data1; + Data1->Next = Data2->Next; + Data2->Next = Data1; + Data1->Prev = Data2; + Data1->Parent = Data2->Parent; + + if((Data1->Parent != NULL) && (Data1->Parent->Child == Data1)) + Data1->Parent->Child = Data2; + if((Data1->Parent == NULL) && (HostListTop == Data1)) + HostListTop = Data2; + } + } + + CurrentHost = GetNodeNumByData(Data1); + SendAllHostNames(GetDlgItem(hDlg, HOST_LIST), CurrentHost); + } + break; + + case HOST_LIST : + if(HIWORD(wParam) == LBN_DBLCLK) + PostMessage(hDlg, WM_COMMAND, MAKEWORD(IDOK, 0), 0); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000027); + break; + } + SetFocus(GetDlgItem(hDlg, HOST_LIST)); + return(TRUE); + + case WM_SIZING : + DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam); + return(TRUE); + + case WM_SELECT_HOST : + HitInfo.pt.x = LOWORD(lParam); + HitInfo.pt.y = HIWORD(lParam); + HitInfo.flags = TVHT_ONITEM; + hItem = (HTREEITEM)SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETNEXTITEM, TVGN_CARET, 0); + HitInfo.hItem = hItem; + if((HTREEITEM)SendMessage(GetDlgItem(hDlg, HOST_LIST), TVM_HITTEST, 0, (LPARAM)&HitInfo) == hItem) + { + if(IsWindowEnabled(GetDlgItem(hDlg, IDOK)) == TRUE) + PostMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDOK, 0), 0); + } + break; + + case WM_NOTIFY: + tView = (NM_TREEVIEW FAR *)lParam; + switch(tView->hdr.idFrom) + { + case HOST_LIST : + tViewPos = tView->itemNew.hItem; + hItem = tView->itemNew.hItem; + switch(tView->hdr.code) + { + case TVN_SELCHANGED : + /* ƒtƒHƒ‹ƒ_‚ª‘I‚΂ꂽ‚Æ‚«‚͐ڑ±AƒRƒs[ƒ{ƒ^ƒ“‚Í‹ÖŽ~ */ + Item.hItem = hItem; + Item.mask = TVIF_PARAM; + SendDlgItemMessage(hDlg, HOST_LIST, TVM_GETITEM, TVGN_CARET, (LPARAM)&Item); + if(IsNodeGroup(Item.lParam) == YES) + { + EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); + EnableWindow(GetDlgItem(hDlg, HOST_COPY), FALSE); + } + else + { + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); + if(AskConnecting() == NO) + EnableWindow(GetDlgItem(hDlg, HOST_COPY), TRUE); + } + break; + } + break; + } + break; + } + return(FALSE); +} + + +/*----- ƒzƒXƒgˆê——TreeView‚̃ƒbƒZ[ƒWˆ— ------------------------------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK HostListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_LBUTTONDBLCLK : + PostMessage(GetParent(hWnd), WM_SELECT_HOST, 0, lParam); + break; + } + return(CallWindowProc(HostListProcPtr, hWnd, message, wParam, lParam)); +} + + +/*----- ŽŸ‚̐ݒè”ԍ†‚̃m[ƒh‚ð•Ô‚· -------------------------------------------- +* +* Parameter +* HOSTLISTDATA *Pos : ƒm[ƒhƒf[ƒ^ +* +* Return Value +* HOSTLISTDATA *ŽŸ‚̃m[ƒh +* NULL=ŽŸ‚Í‚È‚¢ +*----------------------------------------------------------------------------*/ + +static HOSTLISTDATA *GetNextNode(HOSTLISTDATA *Pos) +{ + HOSTLISTDATA *Ret; + + Ret = NULL; + if(Pos->Child != NULL) + Ret = Pos->Child; + else + { + if(Pos->Next != NULL) + Ret = Pos->Next; + else + { + while(Pos->Parent != NULL) + { + Pos = Pos->Parent; + if(Pos->Next != NULL) + { + Ret = Pos->Next; + break; + } + } + } + } + return(Ret); +} + + +/*----- ƒm[ƒh‚̃Œƒxƒ‹”‚ð•Ô‚·iÝ’è”ԍ†Žw’èj -------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* +* Return Value +* int ƒŒƒxƒ‹” (-1=Ý’肪‚È‚¢j +*----------------------------------------------------------------------------*/ + +static int GetNodeLevel(int Num) +{ + int Ret; + HOSTLISTDATA *Pos; + + Ret = -1; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + Ret = 0; + while(Pos->Parent != NULL) + { + Pos = Pos->Parent; + Ret++; + } + } + return(Ret); +} + + +/*----- ƒm[ƒh‚̃Œƒxƒ‹”‚ð•Ô‚·iƒm[ƒhƒf[ƒ^Žw’èj----------------------------- +* +* Parameter +* HOSTLISTDATA *Data : Ý’è’l +* +* Return Value +* int ƒŒƒxƒ‹” +*----------------------------------------------------------------------------*/ + +static int GetNodeLevelByData(HOSTLISTDATA *Data) +{ + int Ret; + + Ret = 0; + while(Data->Parent != NULL) + { + Data = Data->Parent; + Ret++; + } + return(Ret); +} + + +/*----- ƒm[ƒh‚̐ݒè”ԍ†‚ð•Ô‚· ------------------------------------------------ +* +* Parameter +* HOSTLISTDATA *Data : Ý’è’l +* +* Return Value +* int Ý’è”ԍ† +*----------------------------------------------------------------------------*/ + +static int GetNodeNumByData(HOSTLISTDATA *Data) +{ + int Ret; + HOSTLISTDATA *Pos; + + Ret = 0; + Pos = HostListTop; + while(Pos != Data) + { + Pos = GetNextNode(Pos); + Ret++; + } + return(Ret); +} + + +/*----- Žw’è”ԍ†‚̃m[ƒh‚ð•Ô‚· ------------------------------------------------ +* +* Parameter +* int Num : Ý’è”ԍ† +* +* Return Value +* HOSTLISTDATA * : Ý’è’l +*----------------------------------------------------------------------------*/ + +static HOSTLISTDATA *GetNodeByNum(int Num) +{ + HOSTLISTDATA *Pos; + + Pos = HostListTop; + for(; Num > 0; Num--) + Pos = GetNextNode(Pos); + + return(Pos); +} + + +/*----- Ý’è’lƒŠƒXƒg‚ÌŠeƒm[ƒh‚̃Œƒxƒ‹”ԍ†‚ðƒZƒbƒg ---------------------------- +* +* Parameter +* int Num : Ý’è”ԍ† +* +* Return Value +* HOSTLISTDATA * : Ý’è’l +*----------------------------------------------------------------------------*/ + +static int SetNodeLevelAll(void) +{ + HOSTLISTDATA *Pos; + int i; + + Pos = HostListTop; + for(i = 0; i < Hosts; i++) + { + Pos->Set.Level &= ~SET_LEVEL_MASK; + Pos->Set.Level |= GetNodeLevelByData(Pos); + Pos = GetNextNode(Pos); + } + return(SUCCESS); +} + + +/*----- Ý’è’lƒŠƒXƒg‚ɒljÁ ---------------------------------------------------- +* +* Parameter +* HOSTDATA *Set : ’ljÁ‚·‚éÝ’è’l +* int Pos : ’ljÁ‚·‚éˆÊ’u (0` : -1=ÅŒã) +* int Level : ƒŒƒxƒ‹” (SET_LEVEL_SAME=’ljÁˆÊ’u‚Ì‚à‚Ì‚Æ“¯ƒŒƒxƒ‹) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int AddHostToList(HOSTDATA *Set, int Pos, int Level) +{ + int Sts; + HOSTLISTDATA *New; + HOSTLISTDATA *Last; + int Cur; + + Sts = FAIL; + if((Pos >= -1) && (Pos <= Hosts)) + { + if(Pos == -1) + Pos = Hosts; + Level &= SET_LEVEL_MASK; + + if((New = malloc(sizeof(HOSTLISTDATA))) != NULL) + { + memcpy(&New->Set, Set, sizeof(HOSTDATA)); + New->Next = NULL; + New->Prev = NULL; + New->Child = NULL; + New->Parent = NULL; + + if(HostListTop == NULL) + { + if(Pos == 0) + HostListTop = New; + } + else + { + if(Pos == 0) + { + New->Next = HostListTop; + HostListTop = New; + } + else + { + Cur = GetNodeLevel(Pos-1); + Last = HostListTop; + for(Pos--; Pos > 0; Pos--) + Last = GetNextNode(Last); + if((Level != SET_LEVEL_SAME) && (Level > Cur)) + { + New->Next = Last->Child; + New->Parent = Last; + Last->Child = New; + if(New->Next != NULL) + New->Next->Prev = New; + } + else + { + if((Level >= 0) && (Level < SET_LEVEL_SAME)) + { + for(; Level < Cur; Cur--) + Last = Last->Parent; + } + New->Prev = Last; + New->Next = Last->Next; + New->Parent = Last->Parent; + Last->Next = New; + if(New->Next != NULL) + New->Next->Prev = New; + } + } + } + Hosts++; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚ðXV‚·‚é ------------------------------------------------ +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* HOSTDATA *Set : Ý’è’l‚ðƒRƒs[‚·‚郏[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int UpdateHostToList(int Num, HOSTDATA *Set) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + memcpy(&Pos->Set, Set, sizeof(HOSTDATA)); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚©‚çíœ -------------------------------------------------- +* +* Parameter +* int Num : íœ‚·‚é”ԍ† +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int DelHostFromList(int Num) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + if(Num == 0) + { + Pos = HostListTop; + if(Pos->Child != NULL) + DeleteChildAndNext(Pos->Child); + HostListTop = Pos->Next; + } + else + { + Pos = GetNodeByNum(Num); + if(Pos->Child != NULL) + DeleteChildAndNext(Pos->Child); + + if(Pos->Next != NULL) + Pos->Next->Prev = Pos->Prev; + if(Pos->Prev != NULL) + Pos->Prev->Next = Pos->Next; + if((Pos->Parent != NULL) && (Pos->Parent->Child == Pos)) + Pos->Parent->Child = Pos->Next; + } + free(Pos); + Hosts--; + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚©‚çƒm[ƒhƒf[ƒ^‚ðíœ ------------------------------------ +* +* Parameter +* HOSTLISTDATA *Pos : íœ‚·‚éƒm[ƒh +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +* +* Note +* Pos->Next, Pos->Child‚Ì‘S‚Ẵm[ƒh‚ðíœ‚·‚é +*----------------------------------------------------------------------------*/ + +static int DeleteChildAndNext(HOSTLISTDATA *Pos) +{ + HOSTLISTDATA *Next; + + while(Pos != NULL) + { + if(Pos->Child != NULL) + DeleteChildAndNext(Pos->Child); + + Next = Pos->Next; + free(Pos); + Hosts--; + Pos = Next; + } + return(SUCCESS); +} + + +/*----- Ý’è’lƒŠƒXƒg‚©‚çÝ’è’l‚ðŽæ‚èo‚· -------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* HOSTDATA *Set : Ý’è’l‚ðƒRƒs[‚·‚郏[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +* +* Note +* Œ»ÝƒzƒXƒg‚ɐڑ±’†‚ÌŽž‚́ACopyHostFromListInConnect() ‚ðŽg‚¤Ž– +*----------------------------------------------------------------------------*/ + +int CopyHostFromList(int Num, HOSTDATA *Set) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + memcpy(Set, &Pos->Set, sizeof(HOSTDATA)); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚©‚çÝ’è’l‚ðŽæ‚èo‚· -------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* HOSTDATA *Set : Ý’è’l‚ðƒRƒs[‚·‚郏[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +* +* Note +* Œ»ÝƒzƒXƒg‚ɐڑ±’†‚ÌŽž‚ÉŽg‚¤ +*----------------------------------------------------------------------------*/ + +int CopyHostFromListInConnect(int Num, HOSTDATA *Set) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + strcpy(Set->ChmodCmd, Pos->Set.ChmodCmd); + Set->Port = Pos->Set.Port; + Set->Anonymous = Pos->Set.Anonymous; + Set->KanjiCode = Pos->Set.KanjiCode; + Set->KanaCnv = Pos->Set.KanaCnv; + Set->NameKanjiCode = Pos->Set.NameKanjiCode; + Set->NameKanaCnv = Pos->Set.NameKanaCnv; + Set->Pasv = Pos->Set.Pasv; + Set->FireWall = Pos->Set.FireWall; + Set->ListCmdOnly = Pos->Set.ListCmdOnly; + Set->UseNLST_R = Pos->Set.UseNLST_R; + Set->LastDir = Pos->Set.LastDir; + Set->TimeZone = Pos->Set.TimeZone; + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚̃uƒbƒNƒ}[ƒN‚ðXV -------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* char *Bmask : ƒuƒbƒNƒ}[ƒN•¶Žš—ñ +* int Len : ƒuƒbƒNƒ}[ƒN•¶Žš—ñ‚Ì’·‚³ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int SetHostBookMark(int Num, char *Bmask, int Len) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + memcpy(Pos->Set.BookMark, Bmask, Len); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚̃uƒbƒNƒ}[ƒN•¶Žš—ñ‚ð•Ô‚· -------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* +* Return Value +* char *ƒuƒbƒNƒ}[ƒN•¶Žš—ñ +*----------------------------------------------------------------------------*/ + +char *AskHostBookMark(int Num) +{ + char *Ret; + HOSTLISTDATA *Pos; + + Ret = NULL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + Ret = Pos->Set.BookMark; + } + return(Ret); +} + + +/*----- Ý’è’lƒŠƒXƒg‚̃fƒBƒŒƒNƒgƒŠ‚ðXV -------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* char *LocDir : ƒ[ƒJƒ‹‚̃fƒBƒŒƒNƒgƒŠ +* char *HostDir : ƒzƒXƒg‚̃fƒBƒŒƒNƒgƒŠ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int SetHostDir(int Num, char *LocDir, char *HostDir) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + strcpy(Pos->Set.LocalInitDir, LocDir); + strcpy(Pos->Set.RemoteInitDir, HostDir); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Ý’è’lƒŠƒXƒg‚̃pƒXƒ[ƒh‚ðXV ---------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* char *Pass : ƒpƒXƒ[ƒh +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int SetHostPassword(int Num, char *Pass) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + strcpy(Pos->Set.PassWord, Pass); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- Žw’è‚̐ݒ薼‚ðŽ‚ÂÝ’è‚̔ԍ†‚ð•Ô‚· ------------------------------------ +* +* Parameter +* char *Name : Ý’è–¼ +* +* Return Value +* int Ý’è”ԍ† (0`) +* -1=Œ©‚‚©‚ç‚È‚¢ +*----------------------------------------------------------------------------*/ + +int SearchHostName(char *Name) +{ + int Ret; + int i; + HOSTLISTDATA *Pos; + + Ret = -1; + Pos = HostListTop; + for(i = 0; i < Hosts; i++) + { + if(strcmp(Name, Pos->Set.HostName) == 0) + { + Ret = i; + break; + } + Pos = GetNextNode(Pos); + } + return(Ret); +} + + +/*----- Ý’è’lƒŠƒXƒg‚̃\[ƒg•û–@‚ðXV ---------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* int LFSort : ƒ[ƒJƒ‹‚̃tƒ@ƒCƒ‹‚̃\[ƒg•û–@ +* int LDSort : ƒ[ƒJƒ‹‚̃tƒHƒ‹ƒ_‚̃\[ƒg•û–@ +* int RFSort : ƒŠƒ‚[ƒg‚̃tƒ@ƒCƒ‹‚̃\[ƒg•û–@ +* int RDSort : ƒŠƒ‚[ƒg‚̃tƒHƒ‹ƒ_‚̃\[ƒg•û–@ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int SetHostSort(int Num, int LFSort, int LDSort, int RFSort, int RDSort) +{ + int Sts; + HOSTLISTDATA *Pos; + + Sts = FAIL; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + Pos->Set.Sort = LFSort * 0x1000000 | LDSort * 0x10000 | RFSort * 0x100 | RDSort; + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- “o˜^‚³‚ê‚Ä‚¢‚éƒ\[ƒg•û–@‚ð•ª‰ð‚·‚é ------------------------------------ +* +* Parameter +* ulong Sort : ƒ\[ƒg•û–@ +* int *LFSort : ƒ[ƒJƒ‹‚̃tƒ@ƒCƒ‹‚̃\[ƒg•û–@‚ðŠi”[‚·‚郏[ƒN +* int *LDSort : ƒ[ƒJƒ‹‚̃tƒHƒ‹ƒ_‚̃\[ƒg•û–@‚ðŠi”[‚·‚郏[ƒN +* int *RFSort : ƒŠƒ‚[ƒg‚̃tƒ@ƒCƒ‹‚̃\[ƒg•û–@‚ðŠi”[‚·‚郏[ƒN +* int *RDSort : ƒŠƒ‚[ƒg‚̃tƒHƒ‹ƒ_‚̃\[ƒg•û–@‚ðŠi”[‚·‚郏[ƒN +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DecomposeSortType(ulong Sort, int *LFSort, int *LDSort, int *RFSort, int *RDSort) +{ + *LFSort = (int)((Sort / 0x1000000) & 0xFF); + *LDSort = (int)((Sort / 0x10000) & 0xFF); + *RFSort = (int)((Sort / 0x100) & 0xFF); + *RDSort = (int)(Sort & 0xFF); + return; +} + + +/*----- Œ»ÝÚ‘±’†‚̐ݒè”ԍ†‚ð•Ô‚· -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int Ý’è”ԍ† +*----------------------------------------------------------------------------*/ + +int AskCurrentHost(void) +{ + return(ConnectingHost); +} + + +/*----- Œ»ÝÚ‘±’†‚̐ݒè”ԍ†‚ðƒZƒbƒg‚·‚é -------------------------------------- +* +* Parameter +* int Num : Ý’è”ԍ† +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetCurrentHost(int Num) +{ + ConnectingHost = Num; + return; +} + + +/*----- ƒfƒtƒHƒ‹ƒgÝ’è’l‚ðŽæ‚èo‚· -------------------------------------------- +* +* Parameter +* HOSTDATA *Set : Ý’è’l‚ðƒRƒs[‚·‚郏[ƒN +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CopyDefaultHost(HOSTDATA *Set) +{ + Set->Level = 0; + strcpy(Set->HostName, ""); + strcpy(Set->HostAdrs, ""); + strcpy(Set->UserName, ""); + strcpy(Set->PassWord, ""); + strcpy(Set->Account, ""); + strcpy(Set->LocalInitDir, DefaultLocalPath); + strcpy(Set->RemoteInitDir, ""); + memcpy(Set->BookMark, "\0\0", 2); + strcpy(Set->ChmodCmd, CHMOD_CMD_NOR); + strcpy(Set->LsName, LS_FNAME); + strcpy(Set->InitCmd, ""); + Set->Port = PORT_NOR; + Set->Anonymous = NO; + Set->KanjiCode = KANJI_NOCNV; + Set->KanaCnv = YES; + Set->NameKanjiCode = KANJI_NOCNV; + Set->NameKanaCnv = NO; + Set->Pasv = YES; + Set->FireWall = NO; + Set->ListCmdOnly = YES; + Set->UseNLST_R = YES; + Set->LastDir = NO; + Set->TimeZone = 9; /* GMT+9 (JST) */ + Set->HostType = HTYPE_AUTO; + Set->SyncMove = NO; + Set->NoFullPath = NO; + Set->Sort = SORT_NOTSAVED; + Set->Security = SECURITY_AUTO; + Set->Dialup = NO; + Set->DialupAlways = NO; + Set->DialupNotify = YES; + strcpy(Set->DialEntry, ""); + return; +} + + +/*----- Ý’è–¼ˆê——‚ðƒEƒBƒ“ƒhƒE‚É‘—‚é ------------------------------------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Cur : +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void SendAllHostNames(HWND hWnd, int Cur) +{ + int i; + HOSTLISTDATA *Pos; + TV_INSERTSTRUCT tvIns; + HTREEITEM hItem; + HTREEITEM hItemCur; + HTREEITEM *Level; + int CurLevel; + + hItemCur = NULL; + + /* ‚¿‚ç‚‚­‚̂ōĕ`‰æ‹ÖŽ~ */ + SendMessage(hWnd, WM_SETREDRAW, (WPARAM)FALSE, 0); + + SendMessage(hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); /* ‘S‚Ä‚ðíœ */ + + if((Level = malloc(sizeof(HTREEITEM*) * Hosts + 1)) != NULL) + { + Pos = HostListTop; + for(i = 0; i < Hosts; i++) + { + if(Pos->Set.Level & SET_LEVEL_GROUP) + { + tvIns.item.iImage = 0; + tvIns.item.iSelectedImage = 0; + } + else + { + tvIns.item.iImage = 2; + tvIns.item.iSelectedImage = 2; + } + + CurLevel = GetNodeLevel(i); + if(CurLevel == 0) + tvIns.hParent = TVI_ROOT; + else + tvIns.hParent = Level[CurLevel - 1]; + + tvIns.hInsertAfter = TVI_LAST; + tvIns.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN; + // tvIns.item.hItem = 0; + // tvIns.item.state = 0; + // tvIns.item.stateMask = 0; + tvIns.item.pszText = Pos->Set.HostName; + tvIns.item.cchTextMax = 0; + tvIns.item.cChildren = 1; + tvIns.item.lParam = i; + hItem = (HTREEITEM)SendMessage(hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvIns); + + if(Pos->Set.Level & SET_LEVEL_GROUP) + Level[CurLevel] = hItem; + +// DoPrintf("%d = %x", i, hItem); + if(i == Cur) + { + hItemCur = hItem; + } + Pos = GetNextNode(Pos); + } + free(Level); + } + + /* Ä•`‰æ */ + SendMessage(hWnd, WM_SETREDRAW, (WPARAM)TRUE, 0); + + if(hItemCur != NULL) + { + SendMessage(hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItemCur); +// SendMessage(hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItemCur); + } + UpdateWindow(hWnd); + + return; +} + + +/*----- Ý’è’l‚ªƒOƒ‹[ƒv‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* int Num : Ý’è’l†”ԍ† +* +* Return Value +* int ƒOƒ‹[ƒv‚©‚Ç‚¤‚© +* YES/NO/-1=Ý’è’l‚ª‚È‚¢ +*----------------------------------------------------------------------------*/ + +static int IsNodeGroup(int Num) +{ + int Ret; + HOSTLISTDATA *Pos; + + Ret = -1; + if((Num >= 0) && (Num < Hosts)) + { + Pos = GetNodeByNum(Num); + Ret = (Pos->Set.Level & SET_LEVEL_GROUP) ? YES : NO; + } + return(Ret); +} + + +/*----- WS_FTP.INI‚©‚ç‚̃Cƒ“ƒ|[ƒg -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ImportFromWSFTP(void) +{ + FILE *Strm; + char Buf[FMAX_PATH+1]; + HOSTDATA Host; + int InHost; + + strcpy(Buf, "WS_FTP.INI"); + if(SelectFile(GetMainHwnd(), Buf, MSGJPN126, MSGJPN276, NULL, OFN_FILEMUSTEXIST, 0) == TRUE) + { + if((Strm = fopen(Buf, "rt")) != NULL) + { + InHost = NO; + while(fgets(Buf, FMAX_PATH, Strm) != NULL) + { + if(Buf[0] == '[') + { + if(InHost == YES) + { + AddHostToList(&Host, -1, 0); + InHost = NO; + } + if(_stricmp(Buf, "[_config_]\n") != 0) + { + CopyDefaultHost(&Host); + + *(Buf + strlen(Buf) - 2) = NUL; + memset(Host.HostName, NUL, HOST_NAME_LEN+1); + strncpy(Host.HostName, Buf+1, HOST_NAME_LEN); + InHost = YES; + } + } + else if(InHost == YES) + { + FormatIniString(Buf); + + if(_strnicmp(Buf, "HOST=", 5) == 0) + { + memset(Host.HostAdrs, NUL, HOST_ADRS_LEN+1); + strncpy(Host.HostAdrs, Buf+5, HOST_ADRS_LEN); + } + else if(_strnicmp(Buf, "UID=", 4) == 0) + { + memset(Host.UserName, NUL, USER_NAME_LEN+1); + strncpy(Host.UserName, Buf+4, USER_NAME_LEN); + if(strcmp(Host.UserName, "anonymous") == 0) + strcpy(Host.PassWord, UserMailAdrs); + } + else if(_strnicmp(Buf, "LOCDIR=", 7) == 0) + { + memset(Host.LocalInitDir, NUL, INIT_DIR_LEN+1); + strncpy(Host.LocalInitDir, Buf+7, INIT_DIR_LEN); + } + else if(_strnicmp(Buf, "DIR=", 4) == 0) + { + memset(Host.RemoteInitDir, NUL, INIT_DIR_LEN+1); + strncpy(Host.RemoteInitDir, Buf+4, INIT_DIR_LEN); + } + else if(_strnicmp(Buf, "PASVMODE=", 9) == 0) + Host.Pasv = (atoi(Buf+9) == 0) ? 0 : 1; + else if(_strnicmp(Buf, "FIREWALL=", 9) == 0) + Host.FireWall = (atoi(Buf+9) == 0) ? 0 : 1; + } + } + + if(InHost == YES) + AddHostToList(&Host, -1, 0); + fclose(Strm); + } + } + return; +} + + + +/*----- ƒzƒXƒgÝ’è‚̃vƒƒpƒeƒBƒV[ƒg ------------------------------------------ +* +* Parameter +* HWND hDlg : eƒEƒCƒ“ƒhƒE‚̃nƒ“ƒhƒ‹ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static int DispHostSetDlg(HWND hDlg) +{ + PROPSHEETPAGE psp[5]; + PROPSHEETHEADER psh; + + psp[0].dwSize = sizeof(PROPSHEETPAGE); + psp[0].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[0].hInstance = GetFtpInst(); + psp[0].pszTemplate = MAKEINTRESOURCE(hset_main_dlg); + psp[0].pszIcon = NULL; + psp[0].pfnDlgProc = MainSettingProc; + psp[0].pszTitle = MSGJPN127; + psp[0].lParam = 0; + psp[0].pfnCallback = NULL; + + psp[1].dwSize = sizeof(PROPSHEETPAGE); + psp[1].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[1].hInstance = GetFtpInst(); + psp[1].pszTemplate = MAKEINTRESOURCE(hset_adv_dlg); + psp[1].pszIcon = NULL; + psp[1].pfnDlgProc = AdvSettingProc; + psp[1].pszTitle = MSGJPN128; + psp[1].lParam = 0; + psp[1].pfnCallback = NULL; + + psp[2].dwSize = sizeof(PROPSHEETPAGE); + psp[2].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[2].hInstance = GetFtpInst(); + psp[2].pszTemplate = MAKEINTRESOURCE(hset_code_dlg); + psp[2].pszIcon = NULL; + psp[2].pfnDlgProc = CodeSettingProc; + psp[2].pszTitle = MSGJPN129; + psp[2].lParam = 0; + psp[2].pfnCallback = NULL; + + psp[3].dwSize = sizeof(PROPSHEETPAGE); + psp[3].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[3].hInstance = GetFtpInst(); + psp[3].pszTemplate = MAKEINTRESOURCE(hset_dialup_dlg); + psp[3].pszIcon = NULL; + psp[3].pfnDlgProc = DialupSettingProc; + psp[3].pszTitle = MSGJPN130; + psp[3].lParam = 0; + psp[3].pfnCallback = NULL; + + psp[4].dwSize = sizeof(PROPSHEETPAGE); + psp[4].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[4].hInstance = GetFtpInst(); + psp[4].pszTemplate = MAKEINTRESOURCE(hset_adv2_dlg); + psp[4].pszIcon = NULL; + psp[4].pfnDlgProc = Adv2SettingProc; + psp[4].pszTitle = MSGJPN131; + psp[4].lParam = 0; + psp[4].pfnCallback = NULL; + + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE; + psh.hwndParent = hDlg; + psh.hInstance = GetFtpInst(); + psh.pszIcon = NULL; + psh.pszCaption = MSGJPN132; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); + psh.nStartPage = 0; + psh.ppsp = (LPCPROPSHEETPAGE)&psp; + psh.pfnCallback = NULL; + + Apply = NO; + PropertySheet(&psh); + + return(Apply); +} + + +/*----- Šî–{Ý’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK MainSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + long wStyle; + char Tmp[FMAX_PATH+1]; + NMHDR *pnmhdr; + + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, HSET_HOST, EM_LIMITTEXT, HOST_NAME_LEN, 0); + SendDlgItemMessage(hDlg, HSET_ADRS, EM_LIMITTEXT, HOST_ADRS_LEN, 0); + SendDlgItemMessage(hDlg, HSET_USER, EM_LIMITTEXT, USER_NAME_LEN, 0); + SendDlgItemMessage(hDlg, HSET_PASS, EM_LIMITTEXT, PASSWORD_LEN, 0); + SendDlgItemMessage(hDlg, HSET_LOCAL, EM_LIMITTEXT, INIT_DIR_LEN, 0); + SendDlgItemMessage(hDlg, HSET_REMOTE, EM_LIMITTEXT, INIT_DIR_LEN, 0); + SendDlgItemMessage(hDlg, HSET_HOST, WM_SETTEXT, 0, (LPARAM)TmpHost.HostName); + SendDlgItemMessage(hDlg, HSET_ADRS, WM_SETTEXT, 0, (LPARAM)TmpHost.HostAdrs); + SendDlgItemMessage(hDlg, HSET_USER, WM_SETTEXT, 0, (LPARAM)TmpHost.UserName); + SendDlgItemMessage(hDlg, HSET_PASS, WM_SETTEXT, 0, (LPARAM)TmpHost.PassWord); + SendDlgItemMessage(hDlg, HSET_LOCAL, WM_SETTEXT, 0, (LPARAM)TmpHost.LocalInitDir); + SendDlgItemMessage(hDlg, HSET_REMOTE, WM_SETTEXT, 0, (LPARAM)TmpHost.RemoteInitDir); + SendDlgItemMessage(hDlg, HSET_ANONYMOUS, BM_SETCHECK, TmpHost.Anonymous, 0); + SendDlgItemMessage(hDlg, HSET_LASTDIR, BM_SETCHECK, TmpHost.LastDir, 0); + if(AskConnecting() == NO) + EnableWindow(GetDlgItem(hDlg, HSET_REMOTE_CUR), FALSE); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SendDlgItemMessage(hDlg, HSET_HOST, WM_GETTEXT, HOST_NAME_LEN+1, (LPARAM)TmpHost.HostName); + SendDlgItemMessage(hDlg, HSET_ADRS, WM_GETTEXT, HOST_ADRS_LEN+1, (LPARAM)TmpHost.HostAdrs); + RemoveTailingSpaces(TmpHost.HostAdrs); + SendDlgItemMessage(hDlg, HSET_USER, WM_GETTEXT, USER_NAME_LEN+1, (LPARAM)TmpHost.UserName); + SendDlgItemMessage(hDlg, HSET_PASS, WM_GETTEXT, PASSWORD_LEN+1, (LPARAM)TmpHost.PassWord); + SendDlgItemMessage(hDlg, HSET_LOCAL, WM_GETTEXT, INIT_DIR_LEN+1, (LPARAM)TmpHost.LocalInitDir); + SendDlgItemMessage(hDlg, HSET_REMOTE, WM_GETTEXT, INIT_DIR_LEN+1, (LPARAM)TmpHost.RemoteInitDir); + TmpHost.Anonymous = SendDlgItemMessage(hDlg, HSET_ANONYMOUS, BM_GETCHECK, 0, 0); + TmpHost.LastDir = SendDlgItemMessage(hDlg, HSET_LASTDIR, BM_GETCHECK, 0, 0); + if((strlen(TmpHost.HostName) == 0) && (strlen(TmpHost.HostAdrs) > 0)) + { + memset(TmpHost.HostName, NUL, HOST_NAME_LEN+1); + strncpy(TmpHost.HostName, TmpHost.HostAdrs, HOST_NAME_LEN); + } + else if((strlen(TmpHost.HostName) > 0) && (strlen(TmpHost.HostAdrs) == 0)) + { + memset(TmpHost.HostAdrs, NUL, HOST_ADRS_LEN+1); + strncpy(TmpHost.HostAdrs, TmpHost.HostName, HOST_ADRS_LEN); + } + Apply = YES; + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000028); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case HSET_LOCAL_BR : + if(SelectDir(hDlg, TmpHost.LocalInitDir, INIT_DIR_LEN) == TRUE) + SendDlgItemMessage(hDlg, HSET_LOCAL, WM_SETTEXT, 0, (LPARAM)TmpHost.LocalInitDir); + break; + + case HSET_REMOTE_CUR : + AskRemoteCurDir(Tmp, FMAX_PATH); + SendDlgItemMessage(hDlg, HSET_REMOTE, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case HSET_ANONYMOUS : + if(SendDlgItemMessage(hDlg, HSET_ANONYMOUS, BM_GETCHECK, 0, 0) == 1) + { + SendDlgItemMessage(hDlg, HSET_USER, WM_SETTEXT, 0, (LPARAM)"anonymous"); + wStyle = GetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE); + wStyle &= ~ES_PASSWORD; + SetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE, wStyle); + SendDlgItemMessage(hDlg, HSET_PASS, WM_SETTEXT, 0, (LPARAM)UserMailAdrs); + } + else + { + SendDlgItemMessage(hDlg, HSET_USER, WM_SETTEXT, 0, (LPARAM)""); + wStyle = GetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE); + wStyle |= ES_PASSWORD; + SetWindowLong(GetDlgItem(hDlg, HSET_PASS), GWL_STYLE, wStyle); + SendDlgItemMessage(hDlg, HSET_PASS, WM_SETTEXT, 0, (LPARAM)""); + } + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- Šg’£Ý’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK AdvSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + char Tmp[20]; + int i; + + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, HSET_PORT, EM_LIMITTEXT, 5, 0); + sprintf(Tmp, "%d", TmpHost.Port); + SendDlgItemMessage(hDlg, HSET_PORT, WM_SETTEXT, 0, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, HSET_ACCOUNT, EM_LIMITTEXT, ACCOUNT_LEN, 0); + SendDlgItemMessage(hDlg, HSET_ACCOUNT, WM_SETTEXT, 0, (LPARAM)TmpHost.Account); + SendDlgItemMessage(hDlg, HSET_PASV, BM_SETCHECK, TmpHost.Pasv, 0); + SendDlgItemMessage(hDlg, HSET_FIREWALL, BM_SETCHECK, TmpHost.FireWall, 0); + SendDlgItemMessage(hDlg, HSET_SYNCMOVE, BM_SETCHECK, TmpHost.SyncMove, 0); + for(i = -12; i <= 12; i++) + { + if(i == 0) + sprintf(Tmp, "GMT"); + else if(i == 9) + sprintf(Tmp, MSGJPN133, i); + else + sprintf(Tmp, "GMT%+02d:00", i); + SendDlgItemMessage(hDlg, HSET_TIMEZONE, CB_ADDSTRING, 0, (LPARAM)Tmp); + } + SendDlgItemMessage(hDlg, HSET_TIMEZONE, CB_SETCURSEL, TmpHost.TimeZone+12, 0); + + SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN134); + SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN135); + SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN136); + SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN137); + SendDlgItemMessage(hDlg, HSET_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN138); + SendDlgItemMessage(hDlg, HSET_SECURITY, CB_SETCURSEL, TmpHost.Security, 0); + SendDlgItemMessage(hDlg, HSET_INITCMD, EM_LIMITTEXT, INITCMD_LEN, 0); + SendDlgItemMessage(hDlg, HSET_INITCMD, WM_SETTEXT, 0, (LPARAM)TmpHost.InitCmd); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + TmpHost.Pasv = SendDlgItemMessage(hDlg, HSET_PASV, BM_GETCHECK, 0, 0); + TmpHost.FireWall = SendDlgItemMessage(hDlg, HSET_FIREWALL, BM_GETCHECK, 0, 0); + TmpHost.SyncMove = SendDlgItemMessage(hDlg, HSET_SYNCMOVE, BM_GETCHECK, 0, 0); + SendDlgItemMessage(hDlg, HSET_PORT, WM_GETTEXT, 5+1, (LPARAM)Tmp); + TmpHost.Port = atoi(Tmp); + SendDlgItemMessage(hDlg, HSET_ACCOUNT, WM_GETTEXT, ACCOUNT_LEN+1, (LPARAM)TmpHost.Account); + TmpHost.TimeZone = SendDlgItemMessage(hDlg, HSET_TIMEZONE, CB_GETCURSEL, 0, 0) - 12; + TmpHost.Security = SendDlgItemMessage(hDlg, HSET_SECURITY, CB_GETCURSEL, 0, 0); + SendDlgItemMessage(hDlg, HSET_INITCMD, WM_GETTEXT, INITCMD_LEN+1, (LPARAM)TmpHost.InitCmd); + Apply = YES; + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000029); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case HSET_PORT_NOR : + sprintf(Tmp, "%d", PORT_NOR); + SendDlgItemMessage(hDlg, HSET_PORT, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- •¶ŽšƒR[ƒhÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK CodeSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + + static const RADIOBUTTON KanjiButton[] = { + { HSET_NO_CNV, KANJI_NOCNV }, + { HSET_JIS_CNV, KANJI_JIS }, + { HSET_EUC_CNV, KANJI_EUC } + }; + #define KANJIBUTTONS (sizeof(KanjiButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON NameKanjiButton[] = { + { HSET_FN_NO_CNV, KANJI_NOCNV }, + { HSET_FN_JIS_CNV, KANJI_JIS }, + { HSET_FN_EUC_CNV, KANJI_EUC }, + { HSET_FN_SMH_CNV, KANJI_SMB_HEX }, + { HSET_FN_SMC_CNV, KANJI_SMB_CAP }, + { HSET_FN_UTF8N_CNV, KANJI_UTF8N } // UTF-8N‘Ήž + }; + #define NAMEKANJIBUTTONS (sizeof(NameKanjiButton)/sizeof(RADIOBUTTON)) + + switch (iMessage) + { + case WM_INITDIALOG : + SetRadioButtonByValue(hDlg, TmpHost.KanjiCode, KanjiButton, KANJIBUTTONS); + SendDlgItemMessage(hDlg, HSET_HANCNV, BM_SETCHECK, TmpHost.KanaCnv, 0); + SetRadioButtonByValue(hDlg, TmpHost.NameKanjiCode, NameKanjiButton, NAMEKANJIBUTTONS); + SendDlgItemMessage(hDlg, HSET_FN_HANCNV, BM_SETCHECK, TmpHost.NameKanaCnv, 0); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + TmpHost.KanjiCode = AskRadioButtonValue(hDlg, KanjiButton, KANJIBUTTONS); + TmpHost.KanaCnv = SendDlgItemMessage(hDlg, HSET_HANCNV, BM_GETCHECK, 0, 0); + TmpHost.NameKanjiCode = AskRadioButtonValue(hDlg, NameKanjiButton, NAMEKANJIBUTTONS); + TmpHost.NameKanaCnv = SendDlgItemMessage(hDlg, HSET_FN_HANCNV, BM_GETCHECK, 0, 0); + Apply = YES; + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000030); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case HSET_JIS_CNV : + case HSET_EUC_CNV : + EnableWindow(GetDlgItem(hDlg, HSET_HANCNV), TRUE); + break; + + case HSET_NO_CNV : + EnableWindow(GetDlgItem(hDlg, HSET_HANCNV), FALSE); + break; + + case HSET_FN_JIS_CNV : + case HSET_FN_EUC_CNV : + EnableWindow(GetDlgItem(hDlg, HSET_FN_HANCNV), TRUE); + break; + + case HSET_FN_NO_CNV : + case HSET_FN_SMH_CNV : + case HSET_FN_SMC_CNV : + case HSET_FN_UTF8N_CNV : // UTF-8N‘Ήž + EnableWindow(GetDlgItem(hDlg, HSET_FN_HANCNV), FALSE); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒ_ƒCƒAƒ‹ƒAƒbƒvÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, HSET_DIALUP, BM_SETCHECK, TmpHost.Dialup, 0); + SendDlgItemMessage(hDlg, HSET_DIALUSETHIS, BM_SETCHECK, TmpHost.DialupAlways, 0); + SendDlgItemMessage(hDlg, HSET_DIALNOTIFY, BM_SETCHECK, TmpHost.DialupNotify, 0); + if(AskRasUsable() == NO) + EnableWindow(GetDlgItem(hDlg, HSET_DIALUP), FALSE); + if((TmpHost.DialupAlways == NO) || (AskRasUsable() == NO)) + EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE); + if((TmpHost.Dialup == NO) || (AskRasUsable() == NO)) + { + EnableWindow(GetDlgItem(hDlg, HSET_DIALENTRY), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_DIALUSETHIS), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE); + } + SetRasEntryToComboBox(hDlg, HSET_DIALENTRY, TmpHost.DialEntry); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + TmpHost.Dialup = SendDlgItemMessage(hDlg, HSET_DIALUP, BM_GETCHECK, 0, 0); + TmpHost.DialupAlways = SendDlgItemMessage(hDlg, HSET_DIALUSETHIS, BM_GETCHECK, 0, 0); + TmpHost.DialupNotify = SendDlgItemMessage(hDlg, HSET_DIALNOTIFY, BM_GETCHECK, 0, 0); + SendDlgItemMessage(hDlg, HSET_DIALENTRY, WM_GETTEXT, RAS_NAME_LEN+1, (LPARAM)TmpHost.DialEntry); + Apply = YES; + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000031); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case HSET_DIALUP : + if(SendDlgItemMessage(hDlg, HSET_DIALUP, BM_GETCHECK, 0, 0) == 0) + { + EnableWindow(GetDlgItem(hDlg, HSET_DIALENTRY), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_DIALUSETHIS), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE); + break; + } + else + { + EnableWindow(GetDlgItem(hDlg, HSET_DIALENTRY), TRUE); + EnableWindow(GetDlgItem(hDlg, HSET_DIALUSETHIS), TRUE); + } + /* ‚±‚±‚Ébreak‚Í‚È‚¢ */ + + case HSET_DIALUSETHIS : + if(SendDlgItemMessage(hDlg, HSET_DIALUSETHIS, BM_GETCHECK, 0, 0) == 0) + EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), FALSE); + else + EnableWindow(GetDlgItem(hDlg, HSET_DIALNOTIFY), TRUE); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ‚“xÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + int Num; + + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, EM_LIMITTEXT, CHMOD_CMD_LEN, 0); + SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, WM_SETTEXT, 0, (LPARAM)TmpHost.ChmodCmd); + SendDlgItemMessage(hDlg, HSET_LS_FNAME, EM_LIMITTEXT, NLST_NAME_LEN, 0); + SendDlgItemMessage(hDlg, HSET_LS_FNAME, WM_SETTEXT, 0, (LPARAM)TmpHost.LsName); + SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_SETCHECK, TmpHost.ListCmdOnly, 0); + if(TmpHost.ListCmdOnly == YES) + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); + SendDlgItemMessage(hDlg, HSET_NLST_R, BM_SETCHECK, TmpHost.UseNLST_R, 0); + SendDlgItemMessage(hDlg, HSET_FULLPATH, BM_SETCHECK, TmpHost.NoFullPath, 0); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN139); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN140); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN141); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN142); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN143); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN144); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN289); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN295); + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_SETCURSEL, TmpHost.HostType, 0); + if(TmpHost.HostType == 2) + { + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE); + } + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, WM_GETTEXT, CHMOD_CMD_LEN+1, (LPARAM)TmpHost.ChmodCmd); + SendDlgItemMessage(hDlg, HSET_LS_FNAME, WM_GETTEXT, NLST_NAME_LEN+1, (LPARAM)TmpHost.LsName); + TmpHost.ListCmdOnly = SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0); + TmpHost.UseNLST_R = SendDlgItemMessage(hDlg, HSET_NLST_R, BM_GETCHECK, 0, 0); + TmpHost.NoFullPath = SendDlgItemMessage(hDlg, HSET_FULLPATH, BM_GETCHECK, 0, 0); + TmpHost.HostType = SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_GETCURSEL, 0, 0); + Apply = YES; + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000032); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case HSET_CHMOD_NOR : + SendDlgItemMessage(hDlg, HSET_CHMOD_CMD, WM_SETTEXT, 0, (LPARAM)CHMOD_CMD_NOR); + break; + + case HSET_LS_FNAME_NOR : + SendDlgItemMessage(hDlg, HSET_LS_FNAME, WM_SETTEXT, 0, (LPARAM)LS_FNAME); + break; + + case HSET_LISTCMD : + if(SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0) == 0) + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE); + else + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); + break; + + case HSET_HOSTTYPE : + Num = SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_GETCURSEL, 0, 0); + if(Num == 2) + { + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE); + } + else + { + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE); + EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE); + EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE); + } + break; + } + return(TRUE); + } + return(FALSE); +} + + diff --git a/htmlhelp/FFFTP.$HP b/htmlhelp/FFFTP.$HP new file mode 100644 index 0000000000000000000000000000000000000000..f9ee1915edf1a04b395f18447b7a2f0aa92e4d9f GIT binary patch literal 73767 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%0D+C-1oo0Yg-yQ03s9)y#v>Fk$ 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≠0t{n(vtCt3Q~*63{=;u7Wot*u(k{WT%8w1vF15ThY64 z>md@?w`KC4MBajc#pkE`@beMWgh1JacF?hsuK@3D4$DpQq9JAadX4c~?;!i^SIcG2 zP2$3@@CNIAbOB(SR=6$r;v*4ZMh+wm6o?gAONK`PF#sCxd6m?Wv9;A}^YS>w>C@@o zwCdxj)Q?jY&KUdg-1no)Q&CN!Ra0)6i;k%~(|Pl8`&x}mHA{bo#OU&C?TgBx?`r98 zE`ba1p?W=-vf7B));<-0u!%L6C;aFr-`WS8t_i2#_iexUro-dL`KBwouzSOMb5*3z zwnVer(ZiaQ;BZCR%$Xq|2HPGW(md1pfm!B2D80&N&DpUuoKu!cr9a7Q=eX;t*XEkz zWoZn^*?`jH@AjFQ2y)Y-T;TP#AKR&{`Abxi^C!Q*1pn`OWy9UtT z3?G_~Kh9hkm~Ga2xLgtO@y71>ye60VZERGI-@Cb741rUyLg_Z;M#@yg%bbNw!po%{ zh<)U?)5>v-4W0O~%nEGVoA>r>_6CBm6sVintc4 zH{JDNUa3CzE$OuP(0m@N`E{-SJw12!Yv=k5UNiJMd}I3iMPE337N`n6)JxFvW22Q! zVM6kO%*!?Vc}nXcwiI8M>5^9i2kR==T6t*RyRxEn=6IVF_Fh<_yH7N-)z=*bEo$yJ zKfP-4r-&ug@n@KKbUk;$f`a1t22m`?XSdwXo0KejS`85G)0hyLXNtTY+wsFOo*K^f zd=_Kye}sZr?LHaV_46J1AN1>7h=-2;)RLM~(MbHP$%$z*C={^N0R_&}DS}H?k|99> zHDGvL);M^r9rdA!ED+A9D^SAKf#dUHG^%`kLzEx`ok~=OkFmy_D_^S5D>bxalejw+ zj*C2xKiljW$D}^$E9~K(KTbXl08fZ|DLBnYns1{8>tyw+cy5DUoK0I4!1qQ`EC<&lK8sSv&(a277S%KL;!ZsXn(6UO?Sksm$4lVPYcl>o3)Vev83~vF7f$!J@EX^LYH^uusl|zX=d4= z>!K>@TbwV!iMGCjrRcB@iw7yj1>MpwOQbnZ9W^h=sta`jq)acsVWc8F%%#;G>TJ)in@rL<2st0Ru^ zoztAus<~gE%ARybtg3^SP(w}MTp@`Cy5WEIRRgq|NU2!5%UyoXVbRR@kvgVQJuZj! zx7pQLm$l=*$vSMV<@W|Hp+S<M8IP+f9v)X)h z*Xiq@^ZB@s|2u~orW^H@)Qbk9w5X0#XDOFR?IP(2 z84*J#`b57tR&HY+;~}_KOXk_}a`>o!#oRu(^U+1;N`G0K2=xXlqy1$6oM9nge$y@U zM`fJndaP%ostC($mFmmBo?Dx7P95x`JnzQ!Z9yA555C@(RXfvt7h8?x9SXUwzGr{u zzo~Re70Nsscf-E4&lr%t=G&FaCp4sj(5+2bEw26^Estb8SE)-HT0R>>I)z{AcV{cR ziLaaGj?Xe>&{R;6SfU~T5`hC%ZYMk&A^uqfVadv+vR`(x$Ch6KZq3Mrlj)T64VcHb zJGzICo4ZvOjUY)6j-iRjv96d>hW`!CO5wLdjbiG{mE_taB4R~&m+LCD+f|WHHV3s7 zFw;q=(WH&v!NY#nf{b(V_ZYRFM{6{!fs%#pZZi2)Zs$+Wob`iAd#EE81cB$!+`bmE zs!%)zjMMU}7Iae*1qIe_%9_76l&SQi(Ieg`qCV7beM3v2(T4>3`3|S+*CaJ_^n%N| z53HVkh*qk>=<M1vptmGq{EM{cG2K8269+w|rAwU?(POcAa3-FLI^w8r~@I ze9zp#M>rA$6=m9}n0`Y(c+T=VaH7v}hx41n`%jqNa5iC~!P~aRo^!SWM92dR%^tH5^CxYG9%kUST5}7|3 zQt+x_TFY01cECjBLht1>!u?$kH7EODXoM1}JG1!@_rFsx{>MD0!pyxg`%_(jKjI4f zk(wSlzT>{DQ<1%0=3aDu+ryNOzq!MlqnXDPz;(xs&m-kFew1rg)}8WVQ3z?nNF;7w zJA*o0g+jdghuyZ?;bL9i1KF6zHCjikMlY-UtzO2??gQa~?=T-h0Kj_L(+NwZ5mes3nf@lQmXLPi`RUpMww)M}^;EbV0;@T{# zt%bQ|(2l1CUBj#JccQB)cud>I8E{9j1;Y_5^Yo?w)|Nu22X8CbawB-jfP}OiPB<3y z(h1_gPRo(QJnkWWzeF?;0Ii#H;+o~n!|ABC*23d#U74Upj8Gu0zptp@^rI|uyTfxrFJ4OuiB* zuvkCsz{b`oR~B9kvG!1{m+i|bY5G*j_5E@tJ;{C*mYs4CMxu!e3&$DdYt#gXsuc$_ zk6+r&&rzz9=cFYq{!tgobb;Y8uOy=cN^FrdT>G?1o`QDxmYw3WO*BxEK? zYTg!ntf?%|%f927?gbd2p)rHFg^i_G%3{XCdHRTTvypkV>vsA54EB4G{dBPva@RsR zaNh}xf*=D55jfIRcRA0r)WX+_7_4~jJ1{(Trjpq)|Az|?#6l3Lb=nyvn(Qwvw0FOI z0TYmB6^1vD;%o4e%a`^ER#wP;An^L%Y4JU{2`&3*oc?srr#$WD9WDZz|5;%&ih4(q zJpSySwQCh8lR{Rp9*ZM$zP=uNke=6+pHbx~7SEV63^N4z^R)sPb@kZVgT6LSxO!C? zPGhBaZBN%(ZF2gVkT^4Jm|F&!Wye2Z7x9*FC6`r_vTu7@}I=Qzzai6X@2` zeNf0K>fq^jtDEOd616{s%1K6&=67ZG5*8SX_nUGla`^IKd8W_*%r?z2n7%K4KVilE z$iWN3DVsRo?%*uLR|B3a%n!;^kO4`kEsty~f07+jo>Bk4loy!H`AY-%y_+P3t;7WA zd5*LN>v_z}Q=1~m=KVgJ=csp6=^b^=oT2-Q-2j)kw-A1rl@bzf`)XM)N|(76iN~48 zdd}dThJ!J6AH~tqj7`WmeBq04R)fsfWnGCK31!2R$>Mx=2kOO9eiEnQK&QS`)>!zJ z!YSG(y|8_$Cz<9YJBoz?tq&T-^kbPaB^t+ZUv~nf^ zO8zXJyPkv!R6FfQ0#0I>{T1AS;lss$YYOlDxB)ur#xAIZkAtS?Uiax?a$dkXB1O-ZK|!cCP7f6c;l@-|g}pHH6asM{^?zDTaKG z#Z%ETjrSSaY(S9gFN^khF(R*wz1RYG%8~(QcSfnE#(TR_XIz!gp78rET*Hl5_4`sG zPcS7*Qd$bRq)1ny^_Y>0%IB{-7-tz6*sBH<8nG*yH$`^SMcUI-FGb1VsG+8WPiLjM z!O|4cu6uzCRVWP$T}~W{PKf{-9@aG8e8%^PDj?1S`=0Wm`k1n6DCSOP`|Aew z`*3k=uMXv`F05(=1qPIVyCX$t=TONTC$s0OQ?Hkg56jH(U0bP4_hud+oQRq!)i&q< z5>cnsJfiE;cp<15A%!^Hx&9axNmQ}6tJ^NbTyOkKX_<5_(Anp_G)G- z_)%tau`j6>4thS;XDr6$ep>NIG4j)akZk*~;o1-RbO;?8v;5+i(tXOI^h*6F* zg?tjmR7CaM%L(qFm9G4OI zzL)o_N1jY4HU&3rEH0OEtS{PQJm9OPkYqs?u!! zK@`)lao+IzBt895p=v1}VwE!lxOl>0zl%Q9RL}?Cnmd?k2hMn?#f4TS8E!by*3SZKjD{Ic!XvO4dcdYk z_4tS4lD(~Q*t!0D+2j&67*0CeJ_5ek!C*^?uWwVqLNJdD5r#yvJ}u?dgG6Jc83lj( znUJu5Bl2wG(n|B0Fs_q-T5)=0e=(EE+dwl)r*#SUQ^~m}{qHeAzTB-^hA}w~K>Tg5 zDS6S*J5lT3Ivq8Qd~pRM>DaP6OqcYaxFk2z#G~Z=<@jY}1s;DB#(XjrZxe1xSl-_kJBrVt%aWuq7FL$RCEoX*^YRw zR4_{go)|xnD5Neg?VG8rl47BgR0~itIUUrNuNmGT1k|s zGF@@_#h{?WS4rpMXa44_zY}O95Rzj(jR-c%m`m$-ux;=sY5is_ix`8}I>Tg4@`yE5 z)f|7Nt}HXXzpn(mVYc?m(LatBSMT<-z0hh^ramTLrp~~T^kn}_3?uvI*P@5&`V@;`eK%3oY1)`1dF+7a|KG^y_E`eq7n50UTZ!5K9SNpKF z_I}SW#=9x`Ox0{?)e$1Frft_3%DO!uiM>oZscr;|0qNEh#4xm2^~JJmtZg#JnN$Qdd@ zzdk27P&Fj*Q4KEYIyzY%j|hQD9(((F`~Y=-8$EEBINmj+YQ@vherhy@df$JzRMt$9 z>j^&lf)?-D*tlLd0m6t5%vcSdi6D~d*P4G;L;@%7xfBRcY|oD=|BM`cMxRL&DIOqG zx$Zw*A8W2+u;Pqa+TvfI{YA)OPUEQ>C4PXSBx@6L&IdGRaqNsIcrF?X{9<2ib1rU9 z#ol95U^o$~bU|E9(Yn>1{gYbqM4CkR3eTiw(ZPYDtJkrqa7>i#lr)=vdKIWo!8eHm_;<^vRMD(S~~tKFim`)r&ky$qZ1YVjzn_+{f9uW z|M>D9rEM097sb2f%-3f-FH_-4>&XZ2&6C9ZwALGZzcX5u(7O8y2b}gck zTmJNx9QC#kPgbb!WzI0VcPGR^7FJ5{N}GZfK&2*w1T!s;tx}XTChi?Z0N&iJp;*bjw-{T4gzLGApt!hq&-0*Te_&){8Y^IsI5!%~LzeI;@ zQ-xKUnaYOIy$4B>Gi!!5Qs@~>tcjx>bV`zw>Jwqx)hJqd3eI^E#LMDKC^z(j?wqx=0Rc;b!I)F8~in zKeWlPp&Wz&2;ILx2LIQT~qV%U|O5BQIfF~7^>#kQ6$`p0inLVd0gk3}n?;Kkj`0d`{ z2K|#UY$v9O9U&qQp_Lm(Aj&9;vFl0Ei<8nDT8hqcIDXWk3h9H!J|ZHl@3P27$-J#< zY6Lxi7FsRbXQ~R?PlG9k?d2M*saeBiMPdrWCOR9$6>D}2D{Kc#31v>+7q;(dxP*qA zoEDR+-vp=6nUs0}X;0Q5zRVUi`E^_rH-v-UOiDED?BWNRUFm)wB35 z;qusE5WW)P*ZzRT2Vt&Q>bu^iDLep6CnK!fY|*?)JJz}%{I)KwUNyrnC-i!tUlR#F zTp-`C>XVU>ES$lZDEn-stJi@~zFb*|mcA#;2mPCtAsqwtTy_8BP{iycQ6m+jA1VM(+7v9>A4LSRSVof0K2b*V`bL2W8? zn2wYwI=k$Rs1?!$;5<}GB_+<_s5`4hiBp6n|4TT>lCo6kk=PoNxP@uxQRAcjUgeO0 zfL3*h;F|k#ywpU!kF#tIu}=2x9NFd#UKM&-j6OthC#j8C1FaKn-GYzPGD<_q| zhi|9myW>B=5LYFk1*qsiM`*qU>oYyu9jh26CLU>`{x=eKnVCAl1!pCqbvk07#-s-3 zugK!nh?HZufP~UZhHM85_m8{#DP)}S1QmN17M}}g`xT`b45mo<@x~Ku2EqIBFxwJD zBrxR=<;mWIk?-!^e9Gq|*-aS#WU>9M=BnVV5XTjVd%Z046?fbZp`R8eGvU&pbCL^_ zDeqt5eEU&hGv!jTO|+H~5_TT6Uscc{O`VsjOtYC0LpFcfctD4y#4d9 zF%G*g(e_z6UtI?KZ)u3&*OtRg9Vv6(=H4ay3@3wAK;{AIPtX~NTR@#vZN@c`becF|Og0B=QbeTRbTFwNVg{0YKDVH{L z)mewJ+5$c2#U|h0tnqM#Wr;Ct9XYl(u%posj|(YHAKoVYksJ4#o}d*`)|O_}qdwKT zc9E))ojM=_hc&?qesLKfzt*80Y+IUEP18=#RfQxHc}S0&^vkLrUG=iZ*fbT|iBOwh zmE>~}LkCQB_cu$_8BV|xN!nFesd&*M3RnoRNv1aDV$jj{Zm{f3)N(#w58`+iR@Lr z<;RSqNTOnA_ECBAIdng^JxU6*R*1vT`eOtf0mZ15fYPt|NPT{nG4&hOmfeewasG(x zM#7nvFKkonNcBEhTncDs)ET1tE#{jhuP1192=b|fe{|`Ta%)sMe0W;7mMSDs0j~tO z8Z(oY6f+{2Xjha{j;)W~30rZ`KMvJO@U5V83z3=~uqNS6z-F#ADN{m|0JbF2%Oi>V z{$CmPQebQS2VIXBErCeOTGha&vGfD#J?mjQM8Do*rmo5i8%=c)Z1@cRm0X^ynyl zMP($AxNGU+yaasOazUgCd|WV5GcqL=EdYTF-aBK_WMZO%^N2E4b&&yMNmE9ui`PcD zx{toV)Zt`5s51fN>lOMhLK9b^pRF$wpIfF6gh28qe7&7!VihR~HvqsaaW8_5o88il z3fG21xKu9ZWaVW^>hSNJRo+)20bGN2tW=u1AsHOc58gS#ihc{3r`vEGny;?_}pDrXJh$%^67J$@O@|%RC+dc zl9}*r$6;MOM*3B@fh?R7sbSa57_c^a`Sb9F>x5U7i+iy@STu~WGzvv06~RauQTr#P zQ>;rAkDqxB+=WV#b6_`g8TKWo4t&N_xT**5a|MtIW=8M+tf;?k&Wtj^^;k@Sf-AGk zDt{T50n%T)E2h?QoVeb8WY~KqFZ1G9)))CEku43Ac5F}5A##Fdl&Z51tM_3Xe>SmR z=gbZwxEtplkmZRW7EtC)CSPY@`S*w?7{PhDgLoc&`(JuE;gp7Ylo&S^H3HmL##|0! zhNWRxrmscuKw})j4jg~*gyh6b_BI(tv-HeXY!h+)|Is8s4ZyD{)Qm>!0x^QphvHUt&;&$>)^l8-Ni1~b|{MaVC zZf>G=ssBarIrm#?pjP!e^JfPC!ztu@-@}=e@BiKT2cz4IoURZD-hM`G>+0Uv+#ij@#7BJ<|SQ@3YjQde2i@vp6N%@;RDNK{TN9s&+K@o;ACLm7Zm9A<>3| zPsFt%$CH&T_jA*8#~v?GL*zd1$C(mUN7)NKBr`|Np0B9YulrDUTTchiE9H(iKQnnR zy?ot*bxX74mV!PFdtrrmb7Di2;wYmSok_~&IWg1_cbMGs#8ZD8LD;r zwRI$w`!E$*WSYRK1WRv(P{sG7bjmZDb+A)Q|0ifutwcMkybN8k^4}Wf+O$jKSsAXb zV;0b^@m%xba#pV6Ocmle&aX+->!cil6lzl(591PE_-Tg76pNE;Jle!$d~ez06%Y;3 z>yFMkEVwovy|NfXqMc|@OX}TC!cp}6>ooi&693@?X&{$)1(%9JS9tO!@iY~q)1aKq zxOOSZ^U3UCSJF_A4ivk(Z+=B?`aJt7H;N*;b3I~K%yq;2S7)+LV z;bZUtmG+AECJL0KG>lHpES(na==#szvq^pRv3z(*Ia zI`)ntD9Ut#{l->^kfPl_x6oW|6IwI?La7g*U2VsUPTVtOTN8%Q;rAh>N7ImD_aM&4 zcR+Aab5IH$3+}v)g@$4)0QF>YX71(s;cZ3h#;zw(f;1;*<2cjouAxyFvH(y(e6+2@ za(8dNR}5{;PEV0o&__iFX#mP-ECrUxbx+Qs@|zdCUg;a@)pE(;!>PVH z)$mNGiZ%5Qi_Y3S7%A`FccT2CXZwy6j{ldhx6D(n-$!t9YmVS+b1X ze&SM;fXe!KA(syIFAF-=Pp!f;nX59ojEYF$OJi20IJ*F|t0Rxp57id+f8YCyiB)y) zN~2Rpg&xejy1SkY2?8H-tgBk940kcN&P|jsONjUmnk%MGCsXp{E^_tpD3~HYsP58a z8L$K0#ox1(gnQDXm3Qh#x!XMQx;t%$^WGc3JH+Tj*m5?l=D4Nb5eXX}c4~KA()ps8 zpUsKv9O&XVo{9TkKE@c|)sIi(-)Hm`0s*l3Lb%x6iCTgkI1A6&*%-f2mqWAI2O+5_ zHx3Fq1-%sJlyQS66)*S|I|H0t$oavvxu4GlJB&=!EF>3-YzQ1P`sGK9L8szzmHl8 zGl2Jb8Bf}JCx1coT3W|`JKN)nxQ7sFt|m=(U68GiveG(#LZ3V5ePnMsJGs-_aKsK6 zS$huV_pP^ungHi_=>OL$OdnR6ZoB@joO?t)uRW|KgK2o@eq0JYqxB51Mx>t};?V^? zY|~{=J$`$nbJ26_dT32rV4Xj;9!}C1xOS?AYZ6VEQWfMMV7<9%^(+>c@*+t#iym)2 zSFEs<+kx!^>TAoo%(^8W^tTI1bkE94cCv$q12d0aZuW3!pZ; z$Xus)x6aGNvgx-9*ty^G;ca?sL3p3DFY=Rx9_Bm|&?M-!kwRs9Yx`wUEAy9|V=|Da`&OLwibx*n_Uz>oaeCy6P-xU-8!+RC$zY-6NGegxk)A1o zQ{l%K?tURs`o7w(FA%893Z%(%=aaBTHB&I*)X$i3i%t6H%vWe-37z&id*1m!s4LIy zLmb<-;rQ;WqJU_-ELv?<=a-fUw=MW=@wfGv4B6HdrAxNXo+gSi`&UliQ#;F$#r~NJ|dDM6CeJ89ptHlR;KJ=+V zIdkkLW~C(rd-M#3(&s8{5nI)4X3DClA$p|L8}VwKx?$Tx2y|liCe5^eg#*(Iyn9cRijpH2NfX-WzxOZ5oa^nKX4>VdPCU~i^oA+L`ugi6o6{1(%szk!+)XAm4Gsgi*%`-Fb+ zlPhqo%#ZYbmBjPR0@Ms>PfeVdyLxi+(}`uvg=E8$;uwF*j6xaYPaCK588>Je5t)+` z!Lj2KtJTq>V?SFXp8jtH215PomJC(V?k*RFbeL&iDTQi;XxF|}IX3pm8A%{>Z}X)* zn_FxbjD~SGhlv0kSzCyok}$((Aog=3GhB5r3E25>&Ky{>qy9BE$FM;X0JyT_e!+g` zCKPbOBfj1`3OradNQ2(um7PEYBEwzI^uH!IDYRnI6*GS29=vt`KGkhN!M0f&(F zC&T?fKflFhTC9WRGqi9NS=dz3w4ettQ)3CKY_9znl#fM2K9xp3RkIq#;s^~BISOV; zJ~juA4tA!!9e)yHMM{RZ)<(w<*Si)6-$>o3Ye1;cpYtyY;=nnstaPTGU7KKrf72Df zpZ+1j_OnF`e=qA4!__-SJL}Ty1eZl7-Q*~RA(yl3axreiVE}iTkAKg{^rq^t%42}| zC}GX(A=J*gOQr#{PlztcxNn~!~G=h}5=WXYD1G}rMAl>M>(%_zA9C$~rl zr~7)!Y(6S;>v`i(A;8}BNILdfL`5Li$$@a~4NEgouXxb=au9IiroQY4nBv#5r8$5@|ZdS6Vq?Y^;CLJq-Y(wqmhPNEdvk-KSs zZr@&tE}lJ?-U`%OlKhzQDLU}gct@jZcO%zsX^obbp8;Be~XVp7X*#SOdnlnfs6`UP9SQ?agbwT<3H{S zlM};B)C>7qijUnAu(mWviFevbPd5#N7O!<92nH5G`#N27u8)KH-QO)#n6NV>0%(sQw$C6+Fhli6rqMoSVO$U5}@&5|lZx+2j!h?Y8 zMgNts{$*?NE#t6JwW>3rbwfY9D`b;4;$JA_@w6DN=2&&tuXFx;!Ui?ixGZI4;do)K zXiiWkLMzj-TPLGrcw{fEYel;B&D}K4%dG?b{DISBErvTAyH{g!^m^#v44x}~pbXug z!EKkO9@mSoP~9oEIl8+EG9cEP$*h&Pd&HVx)fjBh zUQ_!+zr{YQe@2uZS2N64XD3Vq{O3fB<;w0w;(fyozqMa3Z&CC8)`9IJUd3_Q_Xp;>ulyXjEjQe@Twe{ zwO9(A|J(oxIQQVQoohESk@x?XI$4L5DrDHg<_K%jDcLIds#exiPOYIo+I;n~lilNn zv*9Fd9QsE{oKT8{3IoGfn`5+#5%c8)SoBMk_H<^d3rlpAaBNo2YH?KIzFWHaw0U&L zL*?2h>=UQ#I?mP5Zhrv7rhuW#AorYAvEubHJnMU0omN^)m-pzD;dnYwdx=siQUooYytfF6(}147Ah{LGaJuVUcF7CMx`oGEGVz!^u1LX zO#?baB3vNKW%!SN|B=j3F{QU*S@;9BrU76{bctKZZohv z>P}FcNo`bVV)S(SDgpnQ23M3Ayg6AjW~0T`Vv--PR8vNoRnq`*d*)q%=mliSeK^m) zCe4m=!R~L;(`)(hPNPFl(PxfhqaR?t14IaG^9cQ;<4X6`VI9~WdP@!ruaOvQz(wHP zVW_Xv;yvu{7Ab(Rw@}h*mrT>@U-?B~Ws2!DZL3v##urA(pf4Bk zUyqki2C3ExG8i>}iiVt=*tvDXTA>J7t_}gb<M-O5d*>pqJU-=> zjveqGHQZIZT&l|Fh{V*1QGbW^NY>4n0-#xh;rEHikX4tj0KcK)^LRl{Q>Z4SBX%2p z-^ZV+Bs!j#g_&h7iW5N<)!*VqkKW$RDD)_hBLO!jm+ea&-s^v>v@`Y+_j%%9oJM~? zZ?t;X+pnrIa~9+C(XsGuJ0Cd_jbhD_VFnwun_y&}i+_J;;Z|<}eA$NE7tXg=*_MGFx?UP|{tg1zr5IXY;-Ac)q=Ji4 z?H-np!W>@Y25u=!b6L&m`fjF3hn5{KRCMz#<6bMNXqn369&bJ0$q2%cSj{1~F^V4D z2BvPB)iSINb6d0%r?!*>vf}tVkIB|6W19xdr!PdqDG>Y*V_RN=KMGVz{$yiQ@Uw?n zF2{oj2n~2}^RH8guZ*jxFW;M^^!F%2hcq#v(NJIIkm!g<^ME-!J(1c{lo# zJF8rW4go7$`}ONS=@#k2za#RJS-9!~(2XUs?ld}o(tJb5uzUB=uD1b6{=cbj*lABy zinyF2J8QBa6_?aX$<+IO2l=E_3S8AWR`#-SVMX}p{vYYU6#bGbN=$eTb|eqK`BKnv zj`FFqFFtGCDnVyJ)rBp6x{!PXDY4(E3HRrts=af1s;-}#Z$HKDiKlzd3Wq7+JeXz!+96TU%Gc3=jsRRJfEIfZWU8oFKv1pBaH3l>i(CN zr+q%^-m^YpEe%_;nYMz(oX)OKW$@Y5LwsAB=vpp}QnJ`~IkNa~#KThvT$KD1* zDLm3HDVLvIMLvOMihj8{MzB8kb&gsydZ)@u=OCKSKD`#%pWY#pTo6LJI{8zMg5)p z0vGhwXTAJ5K?Uf)y(7P}Xc|D%@3;peh6{lQ{4JFo2XI5UgvSeFS!$W>B_grE50a+I8OOZz&iQ1Mtu|BT^~zGU>4 zMw9>^?V>;o&A0FRNdoi+>%~Q?$UR}-@I@)HPTJgj)`A!GKD1VR`sD}s^8eP&WEma? z(pZ3Y#Y~Hv&)9t$)_r8a*hp$Tx;xPCD};yW{|85#2Tr%6ze_>wA-PZ0XnxPMgeTbQ^<;vF$oC&`K4(`ic zO=yYUv-OWG)np~*3T8@=)_fP;DWqVB=^~*nw*LU;V9aH~f*J2JWZ^4vZ zy=$7*hEu(+TEQf#+d+6Ke~hAClavSzO}OaBmor&OYf{N4Q(<$q?WNwt8LrgTc~vG$ z!=~B|yu=>-bxwE@mY&E~^0D_Vn|d3FZCvf99qYte({?_^V?BBoNAj-I)aetPjv1+I zrpU(8OI+*oF)(nLQ`6Yn?;N1FnUv){72a(vgQz^xcI|~#%9t*3tx??a^X;6w`wGrO zjib^|5pm~RC&2Y->V%W*+$p1gOI-N^g(sXbZI+&G)+iAfBzQ>Ikv z40%m-XwQ_sS5q%I-CvMekp_O)H|`;J;YIE8BO3x=`IKJ#gm zc(L5x(CFWMkMp5foBy=6FrygRy)0LgV4B*Ayi^!M$Sa?iLy3WV&@4xfErYPkqAbNt z4%VPHJzDK0g=&9Crufb%mA50^w^y%ppOn9`&v2}yXY9e!1gqKD+3-O?Q1~$A2{UDl zI?J#a!R)!B<>iC~B>Ize43SZ3g3-|%C4Zq5m06to)05Y_IXJf4Qwm6Jf6SnXe$@RJ zli3C{oZ1PPDpc>a%R*gB_xd0`ZwE!M12a* zYOVVwLC!Tp&N54V~hiT$q*0#+|6#pWI@xdjw6f2}Lf zHH&J10D0vw&0|@v0l@!~Dw8pw*`vG1iY|-Y+D0L+f|}{q%iPIQ$~Dq-x1l3P;a6hM z+%O!^nghmLz1eq}SVe16vASwi#8OJ77*s*Vf*6m%oa_U^>o0m z6fclGr!(f=ff*5oo>PT?vxxo&_AvD?@X_DRFG2DBMV_@K!uN#3gg&^Y%4Sq#B;tyh zc8sBhGxwev*`d^*d_mkE52N~(l!*7G6(fw~-w0|fJAtNt&>FB>x_U`=mH0^>g2zoY z=NZ;YaZh3RspJ`%3Lie%y0<{*55M^-Qvv%tJMkNPuDvdIO}ZSI9A@4?C;KDM+*d6{ zas85TOpVBXBvGSksUph(ErBhN26^uqfGb5xPHGHpf!jbsuv1DM7Qx3ITfk98ogJD3 zfd4-j5K{En8p8n0K=~;e6$gh6_9juFkPXeQx&(OspMcbl@glYHG5f?H9HedM^yAzLPO&ZNH5k#NKg*K?h!k51OU_q!j4zv(jR=8V!L zW2sMk>rG3(prPf?B2Qv(M$Y=_i5BrpK9&QFlbAA?Fc5ySFUbnx{zAAepqyT3YS@Kd%>+EMjdAdvDQ$9_+j zb7=qM;r0)5dKeT!`*axyo$w4(N-j`k=*PgbPtig#y2?t4Qi&rIDw|7)%8>c|SxpwR zAoNNTjK3q(JoPkAvrh&M+SrxRs{^PbPszrPm_||M3|J%dHIEN!Eg1i6jO;QU+*Za} zKf+7U`=+Y$;828xh}c=o(?Fc}-}J*NHW1I7j~5rs^KoS5CDaT)$KLSv`L4(Cdd4Rb zpz;;DBiAdr<(y(P9iGLoj{QT)BJ;gub1uJ(>`xgTx!KMkLq7dij3TOWg2JG9z@<6H z`u|)FR*>#E8De@Tjq(qz3hoBk#k zpGo^%uNRZt#)OWvtX7RA-d8iJ@f)ihJ+E3TS2T_*MkLlw23fVoXGlDH0lR5U#Y=){^x@0Zmvgzi`MVG^{i5p6C6~H9}@Vs=bU}3_gNvr(z;I3 zEA*j=e|vbbs0aZ*OE`(lTj<`7n1$b^kF93Nw@!~Hn(>4IyBslq&d^&5!(HO zUc@lBgG2W>^W+8CSu$7c_#%CK24&wSBVYbOF6kM=^;H4J`x zD@Pj_W`_m--uGE%mj$;f$95M_8?!3Y-$s(5>__sV=5KbpddMd^9bYZ+HVN#YD$?fRGMhTK5uUlkxVP4qyOM#0N{*w|6xC99 z?*~-r1Tfy!A~GhF1lrZnSl3SF`plkw`a@En!8lJw7NSHa5v0?D(-R& z*$iDHa*@?VDa@SA8km!dD~WFRs8Xb1~1LLqX)5$ps^5tv|g`$iR*GaQ2Z7_$63%_WtPi?y&My$v*+v|R9if5jyXW_dGZV}5#w12hDRD18Y5L5TxHv5JUL=Xt=LUR{8{Z=}+ z9A662{&<&Si2>BdMTy|T>X6Au`msXU&xlxXBD%77xU+i9BW}1&+{+uv3!E?U6O{Vi8oX@(R&naVB2Q$;LDNlb-~n*q;&FpS<&g@GG;QvcGaADC! zs1-P%Dx(?`?xG_>Ss4TBG&eKi{E_GE&#oEIeD{K`D@CC=@=O|$EMQV?(vT4 zq4(YQ$DEmMx@0{t@7CHyGS`8dec{>_NIOebl1Bd#PaIKFpmw9~kg?nNLD*(w{>bM| z{;5R!ay_>i$5 zKX1OE-4TVY70Z}$l)Jm1W5IVa;XiQ;k9`o@LR7h$8(&tp05>k)Ioh0#)l3K(4X{{h zQG9@BI!zb6Zx$QX8R@_Cf@3=Q^yX3yGfdisB2v^$l~c{Zu~h;71M=q0zlq~zUh}*C z-0?I`{FEz}3qBAh1iXIF^I0`cS-UmT*$QWf+#bc+v^jt>OSL*>l)s-C56i6>)~61+ z3Xdd18>^PR>a`gb{5_ly1B^CQyA3PSxM`lLh{HO#`1Bp^I8Sf3_E)@rIxyPnx;(Hl z+Co3R?kk_QpUJu9oPZ=w8N8G-b_$)IEW(k7={`6L!JbGouz1Ono!eQIAC+n86GSq9 z2^RCKQUnpW7WIiX5hOvuQW4bP!<3aW8nNR0S(T?kM=LF;+LsmYBv>yt2Ce>*6teu? z$O;2iONtWGZ|%26+#eZ`Ur_xDKGhYC6}6dO)fv#)a%cYrj!xeX#)qLX_z}CM8$#5% z-nmjXGres*k=c!%nnqIRvAI71Po570w{+KC<7hr(j0tUj#j!JD}ON$M>vMa-onSK^%^*_NW$m`nj zQ9&b)1c}77>+03VZ)lcD{`rzI1CP9!jO;nm@dC8@Jlw_o)i5!6yzBL}7vEptbC=wR zCN>r;NsAaa3~3e>?2Qs@^aA|rBnGfz-($0-THnLU#i)&t3W+ro{^}lqG(&vyJcRs~ znI=N`Y_PFY{iL<&bp=SJ*t5@9t^4omf|hz0oP(>`J0XIJo|T~qwT4#p>QRr+n5l@J z>W=;w2Dc)VScS%YLl`yp(KL8mDJgmjHxMr-z!YaPiX8_BL5gDzVy~UEXXQDp+^~9p z?0#Wc!><}aQFt#8nda>wyTbjRi#NZ>K+zadg?ZT~r)VN%r+uuSInhrgWPTlv{Uz}W zX`wbXQCIeK#?RqAUC^ZD;MGz0rx>wGp!!}#b?_Eab8*A|BBI|K!Rnb?E^Ck|^fP2G zYi-|(VzHri@f;6bQ`uAM6HRRnVV8xQp`~gw{Az~1Y)tzWl&jQZ#6yr{whUaVSx=lO zv8`0O6JH;5I(-u=G|9l%&KcJNgnV^>W*9A*5AU2nE}i(qTyl-iJnHMOKmL$VFPKgy6OP z8n7>Zv^EPh|?JsOsw@bpvsC=WhY%3{L9F*45 z_bvP+a*1iNRDvUUqK!?@0zVzs>`m%TExG_)m2IqgAnDZlgtLVkr2{*IG8Q^&K)gz0 zgijB}+XICZ5snq&CUQs%Ut)rB?CkW}+sjom7dYIx)g!B3V^W6Go zCZ7&V7bFDi_y^2^diYC{LLH%YU~q6y{^_O&@J;t(A@zF8hlEv2My_rK$*3uAqm z;wFyx;N)%VyTbTXvc5@{z8@@Cq5TTiAdRZqCYzfOL(pAjR`emUtkg$i&tIE?N%~i~OSn(g!KEdXNTku=7ldR( zcbx8`Qa9k*M*I}NyQ4L)O@9>>;8c54Fh$uHxjfZ9D*>_TuPSWiUg&V)@)g z%A9h6#lm&Eoj<$zc!XLN`ZKBEpb!sPn^eigDb`Z9qdO+t`>5t8&RDdnZb#& z1VYl!z#pWuPvd&Z><2fA=ntmMI)#S^beEgtob@h^N0aKiV+t-DNItH0&i>AGz*8dz z%i+DhmY0=8i7C+)V|&$#vta9Q6v4Bf`~BaXKf(8$ULEHOkUSnQH_Z0RDvSiRwgMTY zXkAUAI4d(&KDN5=oYbSIr#>vTD(w~u-*V^s44Yk>OM*>zXNAbhWd?jP3(aXv$W7>k zq}6IFap`j%jik|dQKB_X+H9R)}_ZdkSd*{b=?K#-M+D)pLpE$r}&K^^P)T~p* zM%Svm$+W10-!Lo@CEICut8J_CFQi|OO*WXrVky>Kn!Gmo7qkP%FUj8D?FV^!+Hz80 z-nQl;lMtMIfDdk3r2Dy>G{iC7(h^~;*;dy0{7CQ9uVl~2gW2%ss?(Z-+ag0LS3}OY znt|h@o`2lS;>EGF_+Jrg>t+3H-r`kAnc|}Iar-htWt)n z5&xe+cjw-{2ykn5AB2DWTi3~mN-)lMKg2Sb8Bb>V&+~p-@R$UI9CNXnrK0}?j*%hH z$?QtV>bR)m=KrWTy1qCRGRmkAgE3%R=L@ChIVWId_rEDV#OL8y^}bV^XitE&J!A7R zO;P>Q-Smxsxs8FnKMDm-o&?ADPwRcofm$ysfql&Z=;{6-I=yX03{2ob?R($q!6;nX zRA|wZnmPXsqvHqJ%yi56NgRBuj(oLq#?nKtA06wAEH7n?aJC$X%J0CQ)kMs8KGs)m zr+FVbC(3Bij-hYO)o*zupZ*X4GnmOhDPr=#9;;0`aUWMeQ8@DULZ z*rk};S9>{W--eI~i>>q+R8G$xUxE5T@%v$nq)K8uy1$nC>qK{6E?;NS-7RIR_E+e# z>%wkE0*mM%oY#EZiTWp!Ln!}p8g-LG*s10er5VYE{pUvy&)im?B%!Vd;XWEX&aCq? zC#8O37appoA7u#M)p3F)ihj5i07qn~DXQavp@X4uCE*NZ0i&(^hu zUQxPLjMsV^TA~eLW>j$dp-(@Q@^OLX<1kE3{GA<^Z8t=)=hcNH&_&4B`>uHZ=)07m zIl}AlbNNZ0LU-G0jrD2+f>~w`vYDr@O2S66$q}W6#8swKcN7+Rf&9hNj7^HJ@pX|2 z{g$r^40gH>RxT$kYOe8*2zPr4_*$?nH)yx?7P@TVSL6!Z@$R=wTPZR4iJ29Q%-C+@ zOB+jza~FD#P4-=?3O;V*yX(z$P=wcp{pU>LoL1dGrp@=>GV{jGd_`RYhnXcRZ^73^ z&ga2WJ**U81!ZGbz9Nf)ihvrG>{RO0b!M62I)MfZ*sTaW%SBzWuDtPAMfcz z%2IpNIib$@jKAkkEF3}Ur4UUaB^p0Dr&%ZvM1AGLeL&4>fnB5HTQ)c0L!l@ZS4?|7 zHt6in@M@v@K1Y9c#Oqy7t^KS%>b?a-2YovsPa+o1pk1G{hnw^=9L(yoC=dnUbL=~# zw0&53J+4cdek@kYlIsYz_htH&=+4h;tX5NTvHi}q<8=V) z4IVWx1(oedun?#%e+zFo)%0jRg-C>#bZIiR1q%zH8W&J7iTqV{%HvWB-Z_X_kJ^JL zy%Fz_pXd59_t~(1r~UQ5o-F3tssErhu?TCV%^t(lfnqKHK*HQ{P5)G-JO zV*y_F4f)k@6<+WjP4@$8|?3v!4d&b_!J+7XH&jrG?e#u*2vs2Y__*t&2!mN@ARiJWpxmyzaO;;?+=-I%$ZCQ ze;TLin%Ee%Ohy7OK%hV%PB*BHpW`$ zKMR6NyJ}>cAPe!8CLTpasi=bsptZpu<1+tYBEz$*=kVdxuXnYezL>s?ixnj>KQ>eH z)W;IG5wh#zBSM=9=+sVj4mw-?ukH1kNqf!#UXn`tOP&|Jc6i^&^!U^s>i$IXlw_qK zsh>Xi>R`+(Bn!Lg`ioaFLJ?c=8{ubx?8!r*%tDRJ2Ex$q)x}z58O9;%%$@flf*LQ$jaRwYz8uRvj+vM@}?AYIqC!#o;mG` zW3bG*PI#y8Y7&=xk^h)R_xKo8Ry2#} z{)I&S1|-{c|Eki-2mHhC!J+8Tx(u`&3-uqcjK$?QA(HzsGcBV8$;}JsP6hVfbl0Yn z5oPp$HqreBjQBZlOCMIFx|n-gua;4q{`?T!{8L3cY5U7RN>}^h8{uyL>*;<+c{dQ8 zHb_V-&LC|+=xe4nuWF*T7~N+pEo{dxY#a9dU&Rq3w{o0&!MlWE*Jf0#)32qwF4m)C zwQ{cXF1MD5wOv;^AJv%yyec%|2koFC*GKnaZO3lWD!f^aG~P8bTPEk|&Ec%CMaxu= z3{d{CVjeqDh5e1k9Z5vD{S*B$3CWgIr>3xn=OS(aA-}L;3WE+zIQarxqqv(D&#*)PH|DTs~L~4n8!~SlSx0!R#{x9 zW~3|}W-@^je)3a)nGheW+~Qb+i!uV(cA*|FYMrZA0hl+tcvr=Q?nw=GL673yvOmN4q8@RCjcBRIxd;S^(m z6B`XAO!r(nhC0f&zB;Xk6lWMi_crOhgf|m)4)!8*TGXkrCYvHL$g~uLIcx~9ef1Hz zzJ&zqQ9=53>^B8%_`#phE?>y-90I*w{uHy?fT-KVE?|xL>^rG*Z3^_5M4A#@T3vr@ zx)VBbYHID6&Qk1fu;a#sZXJ&CGpc952V(FBb(>ZK#<1VHZ$lRJ?{os(mg1_$#p2?K z0}OQO6TDnxG4YAJ6f0+f+PDY3ux6Kq78U>Vbmv}p0^5I;I>4X?-->$;LCu@0%}PG@ zv@V=U!X-240L1}ji-?^-b%^#9rqf~qIk}U8iq8)NqtXEG42GCcdRA)r)4AL})9TiX zRx4RY$*GajN2{*v95G}`S@CRT7ZnMsg={pK zq-bz_{?YbwQb*akjnsX)odLi4CR*bvNI4qKTKK9NTSBA(&F>l`=1pI-=&E>(RZZcFEKbr)Ut18dAjo7w z52s1(s0$%Th8+k1jeNmX6zgkJ=L4iodc)~!?W-pO?Y=+C0DF13y+aAH+p?5BbVu=q zkuUQVr`>56Zkr&SsG>r3=x{shSCj6-TOy55%S|mv3uav?@G3D3{GV{0Z)aFaV2b35V&r2YkDV-3V8GH48 zl@r*r)Pn#>WsfYAwLT^ykTuP#HE|?osi*5ZQM3WVuyXEJfn*&K&4Q%D<3w8|7A;b?P&YqHdnCm~w?$#dA?YpP#M!7~^jRQ*F_5=+aeo2X+P zrceyn^&D%8dcYPYzZeA%x1KC=ejvoj;-7?4S%2Or!}fl>xH$>A(qf+RS>0azn_3mQ zTIzp*WrfL(ZbASM=y5xf3-x<_ZZ5q%g8zcqGe;E(jTqXK|XasvUXbAQNd+ z=~8K;certecvqRfUOKw}AbO(pC~obbQJ$pyK^vl>Qo26nFl+B~A>aHp^R$5*>^?^w zH>wm-Si@DipUJy$*+8c7n*Aeg96fdc>cJe8X42}kyG93e(e`TS7%+XzHY9^FrfbB( z6x>0)KfW^e4{u~L4f@pqW9A7N3`TLB_C$B`k||@Sd6#mLFQe?^ZL^lC|e z+?=#V+j~HZ-AQivj;~x*=$V3uH1yc)W@HEzD3t2z_)*<& z@5~YW4{{T>Ys^dDn|75jcE080m_1w221PgrJBLJ`504K|({SGKO47e6x5Orvq%O$f z)&n^%lTMzAvWr^WS7(!(3o?72{Vgc`v}_C*`oLL;c#^AvI zk!>$4S7-Zsp+oAQcA4ISnWs?t^lX;fRfkGcgzQJEP^s*`K0Xx<1Nf<)AUQ;OTT9J` z{R+$)R#h8^ja<0|`ns{S(qcE(x=Jf#Vt}eX!sVlGJNxapaeMZ?)+;5pCo<%vnKvZJ zEF%MpPoE@lvB4=;@pMPOuif33&0`boY=kjX*1!8XW`1}R^0HAuwM`_3S<*fmgrPnQ ztq5xN$C3+DiWwzpDqWY#Hcd!J%wsAkb9MaLoF5v0HbS$)yk?;+JK`-}<8!n- z5{3nXOPg?_6ePLfDTgMrK8ZJ7MpndwY2rWbt=*jcQhn5;TAc=Ui5Wfy%Ab&I4MD?_ z7hRkSrUHih`jrSlqX8MjV!^1|OJqbZHn9xtEr~=)0_V}g_>7k^9$qIZkWY)ve&g{B zGnj#uYQcFDfiKkoSHa6Fb#%EH*6)90Nq;STAx$Alf+QEfVtxLU;+Fq&qK5ja(;DlF zBtsMip);NPRP)~Ug~?7YvHSx!5qnCg2{r3cL3~y(f)#V?dVkjl>}WgcwL^Czf3POA z;vIE$)hu>i8RYZ&!fmZqzQ3WG_oUKPh)AgW$uawXem@R$wdm0)r?J@JWI-^xG(t-{ zbr?STBXofZODLBUgm?9+@{L(Z2Rb0M9?hXF0Yz0D8eQ4RO%Q!gFZso97k|)!)fAl8 zs!@tY^h0&@C}sIz(!f_f?Gv!~YQf{`644K=r%mqpe?ni9V^o|EwBPm3=Fw&1O_>I4 z@{a0ICzde3=ofh~^0mDC{#C5rx^Z3GVGCBNW4Uv*RwWgR{Z5>@zZyEMQhOXN{E|{hZ0` zl$C=o#6WChCRj91PFtsNI!@hGx3fn1GiZ8y(8=ZNMNJ=DeN18>I-ebEsN(Da$|2&Y z;9`^XQ?|zchuxf9HSF3y`9c0wwD3)m{yLF;AbLXZ$dumAuwM#4$me1T9Ny@CPD{I` zr|EnrNL9`ow9RhV-4>n1SLjw(4q{Oqx-lfA4V5^$G{^G=ew&uG+(5x~E-)m&~q zW@GTX=wV6xyL|s z83k3$XiM5@PjRGYT0SkV0^lf30jV;u8!w|3|~H_PybaSxX&oCB*NZ0hMyS_9B6nsb==@0 z9BEd!!kr+9Ku=Z1!xpKme6E;Viq-f!F8p{`-2XgW!#>2?drM2*caZr6g;y;%s~lCC znKQ6U3jA`Rk%Q(2%4$ZR`!lSs**;my3Jm|!y84EF!I#(2DwKHOET^sh=68XYIQJOd z^AWtx#o^BG798RgdFHd6Oe7NN?nLHdAp)%#_gnN-k2y;m6G3u0QF^QLJE;n*IxGff z=EjL;XuL-hha=8=CSHAgHr?5nau{EF>}t5B7bVrSQM;-%a!^Mi!xyU@?TSPAg8D-} zDKlgSV-KdT_~5;&aiWMm1}DlP!xga%r~y~$ueFa^ebcr5`2FdOM5l;O8dWI3t2qfG zytIc086!B|#c*T8N3Qupy~F#6D_OUa7E&wsEGI^?>+J!17=7P!TeKxD7{T^>?ed({ zV|_N}xn77?QM5ofqxRYU9L|qq1|a=;?9^rs2`mf=iV@je@_jL?$ZH8G)R8Q=f zD0|eqMmz4)s%5!94#|6ob6fM9njz(CIz$s$4Zr-yg-gh5Ih z0#3x)|1Unq)c1i!c2eSM{*AdtH|-e5O!-gx7jzJnlRMFbmo-H=)^v2tLpaoCzZ{AU zfB7wY`&}d6t0yvNI*Y5!)7$T@bjQKNq6(A0w+6cAcXT2K2k4cQ`Au3Q4Hl?Zr$!i3 zM?CgT29S%}dLZQX&U@Q6O-JyTU*T$4vJu(*2-E-=pSg z!V&UV7v*;lNw(DMEtxu-MK7L*X|{f0fuqsUN?I;AR2rN>!S{(DH4w?Y(>WC95$XS) z242%|WVk|c9V;vga}>#^8lu`ZR>DoL49!$ju4?w5D7XFgZhAwA{k_=Qdm%F@ji2b6 z4a$MSD1Z4P&l{%lD0hHU1|9uUORALqveHtQ4-1cyshwz_z6@tgJ#n{jOqYJg zMZH(_R%9%j9pFR%kW@HXE(uxnQF*@>BLGswj1{N5!C7fv@2Wl5 zVhrd*h)%g9q3!6zo>009EbL3O$wzYOcCj5=kWTzCT5rv}H!GMZN0I-0U2B}TRD zMeGWa&6JiKZHuF~uD!s#(nZL_;cLL^-Z)E3jtuVCeH;hMrX-?KA&(ytV6VC^tuS@$ zN%PiYtBmu>&vm_*gWx_Bv#;eUBM31fJ-?LkO&%K zd-LC%znahA(Nr=8yW-@ywWsT7_&s53XtQLs4=PqpQVq3OKBDH!#5m#b1%zn&;v7z$ zM6S79-#i;ItxRx`D!hF8wb;4r=#?T_ViX!1Zm$`)eS6)My_Qk(K6}rzyOL-Up$O-6 z$vS!N;+XPURX6MxkH}%XZOT7yXlhyC|E|<4q?>|QLF52_-G2XCKO2HWkP(RMP$YncR3{aVRPU0=}@ zK>N(W}CVsUK3VpQiUt%0_4#U({mY<7d?Wym(Gtj389}U>i1TF8aId2XzNq)WLv7 zo_nSnGaha+dfc%dP(-PJF{1@&t~bQ{!R;>~q&EX_+b87tj+ zPKz95-~cp}6-wmuX~-{*^!g|jiKLk@6!T?Z3YG^D-@$Zy3`o1VYGb%4OKr#<(;S3U zY^F;pB~MM0M2T5sJf-fFt$ugfN6~aC`1drZ=1OH|Y+0MIK3BY#pkESwwRi=QyK#?( zw3VB9R9aU-hbE@6E;v$Rs7ZzJ(m0<{LDboOP(O&|RBR1{#utXjP?v{BR$t@8m(<6_ z5_`e>5P8pJk?k`7ZVq(;2w2LiD(_9(o@MlRr;2N1@R~QmBGX? zcnK}i-GZJCE;XmmNeHFkpP;p5eBa4rNcb1`jm}@#R@rH9`L$bZ_-X6G?&I^;ENZw@ ze6m*8-Y<-l&D5!SriUFfvr3gpx*hv#t!ug~3sKVHm>KS@ed%A>Zw*#+37qb2v}E(ejfJCinFSw8a`>L zRdREs{j&tR>8+**pCA&a)#ZWe^vOAepUF3Tx>q_x@CuBVWCR@=g_DIm-)>;={z{sVj(5=VQbCQe0Z$G@~FrLYbDR>0j#ymFq&|yGd+5y zsXKa{uu%I~@Q`~N|0zrpCRN=p`E!(RdvHE7G)*x6Z&;q|))enF(&V6d22`PiI9Nj} z5x6Y{-cCDqm`gMbW{iga_ZPr!Ii4wFYKE`w;ZPuMI*~KFDlJgEkx?Hc<-vW`YI&@| z&;FYg$SGzeK8mrDhla=tm*&ke7tztY>HFXXa{!Ub$179=Q6bqTxa9&)lM;)m!%K}& z00~L^5FZxJ>x-;*&lm$j1(&;5M}q|_hTkacsy}B>5>kDu#s!bnf=oQ1Pbk6VR!ddz zf>%4}~`3$)0iyP6=^KN`Y^|68x8M<*fiI|11_&(@(IfXF?EM$WcXq7f9xE#IZzR7L~xc6hYj}8Mu17j+063(Xtz6 zBf-W0FrSS3!)st$fgZ-%7VX228jNlAVi#43w2DU)QxN__v{5Cg>pM0MjIlp9Uo5?$ z%`QRMrSClU2Y#}}1z=RkKR`H2QhQ(1JpmEa{rTC8}455=UaPBxUYm`D)?;*03YGIWtnVsDl8xcBl^PfF; zb(6(lN_6wGp5uBM)6rrdip_m3HSgLg@yvOC#}ZEg?h!-apiYmWEb6!7AC1SL{(B9; zxQda7zaGf4`TkyL7ds00Pb(q~m}N(FzhZ;+)uKXn&QL9tb7MS_6Dq}4GZ?~13og8< zv1}{>b~}hv)^FJ_k0qgGy><}Sqtkxfsq>&BqUk#0-wjPu8baMuFFEVjXAO@R!skXf z=Ys#BL)3^9qHe3rW;<`UPa4Afoh1MdjC! zK-VT+u5+e^<|R_y)jqo74F29f7k)3GyC9l8?49Zx@H?8vCvN;e;#%0=ym52U1&Xh| z``7eqcf!SJ$+l0swLK%Lq~d?3v*K-q4Ej|H$Lbv(KmZ14x$c8osL_zjn8oIm+cGH=ZExYEww+cX(tcDlfI7s42cTVhEtyeVKXiVI*QWM2#N07^^z;BLDCaxeFCS@wAYokvDf9q62cI084fc_vvmxG_sxX13M<};@T{K!HC_(9L)Ag6ONL((pt zc(dksBu7&mDGQPrU2Cv!ik)_4dV+P}n0h~1?iUL3$q`70?o6T+rD?x)HM$AGZA9R@ zH&RY}NGljBd`>+#e7ORThj7vJ3oZW=AJLuJDQW%|so(05*RhK zSzO)ukzKg{tbla)j0R^1RtQO=aM(MQ3BL@=Kxr)hnzU(BT9jP5hSz6A4tT30uXpAA zoaGRI9y7s5wJ=RhY`qwG!UOF^+Y{a|w@FcGvf}%tV|7ZZ@Uci>%fw0nX(2mCn3M-L z;r=Bve|$8Im}}qJdG-o76Aw0whqDQ*$bc^LiP^?VJT`n;;(axpY>fsnb>J`O-V{Sr zYVk9hmL381+#oIf{#|4$bg(aB7(q}e{F8z|{$3_6$F7b{{p^}7-1K2j*ZKe)BQ{lU z1#%(VX3hhMcB7LEPA8^2$d3kVW0&xn@~O`I!L|mU_IT?&^&2>S%TRACPPcgjsS}Gh z9?}HZ7@WK4|7rTUyEy8DXFKJw(0r|vlr{7DZARavRlm9lm4Caq^sdX4el+{1`GQpA zW#NB8VrYj(Z^sF%4kb^B&s#X1N8{sp3z^&AvEXZ?(bxu*>_Rcx()JZ{%7q=yg7xe! z;$nq(wkW+y#HB&22Xi#d5RzV;ICiZ&UT}P}-3?!^cb(vx{_So~$N#V#G-Kee;rRf| zdg1K?CNE$28vhe<)5-UD(S`s$K*GQOhv=o%=kGp_e*DzkYQ|N5$=k!KUogTC03|*0 zqoxdbcG`c6?m`0v>kkf~#(@RD)_mU;+w$0(Ykh=1&nM;#|I@91n|A_(i2v@M=)J!G za&-y_EGEz}kq!ObKO+C|2PDdNqoh9mLSV@$NJ{RXk8j}ggFpDsz9XGHd*UAw2d@8R z>-~yTo?T)?L5L#rtW3lGA5>m0_0u(poP05>4c^_Oxccg^o0(U|j zBJ`~neYk+CeDqL(gj=(tD|~#iaQBw`CIYpVNx+#8)$U$uJ%m35MPiBSU;_Dpi|99n zt7Kqi<8$-|eoh&K2f6hs)U|Sw2DtbsFhB8=;Pi^#ftRbK8M-+7*#y&tOHb^M@mZ1Y z+ulV)=Ho~>t3&=GW;PJ>Qd8xw8L07&-w(~&*6S`KZdA zp|wbnRwNfEp7_=cI;UbOZ(PPu*u2*3-5}7Xm0@*b`E~}oj=Xyz2#5mV!o{Xa&L!U4Bc2<$q*VKox?3qiZb! z@W-VH$S9yPm5{)(@F z(oV}1-~lW0l)908EeG*IF+ zKa@nx2bO+6I?OS1Le_;&&?sMw9@GG#1E@L0kQ~<}D9_TkSp41}6pO|zMjFkhgb86b zjyE0}ZKlr|p)mQz&;ege)n3hRX79?cpWi0v`vRGj`?axXn2%VjxrpsC)4n%8Si27dj?yvSr zN}%#Md;@+MBDZgtI)~RSO|r(y_HC@I0TD$x}j`@_R$q?7LfvOpc!vj z8P__B!r(V%g$;K|D_8}Zk7ih zwUy{eGVtTKy7l@Mv3PUz4?Y$}QHa~OKNCI*^AmJ(-*@0!4luWp=+w$zNd95BKoo`s z%TFA}kE6>Q91~Ttre6-|ReHnKQGLW#EU=1MrxlX= z2$=bx*gpR;lAhrCx()ZE3n}?dPkVwQBnr1KdZ=x0o=p>IY^X?6E^Rds@q>xHEdZb7 zJKc#{w*40XFDdfy(V;O_@|e^uLFc+X{xIGJl3CvT?^_-I#%!LDJRG-?AhE!0QDH5N zg%zYnvx}3<+9!mebauP`n^U>}5Z;7;Mt{{m1ZqsC+IS*zxUj7^ZJSZCe$njqr6d#&tC1Dq z4ouA36fw!Os*|;$pf-Ra>r;RQeAE`~tcoLtW7Vra1-jo>0Ne%8b3@HG-2rP5xqp@V z^#Ff(mr$P@YrH&*q6)sGEG{WuTRdFeK1*dX7TMF9y~EEAYzc-#YXX$SyW6^jbf*6n z@K*1Mb3h05CYYSuu94w&tc$&IRIWQBq2GZLm`}LHPm}rMai1wf*zpgOfsvOXMd+x} ziwg%~4~&GY-Gq!@mk30T{@4E{FaEhx^ed@jNjOB1r0ZvM+QF zvJE{82Eqf&M@IirSROuHjvmz&2=a4af28jKCBzCG2c{v~PVuKJ)?~H{rAEjyQ8ySG zyQvPi)vWjs1VJmNf{&8PYLn8V@QE5<^o*Q^i26T=O&NWs2|T5LmY;mtJ!PTB+ZlS^ zg>vQ(rjc4`m$$3}5YEku&3dt16bC51tScVm43sUsct*Y>066${MfbhMi>4b$%kRh6 z3xf9oC#b^@gj%+`gfBF3n80Wj%@hlnwGY%$ny<)x6{qE<(Fki$y13{C1b^eF?a!uG z*)Auq_}W4f$rJ=}W-hJYk^b+tIespF@*BZN_EdPXUg`_K=23_<4yrlrFaeKHWqOyv zzVY!FP&g}+jxO^iQt;RAR}*q%y#o~9GN5fGpMy5E{TrTzh!KLI+(=O3tg#DQW5hRB zb&urGMPe3jP~ao4@t5E4`WHGjP@qra4|aadsDM{#x?D(r|GB*_twy~W)&(PJfXfEY z6cJGc*MMXShEv~G#}Bb?9r zzh6@w_S*olx5bwYQqv=32bpLM&CFNrwfVkiY&cnG0Q{=Ns4)7Nx2k^KG$?{;aN)=3 zA~}asl+&!tlZ4zzTW-JydgL1l^aPi*v9SR!jM84DQV@VC;KenQ=*-*>A+whAZ+x1q z?Dsim5dx?#<*Zy&3%2E+Hpb(7UHGhH5o-*axJZbW0B0E~20AHEhxcdGP37!-0{yQT z#Ch_5F4aqN1lm%YNJVsY3r0YCt>8EKSE2d+T75frIBu)n>i|otThkR?w2A5zC#?;0 z0Jk;WEdp7fdoy7Cc8$Z;G?X?cFwdTDMKJQw7=|5W!J0JGD`!DHeA}LAdIOVyNYx3M zZr*Z3uYYyAeK2cK6b1`lW4e6!qDV&r&(Ar{0HSjoL7+%rU1lSa4B_+x5P6E=aVk_& z6d*^eQ6(+DgU*2YSW941IMLOo-R#axqW^onzdEJH6I|J+5=8&&5>c8&-T#CC^53;m zo#jS)?FfCVR&hTvuk;O%guSA@WBmcj^S!{Q+D%)&z_*jt1Fkcc$n?jD2;txIsd*;z zA(uA>KR$>z^P|RQY@i8_91IgTX8uHwXXKc&Dorq3PeG)HS@8RT@~x>D;~G=sA60;h zBa{z=GR$QW15bsl3Z&d^bWgq#38ZS3Ii+^_n&OT_HPCapMLQq&eWeTI)QG-FImJHU zg8m4`&04kI7UX{msfD zvPTX6$2|x%K`L<_Yf$q zUgXA%K>>phdSeOBMH-@YP<1L~;G5G%s=Z~FcU{^zC4P|@zScM;F_^p&&D6ZgFL;zE zQM%ynKeo_yd;k0&jE&VRpp+c@*S2nlof?sWya?*)w|!_79{QkN`At3;$^ zdDjg;vc*qza*#7W@COm)FxlR(mqI@?`E5; z@_$g2PLQYS{5Ufe)?_x0Tu{NW-#$6N|MR<{e)*4U)!*zQY^kXV_ zz1vw`evThFj-*q>Qu?`V1u?iaPUL+KM&P2v!SyaebG<^~#yl6j-F~Dm(J9aLxVlTv ziD$0g)E&eMDbdZUBSmVOEdb&e6Q#Cs>H9tf?RqOA#?CS5 zCKeL1ZY%eC)DboEMOrWm5i7n46(WZQJ2SRt!(M)ffA!MiwdXN$gdat<2;wbC7BHe| z|9I*BqA35B4$`*NZ^CDv;I6ZCsKFund*lF(t`BNFw^hD1w+u-m3x4(~vHD8^;`(OGvUpsRj;x$-DBT<$Iq;@&#e9Cd#fC7)BH?^*pYwgBV5*rB<>>8b zq!EF25RRlBX9d5FqTDi}0%mhhX#E9I`n{nFD(2Cp0@oG?ESyj3a`;aF&nVga(5)CG zUsreL5HiIWO9UavVzbO$30j z&S0?$Y-;UQJN5Nvr6;@@WXCf0$`fd2if%PWPlPr+RMqCDOTzFNY%PsiW!wo-wcO6m zkYd(!g@xEDv*b0v6-JsBGUGLgzv5}#*bz6yd@N=_31s-+l_!X~iGGmt+u(()U8j0X3)~a&Q~5T_92em;=$D`X7q*r82$SC#$_) zL$^doU!+mC!ihz1k^VYbR|I982XA4rM9TJI?Y9xB1Qf6EffqQYYTF8*WcyeUP?r4@ z${_g#K`)aKT@fNU;C_mNR&NSG9zc-(?+vO9v+LpNImjnK6Vbi7M;|Z4;%wW%F8%{` zG&s7}Dti3^P?{SU_A^hBu8}?w>iDYYsvIw66x2h{@+|9Q{o%)F86W~a^^quB9Hd_U zLGql`@7H7v5Gg#kbX`jZ8`tyv`nDrQnw~ji;kv~Wda$?%(o}7dD{6Lj+pv4;i5(yB zu((M{vgS{q=qxnkWf2rAY@Hd1BxF3CC5l>K@t4U8&4jsuR4@sIgP#Uz)_&vDIr*&j907VC9WzHi%z z4GWLVE>HD&SFiTa}Bz81{+m_LeVu{(<<)DFU+G2x5%aY8g+R*y?|QpbK&;tBUmx! z*d9%IY3Nee8pV>|a%0A773iKqLQ2h230Wl0ero%O6`}VZYxzd96BGitIf5qnNC4Hj zd)gOb5hwcnk}@=V@w!=qZ<&EH3j*^kO$0SMsD!2m;Ygovb8XLS#-oL0_6lQno^7qp zA^mQ+$KxNd=HLg8YynIXz4p~LclFO=ALrWzpG=^@ z!G79o<=#|rRSb|wzRgY@4oPucwKnx{o_5e?=`#JJY2Vx4|gV6Hqct~R%FVi`m4#2 zrqq0`6`_|URpjIiQ%Lz$ESnCIo0-~ITrBZc-)ugO+Zh;G{$7f>)?QgVGAw~?sXi*- z(v~TCi)I%$c{@C2;nrw;x}@jK4?S^!`*KpYBJ>~=B``xLXFzZJ;0vOV>!FqU?WITl zz+?5*KC%j6Ir|c|xcZKL5hGT=k7NXBXA5Zqmjk^m850!cVXtuequl6rca}eky^hG783_0Aaq*&n_=9*8 zC^8xMRQ@U4p9RV!{PFeu4LJsUgC52G3jmx?QyVj$zgFmST@@dyx~vswAwDbY((V7% z=hwwrwgD04di6zbwQ2%1J-G1uDx>M>{@HPDlKhW+#Ip@4%E6l5GPq5VI0IhT9xEfb zX!0p9=r1t?2B(ej$Uf_Cv`5G{@JpbMs(>3$p5-<=fbS%Zp6WjA8f_f8fg+zf7WPy< z5BDc=eTl23xMw=!IrA+d;P9V=S~laTUFFWgg@Ifw1JZ4{SYNXr(e!;1+gYkr#Hb|5 z)+baF*|5w0ber;@)-D!>WdnRwQ9Gag8DbxF>?qOGrX?3K7bm>51&xRLCqLIc?<=*W zl>m6+0&d=oN*z=7_@U~#8gotIemxPEWcrW49qjMEzh2MzJ=jzM7(QyyguZTupzvyg{>9|5ShB2F2FKSVDqjShgV=VI>DA#zqn@jkKIA>T+MiLP-Y zV&|%9eHsnsY-Q@wmD4PoEkN?yAYm@u!vdGdr zP+8%k1PaUd$Gnlnk^HZNDK4LoB<6#&Fc0i%eWF$Sh&kEriGPuBHCnSF)DcB5xjlA- zYsddN3&HQnzFrvd)4?Y6a+?Pv{!?2t){i1(p+R&{vqs6q9e{{1{q)3{y=nW>GWfd&Jlj-0d0HX51N#H zSIbO|oQevP{sa~_vh#hT2kZ|(`=Xw;fx&|Ln~69PcL}7GYA?mC4dRaWTp)oUGS@%g z;!~ z8--bj!4cx*-^8Hx#QQ2`@x+rk1dqLs-HeWe4e?rv0@Q~$jz0o-m7T^UE)q#|72Bsw z0+rcqU=*;XPt^x6rfXdFK_JO0v&oFx_#+1HQ<~epdS_P}SO)zGypSN-s0GUj>x2Iw zI@E#W4_3@f115u~*jZPd&XNW)&0xHPa%H~)9%>L>2tJd+Au~VD)y#oJ7sDzv-OwF! z{(^0V@t!+e1Se6Lq@Zv@BGkvvTaVsr?&P`Y;KYSiYYXO_L79r3gG@Ydw2qra2=tHu zC!(h7B0~5gG%<>^M=+r#b(_cDf*`O#nm#s+#ZIT5qUe_gq=n2MWP+37IWM5A(6gf- z)u0(gDMFDvfsxgv;5oU=i5|s)Wxs8JZU(BY2dn$a1SsOPG^#NN*ZeRz(7T@}{Dg9t zLky%tHAccd1LMQ=A$2 z{Rr!;Pw1X%ymx-0^3nD;eUMw4qOP1yf6TruTetKhlC@}>Z)t)@-2HqH;?DQ(&@wt+CC!MVHgxr~g}C&iwG zVDp}z5O@Ug{yL#~x^0cTdYP4`7itEx>p~=%awUa8`jL18q*aVjP zy@12^r&(rM08uY)Cr&Jv9s#;NlA1$%(cB|Srd%1mJn3&>!V=dehF|`;N3ug{fG9Rn zhb;Qy;CTy8^SPb=`HbF<`*VX-A%zdckm?T3f&$BCIN`_9%#Z!ha4^boh@=OosVZvxL6j&*8 z4gqZ=#e}M#Jz*^#OxH6@%=FtM58xwW5QjMVV?zM#WvtDjKMM83zN_r|Lg2s%9+5zF zUxI$UEAV0wGCdHcJcLZbU)4*0je>xXeiAFd(frd{**B1X-4*n#bgLj&ch2 zdl{kPf`EZ0Gk!-Hb4KUsAh#d=T`XtXO#YmDo*lQHsE#HWv=69O~0sCPLrB3 zd)%p8_-5tPwpZBuKLWQDGjZWeH5xz?acGI>v$4v&e7CCA8wpVFi8y~ zd~^6R7IRw1F&E;`TBVTelx-j+wN9rwpcY@&X6HlVl0MIl_<2-k(QB z_@NER2;gKbWj~`4o~!|7Pr?~oOU0)vrJoXKGhrRlohVtM2(3)|i3ZBj_qYIQ)lbZ) zc!2oasTKQq@D4ma#kU1n zh&jy>q4CRmPrAipSU@UjHOK{WR=?{lg%61-fzg37GKILCAUh!CoUI5w8^FgwBVtG= z+cr^pH_`{_Ap*NeVaq8mgijOLweo)099a3ptbP#v9}E|M?ry;%z*(mE?wT2B{%)}Y zvsVSOmd%|n$IM;OLSI&|_C0^c7_%o#SeL4+ESy0|kR<@^T1MA%{b;its_=c;z(>{? z1nJyvsqfA)Ksf|*YF6P4*&I_(KnPKF$r%&A-f0L|H|$DKlilm?mR0&=^r#;{8Ju~n@)$<`uP6~?nzI7{m;L%Y3_qC zlH}rF|3F%|*=`gkz zzc3Jk!Ucg5d7NIJkXiP5bBKm>ZgU;ht)YO_?(+}n{b09auXO8+gFB?YXZgc%KjUsBfDF}Yh4W}f(ZTS-G$nn225mP}1 z4jH57Cd?BwSEtPJ4yMW@^}q84JukXCSh#>v@yTgoGTF5knj{_|yeYh9SL!aAsbT!@ z-vui8P$Y{PIIrV8_n9c)+~Ha~UZ!p9Z)90H3Uz)a{KvaH<6K;hS*X^f z4q8mgKzs{H!%7m`#>NGuUar@x=>? zbq^3yKco(ij{wbXU%kyizp}+otR@gW7kp`d5dzj*6FwuaSA*Dl8YYp()u>fp{2-oD zb}=^?tPd3t6rUO{QO>7j>{N}h@-}k~@Z9k?=zi7xsUV=m(xDuJ4Fgo~B3MZc&6D#U zJ>mzZKwqCV$gsF6_HKZ75CfPJKq+95VU_A8FIYQ67N)EK1ga{6AOOlDP`p(>)lrN9 z1u#f&JvxUG?JfTzR1|iz}zdv*EkrO%r1VyzYYX+^jK{o)ru_tba*F>pGFM16IM*LcFn^?#5pMQ z19;TvkySc$#6%^sFSxmJ3xx#gb+(c+F#swJCg?c2LyK;Uj$s;pfNF=1PD!D8{59te5f%u#~War25G}T zWQBY5!pe`8sMGz`H9$r_?L}E63orGwRcF*_B%n>7de?wO`UW>ZFe4X;&Ax$5OrTEU z{o!EkB{bDfW8Yncnx!jrZ2O4E!_t*fuFTz7YH=R|v6Q1(?XaDMiCI&9e;1orm15q0 z0(M$IOgV&H+ZLE~&|!k{KBxuRhRS)Ixf-Tzn#`k%J{>vDIY4Ctmomk;(5hV|8$Y)V zI`w{@|GQ?>%l}4out8$PU%Mwn6oX$TS4r&fAB6qva;Hr_ZBY}76S=6R7Kl272P9Is|XZ?_& zA|2|s7PFIwx8i?_Ou@T9K(ZQkdXB{l%#(v9L}Zy(7Q!map_w z9FaiTw;$WT^0KoRd5G^1zcF{8`R#qvc(dbmZECSUJyZ+-Z|)tGA*p?D%0i%-IQCi? z^CjYPuIFE5S++HYm=lVa?OzH;@>hBMw0j^){TVvM6M*~Ib{N}neG?wZmET4U%oGhc zn2!(Zc+qH5CCu1iuWd7C9BceCe`!twpe)Vse(!E9I4pf`pKu$BmvsOQj3Ic&Mgcwf zEuLrJ3CGiTeoCJ$px6-GD6LpBsK9z7a5&)q!QSdkaT75Fo=#7Oom$sLoRWu|1ouT= zsFna0_u}hSAm_+#<}=Y{p%$XU?+GA5j1O#jL)xP~bYVjs^AOX*62q)npT=*RliRX< zBCMgxjTCsxMfg85H`XMj?oQ<`9Ar zHn;wo8;`UbM)vb^PHIkPELpF)&TXX3+c(-Rnk=(?_SVmdRrGLGNmBf+5_8p>RAAOA>P61tBM(WoP22)88q z`K=P;Mv^V2DH1!5nEPUR3jpz3$A>wp_UyM5okMRspofobT~_G6e+bEto$j1t*`q(u zNkZfD_d<|V*fr`Uk%$H5Q%W0?jXoJ;XS%n7+Q9=7fRl4hu3 zu~+en&pic*3rGiZ@qM)cMf}03n7S?-p3?)RqXLhIUc|I3=OmMps;3@E3y*w>!m&<2 zt{2lPrq6W5$j#ld#o0_Qz4l~O{W?ZrGV%O{t@QODf?O*GMQ~kj@4dV~b_p|oz|u2- z#Pw%hkjJH1MuW%VV9yECa)9%%Kn)&+e3tIvq{mI6j9bmGUo?Ef=D}MZ%QdO95PlWw z0gm%mrUup^4EIiivex5uBGiRbjQWCOu)F7IKN5R6Su ziLNznVoGFurq2r3I)#X%w$UNO%q(ac%#8P=uHFRE2anSd&OSkux3{=;nSTDpH8JWM z%TP!SXeglzc@vA_QQp82q^*t^2G4+gO3>3k*;xiOOJu;Ip&io1=zTVmmZE|^Us+WT zH*!n6qT|DXa<}OX!K?Nrx_s)1)CP>G!*fv274_W3`(osH=TBLHxGb>o$7e^@OY3?HmB>gizH#F1twx9JN?FI7>DTQi@6B0k8vsh=| z^hD-Xs0?Bhxtdc=zU#A^B?Ej8qa)R+g5InFWY3DfAFPqWw|Gwp{6CO$@-+sZ`P-#~ z`C+noIi1nN{my66zWaLa8bSEnCpwgwE{Q3-_QyqRBLVD!#8+c~%JaI|I3H|-R;}c5 zeYkDDccRT*Ux3y16VnCc>)F##;ir}2h`=!zH;-w@<)b`o`aLcmwp9Il1AKlAwU@kU zqJK~EV1~(<26cAU({!qDTP#EM;x`%xeNb1F`bKph?~*okHzOj~haf`?o%>up=*6GY z#F)z7+b`EStKKh$MWUtR6i)z`OpF@QEgX9MU4VF!kJ@H1+KWa8LOh>$aMOB$@HUIR zTtr$ZH$kFBdG6%ui@r(sH8)p-p~$crs@M=-_)JrdK1C=1ajS~6z6y*$U;U1i;HsWI zcOD<{`^&9fBtk1BAIdk$$T0q@{*f*;%@7-qyqZ@WqOIsx%N)+=*uQ8cjsJH*7Z{!- zCge!}M0IX~W9;YsxK1LW#ueM$wJ1ml#ZYq~G9l~%%yJ9#35_mvWwFItg_P$zLpR8g zmG32mJemvrsvQ$XkX!X#4OO#As;z%pW)G% zr++{>3|q_ohUa55-_o;}%n14h7o;U!TaQm`{ooAJUWf4^;pDN{WVZE!eCZ%9UXU{+ zpi8E=!?MeWJr6x@TLX5E@^1O|;F#FY`wIv7Tb%1p8EH;R%<@LdL)E8uoktHRrCtfI z!=cXpZY`9Gntnjr2Xh3_*Q`0my@}&fz8mNFl1BV3kwKd+OM5%6+u2AEx5ptZ4Z`Y` zbe1{-!v%T5~X7}o@IS~ zF0P9?$naFKcTqI^f&<@BDj(SZ*m0(OAX{gfsLVgQkH08|Sgd<_`T20El-PWmM3H)Y zHQe=xGi~7Y3!b{VdWgo@EjV6FyJoY6nN$S(9Gm<>7Bm`u#%SAT)Qh@LOs;+=;mdGO zER1Xo@>}sni$~plnZu?lq%BH~8bVZ2_4urtxmZ_3pN&emWfR~dEW8k%&J-kU86}ZH zEdZ*-4|%ByrE0u?*ENB4k+=n;;g}^z!;am+3{(RHKnFLIG48sGC?E7QQNt;G(}2K6 z(&+}watV#3XM;2Ts|2rR9nIxiz^|<;ALg;oH#vi>cMBX)6A!_aOO#P-u}EX`u9_CM}8<*3W& zUQp-ybO?A=AEWOr&B?*szMcV>8-y}zwxmSUGyZ6a$lqzBCz6WPCF{`!8HzO?%ue&E z>e6KD8ixZQ_f{X|xIx!xF+dOMXZu%vzg%E)U2aUc&u@dNR4kn(288C{4>TxnDGh`9nB29rag zQPir0wg|iFW(v1<^-$jW#P=Jk%oX-SBF7U*V>2Mf6Gfob0h~MUhijhawY8L0wC`C8 zDsN}fan?4;yQU}WLo-Fuyb!pI*lB>n!>c8qHW~C;X+l?STYPg)ptB~u?`aIMtykx{ z@?9oM%SQUWc%d$>Yh1aZOuuf87dhtJKQHKq7$4P0kLDH^VUjO+b1&6y!gK=Zw>~ju z(xnlJsfYm}MY+pD=iBec;FrCpJ}pm(3s9Br_IVekQ=bVX4B6TW@u6MC=~o#FcuNN+ z_}4^WKIY^Z(hF@P@P2`{1`RB*-vNU@6lGf$-wa7>u48XZwY_<$hVmhgEb@2u@`c{y z%Oc-dHw0gu%8=j0_j!$wbEId?ziw4gjj!V(cdyZ}UH@_$HP9&rj80nSy)#uj|BBv`GGOAB2N79hdO6Jiz z2LV|cSbN~KgOT)>V*_pA)YevI7VeK8xlI_7l1i}_R(x8*-qL`H3W{+l>(|EYU%B#xS|R-{>0@8<$r%d`F;PXtr`Fx&e8Tdv^OR>@-lZLE;YXJh|+ zAcOpD{?(H9_+ck6E(E@Z-=~QT4~3K00IhBIJkNi$>I6&omw?%Se;--i8|L0eH*G^7 zoO6A!AS0M}2eWb#c`$@9mE!|j`Q`iN-Ugy+=bb=ltZO(%rMO$V#>h11Rg%D6#toSY5w20 z2h_sprV4W|fDi5Q1asqM$*&iTEk_kv)Vb#IX{++e_VGn>MuQhx*l0<9Uu4=y?hlan z7lzIX{wDTfea%@(p%K*brf+_63~)Wk`4?XsD5~ta?hYiucWHdTC;splC-HyGEZ&f7 zvl{33%)=-Kt2JjHSF@=$Q=z4M@c%8#CkROYY&nROPd=;0BfbLTaXU@4=VZN~d2|_P z^stQ|Y&0ZNxcf3E&85EHcMyz&RRJI*Cs&B8S|0I7mXpM+rhpf3rF9U+-OHDs4VRI66 z%}E6W$P9aAvF_V`5OQYE-1 z^31oj$3NnG_2V~}1%PLGR4@K&IUwYIZ&_9cpww^iW4AC1bD=Qz9$(mWUG1FjC-$V~ zl7Mnxsg2VAIsV%7S9$?=i_k6bVC8m%6SKYlz3@?GLeH0QOswTiOwA0}Are)YAnOs+x~( z;$0_JUZ}gapac?O1!fH)B)coq?NbjWdawl-Tr5tXaa%G^7pKQS8jhe6{P&j{;WC>o z+_&iC`1jf9=LiJWI`emFL7G(%36$|+$_&Ni^&hX3{rDBv(ZhAMu=GzcJ~ z;q!e$IrlHT4hfb6(p-}%_GQyRqh3K@o=i>@+#%FC8yulrQo*Ig#$B-;euGa>@ADW- zP|DY8jl2{;nOu3+iV&_&j6z@Jx%6`Wl)gJ*n29B_0)gw60dbcfy}ZmEsyLG+nP~#s zGV7mko9N^w0#ZZ%bvdA1%Rzx>R{AGR1f^H01_OTk5w&X6SD!Bqle6_C)qN}xwr#Wo zY+qQxD&3C5mm6krU0-#O{-7v4kxIU5UO8HRpV~d7$3L4%GTp%pOK&6ekBV2zz)R~q zCa1T}Dm-U;U-b?KT^;_){j|{YXN{#ii0b6b3a_)_sZFF+52Q4TSJ5KBL93>LW%oCQ zu{g>{LK;a|12p;7azX8S_L;m_v&ob-@9yjI-YFE7Nwz()!33qUU}f z_dS<$?;*p@LdH%_-&fH_<#}XxYH-UQf78QSWw`3~1tOASCcq*@{h{CZI6#+C+{E(( zV%=zk#?L8H*qt#J7s24}!oJPX9sSj#?)EGu8lcqZldleu8-Ydmn;^O8iH*2jiE@P( zB~VAXp2AK%z16<)b}0u;TA?n2Eor6{DANF(S&^7ZC6aRZ15!xmati{}cEq#VK(QTE z8|jx%NEohLZB(mvzl(+5FQTwx7LpGm$~w4$^g~Eut<={#b%c2JlBB`00?s z9+2j@8csqrun`cbAaV1|9DFI8j|h>9y^G(lJFyO6Nh(XcHI6cSr?_I8@VY4Y{$wi? zbY@-6z+Z|au(6w(dV0Ci%6@!W7iN~ zOpc`igldE(XJ5;UaITdVpet#&@#U1j_!l2NO}}q}|0NeJFgGj<3vvD3pw$4Chkp~I zHrW7f25y$&Wy@Cvf^WH+>MWgcv#g zhro0UNPBh|p_rI4F_#@;J*28EW8au^D#R%gAU|P+Oga}l5)xMJxkK-8gWfqqb(5}n zgkp!1*CduKs6KGVWMqRqV_tp`gt$?GVx8%lgKA*l^gKEU<2`@g z{HdZ6jT+QPkRL{?!E=gv0RS~+XZh*Fm;yuXbnuyj3(f=+w@E2>9hpdU?B`or3mzk{ zUrM>3aAyLS&E$U9HgYU*0OC!IAlv?CT;NUj=wcP!u$FLkiH>9Z04tvPF}kGjD;}Vq ziZ$A@C3Ik-Uz4*k@kYD&b{oC~ z&R%_`+93bJZOY_jlsYm?-tx7gCbCD-k%UGqRl+NbR`dM1FG6k!dNNNSx$}M8nYF-b|z(#Br9i4?TY4)oTtDOzgVrlC!O-gLOvNV zjZjKBQ3B#ppfrmqhbrxe(Rmck*=63)$&=+A#XM;=TE>`S^@jbWfFq419RLCPsI)-` z8GdK_nWWVm)#W$qSVI4YC%(lxJv@na28lIVa{H6Y?h(Lt4@sNF---Z;2bgDbnD;ux zWF>8BGrU=8&kXGvxMD(}XuK#veW}kvs5b;TBEXHTehzkTy7$hcrF!TQAGLq-Mlo1Z zuma#V*~?W3AX9Gp0MDD9n%QpC{Sb~Rr`5P&4YbkloRSs0j^*G%+7n7K&Ki^j}?~+p&;g8AU z*&?T4Bx3suX}|$LeZF|6vIxhKTFc4-j&m9J0YHRS7!|Zeo^HVXfvDuh2CmuY8YI5U z6~}x}+=z@}i;SurdJnFJVsgP3b%J8?6qP0vJa4cJl!#hB!TycB+B-G23)-;M%VTq} z+U54afs+S{)Dd!jO^G{x?Cx8hQth0eb`8_g`#!z`oiUJ0qmdimKN}4>m65z1=&LhT z5ar_Gah?Kz6_4y3dPxAf>{fSRM)wB*7n1BRKsD^AOB`^8TsAF5CnRfEFJrMaC!U^{ zu1SCkZF@Qm9fJ|*tXL=^zxk{Qocv)r1tr~I)H4JLHv7cGHf9xS*^Z@e!i)rQv#cQgJOJeU?cN`E2N^mrKu{|Vt2QDV_MU8>n&KM@ zPD}~mLY5Df6nmPkty4rABn}Nc`SR@+tP7V=cmTBA}hqi8b$L7OOj$J z!rC}ewy%<0FSE?0bpeu&IUYp-`>CzP~_^8eC zi{k)AHKcetecF3|aqyA(+869=o_TH_-_-*q;i!S?azs&#tqVXi9O@q)eb9HGcWV2v zk0j2a(Y+w7+a!-2l_%Z@bATVuO;mGRRVL0CmHy%L70R29=DV%E5X~C`M*q#{s9xD)>?s7zDuC=y{=7aSL3Dh07*c$zn;|h+*|xDnqj&( zxnud!Djkp;$FJhc!e46;DYsKspR;kf_s|d%m{WOM{{Zw5Xjo&z6%qGbR5 zH&0G4-a+kuvGE9Jz}aO7)fh4G%>Ih$yMN$NnEg-Ko-!b>JCy_+BYTj!o`!`CNS%+l zyb(s>p&7vIgz|gm*}ZJXcoOX41T7>x{bFak+YTm^+~GUtiNC_QLms1>UMjP&%*k1{ zR;0%RoS3v|&R4=;@PcWKrTP|bG7?Pa3_Ffjlwg4|m{ycV%5R@z$0^O2{ac*uhTvZ- z;25Us{Ich(P#q#|_=W!lYLxF&9P8?Sl3}zdhvix07-_X1l8Gmvm55_zT`SOwgla48 z3o@VOYGYdhtX&9U($W4TkwElDV!FKG%gRI;HqFUkcbFDqJhwR|JK7MOf23Wg*C6+S zi2Ym}-Pp^}NuzRfm1F|8t-u#alw-_3JUw=eq+PS>qk740Z;a=j|11aL{GMc2Z(xT7 z@VI63LDI;wq?E@veF5D+N_3rb;W&^gE(-!UC!ie#OeA2;Q`am-$Y70DHa_3(d760d zU7?%8OoJZFuQqsK3~PcC?VfCK^ZS4iDS4U)P+rE&kfF3gxE^zhW%y9k7WE477jRlJ z6!U-m6m;CJf9wM9W2%GR?6$T9y4^x#H>6WmR{j_Ji|XC^k2QOYb2+FloU^!(uQc_c z5FJ1{D0YHevi13ZzZ2sB9M@jSyZPFTalBvqdO-WkE;P9ig6o8<%=iB7H+S?P&jqm&~&+$(BLfgHRY_zWNgFp{CKz~kN!s4m82A>V|2 z{MlH;S(@S*!2?J~I2ssS)du&ozG)zXOv}y9uPz-TAKU)_dy1RvKPC_&Z$zj~f;moELAK>vSd!5N%svK;@3g#?4c4{e11!1C1(-~WDMskLcdjNgyZb)VN1 zx(IW}SE%H|mL($&rLQX&B?iDjp06QuTYVSZHJ~+JT@$|B{zn1w=K`D#ATj@hs4&##>eFF-phQsDg2+=CO)^<8?{-R%!3_= zmn>)W-~Z|yftDjiEOa2T;&Z=S7e4r#RQ@PF2RBo32~7eKXQ_!ac@07x-;a_sRcJP% z)vg(~h(#!;htFQ*K-O%fXr_($H3}Yjy*u;%$`by3k!FrX!suw1e=P<(Y*!@3KE9$j zzxQ#jpt2gJxG{=^LC%FN7hNG(y*O}4bBw)b2~r^pz%}prXb&TB%MtfX*zo5H$%swD znLCpdp9V4FjgMdDuV)&*4X#%NMEod9qty*-%uSb5J?2|Fa3L94oo3Z?;)(d^-civuPvunG{#&Q&<|V3?qMr8H&71+T!_;1Nuws|W+qv#(pW(E-$g;b z;+2>IhyJ5gcNm+7GwI}a=DouSx2-g_c8K1(| z*_o+&Ihht&Pqp~&gbe)PoW#&d3dAsbSrhSzLP=xkFv=llYh}iA(3F|Gq2|qm_8*3c zM&LwF##R2L-tV%ZPZ1hFnxlHefq$~n+MKP+pqiX<**ETo=J*!VOMG$HRky5k(zOK) z>z#L%5%X#wMtKy*(i#_bV=d&^bk-R#Kc%i zd7{pumeh}2*|$WlWi`f*eg5$Q#4my~g*X$^_jCX0-$6<$Qq|{@fjui%!Huq=A;|m9 z;e_w>1w&LuWnlit`YQS$hNZ@L4;8g?_UwVIbhg2zcYZ}$TZ+gu{*w1jrgwiN*O4^hgXL+>(B%A`Y7Q;bLYNXEN)!F1gS)cnzKP(BCod=qN-vn{KW~;c8OS7VSK3l9 zg#y^!Uyeg#mmHfKUMa??pL=@~!1jUcR#^o!O`GZi2WOy`-dbq)c2O`vhf8Z#m;6ku z8nYI+8zjK=!ZM+m>1`SLcoIu#6t2k+afh86(%>Cln7Xri!uOx30DC0fPw;iV7~Wt7 z0EJG~(+FZ*1)NF*RA_$A6zfOMsWrj^11Azu_Qk2ZiNF5uUlK=70-6s3RAzjy0yX>> zNSKjLlX(WY4$It&^~S5~*vWTElY};I+W6$a9y(o|YskOQF=ssy2*smZ+$-B4wno$D z!?_yYfW(!N9up*{sbK&pLv@$7Rj^Z?Y4($K50Oj$f8u>^rHWefa?$Y z_E}7xxIh5KUWE=WcM2BBYH8G}!!hYRsssQH==Xfnwo)o9ex}Y-s#+)R8c2Z@1ad+B z-ilt4zlVpaIq&q*;qSaIFEZz^>4V3MAHeF?4E=b155m2wN4n?5f#u~H7yB-hxCe#t zhRC8l)XLGNZ*#HWV$aRv@@M|Y^lIKO z*Bnohny0CI+OE53gl&!7eP`8qPCc(*{QDJk?N}3tc%O@BCrpLE^Z~7AL)pwbkJ+gc z*)pPi1+cu!=84O`5)EJ6d%LUVvs;}jk8IC%!H3To1lt1C)&qb0`-lw?K#>J3+PBS> z@Z$0+hu#AIJeqo+o8!t3xZ4gtpW>fe-mu6snLzlp)gv!P$p^U8fd6hWX}WEX4N>T-`=|reQ)DcIA4}m#WxUGiBwvN#H@bt zSK#cA1QHKEnYJ0Tv9KQCYV$^j!R!y-R*eH%oyY@`I_9caT30# zi<2CBf!V8Nr5slDcs{Y3%eQM@AyzqYoi`B(|`Xn z)xSGW7T!ZT$~nfNS2vpXG^J5wb(a+0L<0G{8 zZ2+Igs>wpsR>#g7+%xidDee3$ZP~7rY|_1uwjS$;qBBHy|Mg^<@~L1#gd0E`6rw<< z#jk2DwmWtG?zT>+odjx(H|4O~<&T?_O?#ERj0I)ZyOaX+5}F?J|9`|zlAq>(h0wTC z4l_DYd*4$f4!4J?DbsT*vy#>+qQGO9ca&H% z;>Gts?Ym_5kS!yix`z716v#18+D%!QljTQ7IIRO6QLz>5f*KcB+6kL7Z? zFJi2`af3rgQiazJafo?dmf^_4qt_9*t0Y?z7NC{0cWqD|buyE5h>wIexXO)?FNr{v z12u0|XL4;};Z~;hsb-FTV^i!^0T?Vq(4XHsfijg#^3Hkc(mcHm8HoINj1}L>yzdMt z*+aR10ed&8;Z`>LQy|ELwvEOpF5Wz^XLwnixwV{7dT)6yx3fTp#s345r zZJSu2!&+(2;`-*X3J3LL&#mb)Mn<^FgLjdRLN?G2Jy?0y_6emo{DSipzKt1Jow{+@vuc&QUwPslLY+F1!>W5tievU*Wix;>*jNEDxTFOj#2kN&?j z0c_br{K9cv@<{+l94S%v>PF~D$|TT?IeV4A+m9qv_{@DYc#|3y;_Emj*%9v)2~q)S zKm5gr{xw*08xcRKD<$h4R`VaP8)B(by-eHc)lGWYzBh3GQ9Z`UY~YM)VyI9z;XTNr zo1n49$=AQT{%|3lkpX%}R@(JQ(cTm}ktR^D(pTauNN5ein3zHUMF1ADfm2X|iok=< zsh$6k;ekgx=uH$N8P{CG7tUE7$)nB#TYFqO;`w1F8#rwX4sJ6~N%RUUeg< zLNGQW&Z?+m<31+(rGUT!rK1+XaDNUMOjjx8KP&e*3SQs zX7_P~^y!3hxH>Js5MKpm;0I!@p74F~-DRmGsscU$Upfb|q)J0ka`eyeuY>C9Fp^`r zFg_nW`2Gk(Aw#tK)!|LJ&+-%59dUKkjtd64<*3ujh>Zxyei6QkZ-3VQ_TnQ)ZFB4z zE#=h;yNbLZ59Mmnj_WD|qr+ZX{1wm*Xl&5-PMgi-JNI55H*s(800T$ma5r-gQ?Tqxbl<^2_ z9#0%ss7brr)#Ui!Y78nui zViF7?-mU5}+`~tW#SXu2+awAd!WLi!IfE#l1fCsp<=b4w0R$+4I4HX%aI%9UF&TM+ z0GClnhY=^+_5^0Sy%n2jvrW_1AB+^aO3LypPPLg~`(^=?V0|4L5m{qJdWJiia;v5T zZZk|b)r+i-XXvwO^d0CsJkbVfy-kFK`^fj;iZDLZ-_l}qKYUZe<(q`rh$zp z7++w@4a!p8{M#dyYMn9VoNsg!C7$#dyOz>Fg5qD~9dp@dtDj6jQpP^L=z(q(60 zodhC!8oC6NTJStw+{y@m`(@ujtm#lFc#t0`!Vsp`009^ywL&T%F9sA$uf95$=r?OP zF?WzS-aaDkOX>@ePy;9rxqzHyM?Nd-(zC=Xg6}~5uA$tYWYj52Nc+&`LpG{)OoS4S z$(#^?4I-%a+H3d zZdbz$<1u_~8Uxh--;ZiQJbn#c&EH&S(-#)w#$mb$3=*beGyN`T-R9HSdV zzy}0jkK=0v;TXB;4`BSis5@FGy83^1pA_{XpIE>-E5hj03SbJ9Spheb7|t@iAgCLM zWfg+k+}ND?%8XccZmtu5Cg}?reSely$DNiD`6@Axd~c3Sqe+0HGwp0SzTN{Sebj)H zV*ve2f5EUvztX?-6&^Pq+e2PHj0~;3?rr2_wz7kga9VLub)_(i=J(us@xM0NH z|6}04pHU;^4ijf*ShQ2V#sg!5E{hgP3tvm;>3|xZzQl^FSLrRuujE$)B}_ms+*T(N zWM*NvC5eRe0Ucx&c*wtfl2|J=reA)6+X}ZrK^a;15#9$i^8wea`=%%4)uW$^@{@7pR)Sut-kLK){?F zey`nj8kfM>=6aH*j3p(Jey^ZBP(^89P7A)!Yt;T2uS|vkKbu1+H*k%o%6i6zwkHK* zx(s(kE|?nby(Gbmfg9e2%-|3P|> z60qsJz#RHG(omuwCE^H+MtQ30hY!tMGAHO`OtwC&5srE{!CgiG7@omUGjMjH6?X-g z;^8UGN5nRv@Qx>_@$K8o&_G)idk_63J=Qm+Q{DqG1#4oti};EHP6Q=zK)4DB-nBG- zFI)AnB~(UAX;{uc%=LOdPxzqOU#AMwr?hmlwg9neYSm|T zK`Rkjm^4sc?$B=>#*NH%Z-$FN&bJ?$J7LElM#o^(fnSW`NyischnbM>UyG6bK=kT~ zl9=nC@#@9RE99H3c;Jf^OY|@Co$~<+}HZ z5YXqGB&Xy>kc{k&68JC=VHEEQFHOaC$Dkp#=Q2Wgo8(>yICe5Fbp-cal7PEEY(%Gq zRvB*SKtk{)6Ap<6ij~R2h$4-dZv#3@-o;hmZwLYU5L=V@68bE%;RYsm>PP8x z>joU85bm$Mg9dVhLBCqzSN4f^qen-3=opaZJ>ekfe07jR#DC-g)Wz&|iy;G?-@LLu z*q&?;3P0JaGgi5v(B@})qG>Ph23gBH!10iqC<2L~slq z<)yJA6=|ed-{?P7Kzzt%U_di0kT*K?jXWk$Mznw$3om2nr1gcDE4P*pj^y=$?l3sKx*ifi@*=mT)Qo7c~4x^T8nA)W;vn92<4U z@yKVUPbe8Yjq@GRPM1a_TA3mn`YxgOiA-oh_6cdF2b2ct63FQJspuC#f}&lAc&PwX zKdlo)=pzhy+7UyW6avh*-WlV9mIn}?V0jaOT%vMnk{+*hA<|{^q~DZ#$Ki3SZrWS8 zZOXG406FmAnDy1WR?OUgvfK3&=mrp8Mq_ae0p&q2?2l7s0JsZqdy{?Btb$RN&D<~X zXsS#5q|c%${O8zm7JAdww5pB{C|`A;#iHNaBhS|4oCd!rCy)8*gU`R|s~_yE{-M}B z@3ahG^#6hXQu#bA-n8IY8GwWcs)lf68G)KfeDx}*Y6r)|`0$6&b_OdAI-p;9(?u^$ zQ0-{5eQ^Ltrmq9GeN_L=4X!`_R*z7+@~D3l<5~8KD?evGlg`)>Y?0EWZdAzB2wffQ zd^J03;vG=7E8^Ih5y?ZN`FgC*nya2GWttxWq-*vK$bj-Ms1m9%ch+x~3VSRPU`O>m zV2&?e>qL_ZZ)3OM95XvUjE?dHz9*UV3$Tyak5<31Zbo)~u67wR#JluqqVV|WJ>Qow zM2HY^%c{71WoRqF26v$TEccHT;`%AYNGwc{WYr5#lFPuf5xxG)?T2L zVLT)3ko7lr4ea(mG^@S>YCxz_uayO`GA%Ap?Mn-M7l%-DNS8P4m@;?*J!HHu3PQU5<54XQt zqC);{oQ8>n0vdSK7L3W_@~4MsE4seN?^!i4%i$7)LP?!6}4KV+rP%_23?-T zizi{}r%O#^N3W19rK$ph2d=z-c;v?b9@l7=V!SGjC|9)_P*wx7{HRrt6Pn8hEb~KL zmuV{)>p$WS%WklO{u7zfzqga#&GDnZ7QcU%>RWPJ#(oE_67CDR6n+H#u-gzSS9N*S ztu)7cNZ)})8CI1Gn6Iq%9;<*!?#;pq1Xko_l`cS>;R-Ll?gO_pHI{_j5mY+3umw~M zPkF3PDZe(G)Wze+IE@~0vQ$8v>%)@ceR#G+m14-{|LWsEji|T;TlhN{xu|^n>&w7# zE3g`4EB~j->LQx{->%(6Q%9VU-#QwVeg)RvTLZRaDFXqSx4D&bhj{sK)K|2lV5&jT zS1KzgK)||n7Eb)l@;Y+`WFXIb2cjKjUY^j*-56orp$D7!IP8xzJMWA}on(Qtz6Y=O z`ofp4_4vw|yS76ka?qDXe6|3_|KaRw>tDjyg7O#OR{(Ts&z45_AMBq9b_IgYXG(8h zCpb23^Jn9pi70Y(3k^UpvUPNoCncWOE#^?c1`CogCM2IM`3YH+<$h%%w1NyZKqL89 zY!cS|Q$Q0&_;EIYjJJ!=2bih-TJ(SDl~{{%Xdm^s`3HZ)3JpOctww|M|MU(?n zc5fTHGywW8IeFy%7Hs~!KfTB;hUK^siMQ7=ualjlC)Rysn`!@m0A^%J6niFpyn3de zgUBK8ceU^KzpyU$oDaBbE+dx(jS^0Jpx`|mf7Id_ZD3!4Vzt%>_H`pabtcI1nI`aD zN@*t!@=odDU|3vO{uW%QB|PT!;{VLg9%sJRy&vdS9daV)m4!Km7#urbH!8&T!ER~K z?3qrEPG%|K!R%Opv}6*|fJRM*o!>`cMlvnOTiIQUI33w&mDf~4{Az;aFRawSr?HJR zo*NDBLHHY`T2=$G|3bY0!vF=j* z$fAit^c4>j7M&2iBXE=CJ>v>p?T({MQ2{)UN)I1CQO#}Ys_DA9Z)s<@Nf}AbTxl>; zpDUC7=%K7S>lvgTDd{ZPi=4@J`Z|(4c9D%ijUzI-Nsy}56DPt-P*_JJo zDpplsU9#NLP)`F)H*aGPn*WopR)Q~^Amus+SproO3P`D<`<~k|WfWY8GCn<9f+P@x z3uIcruZz&9lD@z$_KZNJP;sB%)rOde=2a*%gq~Zq3@-MwpB<7kr=k`BpGK^JCsSK7 zN>CzmnZ$j7;PFwsy6dDG&X8d@ro)2#Q?{)PtJDVnvl6B; zNr@ncr?X0juy~>GD))@C1qUS$Bnj z!~AEHCIb&h;z2@ZxbdQyzD0YsMnGZ=YVbL5$y#Xpd5MBzA#n)iR@-e_mIg=&cIX59 zk4~gXqw$l*Qa5`d(fK_V=@6u&fyREQkP1t2-pnF^0~>0#!KfR0U4N*hsnEH0-vP(~ z;vyGBsCNjy?n{Y?Fgt<)`yHTm*_&IliJt-$qBTD5*WkB$XaN1bpst%~>Bu29(C?9M2mah|and6-vM; z7X*7h6(}@QB^}t6tFKnmF?qy)6X}&~5Mu+DOAQLL0WglWqsfO-;ft=GcQ?etQ-bo_&2(!k2lq`whDF7n$ODj}ltfHN z9gffy3N=)I6c~9~sg;qOz1HBUZ9?*I#@l+VFfvsA)$3!9^SCN^lzoNGt1c6~f5-80=8BE1qLm{ep;VL&$Y79(ERqp8 znpFGhxw#&7EvFW=5l9AUxaV%cWR3wA9#Ijzyd5w1t9yIY%`L>ojm4r6y%bj?ak)tl zKQ03@LEmZypV_Cu2+~3a!)Z%q)`Xm5OeI;>jc70F3)CGd&v(TeVOu9`Z)Oe3g~m86ybXw?D)JBOXiV zJ+fk!e;KHMk=pkHnv-_WMuLu@1dNy1qsM#_Z|KP{PP^+$9gYGZd{6f z&Mf&(M_a!CB1_Vd1tjBzm7GA(60W{Sa6>DtM|_(Q?8CB_;KNr&7i?uy)UlM z82;qopFp??6g*WE7hBVtlK>ABWaXU+N1*zJ{1=BURuXHgK$TFqwY>k#zx#jxi?fBW z@);EYY#1KsI*a=|7lO-`w8gW*E4IqW7DZeaxA zQet!+*j@Pj;D;&|HC6}HLkuBHnz_SnE~hQ&A6k=C#HlZzKccmHJu*72O2@5KD|f?Lmr`!!KDq+0!~c1|Lh7 z>Ean>e^tFl7#~Fs2hUJo`Zm{YcSUJMqW&cD5;s(J@F(U)ZoIB#nvoh)z+_cxE_9xv z_Lh_bqRrLwyQk~`)u1OoVIct(wDauyey1-jCMa|Kg`A}%Rqwl;?21C}Ha5IDKT5A; zl}l!UbfN; zQEt?!mF6yn4@y-zBnvz3Y#TNmSHpZWiZ75iH9q*W+Unuv8Sg%eEh@S$DT-6hP4I_e zF;C`?bYs`q9{$jD9X?C{wKI(VG}c;ISH+}l5a}>lx;vxxDz{v0Db-4|{qZanF9Do` z2q)b}QJP+G(IBc0h{uGR2chry&1^I5qpt=)4T7HSWj1?p%L;&A8&7~;OA3{s#5%;e zR09*Rw9ZyEqP?>+!~APD29iE%F-)#S4p0BoiaPcJGcV=uQEsIFOl6|-2L6L`8ZdOR|H*DTk!O+o%p;Qz3ip_F5u?Wae+b8 ztm@W08QN7NJ@gG&Djz_+3e4l}edZJaH~$YNKisYo@F|E$2ghV_LWQuS(+W>VFTOHF zPP{$p-Bih+qgycK$(9{5m}HJB7nE?1iPLe=p_~@Uw*>_W;4)=6-~(_3&+gtwfZAX| z&{b;!iKy576J@xXLq(r!h~6s`iAtsu6e2F`i~!h4n<=1#WwDm!8?Ce>H)C!7=gTg= z3O~)VrqAr?4u>BYDR4@5B^M0KMkYlw;~0CTA1PU zm=K8sTKgtPk*+|pBiv|Q-_5%6clkUf zg{$5UkFh_P8ot(WZ_$7L-``ua{`E$136&vFKC3i4a@?c{WSeL6=vx)T55q)@nPYz= z`)I;gV43%!W1Dvj)2|C*9@QYwdl&vGANkjd;*h|X^@;aI!!O8`GUxs(?>Zc`KDR>{-a$>~; zQhovMmph5w+ygg2xx@~U3*QuQ8Df8R70da4C1uF-{psUC&f_oL)C?#ddo%{}j-U^t zM5R8C0Q~M1*_C59V<14oN3NH3pQ6XTeu+tcYLqBq&d%dZOZcql_hAOv(HW-w;~T&X z5qg61o$P5JnTVdmUM3KMR}MI_ZdZ%_?YsJj6pT!BL5e(fh{XaG&zfOi`4Lzl0Tmoj zk^oDbLp6@1w*1f?|GjP7sW<-c zpGzkl<&b|#3oQO@ponJZ0IMu9a0Ib|?BdGOWwTxo<#6=XL3;kw%1*o?Hh)d9qN6?UywCu3p7BF^o4x~0Hi;HXWkRE)8(eDM+I=quaYd7$7y~n zMGqE}NVBLB3FHf4NozOUL8VDPzMCYr0vwWX*ju_~nE{w9V7*_?fnKOX6JK}B>*C?% z%njC++42+n_JMFB{P{d5N9MB<$>N{LD6rhDNIGE74SLg3sxMwYniw&3mS?2hZ932* zN|=OGh&%Pr!-(_mnJJr$eUdV%TOeTh`(PnFI)f7QDM0qfEc9L6*&(Tdgc&sa)uQ!- zHA+=Sye%AiCGw;n>k*Qho)T!Wep6N#sVS_P9GI!9*GH#dza$qj3@tGJ| z-nmuNA!!vUnsfOB%IjFR<@=To`nxoq?`Vf{IS%~WC?C=3mwg0}aJ6#hmIDl3JH2bt4FgLZp5>CuyVf-igdH5KAm=&S+SkzrWRSGWX&M+MTo*}uA~aPoRsw=G%A<%$a>lZZ7(2Y z{9SYpHcIw7Hamz8#S?l?9P+BHFFqHA16`8j*#F zq6e;FxE1k2!ZF#SXPlL*m zZZ<03zNI~@$2191P)))5Zya?00bZ5lfAPQb|M}4HHzNT50$?8iAP^7$0000{2WKMy z08ao@=?Yasl9Eg&QB+9Xhe8rj6mDCh*4!yG2ribdq+e z;T{U(_cH@VBLG(b01t4x-@C_t@8;^8hXW|P_0E-lzyiLG5Mk0nW|U2s7%RUKhjifSTT z7Pb>px1?=?|B#UY0096R8iE3DptkMZJ>YE{PsaG~ljApYR_u928eZUCUu_~A(_J&wlZ2|hMRGhX($79hHXZ4 z#!<$@OuyNBoYgSQ#FW7^V{YbqMo~sC|Bqwij2c%a!A5TkQV!vjKSZ`k(i4_rH>NF& zQVi(K-5J3%OER)&m}Y!u@MeZ)^2%(QX*W|j9nVe~!36-%nLz8187{fL*IAb>%AsN7?z}Xy^ ztf;MvSHjKu%{?5W;U8yP>t$Hy1cLDL_xu0PkDcr={O$V#iW)G+fT#?>7w6B9KfNBM zf1G~|tTJFdc5<3{xm}T5(OCgZk+DLV0)GYK73KNke8;Q_^09sKUB$G7{1<;HecV*) z3`d3J3hD|&ehfZ}V85HKdba{zg#TUSiurk~L=~m`tn8MbRBpoamnt(;|1*V&`1s8y zMPl&Pt@Ah^J9ds&=+i^r4@JUUPK?cWZoh?#nL5{BmeGRz(LTL$3`-@QX|2HVcT4X} z-IbY9?;kho@^AZzoRj$cgeE$#WTwW{tNcM9+>6IlBYwhu4?joT+U~evr!(;R?J8O( zcmHE2Jzw&n3+j~PnEofL^if#}x@e$C-ON|kv`vi(oA=ib!Kds%5*JhJP%eZJb&PP%#@&oTM3MH8p6QK0mw zul)cFXWYr-aKB{aic^R0lI}7CK@j=^xnZO~o+YmA4|k;Ve4+FNDV54UOZnW`H7xxu zd@i+<6-Zz4d2;MeZuoteFPAFvUi1-Ky9dK%n`jkn$^RJXim7MvecJ!zx{_LXhLzs` zcyB45(Kq^2dfKVaeJh^nqZdU*vhWcTV|Oa*ou~dW98B%;mmh1yseK?aQ*UZ;=)G#` zDx&;iz2~3&)e9U}{~i7cO7NfcZy4a7I-03F1B0J-4eqJH8L+llK-nPLyGp+fGDIrZ zeZe*veqHbtF4H!vAFdkFXU|dI)K4TxsZsdZ5L=!*z2(6R{!PN{O>fVdD&RX?x>f4( z4E139!g9~XsrwmGi>BS)ulgDwIVxbEay$x$Y;B0?-?v3${$~xnv0d=$5!6S)-g5L! z0L`gY`eMRUu)5$XUd&xxi;cTX{nn0{y2%Qw$J#Tz4=(ss$;vt|lwI_8>Nd6X&eSF9 z?>}e#N>#_6GIy2sG4{1zf#24)`0~^)eRgGVQ%C&?S9vp^sqgp4K(X!XpO@d78XrRd zSjW5Xc;g*+yqA-+Xn$0PTh05&JMVbo9e2FR?f2S50)1HkWAq$zu!-^^ILi~ zW}EpM9A`I`^X#AJBR?zYl&{f;;BtQWv$Vji8s`y#KY3bMRrhQ)%zau}Rj>Tb5877e zd@Jx(ZKPIFJ6*eBRS&e)Fb!&9RWG#FFtTm1s*u>4A#FDe^P*N(Rks_4c~PsYYTFIN z{I^xA3U|XWA8OTAHM?P$m$hoD9^J6a&;K<-zZ*@0x@hQF+6@xD8wGf@VJQ2CRRHiB zyQns!1gu^ttmZCptH4zS{xoit39O!gr43$veqNw@O)|tyz*;rEGQb~=^#L*0IJ59C zFui6&Xhlx`8kh;bIW`({*l3<`-umX-Xv(ppfroG7H{nKa4vprH>jrSdji?+qnmN2R zQV{t9XsVg8)@xu$E1>uV{%me47}v^RFh1*=T44Yi4FGt(MsA17$rk?jtLY&I)2JFb z+78pG9(mdp)2JdS-jC^26D)7ZbgGKbHam1w7tC#y>8Muu+cwjvGQ{36>r}0NZ<%$~ z#^M_@oz<(L8_hbZWA=@j&h;_vMr}t5IccL~2P)RzjmXYwWUGy}9jauDjcYsA$!Z&H zJE~dgHrjSnwG3{%?NlikZolnRD>QD3>`~o0zJl9PZFtqT<;a}5wcB`;f4Xm12H?(SD)x)}`RSl~e)-|neSkzYgv&4XqkjHLz}J)qA5kus0e3zeXc) z{LN;|Rx{e4l|1;*Y82O+Axiq|X>>;L*R4*>p}NsVYteXtvxW|zjn9ZSnjwhM)FQD4 zG~SIn1U4EYplCu2-nm0+qcoz8Mug-VJi0dIA-2&EL5)TbkI_sKw`LEzjnN1;nj!Sj z@DaGC59*CSgf|)yvoxe~Z~P&$(IBE54T#`0fn;tGM0}$V;f-d9(3;XnHxMGe(T(V% zF=uCUn$Siy55ERJr6@ebnF8;U(`H1`Z>b~)Pc?zGX}v!m(fX=bsi zjqe^CjUL6#?^ql0JsZs)%QTgUZ7}w>(b$7V)1Js0$L2O3d)sL2!J~oaZzi&ojgmcY zG<#xbCfweD_ugpt{Ahxi+@b7zquEnNQ-}E@yy!+{4;zhpE;PfoZ!UY;X!ps{5K+4n z_q5UJQ$~Xi(oLpK8{_qEaPW1~qYYopx7MslAU%|2x`ny77<``Kvj zBco}jZsXkEM!CFQmD9(Sl}E9))3KG)rLU{(mBx|9>YX%S+4E{mSQm#4M=#|BoYQ z+ZJc^Z&n}s5D#Rj{_jiZ^X`w>5uxlqiOq?>7oJO}&fzmPUGdXQMQ$FF@7rhNop-#c zzMN(IRtp&#@11gWP^jDE5IFja9#GRjOe=>+FX!WoL^MTKgdU!)P!2Z&J@%S?O2$te zVWWVdTYBune@{n80*^VUuzOzoxW+T?1vnDW|ARTf9E3-ew}UT&WElz`$qag0eL!^z5-HN2yA9Lv?lWn1$&9uHFEV6v8GY&BHQLcnLArRTFl(=;xZ)qU4G=(k0Q=_T3n@8cQc35lC1; z@s^j%QZ938L-u)%reM&;@b2HhPGIcE$47W~AuD6ObClRGi}AeKxNXcuE;wka?uP_O zLm0}q%xDIVgo?R=d>tuPE|XHzrf1G9&5CY2+(`vO?T{8(xDRMr%DrczzM<9(`iSsi zW%FXv0gqrW;@7o?rfjz9Zu{7u?R|}FAE88xm!!$3n(&1W*1=()OS)0#iSBRn?Q0vX z=3WHW6%cp`G#sn*$xX1$A>MRo=IS){U^`i9dde5%xbLqbZ78h;ZD{PhS>;Cqd-oIm zGV!KnUZ-@&Vv(Jra;q#})4l!FC)c9+x0<%*6%eOMJ%8ATEHwrf&4aIe-$Huclp=NH z<#DZ5x%CNDMG*^s_Qi|?zt_A{ZpRAw2D8(ZFw$ioEH8=3S5* zg2C((g(ckE+1x4{Ilm)f9pu!d_3eGm`|y;w)PKhW5o9}kwN^aZMlFQJqSo~rlHgtbj_^z42HSsELLLj`wTAIUkSRG3jb`N{yPA@zwY$@Vw z+MN@G)aojxZh5bb1pPWteEYrAx^efiicD8(eivYXG~m-CAjOaJb}4-8q22!JqoclF zK^z(elSjV}9Q9<)2f6OTM-FjV9!6@0{nE;{_ss_A`4Z2^E5qZ1FVe`C?}8B2mCK)~ zZzHXzaHTD7)LbHT#I{}nVqgq)polYw&-ok|_ys}FT=+(p7&`A}=5AEwC?*36V{CWh z4O-E@@4E>}Z|=`j*rZxJzsum5jDa&+7s;!n$MXRBQrH;^;p}^Hm07{jnWthUWbY9( zL1eBYgS4%&A2n-O7Ngv*V@gPt{qhTQvZ8YHhKXgmM%GHHV<0tl^4bCL3N6p|o-hjWz*BGB?}9D5ctZcEoWz`dJFs5ocZ(9a4~2393Mp z)n>$+A9BKrM2Vr{W$kKEDdg5WQaamavv4tqLj`v%>u^cqJpS8jXxxNj;fb)&X3<_o zh&JO%#U5gIu%(1c>F(X4-L=5rCgIUpMsLGU4)Lzjh|2g9?i2Sss5?3l?>|RAE{k_l zN{5HRlakt-=BASdVfj9ZPw}+@d9Y9`NJ6uwDexL@xZO)&w z{6^i!YoJC?Ok#j2sWqMQ)JgFJd7QsR$^_MEi7jk5-zAg>u}r5Mw`u3;L|jv^V>qoG zGX#+OqO|5gQ}trTDITxrCD#zkO?pTV1vgHH>h6dmh$}wyODz#b+Za0fz6}RmN?4B5 z?7?~9BMrKAqMS9>!@pTWIJH({Z;dSyaL3!BFxxb*u1{Vq1iWUlSf#7RtBWLT&!OFC zO}u+S@sDSAj-rM zVy&cd(iLdQE4cgj8fz6-(art&S=%x>6G=iMDnZ9pD#Uh7OnEK2N{pjAfgVZooo=1I zWxQ-u{1wYBhpEzMA zFtXT3dR@mA%59mk(8Mj=&#p`|9;_q3&(^s|#tElriV0?HSr2fR@H*UxcD~K@y^^m1 zLp~w{$p(!R1t!4rbr(Gt!TtHJzG7(e#I#H~sYuylH~I9^=gzg|te6Ae$`?AQiTu|H4-SBogSl#=^T7F3*g{Q-EM>X9<)s<4R9FeS|C;N%8 zT_KpZ23Q>x*7YRsNlk`et9>pv-_8xKw2intB?<5D+#S}Nac_n}ozZ8ja>LD(6X>J* zbXQGqI^v>mw_6jDIFbkCq7_UD9h|;E_?bgWuC#kOmsTaEj4&aozm_g7vagctOI2hN8?m$7edEwGmR?z; z_8nU`ye{2fw(kAg6z4aacjB>$&e&p~$yTFcWPGk&8MY2rv;S#DtjN;l+@$*OOvFq~ zyUGl~Hjy!0L+a$3ZN4J&KtFq{f<>G~Hql*YUyyJRky?)sjqNje9+)?fNq40~v+MJA$&pc8@&flL#tbmCv2|-BQ{qRvNebgCjLuA^MoL6&wzvtN zq$8VbEyaTNVO3hp%4wb6Lt@ghR?|V)7ee=Ml9T8bBKLg@t|^=<+0G;Q#YGvaHsR( zoxoCM&DH>Ox?5`UhMz{CyWzZBpJ!f<{_z-hKXP;=WF@ud9o#qdm1inKs0esQ6+Qqp zsVE{0!wSR=NhVfkESUhw9t*8FXym509-MUQN_$OIyadL5G6<1*po&9!A%Jq%0MeRr zP;Lm#IgqiAWKn6QZ?z*sMQCI0qNpV$ivGp?AaP0%?=iB5lXhg< zjQjYZba3=$>}c2|I8BuO*6{wDp}$k&00Vgf4A2I~pvcHp2K2~#pGaW_K2j_rq9qwV zy>{=kvoC;_e1>*Fdu4)M<$`JDiqeh@7eyT-6VmDS8c9iy>dtJ7>4`$=*_-iK0?K>yc^m5!tVDr`pVXoimxPc4rBc{h4nV_^*Ddh_=_S zx{R=T8?c)_&WmO(e3!RBQ{BC#r$gDH;~Kl|QVh~NGB9VHUeutK2Z_8%rQ+`~T4bSw z5l#{7+D|tG_nZ9+u95C#4OBWi;1+k=XBf&|0P>FK8>sm9{bxSQOvF~(7v5_AlSYpO zt&!fI`PwAfE)5~Iqj#gXMH-lcpV#W@A!D2ftm_W<{iefu_pu(dFc%AcwO`sS%`!P+ z#%lpgtP?q?wPJ279a^6ptUP4%x)qW2PKiX;XE>wZPw-q4_UzU|)$GZ0#l6Un%7muO zH|+D!Oj4kkT-k%Rxkk(hZ{S))yRF;4p*SG9=!p4ndmINw?KB%Uo`o5g5i`t`sI!ki zVP$1Mzkl5Zm2&XeyE4mylIxx0k2iFDE~b#=5MiUgl`Sj%&F=~paLO4?83_H*MDLJd zm|o&J(Zs0dAJG42Ag@zSpNi(b=mRJ?*(L50`QiEbrMY{$|31)f@kF@uUJX9lsrpAb zA?zl@7tI-uDWNnmXbw5)fT;3ytO8M@UyCr{U)d>(|0sIWDtSIpplgpl{eI_|Z{lV^ z)3_~!=?mn9;KKC6kLjuCe4%|Tu}Sfr%>{Zu_a(TlUR_ejI{sQ2$u7iv&?7C20%F~= z?$NOvaf+l?>_q}uDf~)t%`P%WchAqyPBfV5^DmT zxEg=mvbuZ=u6kosWfEsGtQLOxB$vrv zT^AL4_g5+kJnQRN@av!8A~CjzWSvu7V&T-<_iiz1D9w9hzCCkNO9awhr%@U|+p60& zaJ;vrE-f3USMpvBTue^fcG!ozMSq^#2>;maaJu()RK6Yd%MxI|O^9U>QmCml!?@!d>bZ`ZABbBIH#SlU|r2;kc&V;IQ3N5POSPG29g-Rjv!CVUE?+# zMR|>NqB^N&A19m}A4$Q>@E~Vz7Qzq+!s8~_S&d+umYv(7G7U%W&PQoQ&^U4p(Ve29p&-zrmgk~7!bTA}?Q3r8(2!fBWwDsB zb`ny%JSk`{5m8+_n8Zx}xB3z|Ue~h>WnuQ3zG`o^2E1PVWhQ=@sfefqvTjDpm~B_1 z^HA0#y#`7jLH;rfIXDBSzQtTeCTnOf384^b=2%e{BQrz1(G6O$ES6d*O$*|hUlNgz=wjzdk&>ibTzS$w3+MA1kcq&BX()Dd zF1_4Bv3Pj&C;`sVw%Fs*i!wDD+5qq0nJ%b}2nTCfxKHlO8qkw1N(At@@iaGwTNf5@ z2O-HQmTco1{3q-rabwD(p%9jMC}*Y9WA0=EvcQinl*_*y1P8JMHQjrQ3a5|(hwJsE6JeD~N3aIwf*+P=FiU+yKO zufLVmzbwu->p-b=6+jo(5Z>*~jSHtWCT*CqZUCQA>L;ve&SBV#o z?)V@upCSx}1=D{c&eH)cZ?AJn`M@3P$cUJh^6(6y4NldfwsXZut#MpATI}oO^x6+Z zmQnJ0ej5XOrJ=hyzF2FId}q2!E5ioMB>LaYE$o! zgrH%*khUw54Y(I@*QI4d<%T1J-%413ad&+`q6tmjsMN-`t@zX{{mduXmift&bd))W zXp<=((Q}5ScFv541VTc`x*!;#)R~d#Y}1-$(-Vv<_KRgP8!rS>7#^Ip^cndZJRiJdd)doa0{9*Dn1}&XRt&bIXdIq<>VV#US&!gi zO`t0}5Owd}j#TQw1cxJfT5uUIVUp|}H*msOT4G+=Pp~VeNM%|>AgTq& z2PDvf>}?yf5?A<-8GGcA!&Z%gifjMYQQ1#q!gO|C;G6 z4j*JC(-2bGWvwG&+U}+HR_Oj>9WD%V1&60#uV2o>xaq|!%2x0-v*j|cwE@n)&SruZ zA0Z87OF&m2*EradhZk%<&6n9Lac$dTu3#1rkgtQY4j2C>N<^3Q4bbbd;;9XvNU@h9Vgd&D> zIt_JYCzkGrsMp*}xW}FI7;!yjlFp;vf+~|VAwohfr5tm~NMl(y@HRaDQkDeU(bPS0 z$=$W6?dvs|ts?l-@>}qgM|m{~*<<)U9j3v8x-O+&F7k^hKhuK*spu#-%eebKumq$wQAu(x#D zbD7=fimzf^`a$y4-adgyVqR0T5p!S5+Q)eNa*L-IHG;Klb`HwNd)CWpQlJv zWaRJSeCITKcn-Z8!9My197n^tHS9RZnFjI=7VU)-g8;LQ6atVcjzE z;x-TTU?p%y?-Wh;yf3R!W1|%MxWZs1TRCm~+$tH>%v|UR@f*~C4BH!hk2V`Ns`6Q) z@IA6|YkOR2*sxufgH!TWuh}b<)Ww(W*2zrPOp?ovB*!n z*yNO!Z6YmdoSWYiQ3(>lBMSJaMDdKDtIY|>%A}QLGuYz-*AblWjJD;A^uim+qmBj@ zcZaFeukFzqvsr-u6Tb3LwcKME{Th-=HiToVDw4BF(NILavFdmTp`5=G!LJEu`Ye4f zf~8ABKp0i#p+i{^*|kd}d$c`fW?3oGB)Booap339_?JvggiaHql&*JCya;tQFwtYV z&HQ$T%!dLs-B#v-p6OFRnk`4nPlLAIb8M$L%UCv4OGnYy@!MT%Z8`+Q_lkiVm5FUY zT0tJZ*{{4hI;i$;O4AU}J4aic`7@^`N~|##(qSRnQ-@DGpg(}RwUX)eBI1yN>q4ll z9bXNt!BtdKtC`DzQ+2ooFzX4&61-9QJ~?s@vDDkwSzK{i+o%eENlwv+y|Zn#W`xn) z)2>bk<~q858~k3v>oE*O3ffx~WI%tbh%s^~3Mc#5b$M8&egjSKg))*^hifc#Oh%WL&PC}9o+D81! z6Amc(!u z#&~e7*PSsJ)rFVv7~&|QWLxcR`Pb4Uo(?rfv{XF&mJCbW z;Z|zfO8Vi~18!F)<{XiET)n{>`{qx~WS7a+eU)^`Q3W@7qF@wbJ&^z1Ln+iRj`6cL z?ctLLhu5aTeujhm4M&)Y*`wa$W*~3~ouNL5Z}*-9KS^=NdIDZmF)lF}WM|dpgcra! zU_iQXmMsUm!*S1xFSe6O36E;`Co~z)S02OGIz@u9@<{=11mv^QtMrE-ZVJk z#=6w*l#|=ZwEiVKb)t*;O%OCgW5W!$iJUw?%8D|E2KFn2u$>5ExqHvnd-qwf&0_N` z9&+C&t3Qd`x$-i`Dis`tni#UaxQ(jc#Nt8ufb3?|!7E;}B*`I%=-BfmpFW;12V(ka zML3jl)^$*EcXAD`Pw|#EBlI3Dr&t@fzPaG%XjOf=)mDbMOYf$_P5qgfb?TM@=J2d1 zprX7_cJ_H#xwjChN8UTKhmow}?0Oc~#zc=UjD4fcJ44w+bE2X1lX+ELXo3_CNs{UC z`GSzr$}x?etFao*ojWWHv|R3lc(YONHsD2@#tkQ4*hiZD9$#ftc$N<_H(ODtUTC#& z0y19dh;oXyLI=@t_Yk6e>co_yLwKMgUPkUfYgSXBN%YGSf@BrRD_BSOLI0SkA-4(N z@TkG;TE56$#>}lxpyE=c`590f+O#L_9~OKYr4}HHh{%`=D=R2zYtq+(DS zwHq9cutGNsM+76Rcci04yEOuNl17fLvq;M)fTQhj-C&JSyWt(5339WfltV|N56KR-5cpM`UkB-j9Hazo-(Uc zN_O)zYaS(pVA;CwhRTD{=z;c{#?${Mj_7~Q<0V78mvbULR8B~v(DXB;E%!x@r$ zk-#C%fND5DuF-N(qFzbKT{F=ex=>A!LGbdA9Zv3cG85u_Y^>U)s6I%PHC6k#jAzkh zAzfryIFx}D#S!Dl)g1E`xCN(fI+WfMdXA6SKyb*kZV%QfE8U5{Eh?dPS)|NywNd8J z`gXQ~Xti@LnTibLvfW>8dqf{`V5Moyjui2_XjfJ&J|-EBwnZT|5g!w8KnHx;vEm_e zlP*@9w-${Y)*ueeDo;$6md^t56u1o*Nd8>w-_EzWM`1YB7Wp0}XccRul z^0L|Xv(>HRPK(6Cco4gB5u{(^%VQ6<;k#_)Y*1`TFHyD&7Djh?ZCTF)SE9&vvz+4% zlecdC#V{*^D1B}xe>!I(w>3htfXI$LRQL~vjw}Vs<;W*MvoaUl91t84Jo^58MXA^G z5&76+^hA-Ujj1bjgXAplSPsY z?vB0%93%N!-@WZ!II*Qm?d7X{#d*x4hpY{8TzbQCC*)!}y-DAWz(avYd%-6(e4?=X_v6-7GK{fM0g>!Q)4ofm7qzu*;oBcUN0v88QZSF#OZtq{> zxL0i<=6y+!O+LGYGwu>8(xOt!p#jF%i^L8AlVWlE(-FkBT{*BsBPAX`{3%#?4#&Vt z%=cO3tQ`LyhC)8(Z^(c?c#>4-izW%{zGBjRYa342!~e4C#eilHk6s51IibU1k*yEr z_2aEdC%t@;#W=`Js|6!42<*)|wWrSm5hvrlW6)Ew8l~IzlRO*1OS@1IA9%zbmYzhD z&j0Py>?k>H(Z=s>OemOEkQFSXfh7*EkYQ8krB?Yq4UW6B^2#MO@+)@XCd+V%6mc<= zkvNVihQz+p-@#W@i;E$9YRPL)2`RPN@+TH@+@0ZQdyLD%+dx!qEgu?UrCI^u+vb7+ zc$iA)U+jW4a!8Umrn>U1J%fX&ITMC7R=$d9`z}^xG(t!6oP%oNkcu|tt8YfQ(LYL3 z9MZC_9NBhu?9$u$w7uaG{(05MPzW)3L&f=Dg{1W5SL#W?Gx5Hg0uMdUnw4vT{G- zY+K5%Uvl#TKMD-19@J25Rf)Q6jM5FRGna%ql%ZSUF8f@hwg&Jv*`R)M+~B}SVWIl1 zV1?_*a8rIAs#P)DZEVhTDdGWe_-J>F)-LYXvl6D}c=ZRN+?!W`mbN5U zkPHE9(EW4(fb;A$fCB{z2blCfjY965n&V%PXaP|XI&vqoU@80;?G|uQ;d39A?n({+ z%+qRKFHVKNsC(D5zz>GYb2LRrxV|_=!{zt8jKuTy+M<&t}I3k^DUrCGToi zEA)Z)GY$Iv--Er>j18a3zyr(}JAU=PzGezb2qv(74YO>YU%&b$MT-MdQA^>BK9gaH z_+if9HJP^Izm{}E5vZ?cr-9>-(Q+JS&dkxqYw7ym!jJ3>ALb;#c2+{4@_;b@%peh& zXl7?$ad7uzP4lw&ydn;brWx9n9qwvsl`S62W6bz(IM~J>C}Nw*jT0p5QZ<_I! zdkd!gvNXOJ{F!XhRb6)})AObc_$-8at0Rd$*Q|xYEU%f5Txb0=?E6A|R4{lQWUy>x zWFK*OwbB1--+G6?Q=4oiwL!Nr{I3ps6?ab;wH9++P9`;s`Y_5{TK*A#If4n57H2PZ zaZ%3SZ?7XTTE9R}n>mByJ8c^NEZTTO&8p3MP7!nJhE2N>(fPK97qiAs88~r3sCIg^ z2etv%v^LfUNJhYz{vGCokDtc*@C(JNTjQZ;D&kHMMGk~||Bk~m<)5}r{df5pm9Ot2 zVfxbx&xS=@-=O=en%7w&R9WiLaB=thn_wRk(Z<6sgOff7LN$sV?J?|ajLp6*eGq0c zO}wvJpG*DBYz=kAzjR9?Z62L|s_K3&Jiy{-^ruH*KL7t9WKAvVzkVGvKlQxA%#X}o z>2*K9-Q@I{bJA-0*RRnN9~83B;l?^##V_Ydmii1S^O<(WhGvf6XZP>$Y1Qp#I{)3- z_KYtU&|=Z*HS>M41L|lIYyA5)CpwSzLC}uuTAFV2MCQ<3>* z-cTDqB6iysuWC$2qu6R{OZw-#^WV0kWG~TA1}fJ~GEeix{dj5S<%g$GF8QVT4}E6_ zSM;w(wYB;DFPvt-p6nKS@FUi;nsIjUHpcz0Udu`Ef7Mr(V#YYy{L_?gMTdHFe` zyk9i`zYNcoH0-O3{Iptim`DE1+f_6S9e$?)1L+%xk@aJb&iFHJ;`3mE?`ZD5ls{wd zIP=(V{I7G#n7_rzyPa;rpw;j}(_G6>3)-OaV#4_o{r<&eo_0o@zA);==C>YH z8CT_-KWTaRw(C$;?fc@hr5onuHom`l_9jn;w7ms?q$yv=sO0b0qkTMoe_g>eSM!J+ zkMc!)^$(mje<1PEX9vs;EN#)A-{PA7N%Y6p<|h3k!m(Esyk9EL%e;@cxa$2AFM8~N zPQRV9BUTKNWJb`*IV^h3ulB~@v8T?42V#EtY>~+Gv`U3PQ(q8q)^G6z6DcL|=9}HN zs~aL_jRU{o*PlJ{WEz;)&(w0@KLQ@BV{7wjza?wg$LS}<oroq^E{nz)*_;qQGx)Z6+^IOZr|59zPG#Uu}#D_pB(r}GTrZCoQ? zPkafX`ZHK8^{Q*#a6yYPEbvDa<-#++f+8Tr}-fnlzo zzsZ#86%Oxe$6m!vt+vL92wn>v|y@{_&Xn6bs*FHvKAudP;1z<1P# zm?0R_GjtO43}Bi)*8HoWr1b%qaAhY=hYULE-6W zf!4+>y2fY-&}M8*zrEj#+12tK#54ie3<<+uM`je448gGm_6_PS5Yu& zW5`fvVQ|EhzBde-d_-w76EU^?RmlED^#Z*2%70-K4~fl(B*s9#vEEOaXMJ$Yz5Iy@ zEsw|G&mg7es(gOtC<1~68r4ugsIKxC-xezR-}gm}-L?SwfOSer+V9Wrg=F6=rtvoI zU*s2^0!FyseCuf9;}Vd6Z0^JjdVBj0f&z0 zl>8!MIH~2|wfEWuSNr&;wp-)@H@Ys)1&NyS`M28yb^AT~;7;)upcVbwx!)QBpP(-* z9QhM~x>L09eiwY##bW;ebqSO5w`#dyYUYMBpf_~3Flve4l-H4;Uu1*FTi;#amG4Fp z_P5gv_;)^|g*_LsHDjvM1&oKgvEL(xfyWk#Evbm-GREH&or4=kL|) zyxtF_?6bUzncthO%+^4@i0RTUP^3ICOC(}`f9kL%=(5hN5*!;@(@V`;{{&D%O@D+* z;x-D77|1-dpXGO6V$GQ+x3jSXj0~!$yiVvIaFZ9g#d}Nago>qZ1n(jFDX0YHI}uznry@FY3-_V1p=>3Hj|&ba zsYSC);uRI~#>KHn264WSBqh%V&xr;uiQ%!o;yNx;fT_`h+sY7F8+gg%TXI|>487Kn zN+GBR+}Tb_7)Rr}@iaboM7%L@RH7q;!mh!&`r8W+AnhE^gz7HwD|e<-y-?E~>yo~_ z;vH8rHSB(#;%@pK!xyJ^4t?;#0-TFjNV)DuISwfiMgh__3I~oGbBuJ+am{u9PtO{u z0p;DU9vq>n?NXzmZnd3cpC2gH;&ZUDX~<{qj%k*5>(|lpa0cUM`LJl`t-y9pJ9x9o z%-rVNPhp{VUCh0`A=ZXq<5`KB=h>Li-jnJDPNmST=%ZP5 zP4YN*TGy}@ZRi(ra+S4$L+`goOHRIq8|>yR;yrf2i6pJQ8scx$gOpp(ML-1eh@jAV zfV>&pR(xbXHB(HMl?*c0HuV~;)MC=Tt79N86^0^nmsHkSl9fYBkx#1VT;!}NsoQ+{ z8fLJ>B;FMqT>IhlEUwj}fJ<<*o}nVy6Vk4c*tm&|!Np2mVHZAbHPGYf?r3f2>FGNv z*%UHz_h>#;Dc5Xr?lFlAlHn-KHMwNa+VM1$WL^RDz~aSyaI)0j&Wg zd{=#xCH?8VovD-uD~2gISBxLKzACRGIceGp${aNoLN)$4e*1>Q#NLIYZIL4ZmfJV6 zmy$>6`_C|E$6<-6F_>G=i~H$5~)!1J)Gm-w(L3Y9hm~Uo7-JNYQh#oSir3VGCi8 zGqf-RzNyc>}9W!>$!CMI=L&(r;m65Nm>1 zUqlNeTwrbkCQ(%uN)yWef=209qXBa%^mD>(!qsYclMNOu&!SF@xku01**#`&hR|F$ z2Yc3r1YRLw7dpV#L*mFH7Q;MWQ0%~x!{b(%7&%=v(;aj}u$8XWnN4Sg;%+6ihsb8z zpP-9qNN5$xZbRm_XH*x%wT{(|q%xf=PSXHj{n zWk7gC+7!?0@YkA}KkVehQu!j7Ja8QL5POrnydG<-OZUqHXQj#st;bUW`cW}%-wlaV zY`i-F6g5FCeHERpkKJl3U1f2mn-fHNok$&{7I>a1aG(4bD?@8IFsl5K&MAC065=7B zNf?$-yZT|2Om{iFv23gDFF^sklf}BAm%iY|UBknYo&BgJlQ{rubbY3cHz&wED$uw% zM~QJjanu`UkLMl$o+L5Yu$c-+3fhL1TPV@U*^YuU{eCKJs7x|h5WhTB7rt>JbN+3+ zrI{Anm6$#bx`z(wmsz5qzd827Z6TZdE8^Vu1N{wV~@bqtY3KhSvWNy(`>6YN~B__ zyUS`zN!6$yf9MdrM=sMmw%snr&*5j+c+!^>q)D>CI z8$$TNy_t9CGzAbs_nJ#Umh(49TfcDXot)0HcM>&VG28{%^YBtO&>7p+%I`Xph{sJh zeo9W^aNBOpw@R})Kr@{5sww3y&LCHp`h2~ z5SwQ_qP`nsrF{=+mtac}w}YZ{iB8-+9KUL@@S-8&!!o&CnHW7Jx-03-5k}E6v1DeO z{cH8s)}2Oo?#vt^1X$p>5m@N$jTpY`1R)Xx__RbZiMM1s%N_Pg5Ergc*+wrnIh>8l zb|ckl>dVP*o+K3Mb(^%e^!q0A=XHNOa@_Q9k|B)R;ekyE{+X%swcM>TQyu(*h>RV!K)%Cz!1g z6H@Avcj@X2JKKmpZg?Crm89u7ZXL04VA|F;F<31z%!{k5bQ&_tE>v4J@H9)ORdij? zMY3XCGMc>!H(Q=2Ap#huvDu{2t4Nc!iJ-^j!Sng%N?esh6yAh-pOq?V*g7`-Mxj0& zIN*EYs%-4w1TQiJ^w#Wn zOuRV;{%zHq)o78(_Y;6Qi=&Pe0_3G9$BWeyPK3NhIQwNL#>|!EowMz( z<`A6G>#(j<{RyTNsMo~&j92i)eaHzC5KaSDR1C8K8Im9E+%ou0s~IBG2LqaRjS6rR zpoEe&o9;XxV21$y#Dp95Qvq>*h)Z?y9(JfsrHQQFkVIH4G#B0=36?V3S>YTD+2)b{ zJ`~eqf@vc|A~{3x;WE*aiWS78`|&)dXj;)_3~fSCyh&aaX;E+5g*E62&}&xsJ_ESe zbtO9P#xjuJ$}c)%r%d*V+-0j8{`QLIE&FA@03DC0zv3s;*3gba`|MfSK8h#nZfxFS zIGy9ynejthZ3=7}n>LI+y~e0r0%<+4VyzM3_)Ahp7p>a+b300&hUuYt70YU_A~wra z3S5)p|J0i?8A`6N0LNVoQOC>spaW<}r8d!jK|3c9!PBCop_p>=vB;_O#Nji_ECxJW zgxZuoEe(m=7VkNEg3=@RKroya$swr}#5F$>4y&oPsuzovkA+GkAxLa;@m1)8vq?og zxQoRM;)f~R7!~Q1ZxI95sxHpJcs5Ik)Q9_(|1_nn=aEC6<8id;5afIEbQgihtgD%= z)4h$a1EW8O89PvX#>=5}w`C?iyL&_wkj;z;b@b!*zOe)CQzDymVxQV~xGhdnt?5}Y zYiK%yi@Fgv0{0%w6Vj>3TnV%w*pty*KqkS?K0XF6~MyYy0rdO|>n@Sb9v&Z080yxX9|_ z8Y|VwhNU4y&@Hz|@t|Bn+?cDnh-BC59P)k+6ooRY`1UO_32+-2Mq*R6>4jnLM~Sp0 zWVX#PEwTQ&G#3I7@1pIDGkcBnz$C{SNGOpjFCHF~HxqzW<|bD3dWsZZJ*=F7p{H#l z+N#n{bi6a(bP2f87WwJ7&QlIjUo(~yDtArQDPtgZ%UKSC8Dmp^%)8ZJ-E`YMR(dHp z@%gz(d*lf52ssxRki&GJ?g{!xvGc8#e)ejM!R{zu2up9bx6wX?firnP-n_L2G~igb zMlA1P7+jv@Z4lHhK$$tntXn_!TgLso+`d$N=&%{Pii0P^g)A(>z|d_5tStlNNu3?C zfR$=^S;)GZ5}Q+3356U)|=xm)5oj zBps7oklEjhhr*TBy(cRxrqY@~%jr_gj5CMdShT7qg9{Hs0j&hAxpw$6#;cPC#TAYv zGYKvgiv35#MZKl34-b?R5iXzK3ig~~2T~1qc47lT5N z-ck8&olmzlQiv2PBzw->1JEkShwT#Mh?1+LGGncSE2+WrUbx+#sW;7-5IZ+cto=eN zZZrSMfLev!>)G#MY^T6o{PekTjaNk65#F2eZ9m%3S#b7Ej)W!mMX_JiYJ*mqT~&-F zI!xQA;7W|GJrJ}uM3q~z7C7akT^;MWaUVujp>$gmNe~sy|8k!wrFeM&G@ZmyO4nNY+(pTwVGt|CDjZ!Sl1e0b=jBa&5O9AP-^ zPx8$(BpYVNTY9L)8ml0;CT}kcbAO5#D-7c`f-0ejT)$Wyjxliq{p!36w5!$d5c;Lr zZnjDF-MxN#J@3K@zjJPZ(xY;zk{>u*w#YKIPc3}*hHg&9Z9m7VEbB~EW2!v_M=8aI zIFHHA(y5_l?izN&_!GW+R3o<25OJ25&%RP#mh;$cxx^PYX)3l|$2;S;#SpT#>z&#* z7A2xyWq9t0A6!O4;IF@Hv$@M2g_tH7O9!F)t&iuo%EpGn;FX*ctx4p#wP357P=G` zd>R#%JjX2ggm65QD%LB}$aynjFxz9t60Bl)$7&nmv#!~&mYr5TyQ3RyvR-PRXDi<++ffUxU`SOCBWDq5plXr=cGsxCxJ?CP)v~9*96heD%GQn{+D{@7p-|x+I_G1i@5FPo~ z^FUZ^fHgy838Syi`>F`AlIzKuhzlaJMTJny91;PxV3Ef$mOZZSm zFf|~f)^Z<=9ZNnW-U@fO+7Ppde=8DghuN4w17PoinXfs95XA@2#+!a4=aRjYo8zBW zxYb9Qb{#)Wv`V~r;E*iD;1Yf#g^u#}5L3q6F3NFUZYxWtvK0W$GL}AD?YLN!&_j^2>*)Kv#%yeHOAdKvFx$ggbIc+;A)t2kZ#amj zl($xF3Z4?i(pD8i*Lw7F`}^-M+n#*ef>|q2|WrIHP{y3W{5}*-jk$f^EI~kZ|3a_w=&nv7~uQ zLcSU!d>VXlmpp1W_qGz8Y{dl*2_3r?0^88h?C-B7Rj@<%+d;)lDfp?mFX z!^a{y75#Eb$vwqtlWLqXUJa5X5?bg3W2!tWla|3TF4jN>tah7jXF2`6s2lRW$|cQ% zHP*8Lz@l@0qtDh-!2wDU_mQw`2VP@$dtHFY0)l9)78z+mX|%HWb6&YVB_K81M`21)+qGv(1&dh$ZhF8H6V%q2_ZE7Z*v_2o2lz z6w0Xt1L@_kPOw9G ze6a1?7}9GVMDay?8UD}&yeuB8E{&(vW_PJ1;$c@qokU^bQTIsX z`Na+iy?CcS^)OjNY>??jZqU=;BJa-cpiI4ybzHECZ!?u#@N29?gzcO$<|ORLP+r)a zt$U;XC}Be)iF_>ki{B23L^PYz$kD*WBgW7N*LVx(;obAfh_fs`0oCU~1v^s=f+}t2 z!~=dr*a7zpwzI2p$ms9FP3=mLH9ocR8!@e3s}6ND8j|feaBWC#IjML#Bc5$2YdDP^ z&F7sHT(xp&$u=t2zG=;D0^EhX^ZpZ4-ujhjtSvdx6r~b4;q% zpgBUL+1hzvE2|#DP4<|O)#)Nc^f6@m>R5~@Ua`A|@oW>)n8F&Oax-^RI~`4~H7O86 z-3*&~mUvjiNqhu65qV-+P?B;_pq9EZ%!-Y=v|%S8)!8)#F!M{}`i6^+FJpT*Cl@^h zpczr0qp-=jWM|VQD2Q!9J^NfZS5ym2MXHK~Bt-^SZ-LX!iX5hG+Q~@m0_e(^r+9r{ zQqy^l!yj40==Ns9S=}93=0S3)>bU`QZY2R|N5}hwk)%Wa*9ggcC-WNO!)_T|Iv8nt zt(Vdj%ZlJsEcy2#6-jStkvZj%km$oS*Vf_qOu2RB+sxWPa^qn=0Q+Lc%IA|r9xSw% zp?NIa2T1TXz`?LCzxOd7HW0!U#LbX+R?!?Js3+zZt@+L;D&3lX>n_(_1e?A~KhD;i z|0e*o-%S@HAZcqlr0ZSyh$oURP<+z$IHlk+R!3BN;cIw`lGd7vC+mSuruCjIsLTPv z>BvyCk{QmCLhzWh7R4m2qlrx2~LY0 zTORgidr!0e=&27uqj2ltVt1u?@uSHu?DeIN>V*mSdJ;g#cI^ze2j+@1pOaFYbG_wl z^kH^|wN-`fX$t7kW&APVAeZmsFnXGEe7ULXfNc4|xAx~vRy5wR0C^6d#b5f&r>qtr zc0n%|q+op*R(E+C34WMi!7ya}g{nz&#RTgro=O(}O#@lazb_LbSU`=m5a&c$k|!m- zyi5cqc`|(n@ZY!3i(jJi4Fs&+{H6ire}L&#K$#WiI1|~B*~BCz$Oh0k_%TCE7U7JW z6^5m$p8)`VZ$@gg9HaL&n(!{uu|w^y?~EHl+VKhEo!B?1BSIh088wFR!&(M++M>^O zn?WG8D21_r>L#W4=H>+PqaBFXTg>Gj>2C88wV^w112f19MI};h_6vzm={j(LUE_=(X(JX>g_Z-iXv-bv+2my zXa*gIe%C_6p5Q1j9u@io7wcW-rt3P=figCUFo2*@n_+8v_5!;xNl@J6`t;UkoU_0V z4@t}?QY5$B5MLrLhqN6?YS>OM7%gJ2Ik7R*6Ffz;eh4 zy=P8i#J$A&CT13{pAVM|tq;EYTp-F?RE2y@+=9O{_H7n2vh7}Lfm+@g;p;JA8|-uucxG&2KP!-V`RG37y_K{6-;*hD1cS(4i!Th9V@Ji zat8dzvSnlzRkq0<>3|M^-=_Z?VKNlay-fIR@XgoN$K^1bsSP$Q%=F6l*wXA+_gV~TwPDbyS78_r+fi~>htwq2I`PN@MNklBs6_T1Z zAQ{OjJpfI8dQ~0^F`{vTqT7fbb0OsVHC&$Jh;l=$o)7Cg!l|IEJw4 zN7~TyqWXz2u$4=IaOqEzXwlu6+8-i!JeNS4U2J?xCIV5eK;R{99-z1cSgvR+3Mp#A zU@S(Uiw>G{(4Q$KNKw#zv|CV=+}MCHlyi<=3^f2RYdA#rIlVN9J_u4+wMvZkM?GeI zTW+n_b#1Z42zlp8H5LXD!7B~P3Aa=2$1mK9k~pn09M)R`B2PJ&ggq5Wt1})P0{ayL z)dAIvYxTV`N`mWSaed@wt^*(k2R+B6qX4!Ee@bgNJ%{xq53&8d>05UO7!pb&juX>P zbqu+p{%JHTx>hVT3K8BX3~lPP{Y#i>A#&CSw3~-S?k&#Z6`jkF*VoBFTHS8& zr6I49y3E6*evahoPp%ZBg1B}Zvcb#H_@A6FcX~;KD=r3~+e+y*zg1zXG3`t}QRpi= z()k=dex%Jr>Wi8mgroG=X_obm#>eT$8=e`k*_S~kXK>DLS(w=gfet2nd{=~;B2b07KqXx*9)=vf-kkyr@$`L;+^2$L|XLx zH-el#r2{}|g98p6#BfOLd;1GjUXEE7@EKgjn|`q-Tw&ocLtf`x(bg#3e>i$-8I>kU zr1~$dovAPY5+AT0w*3N1qOK%cga<-f9M1GlBYhWKOkG9cDpUV+%*fHk`Uc(8auLb9 z0vdeP?kWq#ts=#K=e)F$YjXRL6x*#M5AHZNQ#IavA%lEpnpFpOwI%&>AnJu0&sfFzjmC)t>_9~5cc9@A~)dH}Pge%>J#}2(aX@-#jEvpfP3>{`u zTuTuuEZLq)S|5Kxl)cDi%w$ohOQ$i|IE^#ML=Yfffdk1^DjUYdjm3xp;7i;VEVm;B zAr~OZSG8AgW_=+E<}wx*;^;3qF!}weC=C(5_D!8+{gPlb*)wH+uE1Pi7ns zoSD`5BMCHYTqiooO8xLW1awv#X=#S?Rs^*o`Q##3gorm%Kf@h;TyDs-U>7Pm3&u=i ze{sHw2nlXhYZPD9w(PEwUu($$&+x+As9wqa@C?w!lyMyPrQKKpY$~IWvfYd+@mpN_ zr2%)3pPXafz#ygl@PmxUW}ILsF-11)vG=nGhI}dQ()FxQt$w(XRaDR#RrlT=LjV3v zk3*8rUYF!)(Re6|>+=BkdvYRwA%Elp&(E_33mJWi8t7iJ8(>Fa`AK?MD1M=jes+{v zR&JGU(c$7>mosQiAcWAG)0kDY?DO*hQP*xWr^9xfITa2u}aI=Byku} z_Zn@MyqZ}0WF>KSV(YIxra51guH<>shl%T;i5s0B9qk(WaAgvYBTC+|Z9aQ;Z+G3g zA8&a9qp&yywy=MJni(l2?(*sDg+_NhhpRAtB$KYXtM^gGF&dCMGNAx_H%?v@*E*B# z{q>;2`7yDfkl~Z*y)TcQ>3tOH!m_M#RKzqyh}b8y_#^=R_vQ%;masX;EeyMpV1(Ey z$$jD5{Sx{}p4q2Pp)3bHO?wf!hv|WPk@rsil1Z8d7?f4qo;z|&77Tj@65)^tTvv#?rOj5 z)jYMpR<||oTJp9xyw5q5*&;lL?IOWszXQ`6Y;atJO>nJ=9P=rK_FQvEr`w?*yh3Q+-gDt_FY#7f?Wko^R@9>zEBP#D z;5iqK&OIG&V0agI(v>7vifG%IWVSvk5e)$e9wm@*+3atrJl%KC4hCeFjw^Tj`*arb z{?TH7-A=*J4+TRoGcYMMRG`fIxtBVX9uE~%2xYg6?g_HI&P=>4w>+>I4fQ?iuO}!n zz-G{4;1ilD49~WJ{q07@P>=Sbd#=C0o!A)D7J1)UAH0AS1ks5>E5j0MeXanC4|pBU z8*TE0VZ!15*ERYUdr`#ssz3EW%S3KRx3*<_u@Y7PFZru%Q~wtt3ZOC@UfG2tOf%du6d|ZV-6qk%|3j0K1xVeI z5q)>82uoHKe`(AC`+<0+jaq!TfOsdl;f7ul4)vF}lEYKG1^ZC50m&0$#tWn|c`>W3 zc^oe0@l$rtQ-GHaqC14m88IgaJ3B}^CX6gxo|z_{yg=t7EWvL^>`})J0_Q8alV2+> zBDm~Cw>Sg=lU$i&tCk+2MtvVxyfdx9~ zRY>4N#J$TQ$#z;<2keao@32={rZcXcS| z?}LM3%*Wi8t;!~tO&_$J3V5b~Y|z=eG5ZFlH~I5RcAj1UqeFs zqH%`Hz(uA19!Z+^=geTSh4w3&fW6NQAUv=*Vn!pH^MAW#uGslzJC0=B&xJCZqt_wc zroA@)B(_^2R8N?g?Z1I$UirG)6oaB$vgoHc#O((RbXFtw*ApChAEh}b*CPR6DC-p$ zYU9C?PUpSpMm>AiAA4;#JVOGui_Uu)4-IXjc<5#?_g~JA+lib$wGrvUg+E!5O+~|W^%&*#O2uG9J(=t!(3^A)B8ux?BIERB z#~0RO+{+t3G4DO+x!D0M2b$mGYhI26B|s$n{d0VX7TZVw7H9M7JXf%y>EzVcVo}+f zy8%q#$dEwGy4^r(zduQ@bBp-5WutD_n~$F2kQHlKc!t-lZBwM#uPjNH;-Hdc$(qxkFvxDm#@R1sgKgR`n2%x6 z@kn&%tG8hsV>MIgrMSvJZg{w})Fj}H!p0umO97Z#N62r+c;?1Z4DzKKe0FQqWm3!2 z;+s!8eIHjwnuNSq;&!|p&|Rp!T3p62l15#5-P%Q!iG}pDKkO-x(+9)2oR??#)iVmZXBsp@K7NFkQ+uP*K{z^& z5qU(S;^r&e+|Jw(uPIW!{h0v1OR5!up9l5Epn*#lr~Nb%p}+hk#Fv##MB;>xW|UVa z2g^5YI*}qA!e|9FSU$YcgJ-daD`VEQq$SQtG4edQ;7_j;S_27C_AvB@ zKgiDy(jDb9>rEF7;Z4b-7MD4y#yduDJc==Uikbu=8eKcmYkU5&VunELq||EQ;b&Fb z(s^@R)d2?i=7am!+w*O~jtx5uSfa-$IKmDcXhkEaMls-rM!~VXLK;KN~Kl=8NimhrWwFm2tp>T2;XuA`^R2b3yPL6K*=S|dS&Z( z!=>pnaXa#l=bG7aL)1m6^;c07uiUrLN_R7_RZk3W;i;PY-^Cj+E}cgS*6d$yBuP-~ z3Qaw&K0?EiwH%Bj5gqg#3JY7DgCgV}O0{64^czPM08=|n+c(JEq*{>6Z1Zw23MxHE z;;xmT+GcNd#3YWOTD(O;SXia<%^0`U?w<~LimanqRvy1K;)mRZyA87x|3hB;7ZpS< zY#ts*(YCxrTVdoMW5S4*;Ig7PDWkzX)iJdPt+bg9K?bs+kIY7@CCgQkK0n-l`(2Y! z-WktDX5xWj;L}|Nb~>3*+7~$ewI`GY>)w1+99UoYzxEE2ln?jobD=2o6?@+rA)l5v~_(-Et50kwqYr4!&&K^uYIh=fIn`M zeWJ$%tO|_0#0dL-Ai;0amSL34)*fFDt^*2zLc))-?lW!#3dM%Rq6~C5<~k^GV;{3 zHPgl@TIHCJ+|*fWGAvA}O8b&L0N<8#J`e70)XE#SsrhYs9T)qvEK!<7R&}}3^^(oQ zt@WX>%;D2k5%bRRNKu;!oh~VnK+A8=#`!5$E|ZNelst#qfPw+ZWDQS&UA}5`D_=>I z*kou{a+B5hfv1G%MXp#R$FQ5;JXD;I1^C{dGncyIMzDZq5kybKatHWG6sOxMq&Q4` zszq>b@V31yYw{SUMe{thtz-}FHbrY02fOrPF^SrJ7EMNWQ0&OSbz`tR4hK-6!lNZC z6*?!JRF_~;-F^uRhAMo7dI~mid5YHTPn}L5e5(%$NX*kHMRBslCErhL^PFrrJ+nE3 z^2Ef$YtEmZYp9*)_jq&59Ra|2?sEE*?|H9j!}dMp)ZqBRXo^;>Sg2QT+P zuN#&&gq?~W&{>zJUF_kSf-In1PhnPr{`a`!M}@d0DVyN@yb`xmS0_LG^(iPV$)Cmu zfEEoFnMwi-<w(^k7R?%ypFB*pIB*Od}u`?*<84w2X%xqCW z`K7YJT?{dIGEE<10#+K09Ow+5BcmfFzwq>%5_K-P7QS;ASek1lDBco23YWad3U7#W zFJVKI?$(|164Ez}jQRmbU%Z1u(}C?NvclL3TyN4XfMa$frr4XUbDpGgMaQoZv7Hk7 zgR%)Yy{*V^Iq}{uHR(c&OyAk?A-brZ+bpkVnbc*a2U(h&VdvnRsSf}x@jl~oHcYoX zJ08Y)%n*DjC2JJJ(BQ#^Yg0$OVY4ll>Om>++s)@O6ZB$1TOBprw)t!%EI53abkQPZ z(0@GI=n2~ohW||YbNje=v?nD=EZ$FVw5^ER2*6`EsqyG+FhNDIE2$56 zeXtJ+B;}k+bv*2pX5)q5pX;G9{LZhz_{P_bUqwL@5u<}V=sRmxDmElyn-Y56qQ`%w zf?^k<)V=PgZ8Th0;mwJ%Zp7PJ$s-T25?GwFEcD8qz9tE=-P|FY|!_@G@Yovuf2uuD|2?Q#wrDiL_| z^xW<^$boXVkS1saJEUeVz#V3pI|4V$CJXSt?wmx}o)oWKZ=a_y z?V0z`cuCC2ffAHCI%$ zPY8fjd<`#8r6qNhXMcyAutx`;yz4E=1?k3nl{Z|$QDMRRECxJcBK%`FLD&)TPtQ*Z zagUJQa?E@~?;fN1LW&1aXh0KITvPIbXx;~+mJKt;b~)l!jYvKeFY5ULNd?&KgXm5= zD50!yN}vN8q;5_UOyQDL_EN?8;5+wom?<9a$-GKj7cnhqwHaCuqS=`T%&`+<6+hUT z5*^KZjgKfRllTDHuho3gSsJw7&N#reu6Xxj+p8tAKjSP+$GxY6+!~vG|Q zPAYWZV`t^1cWy^KTkTQ-ffg z?*+C?L)rXVz4{Oim@G(_xTvz}Q+S=PPgBT{Tnpvql(thnheq6b+3^3c`r*ahp_57i z&_H7DID26BthhJ5{vS<@KswmM(GCG`hHI~eyKqlv0@hv|!u68V9;FKO(mY#!c}adK z=<1vaF}Q~OwlXm%pVsaa2#1Ps`M5MVM_h{K8RCBVY0MhrTW#m(8uoK)pxNT!$qEk^yl~2$LQNA- z5EW49aVNqAx=iQ1IUy9CNJorNW}}BGz}2Rb(0Q@qB)XEis>wbxd}{Q6#7`$D(9f$o zKj2P-C5V6{Q_dX=3U#Z&ez29?8CFa-whe>j`XFtA9nm2_2fwB?e>nI^`U-MACQcycQlj1^!G%oVgu~4o~$?bYs+i+aTL{3wkR>`zde3xb#w$F9dbL zJ9${LVIiIUROfB=vI?Pu9e~as#<$9fjioN`1(zj3YP~Yvap*7#e1_ca_WOtpbM~Z? zM|{oFeDPg-jZTW^Lwt6$P_u|zp(dS+R|pjCyS)uAhToUECWV&|JeDH2 zm@6!fnRuc0SbTM?*^UAaEgp5Pj6Y3kg6Wri_A3?owC-n&305D+k5(j=R%{V&w-H>< zIw639$%HyD1I(elPXeu=!RPk}aV6b{^%}l7Mmt9xqAYmFtG}&0*Mn2-fYco_;RB!4 zMw?iCxOL82ci&vLhPc_hHd!*;2bQ`&B9^-Juy36YYDbV83i7dwBP`OrJ+i0gv&@NEJzM>0h8R zK{H9P8yq+m|KzN&JdkhUk2vE%-N{SZaV_YvV$UEqGkj7mv5_k^8*FC zrEz=pM4>qFmfsi8O5%3#fGzfou|*jTWTU+6{d~bg{2?ZX?9rgS-Y5K;u_G~xALBFS zR)*mry>0G*{E>;5-eI*OdJ?u>?(GA2Ms|1N+Stb7(S}YJJ5V~~TakpkW!~k!Fnhi^ ztpKXP!_YU=c1-YYxOo8Ea^fH}sq=3cMn8bcjiZ?CR3fI@# z!}1&08bV7UwhJwqMmRBXGFb)4-B|*qMK6C1xM*x(xwv^hH-Z%4kN;P^8+hW{5(Z7J2+&GZ34|Ix_yijzymFs z71M<<1|dj7_;{aTNIjBlVS2GZLEpA@m#4?9rY&ws8A3=bX=QSxh;Q}QlFg^CJEn-I zlRe`Cf~6bx6uibGXiEQ7mIT5%(6YwE<=>=3$cpYt$3q2io? zg;!FiUkD5$#qOU|6i^UB@yM4RZ;u0Kd87n=*!qo5cUGBDcN>#CqX$*TXZBHX$&(VJ z0Z&BJ;0GSjNJfWx!sF4x&LxYeH`+{K?qg_wxF%fxbp(D-E7H6<|7Rb|o|r@PsdWy|!hULAMYqZm^}nn&ln*Y;AApyC)4B6l7f9 z1PGf#t}8MgAWh&sCn(iENSKvZtg&5GHs>X5zeVK&GfZX3%N4IY%eUg#+r9<_uezn|e^`C(b|;Ei)G z7ZWbCrR?OVgvyqf`vmvCe!e7}I&Tx~SFBfS^(wgbSHG)_Tm5rG?}t}`{NhSWY90ZtTJPKCOfqz@m=f@UmIJ-=yN=;5fNCX7 z8iG)J>-ok1L`S~;9iCmHtKf+)as z)P7DiEC0$`AqPM2g*MP1Yv5TBy*d{Aqg>%N(7^=LV zw10~sBO&sb!^Z-kdyUiwZSjl)t`8M&PbgVS)%7 z>JYw6oE_B07*}{vmHcy4jOt{7Rosout5=x$0iPB3Dq&T--QQp9oD)vJ77sayn7=Fj zXj%C@;}5%J4$$h#ypOA`F7VswSSf?0^VREVW_-$OgiWpaowq)eUG%9&VkiT*54H_ zoCCsIrA*%~zL!=we;A805Bc509C9U_Nb&iA!||NcSFAXuIsIO?HUeLZvq1jlY)@?R zj4G0>nfD_4onz)=F&y2LZ&aTH&VhxJznbPP|JPR47oKra8x}lT$2!n%eyaz>{{Rva zujv13Xxi|8Cx5pSey@N{>Mv^dCDB$Oy>wky@ZjFe}q1dySM+@nn9@ zsR`G=M}KI{J-=ZkpRt@TB@9}xQ9~4EzWBk*4Pd`#j38`%%b&AAfnZc1e_kAM`kqxR zukXkM(}K@I+n3)uj62uM4g~!{;HQ@CL3e@a>y4u?dmQJ1&}kC}T1WFNDW~7=+&2Nx zs{KKU2WBHc^p;SZtM)lX0{k;a?FoxLvH<(!VP_YQYR4Sr$~8-@^MMIw4iB`SA8W`< zMFr^9F?++d3t*cn|7Yj61Hj_) zudSJu{@@U=?U?w%Jbv%`MJXPC4Tp@YO2FR*Z7+5Grn_iD52#WxI%5n`2Qg>`wWf~A zzvyli0)A_6l<>zJ+q+rhx8G&#;d5=(iGHE_T!)`klGey_d4+!RuWRP9%X<9$aVp6_ zgf*&7p50Y-Ob~2L@=*VBpi|jgM@O5fzU=+1_Q(9dZc3C}v^pMuAe?ge*}~Rm`tpXp z@x&J))GJl%*HnQdC|NBUV+~--Suq<=fZ|j^}c;%It(thT6FL;jdRv$Wc%BxoJr)|u; zeh5|HpVf4?r99+R-QR^~t$-bLarrZ7pWd$JHfrAzn)(0ihgnZZtwD`gMT-f5MhkJTh@G@3%?_MGU-9Y z-mBj*6qO!MtLHG)RX(dq_59QNJ?>z?>C<5ELB@7@^BOY;e{W=#{Cw($#?$}YMs1ky zZ^0peAO6u94r0GTBIm;2%7J&iYh~ zg&%TQCWV&K{5RF694*;-w+JNs(d&b&kMZa92oPkZ*{fXz^O;8&fkOnk@bSZ5C13Y z0&VT6bQhY>!{U{?|6nFQ{+z^uHJUDOCEAeD|-zuG)#O zvpQo#(T7%^^nGWv+NfVSC?!J;^X4nmB$yzwmwqqoH*qVJYJQ2POO@)nJO}_7!hQY^ z)-=EsKB!~$JlTsX+WpT{jvj|1{0YcqJnn+OWL`teSAEj<`;IW*bl41RjQEYy70 zoP$E@Yoe>kz55{>A`^D|$1)X(Jl@#h1sTKpUqZL-azTpCRNJiJUiRI#bKA1XFb`?V ze}*C1#tNW4MZ)CYj!SWk5G&{dK9tQ)DL}!)bd8A=xO;e4dR2Ow7?%M^FuHOlm++D7 zGhLhaR+goMrqpFiT4sqr5q1;uLdKA%nAk3L#I+S|@)<6>si*hU(59nTSm326;9L1! zTf-_Fg)LrQMpIoZ3oh~CE^*8w2_Ko_#UKgx=n%UM?sL|lbtqe%*UQnPMUleM?jmEM z()VEG)+#%Cu-%vu#T0Ia9LLX(L6qw%&4;Dp&amlJtqa*d_*#G5Z(2+qJbeO=syJ|) z?l#yPku1J!Y1FPCI9Iy+0L&*HKU1R1WnYN~>Q%BZg&7b;iiWD?vLwB&F&CPH+TNxu{h&vGD;lpiLbHuG)r%YL5K>H5EzOvgqr#d^{yBVdFCD2OcZnx8!rD;zfsAe$O)Qo@V-Gob{zK<5%1m$1aQt) zy3M^r-yngF)Bq8W?9VPckSb?_(kP~_gGDy1YH{pT&uX)&!eYefFLy|et?=xSyzf!gK~;}%|9BhCGGgT#>U+#^K+Dm;#T9)U zla&v*CY3hftU{&~eJqz}MY+qP{n|(ODvPBNsgzPPVX?iuTPE!MHxgRc5%zve1=9zk zbKl>~;U;tZ)ZQP4l*!MY^4;j&b-q=^V*fow_X8Et|DwA$ri~p*{|9zL(Xs-)`{)UZ z6w{MpQ|E~>!1fc5i@R6jdV>}S+K-xp3PZU)D@wn^`19-n+#{q$J=piGz?OT7$ncCP z0blG0$K4M_VLH$kk4_#P(3K7M<3XdV^w3(Cp^Ik5^p-p3n7oEC?bUzR;vgQCIo;Cb zQX{1VLpt?*HKBtPEd1`yl$RfFi___t36g+4ciEmnW_3V5z|9-LjU1-`2gt;dt(|-H z%+x)J#A44_faE5SdU(SUowPY>4tlI96`$yWPw7cgs0v4egr8*W_*UIK)NDrD@Cme9!Csx z4eg_t-_HSF>`wGKcwP?VY9#p@>`l-;p8U3f@xL1`Zbg01h+pB>cuLHC49~mlQVm&Q zQ7@Ub+G^$MSy~*GE>t`mM!wtzY9heJR_sMS8)F`G6r_`!ZyuUQ;r^cFrL<+jHPNDy znIs`odJ}Q1`i4;Z{O;Ne`v&l@(~{axZSY6vlcyPLuT>V#t;3Eq0Y{H8@TfeMQU`3SbPkcUUY`GjrTHdvcX9Dd1`u}kM zMe zgjrM0Uinxmh#Y=f0PMu?1)df|?JLmZ0>RzNp&-$-2dxC)xojN`BK|P?jXaEBk)x}L zm64Zs1gQ+WF!noB@b2WD$`V>Sz20?wlIC**3Q)4dhr|Ozk*8uhG{0$)ka=Q=*s2NP~C}^>7+C5-_(4Fb6G0Rglrn10uRW*bq507 zw`cb>8II|Dc$dykSHHdd2IR$qd(%EIMT z@d1fv_Ww`qX)yMieaDhaio|W(J_cNWvOX{UE?t>Q$iCMn)kr~eH1O5jq>Vp0uT77- zu8pGklZ8J~^GW3wp)R98=!=$SLr~Td_wRg;C$6P=atxu}05UUS`&71WGM0fp+sk`& ztXP4>w$0?vX5fq=C}U;Avw<$fzGH5AV04{P=@6PwN-{))Z;i{U<6U9HGU@-J=WTh! z(Fa69?x_W-+a2RBpLWqcmIXhV0RH3yn@K^sH3kSuY{yR*Zz-b=G5NQHkd%h zYWC7WwlucZeur%REX)+6BdgXfai9oFt|Qh}Jb$6xpyl1d3%2KkBC`-r??2hLyd$5VCXyGw(||(b=~{Ro#-0xV4+Xk>xh@OujUv1PJwY zB7p_+(>@^Uy~GUn`W(Zq&PY4{dr^pHSg?Q)&A#1)uTMmZ`~$sL)?0U{mGrwnOOBH> z;JvM`)yMAPGUB!h}D%3D{v$3(n#131&)6H z;A?q@T3fqIvA{4Um~b)DH5wxsLja3_!K9fhc3HLe2}WvvW&=ganru4Z-c;}fG&*Ho zz+_u1p+WKaU$KW^nffj~YAhYi4JzaeE)G7ShwWU|pX3mQt(kk^2Lro@q@CL6UUKj_ zvuFUN28aCPAasSNSE&PfFoEa@^SUE)4~lYu1gU|x#a~jB%J3|Ty0`Q! zOU}Ql_AfZ>r4x1zaJzdLky7#>kD}CKK!NFJ#H{?J-D4ga^Yq|`MFP6Xdk41Y3`X>X zYxE!S{amU*z^9orx0b#{-@iT%%D=X?1IoYE^_6c%>C^1zFxe@+5Qwh4 z`70V}<1%|yioMcsTe$-*Y8ewKaH0DXYDg(&C<~A~%DkT3B6~ehmvc86P6nQ;aasga zOg=Oq#(X$Se5-+=&{FeS;0KQ*1G9s*IOe~fJ|Ciu+5wf!fG`#57~_+<7*~ggmH%KZ z;CmAWdCwl9jt*e=gIjk|FR0MDc)=N6c^T6fFeMAlTsB~Ws&XW)5Hk^2rGU{p;i*V9 z@Bec{|8j|Rf|*m`lt(c1wmkH}RtY>xErK;6Dv*fN(c72qRuwiR-#ihdq;<#^$`90I zHR)0T61;Po0&e%=rmV(vO_PTziW%4c$e@tCsj8{e66;hkZB*Aa3J(-zs}*E&=|UI2 zD8u%fPDULcvmi#IK8u&b{lGHo1)?lq1pmIZDFwteL*ds0a8CBYGPriQZufwnSwN{W zZ?;tS-6qYSSGIDqJ8xdq!Wz)ZSB{JrbO(^#-8BA-p^^DKGf|OX-BGtH>OkV_4=ngI zube;=r$9Za2!E;#l#dr_>pMr!CgvvQafh7<=ZW2<9 zDG2&7d9oSvUPW3S~wEc^p2)VN2VjD3K5(~|OQOlH9+Kq>oe^L+^H`bcf; zp9-Ua5e2R6%f&?czEyYc6Z>Lk^?SL$S{ofg->7bwvl!v>a3J|5Ju6VB;!tN}bOe^I zE$2hQ?K}KW-2ybLRS`kT_uI{^s8uag>1b9$qVtmtCHIDg) zKlSkscN5#D?9a^<*jmpc1U?kbi`rEeOrkOUF~HD2-C0!l!0EB`_N3(Q$*R0}yN>Sl zdp}F^fGw)EU#!^<{e1k0U?~m*K7u;h*TkrK7|sDn2RZq#fvyUqk`AD~G0^%}VC>7VHw^3dn`g?@1~4&>iUW^B`F&A$=$ZYt=0&=+1BczM4t`VWvY|KC?z zbN4}C`;xG*f7tI}KcH(;|6arYaxv!WSFE1H=#N35Cd1_3PXqXKcU29QNxyap-4oS< ze|^MK?bEJe`5@zCK8z&%D}n`TuUW;g-*NKyl+xC#x(KzXwUtc+dEarEj$3eQBt941 z_-f$wcSy*`@7llV-DkC`2ELO?1HKp?R4kYn0gDQbv6$ahyJL=DyBdc@ybqjk*l!(v z;AF}-9;@R76i*H};YzRtjZyZUVDE|Z)}9Zgy^mP?(bd8X+gM1lBHwJQ2IVW5%X!N+ zb6)sCt2XxSEd2(Wgbp*mMs4H6IkkQ!?FTg8`J4W6`)S9`@E3IDJ(EVt_Cl7W4&#Fd zkJeJ(XMj!1JS9|a7{CDxe@vYGXW+NH9sEJ{!#*I@(t4y1($)8WX$VL^dHq#!)zUnb z{YPs0{q)f-KL3U#ARTJy_Uh5>(oQG?>UW{9PXXd#S?H zUli=fCv&B+&fH66yJ zs+&!!dwJldZ)zoe4&I_K-$+)%(WAaI=3fJkoI8F8G282YRoEyaGFvb3{^K>-RaO7z zp8N3bcecKv>g zWYo&c?HRt*XBnfZOEac2bV(Jk{ZYbtl>?QAD(Y5DRZQVjv6-$iRir+gd6Jnd zRR*X|8aqt7R7H9+mQ(#{0?B-xN|u>BQ<6Gbro~LmRBo9cGeT25XI^Hyr`TmO&jF>w z44TQ58ZeW31}gPRCj3?<>CJkRd42HHpawB&Q4Cv*?x~71b~3_Ksb&bufK08ML7+X& z!g)+@n?t{OYEve&jP%sv%#q9xsbYla2&KcDNQ+@(-P+$kl;bg&9I1qd{R%DPXjc7x zTPyQn{QVYkmX+%Viscgxz`GNGM~$+Ko=wVA#9l54qnhZHz$X5YzSY!Jp& z&c^H}>E+7T@b7ajQ%piU;k3=g=*PWrx-)$>d)C3T3K^&w#^G{VvBvLASoWrD;Pdyh zIodE&*8$uEm?a~J_a>^Qb~{j0og>wTGL~AWGG@xmXO-L1kUucvE;Cn#Do#*&%nKYJ zza;iIG%sKO#}K=hfxb8WKZ)Kp0o?>5`$ln7=IjP?wOYIhlY_=Ayl%V^ql4o)Ju~ii z*+DU#{hWc%w8-5Vv>9$n!g=uw#SAER$GLijSw`H1=lM>i+>E&~c|QI3i@r8WIq2r+ zjFc&o=eSESfKx>#}vXutNCbh;w7Q8h^(rRG^JZ}Odc1Cz zXYghc;nwY%Ox`k#S6A(+nWi#uTSD878ND-o2ZrkT6t>I>Ym4ziKj;f97A= zYNFL*l)!%}+y}oq#{FN%`ZpRsKYvX-OGiaFo}#Fv@58+Ry_fH7UL~Ki{)_y&G{KWi z>4cw2DoYYe!Q@RcWD`2!wpgmGvHVOfBojE%mQEWjzY0q%B$GDL6Hff3ugVh3!Q@Rc zWD`2!CQ^}=ODrUlHqjGK{G_ki63g=CextgLs5nxv0wtp>%KOhJaZZgk)Qg##Ps^Q5 zeF8UKq?Y&^2wO_LJ+9o?$XlD+^nbms@i|AQTK0aAO@*C3`ew!6R^z&E;U$Z6+bC~T z@M5#-y7oDh%0v|=vrk%E-lJ+{qSTZ2r{+t?hsnFmpyO)je&woc!5Wh26Ew;$E0dGl`8@MGs8jTDQs`>@G>w?O3U?T6S!blOSS z#+mX9aAvwX*vG@xZTBO)MoWC;EgnwgaA14AS!F z$`f>bIQpPOQtdzN_rX0Ys}EH{Qm)=UswO+_(r@3NyO1d$4-Hgl_sGhD`(k{YP3)_E zbI)8TTeg=SpOmFvMSbb`Z~1YpPyQNlJ|^FMXC}%g$Cylg-C_R*k}YQLqLok5&dt%$ z@Zq~As2=lww5*Z0cL&mm5iE*cZ{++G>?e9MbNTPj?l6h&j%H3h;M#Wm1%nozd%D~O zh5pth|4nv>@>G_|D0MY;e0000000000000000000000000 Z00000000000000000000002J#0MwAQ>)-$Y literal 0 HcmV?d00001 diff --git a/htmlhelp/FFFTP.HHC b/htmlhelp/FFFTP.HHC new file mode 100644 index 0000000..d68d970 --- /dev/null +++ b/htmlhelp/FFFTP.HHC @@ -0,0 +1,267 @@ + + + + + + + + + +
    +
  • + + + +
  • + + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
  • + + +
      +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    • + + + +
    +
+ diff --git a/htmlhelp/FFFTP.HHK b/htmlhelp/FFFTP.HHK new file mode 100644 index 0000000..a08ac90 --- /dev/null +++ b/htmlhelp/FFFTP.HHK @@ -0,0 +1,323 @@ + + + + + + +
    +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
  • + + + + +
+ diff --git a/htmlhelp/FFFTP.HHP b/htmlhelp/FFFTP.HHP new file mode 100644 index 0000000..6d37966 --- /dev/null +++ b/htmlhelp/FFFTP.HHP @@ -0,0 +1,142 @@ +[OPTIONS] +Auto Index = Yes +Binary Index = No +Binary TOC = No +Compatibility = 1.1 or later +Title = FFFTP +Compiled file = FFFTP.CHM +Contents file = FFFTP.HHC +Index file = FFFTP.HHK +Error log file = FFFTP.LOG +Display compile progress = Yes +Language = 0x411 “ú–{Œê +Full-text search = Yes +Default Window = DefaultWindow + +[WINDOWS] +DefaultWindow="","FFFTP.HHC","FFFTP.HHK","","","","","","",0x2420,0,0x3006,[0,0,0,0],0x0,0x0,,0,0,,0 + +[FILES] +HTML\H0000001.HTM +HTML\H0000002.HTM +HTML\H0000003.HTM +HTML\H0000005.HTM +HTML\H0000006.HTM +HTML\H0000007.HTM +HTML\H0000008.HTM +HTML\H0000009.HTM +HTML\H0000010.HTM +HTML\H0000011.HTM +HTML\H0000012.HTM +HTML\H0000013.HTM +HTML\H0000014.HTM +HTML\H0000015.HTM +HTML\H0000016.HTM +HTML\H0000017.HTM +HTML\H0000018.HTM +HTML\H0000019.HTM +HTML\H0000020.HTM +HTML\H0000021.HTM +HTML\H0000022.HTM +HTML\H0000023.HTM +HTML\H0000024.HTM +HTML\H0000025.HTM +HTML\H0000027.HTM +HTML\H0000028.HTM +HTML\H0000029.HTM +HTML\H0000030.HTM +HTML\H0000031.HTM +HTML\H0000032.HTM +HTML\H0000034.HTM +HTML\H0000035.HTM +HTML\H0000036.HTM +HTML\H0000037.HTM +HTML\H0000038.HTM +HTML\H0000039.HTM +HTML\H0000040.HTM +HTML\H0000041.HTM +HTML\H0000042.HTM +HTML\H0000043.HTM +HTML\H0000044.HTM +HTML\H0000045.HTM +HTML\H0000046.HTM +HTML\H0000047.HTM +HTML\H0000048.HTM +HTML\H0000049.HTM +HTML\H0000050.HTM +HTML\H0000051.HTM +HTML\H0000052.HTM +HTML\H0000054.HTM +HTML\H0000055.HTM +HTML\H0000056.HTM +HTML\H0000057.HTM +HTML\H0000058.HTM +HTML\H0000059.HTM +HTML\H0000060.HTM +HTML\H0000061.HTM +HTML\H0000062.HTM +HTML\H0000064.HTM + +[ALIAS] +IDH_HELP_TOPIC_0000001 = HTML\H0000001.HTM ; ‚Í‚¶‚ß‚É +IDH_HELP_TOPIC_0000002 = HTML\H0000002.HTM ; Žg‚¢•û +IDH_HELP_TOPIC_0000003 = HTML\H0000003.HTM ; ‰æ–Ê‚Ìà–¾ +IDH_HELP_TOPIC_0000005 = HTML\H0000005.HTM ; ƒzƒXƒg‚ւ̐ڑ±‚Ɛؒf +IDH_HELP_TOPIC_0000006 = HTML\H0000006.HTM ; ƒtƒ@ƒCƒ‹ˆê—— +IDH_HELP_TOPIC_0000007 = HTML\H0000007.HTM ; “]‘—ƒ‚[ƒh +IDH_HELP_TOPIC_0000008 = HTML\H0000008.HTM ; ƒ_ƒEƒ“ƒ[ƒh +IDH_HELP_TOPIC_0000009 = HTML\H0000009.HTM ; ƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”F +IDH_HELP_TOPIC_0000010 = HTML\H0000010.HTM ; ƒAƒbƒvƒ[ƒh +IDH_HELP_TOPIC_0000011 = HTML\H0000011.HTM ; ƒAƒbƒvƒ[ƒh‚ÌŠm”F +IDH_HELP_TOPIC_0000012 = HTML\H0000012.HTM ; ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh +IDH_HELP_TOPIC_0000013 = HTML\H0000013.HTM ; ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh +IDH_HELP_TOPIC_0000014 = HTML\H0000014.HTM ; ƒtƒ@ƒCƒ‹‚ðŠJ‚­ +IDH_HELP_TOPIC_0000015 = HTML\H0000015.HTM ; ƒtƒ@ƒCƒ‹íœ +IDH_HELP_TOPIC_0000016 = HTML\H0000016.HTM ; ƒtƒ@ƒCƒ‹–¼•ÏX +IDH_HELP_TOPIC_0000017 = HTML\H0000017.HTM ; ‘®«•ÏX +IDH_HELP_TOPIC_0000018 = HTML\H0000018.HTM ; ƒtƒHƒ‹ƒ_ì¬ +IDH_HELP_TOPIC_0000019 = HTML\H0000019.HTM ; ƒuƒbƒNƒ}[ƒN +IDH_HELP_TOPIC_0000020 = HTML\H0000020.HTM ; ƒtƒ@ƒCƒ‹‚ÌŒŸõ +IDH_HELP_TOPIC_0000021 = HTML\H0000021.HTM ; ƒtƒBƒ‹ƒ^ +IDH_HELP_TOPIC_0000022 = HTML\H0000022.HTM ; ƒtƒHƒ‹ƒ_‚Ì“¯ŽžˆÚ“® +IDH_HELP_TOPIC_0000023 = HTML\H0000023.HTM ; ”CˆÓ‚̃Rƒ}ƒ“ƒh +IDH_HELP_TOPIC_0000024 = HTML\H0000024.HTM ; ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ +IDH_HELP_TOPIC_0000025 = HTML\H0000025.HTM ; ƒCƒ“ƒ|[ƒg +IDH_HELP_TOPIC_0000027 = HTML\H0000027.HTM ; ƒzƒXƒgˆê—— +IDH_HELP_TOPIC_0000028 = HTML\H0000028.HTM ; Šî–{ +IDH_HELP_TOPIC_0000029 = HTML\H0000029.HTM ; Šg’£ +IDH_HELP_TOPIC_0000030 = HTML\H0000030.HTM ; •¶ŽšƒR[ƒh +IDH_HELP_TOPIC_0000031 = HTML\H0000031.HTM ; ƒ_ƒCƒAƒ‹ƒAƒbƒv +IDH_HELP_TOPIC_0000032 = HTML\H0000032.HTM ; ‚“x +IDH_HELP_TOPIC_0000034 = HTML\H0000034.HTM ; Ú‘± +IDH_HELP_TOPIC_0000035 = HTML\H0000035.HTM ; ƒRƒ}ƒ“ƒh +IDH_HELP_TOPIC_0000036 = HTML\H0000036.HTM ; •\Ž¦ +IDH_HELP_TOPIC_0000037 = HTML\H0000037.HTM ; ƒc[ƒ‹ +IDH_HELP_TOPIC_0000038 = HTML\H0000038.HTM ; ƒIƒvƒVƒ‡ƒ“ +IDH_HELP_TOPIC_0000039 = HTML\H0000039.HTM ; ƒwƒ‹ƒv +IDH_HELP_TOPIC_0000040 = HTML\H0000040.HTM ; ŠÂ‹«Ý’è +IDH_HELP_TOPIC_0000041 = HTML\H0000041.HTM ; ƒ†[ƒU +IDH_HELP_TOPIC_0000042 = HTML\H0000042.HTM ; “]‘—‚P +IDH_HELP_TOPIC_0000043 = HTML\H0000043.HTM ; “]‘—‚Q +IDH_HELP_TOPIC_0000044 = HTML\H0000044.HTM ; “]‘—‚R +IDH_HELP_TOPIC_0000045 = HTML\H0000045.HTM ; ƒ~ƒ‰[ƒŠƒ“ƒO +IDH_HELP_TOPIC_0000046 = HTML\H0000046.HTM ; ‘€ì +IDH_HELP_TOPIC_0000047 = HTML\H0000047.HTM ; •\Ž¦ +IDH_HELP_TOPIC_0000048 = HTML\H0000048.HTM ; Ú‘±/Ø’f +IDH_HELP_TOPIC_0000049 = HTML\H0000049.HTM ; FireWall +IDH_HELP_TOPIC_0000050 = HTML\H0000050.HTM ; ƒc[ƒ‹ +IDH_HELP_TOPIC_0000051 = HTML\H0000051.HTM ; ƒTƒEƒ“ƒh +IDH_HELP_TOPIC_0000052 = HTML\H0000052.HTM ; ‚»‚Ì‘¼ +IDH_HELP_TOPIC_0000054 = HTML\H0000054.HTM ; JISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä +IDH_HELP_TOPIC_0000055 = HTML\H0000055.HTM ; Š¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚Ä +IDH_HELP_TOPIC_0000056 = HTML\H0000056.HTM ; ƒpƒXƒ[ƒh‚ÌŽæ‚舵‚¢‚ɂ‚¢‚Ä +IDH_HELP_TOPIC_0000057 = HTML\H0000057.HTM ; jre32.dll‚ɂ‚¢‚Ä +IDH_HELP_TOPIC_0000058 = HTML\H0000058.HTM ; ƒo[ƒWƒ‡ƒ“ƒAƒbƒv‚ɂ‚¢‚Ä +IDH_HELP_TOPIC_0000059 = HTML\H0000059.HTM ; ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ɂ‚¢‚Ä +IDH_HELP_TOPIC_0000060 = HTML\H0000060.HTM ; ì¬ +IDH_HELP_TOPIC_0000061 = HTML\H0000061.HTM ; ƒtƒ@ƒCƒ‹‚Ì‘I‘ð +IDH_HELP_TOPIC_0000062 = HTML\H0000062.HTM ; ƒuƒbƒNƒ}[ƒN +IDH_HELP_TOPIC_0000064 = HTML\H0000064.HTM ; ƒ}ƒXƒ^[ƒpƒXƒ[ƒh + +[MAP] +#include helpid.h diff --git a/htmlhelp/FFFTP.KHP b/htmlhelp/FFFTP.KHP new file mode 100644 index 0000000000000000000000000000000000000000..f9ee1915edf1a04b395f18447b7a2f0aa92e4d9f GIT binary patch literal 73767 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 +‚Í‚¶‚ß‚É + + + +

 ‚e‚e‚e‚s‚o@Ver 1.97a
(“®ìŠm”FŠÂ‹« +Windows 7, Vista, XP, 2000)

+


‚f‚t‚h‚È‚e‚s‚oƒNƒ‰ƒCƒAƒ“ƒgƒc[ƒ‹‚Å‚·B

+

‚¨Žg‚¢‚Ì‘O‚É

+

ˆÈ‰º‚̍€–ڂ͏d—v‚Å‚·B‚¨“Ç‚Ý‚­‚¾‚³‚¢B

+

ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ɂ‚¢‚Ä

+

“Á’¥

+

™ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì•”•ª‚ƃtƒ@ƒCƒ‹“]‘—‚ª•ÊƒXƒŒƒbƒh‚Ȃ̂ŁAƒtƒ@ƒCƒ‹“]‘—‚ð‚µ‚È‚ª‚çV‚½‚ȃtƒ@ƒCƒ‹‘€ì‚ª‚Å‚«‚Ü‚·B

+

™Š¿ŽšƒR[ƒh‚Ì•ÏŠ·‚ª‚Å‚«‚Ü‚·B

+

™Š¿Žš‚̃tƒ@ƒCƒ‹–¼‚ðˆµ‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

™ƒTƒuƒfƒBƒŒƒNƒgƒŠ‚ðŠÜ‚ß‚½ƒtƒ@ƒCƒ‹‚Ì“]‘—‚ª‚Å‚«‚Ü‚·B

+

™“r’†‚܂Ń_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«A‚»‚Ì‘±‚«‚ðƒ_ƒEƒ“ƒ[ƒh‚Å‚«‚Ü‚·B

+

™ƒtƒ@ƒCƒ‹‚Ì“]‘—‚ðA‚¢‚Â‚Å‚à’†’f‚Å‚«‚Ü‚·B

+

™ƒ~ƒ‰[ƒŠƒ“ƒO‹@”\‚É‚æ‚èAƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹\¬‚ð‚»‚Ì‚Ü‚ÜƒzƒXƒg‘¤‚ɍČ»‚Å‚«‚Ü‚·BWebƒy[ƒW‚̃tƒ@ƒCƒ‹“]‘—‚È‚Ç‚É•Ö—˜‚Å‚·B

+


“®ìŠm”FŠÂ‹«

+

FFFTP‚͈ȉº‚̊‹«‚Å“®ì‚ðŠm”F‚µ‚Ä‚¢‚Ü‚·B
    Windows 7 +(32bit)
    Windows Vista (32bit)
    +Windows XP (32bit)
    Windows 2000

+

 

diff --git a/htmlhelp/HTML/H0000002.HTM b/htmlhelp/HTML/H0000002.HTM new file mode 100644 index 0000000..42b792d --- /dev/null +++ b/htmlhelp/HTML/H0000002.HTM @@ -0,0 +1,6 @@ + +Žg‚¢•û + + + +

 

diff --git a/htmlhelp/HTML/H0000003.HTM b/htmlhelp/HTML/H0000003.HTM new file mode 100644 index 0000000..0dc1b03 --- /dev/null +++ b/htmlhelp/HTML/H0000003.HTM @@ -0,0 +1,12 @@ + +‰æ–Ê‚Ìà–¾ + + + +

ƒEƒCƒ“ƒhƒE‚ÌŠe•”•ª‚́AŽŸ‚Ì“­‚«‚ð‚µ‚Ü‚·B

+

+

ƒtƒ@ƒCƒ‹–¼‚ª’·‚­‚Ä•\Ž¦‚µ‚«‚ê‚È‚¢ŽžAƒJ[ƒ\ƒ‹‚ð‚»‚ÌêŠ‚Ɉړ®‚·‚é‚ƃtƒ@ƒCƒ‹–¼‘S‘Ì‚ð•\Ž¦‚µ‚Ü‚·B

+

+

ƒtƒ@ƒCƒ‹‚̃AƒCƒRƒ“‚ÍŽŸ‚̂悤‚É‹æ•Ê‚µ‚Ä‚¢‚Ü‚·B

+

+

 

diff --git a/htmlhelp/HTML/H0000004.HTM b/htmlhelp/HTML/H0000004.HTM new file mode 100644 index 0000000..be2f523 --- /dev/null +++ b/htmlhelp/HTML/H0000004.HTM @@ -0,0 +1,11 @@ + +ƒ[ƒ‹ƒAƒhƒŒƒX + + + +

+

ƒ[ƒ‹ƒAƒhƒŒƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B

+

‚±‚±‚Å“ü—Í‚µ‚½ƒ[ƒ‹ƒAƒhƒŒƒX‚́Aanonymous-FTP‚ɐڑ±‚·‚鎞‚̃pƒXƒ[ƒh‚Æ‚µ‚ÄŽg—p‚µ‚Ü‚·B

+

“ü—Í‚µ‚½ƒ[ƒ‹ƒAƒhƒŒƒX‚́A{jump ŠÂ‹«Ý’è,HID00000028}‚Ì{jump +ƒ†[ƒU,HID00000029}ƒ^ƒu‚ŕύX‚Å‚«‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000005.HTM b/htmlhelp/HTML/H0000005.HTM new file mode 100644 index 0000000..003a53d --- /dev/null +++ b/htmlhelp/HTML/H0000005.HTM @@ -0,0 +1,28 @@ + +ƒzƒXƒg‚ւ̐ڑ±‚Ɛؒf + + + +

¡“o˜^‚µ‚½ƒzƒXƒg‚֐ڑ±

+

Ú‘±ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAƒzƒXƒgˆê——ƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B“o˜^‚µ‚Ä‚ ‚éƒzƒXƒg‚ð‘I‚ñ‚ŁAÚ‘±ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ü‚·B

+


iª‚±‚̃EƒCƒ“ƒhƒE‚́A‘å‚«‚³‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·j

+

¡ƒzƒXƒg–¼iƒAƒhƒŒƒXj‚Ü‚½‚ÍURL‚ð“ü—Í‚µ‚Đڑ±

+

ƒNƒCƒbƒNÚ‘±ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ü‚·BƒzƒXƒg–¼iƒAƒhƒŒƒXj‚Ü‚½‚ÍURLAƒ†[ƒU–¼AƒpƒXƒ[ƒhi‚Ü‚½‚̓pƒXƒtƒŒ[ƒYj‚ð“ü—Í‚µ‚Ü‚·B
URL‚ð“ü—Í‚·‚鎞‚̓Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚Æ“¯‚¶Œ`Ž®‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B

+

+

Ú‘±‚·‚éƒzƒXƒg‚ªƒzƒXƒgˆê——‚É“o˜^‚³‚ê‚Ä‚¢‚é‚Æ‚«‚́AƒzƒXƒgˆê——‚É“o˜^‚³‚ê‚Ä‚¢‚éFireWallAPASVƒ‚[ƒhALISTƒRƒ}ƒ“ƒh‚Ì‚Ý‚ðŽg—p‚·‚é‚©‚Ç‚¤‚©‚̐ݒè‚ðŽg‚¢‚Ü‚·B

+

¡ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ŃzƒXƒg‚ðŽw’肵‚Đڑ±

+

ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+

Ú‘±‚·‚éƒzƒXƒg‚ªƒzƒXƒgˆê——‚É“o˜^‚³‚ê‚Ä‚¢‚é‚Æ‚«‚́AƒzƒXƒgˆê——‚É“o˜^‚³‚ê‚Ä‚¢‚éFireWallAPASVƒ‚[ƒhALISTƒRƒ}ƒ“ƒh‚Ì‚Ý‚ðŽg—p‚·‚é‚©‚Ç‚¤‚©‚̐ݒè‚ðŽg‚¢‚Ü‚·B

+

¡Ú‘±‚ð“r’†‚Å’†Ž~‚·‚éê‡

+

Ú‘±‚ð“r’†‚Å’†Ž~‚·‚é‚Æ‚«‚́AØ’fƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ü‚·B

+

¡Ø’f

+

Ø’fƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000006.HTM b/htmlhelp/HTML/H0000006.HTM new file mode 100644 index 0000000..16d9220 --- /dev/null +++ b/htmlhelp/HTML/H0000006.HTM @@ -0,0 +1,10 @@ + +ƒtƒ@ƒCƒ‹ˆê—— + + + +

ƒtƒ@ƒCƒ‹ˆê——‚ÍŽ©“®“I‚É•\Ž¦‚³‚ê‚Ü‚·BiƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚́AƒzƒXƒg‚ɐڑ±‚µ‚Ä‚¢‚È‚¢Žž‚Í•\Ž¦‚³‚ê‚Ü‚¹‚ñBj

+

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ðŽóM‚µ‚Ä‚¢‚éŠÔAƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE‚ÉŽóMó‹µ‚ª•\Ž¦‚³‚ê‚Ü‚·B

+

+

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ÌŽóM‚ª’x‚¢ŽžAŽóM’†Ž~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚Æ’†Ž~‚Å‚«‚Ü‚·Biƒ^ƒCƒ~ƒ“ƒO‚É‚æ‚Á‚Ä‚Í‚·‚®‚É’†Ž~‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·j

diff --git a/htmlhelp/HTML/H0000007.HTM b/htmlhelp/HTML/H0000007.HTM new file mode 100644 index 0000000..e1cc8dd --- /dev/null +++ b/htmlhelp/HTML/H0000007.HTM @@ -0,0 +1,17 @@ + +“]‘—ƒ‚[ƒh + + + +

FTP‚Ńtƒ@ƒCƒ‹‚ð“]‘—‚·‚鎞‚́AŽŸ‚Ì‚Q‚‚̓]‘—ƒ‚[ƒh‚ª‚ ‚è‚Ü‚·B

+

ƒc[ƒ‹ƒo[‚Őݒè‚Å‚«‚Ü‚·B
@

+

‚Ü‚½AŠg’£Žq‚È‚Ç‚É‚æ‚莩“®“I‚É“]‘—ƒ‚[ƒh‚ðØ‚è‘Ö‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
@“]‘—‚P

+

¡ƒAƒXƒL[“]‘—ƒ‚[ƒh

+

ƒƒ‚’ ‚Ȃǂł݂邱‚Æ‚Ì‚Å‚«‚éƒtƒ@ƒCƒ‹iŠg’£Žq‚ª .txtA.html +‚Ȃǁj‚ðƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚·‚é‚Æ‚«‚ÉŽg—p‚µ‚Ü‚·B
ƒtƒ@ƒCƒ‹‚̉üs•¶Žš‚ª•ÏŠ·‚³‚ê‚Ü‚·B
iƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚̃TƒCƒY‚́AŒ³‚̃tƒ@ƒCƒ‹‚̃TƒCƒY‚©‚çŽáŠ±•Ï‚í‚è‚Ü‚·Bj

+

‰æ‘œƒtƒ@ƒCƒ‹‚Ȃǂ́AƒAƒXƒL[“]‘—ƒ‚[ƒh‚Å“]‘—‚µ‚È‚¢‚Å‚­‚¾‚³‚¢B‰æ‘œ‚ª³‚µ‚­•\Ž¦‚³‚ê‚È‚­‚È‚è‚Ü‚·B

+

¡ƒoƒCƒiƒŠ“]‘—ƒ‚[ƒh

+

‰æ‘œƒtƒ@ƒCƒ‹AŽÀsƒtƒ@ƒCƒ‹‚È‚Ç‚ðƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚·‚é‚Æ‚«‚ÉŽg—p‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000008.HTM b/htmlhelp/HTML/H0000008.HTM new file mode 100644 index 0000000..0af79d4 --- /dev/null +++ b/htmlhelp/HTML/H0000008.HTM @@ -0,0 +1,36 @@ + +ƒ_ƒEƒ“ƒ[ƒh + + + +

ƒzƒXƒg‚©‚烍[ƒJƒ‹‚Öƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B
•¡”‚̃tƒ@ƒCƒ‹AƒTƒuƒtƒHƒ‹ƒ_ˆÈ‰º‚Ì‘S‚Ẵtƒ@ƒCƒ‹‚ð‚܂Ƃ߂ă_ƒEƒ“ƒ[ƒh‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B

+

ŽŸ‚̂悤‚È‘€ì•û–@‚ª‚ ‚è‚Ü‚·B

+

œƒ_ƒEƒ“ƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚ð‘I‚ñ‚ŁAƒ_ƒEƒ“ƒ[ƒhƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚©AƒRƒ}ƒ“ƒhƒƒjƒ…[‚̃_ƒEƒ“ƒ[ƒh‚ð‘I‚Ñ‚Ü‚·B

+

œƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚©‚çAƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ˆê——‚Öƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚Ü‚·B

+

œƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚©‚çAƒGƒNƒXƒvƒ[ƒ‰‚È‚Ç‚Öƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚Ü‚·B

+

œƒ_ƒEƒ“ƒ[ƒh‚·‚鎞‚Ƀtƒ@ƒCƒ‹–¼‚ð•Ï‚¦‚½‚¢Žž‚́AƒRƒ}ƒ“ƒhƒƒjƒ…[‚Ì–¼‘O‚ð•Ï‚¦‚ă_ƒEƒ“ƒ[ƒh‚ð‘I‚сAƒtƒ@ƒCƒ‹–¼‚ð“ü—Í‚µ‚Ü‚·B

+

œƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚È‚¢ƒtƒ@ƒCƒ‹‚ª‚ ‚鎞‚́AƒRƒ}ƒ“ƒhƒƒjƒ…[‚Ì–¼‘O‚ðŽw’肵‚ă_ƒEƒ“ƒ[ƒh‚ð‘I‚сAƒtƒ@ƒCƒ‹–¼‚ð“ü—Í‚µ‚Ü‚·B

+

œƒtƒ@ƒCƒ‹‚Å‚ ‚é‚Í‚¸‚Ì‚à‚Ì‚ªƒtƒHƒ‹ƒ_‚Æ‚µ‚ătƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚鎞‚́AƒRƒ}ƒ“ƒhƒƒjƒ…[‚̃tƒ@ƒCƒ‹‚Æ‚µ‚ă_ƒEƒ“ƒ[ƒh‚ð‘I‚Ñ‚Ü‚·B

+

ƒ_ƒEƒ“ƒ[ƒh’†‚́Aó‹µ‚ðŽ¦‚·ƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B

+

+

¡ƒ_ƒEƒ“ƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚̒ljÁ

+

ƒ_ƒEƒ“ƒ[ƒh’†‚Å‚àã‹L‚̃_ƒEƒ“ƒ[ƒh‚Ì‘€ì‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

¡ƒ_ƒEƒ“ƒ[ƒh‚Ì’†Ž~

+

‚±‚̃tƒ@ƒCƒ‹‚𒆎~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAƒ_ƒEƒ“ƒ[ƒh’†‚̃tƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚𒆎~‚µ‚Ü‚·B•¡”‚̃tƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚µ‚Ä‚¢‚é‚Æ‚«‚́AŽŸ‚̃tƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚ðs‚È‚¢‚Ü‚·B

+

ŽŸˆÈ~’†Ž~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAŒ»Ýƒ_ƒEƒ“ƒ[ƒh‚µ‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ÌŽŸˆÈ~‚̃tƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚𒆎~‚µ‚Ü‚·Bi•¡”‚̃tƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚µ‚Ä‚¢‚鎞‚É—LŒø‚Å‚·j

+

‘S‚Ä’†Ž~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁA‘S‚Ẵtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚𒆎~‚µ‚Ü‚·Bi•¡”‚̃tƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚µ‚Ä‚¢‚鎞‚É—LŒø‚Å‚·j

+

¡ƒ_ƒEƒ“ƒ[ƒh‚̍ĊJiƒŠƒWƒ…[ƒ€j

+

ƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”F‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000009.HTM b/htmlhelp/HTML/H0000009.HTM new file mode 100644 index 0000000..27e5406 --- /dev/null +++ b/htmlhelp/HTML/H0000009.HTM @@ -0,0 +1,24 @@ + +ƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”F + + + +

ƒ_ƒEƒ“ƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Æ“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ªƒ[ƒJƒ‹‘¤‚É‚ ‚é‚Æ‚«‚́Aƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”FƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B

+

ƒIƒvƒVƒ‡ƒ“‚Ì‘€ì‚̃_ƒEƒ“ƒ[ƒhŽž‚̐ݒ肪ã‘‚«‚ÌŽž‚́AŠm”FƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚¹‚¸‚ɁA‚‚˂ɏ㏑‚«‚µ‚Ü‚·B

+

+

¡ã‘‚«

+

ƒtƒ@ƒCƒ‹‚ðã‘‚«‚µ‚Ü‚·B

+

¡V‚µ‚¯‚ê‚Ώ㏑‚«

+

ƒtƒ@ƒCƒ‹‚Ì“ú•t‚ð”äŠr‚µAƒzƒXƒg‚̃tƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ªV‚µ‚¯‚ê‚΃_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B

+

¡ÄŠJiƒŠƒWƒ…[ƒ€j

+

“r’†‚܂Ń_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«A‚»‚Ì‘±‚«‚ðƒ_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
ƒAƒXƒL[ƒ‚[ƒh‚Ń_ƒEƒ“ƒ[ƒh‚·‚é‚Æ‚«‚́AƒŠƒWƒ…[ƒ€‚Í‚Å‚«‚Ü‚¹‚ñB

+

¦ƒzƒXƒg‚É‚æ‚Á‚Ă̓ŠƒWƒ…[ƒ€‚ɑΉž‚µ‚Ä‚¢‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B

+

¡ƒ_ƒEƒ“ƒ[ƒh‚µ‚È‚¢

+

ƒ[ƒJƒ‹‘¤‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«‚́Aƒ_ƒEƒ“ƒ[ƒh‚µ‚Ü‚¹‚ñB

+

¡ƒtƒ@ƒCƒ‹–¼‚ð•ÏX‚·‚é

+

ƒtƒ@ƒCƒ‹–¼‚ð•ÏX‚µ‚ď㏑‚«‚ð‰Ÿ‚·‚±‚Æ‚É‚æ‚èAˆá‚¤–¼‘O‚Ń_ƒEƒ“ƒ[ƒh‚Å‚«‚Ü‚·B

+

¡ˆÈ~‘S‚Ä

+

‚±‚êˆÈ~Aƒ_ƒEƒ“ƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Æ“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ªƒ[ƒJƒ‹‘¤‚É‚ ‚Á‚Ä‚àAŠm”F‚ð‚¹‚¸‚ɁA“¯‚¶•û–@‚ŏˆ—‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000010.HTM b/htmlhelp/HTML/H0000010.HTM new file mode 100644 index 0000000..3effc1d --- /dev/null +++ b/htmlhelp/HTML/H0000010.HTM @@ -0,0 +1,28 @@ + +ƒAƒbƒvƒ[ƒh + + + +

ƒ[ƒJƒ‹‚©‚çƒzƒXƒg‚Öƒtƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·B
•¡”‚̃tƒ@ƒCƒ‹AƒTƒuƒtƒHƒ‹ƒ_ˆÈ‰º‚Ì‘S‚Ẵtƒ@ƒCƒ‹‚ð‚܂Ƃ߂ăAƒbƒvƒ[ƒh‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B

+

ŽŸ‚̂悤‚È‘€ì•û–@‚ª‚ ‚è‚Ü‚·B

+

œƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚ð‘I‚ñ‚ŁAƒAƒbƒvƒ[ƒhƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚©AƒRƒ}ƒ“ƒhƒƒjƒ…[‚̃Aƒbƒvƒ[ƒh‚ð‘I‚Ñ‚Ü‚·B

+

œƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ˆê——‚©‚çAƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚Öƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚Ü‚·B

+

œƒGƒNƒXƒvƒ[ƒ‰‚È‚Ç‚©‚çAƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚Öƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚µ‚Ü‚·B

+

œƒAƒbƒvƒ[ƒh‚·‚鎞‚Ƀtƒ@ƒCƒ‹–¼‚ð•Ï‚¦‚½‚¢Žž‚́AƒRƒ}ƒ“ƒhƒƒjƒ…[‚Ì–¼‘O‚ð•Ï‚¦‚ăAƒbƒvƒ[ƒh‚ð‘I‚сAƒtƒ@ƒCƒ‹–¼‚ð“ü—Í‚µ‚Ü‚·B

+

ƒAƒbƒvƒ[ƒh’†‚́Aó‹µ‚ðŽ¦‚·ƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B

+

+

¡ƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚̒ljÁ

+

ƒAƒbƒvƒ[ƒh’†‚ɁAƒtƒ@ƒCƒ‹ƒŠƒXƒg‚̃tƒ@ƒCƒ‹‚ð‘I‚ñ‚ŃAƒbƒvƒ[ƒhƒ{ƒ^ƒ“pic\btn_up.png‚ð‰Ÿ‚µ‚Ü‚·B

+

¡ƒAƒbƒvƒ[ƒh‚Ì’†Ž~

+

‚±‚̃tƒ@ƒCƒ‹‚𒆎~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAƒAƒbƒvƒ[ƒh’†‚̃tƒ@ƒCƒ‹‚̃Aƒbƒvƒ[ƒh‚𒆎~‚µ‚Ü‚·B•¡”‚̃tƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚µ‚Ä‚¢‚é‚Æ‚«‚́AŽŸ‚̃tƒ@ƒCƒ‹‚̃Aƒbƒvƒ[ƒh‚ðs‚È‚¢‚Ü‚·B

+

ŽŸˆÈ~’†Ž~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAŒ»ÝƒAƒbƒvƒ[ƒh‚µ‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ÌŽŸˆÈ~‚̃tƒ@ƒCƒ‹‚̃Aƒbƒvƒ[ƒh‚𒆎~‚µ‚Ü‚·Bi•¡”‚̃tƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚µ‚Ä‚¢‚鎞‚É—LŒø‚Å‚·j

+

‘S‚Ä’†Ž~ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁA‘S‚Ẵtƒ@ƒCƒ‹‚̃Aƒbƒvƒ[ƒh‚𒆎~‚µ‚Ü‚·Bi•¡”‚̃tƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚µ‚Ä‚¢‚鎞‚É—LŒø‚Å‚·j

diff --git a/htmlhelp/HTML/H0000011.HTM b/htmlhelp/HTML/H0000011.HTM new file mode 100644 index 0000000..c0fd5c3 --- /dev/null +++ b/htmlhelp/HTML/H0000011.HTM @@ -0,0 +1,28 @@ + +ƒAƒbƒvƒ[ƒh‚ÌŠm”F + + + +

ƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Æ“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ªƒzƒXƒg‘¤‚É‚ ‚é‚Æ‚«‚́AƒAƒbƒvƒ[ƒh‚ÌŠm”FƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B

+

ƒIƒvƒVƒ‡ƒ“‚Ì‘€ì‚̃Aƒbƒvƒ[ƒhŽž‚̐ݒ肪ã‘‚«‚ÌŽž‚́AŠm”FƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚¹‚¸‚ɁA‚‚˂ɏ㏑‚«‚µ‚Ü‚·B

+

+

¡ã‘‚«

+

ƒtƒ@ƒCƒ‹‚ðã‘‚«‚µ‚Ü‚·B

+

¡V‚µ‚¯‚ê‚Ώ㏑‚«

+

ƒtƒ@ƒCƒ‹‚Ì“ú•t‚ð”äŠr‚µAƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ªV‚µ‚¯‚ê‚΃Aƒbƒvƒ[ƒh‚µ‚Ü‚·B

+

¡ÄŠJiƒŠƒWƒ…[ƒ€j

+

“r’†‚܂ŃAƒbƒvƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«A‚»‚Ì‘±‚«‚ðƒAƒbƒvƒ[ƒh‚µ‚Ü‚·B
ƒAƒXƒL[ƒ‚[ƒh‚ŃAƒbƒvƒ[ƒh‚·‚é‚Æ‚«‚́AƒŠƒWƒ…[ƒ€‚Í‚Å‚«‚Ü‚¹‚ñB

+

¦ƒzƒXƒg‚É‚æ‚Á‚Ă̓ŠƒWƒ…[ƒ€‚ɑΉž‚µ‚Ä‚¢‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B

+

¡ƒzƒXƒg‚ª–¼‘O‚ð•t‚¯‚é

+

ƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Ì–¼‘O‚ðƒzƒXƒg‚ªŒˆ’肵‚Ü‚·B

+

—áj sample.txt ¨ sample.txt.1

+

¡ƒAƒbƒvƒ[ƒh‚µ‚È‚¢

+

ƒzƒXƒg‘¤‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«‚́AƒAƒbƒvƒ[ƒh‚µ‚Ü‚¹‚ñB

+

¡ƒtƒ@ƒCƒ‹–¼‚ð•ÏX‚·‚é

+

ƒtƒ@ƒCƒ‹–¼‚ð•ÏX‚µ‚ď㏑‚«‚ð‰Ÿ‚·‚±‚Æ‚É‚æ‚èAˆá‚¤–¼‘O‚ŃAƒbƒvƒ[ƒh‚Å‚«‚Ü‚·B

+

¡ˆÈ~‘S‚Ä

+

‚±‚êˆÈ~AƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Æ“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ªƒzƒXƒg‘¤‚É‚ ‚Á‚Ä‚àAŠm”F‚ð‚¹‚¸‚ɁA“¯‚¶•û–@‚ŏˆ—‚µ‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000012.HTM b/htmlhelp/HTML/H0000012.HTM new file mode 100644 index 0000000..2218bcb --- /dev/null +++ b/htmlhelp/HTML/H0000012.HTM @@ -0,0 +1,31 @@ + +ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh + + + +

ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_“à—e‚ðAƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚߂ăzƒXƒg‘¤‚ɍČ»‚µ‚Ü‚·Bƒ[ƒJƒ‹‘¤‚ƃzƒXƒg‘¤‚̃tƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_\¬‚ª“¯‚¶‚É‚È‚è‚Ü‚·B

+

¦ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚̓tƒ@ƒCƒ‹‚̍폜‚às‚¢‚Ü‚·B\•ª‚É‚²’ˆÓ‚­‚¾‚³‚¢B

+

ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚̏ˆ—‚ɂ‚¢‚Ä

+

ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚́AˆÈ‰º‚̏ˆ—‚ðs‚¢‚Ü‚·B

+
+

(1) ƒzƒXƒg‘¤‚Ì‚Ý‚É—L‚éƒtƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_‚ðíœ‚·‚éBiƒTƒuƒtƒHƒ‹ƒ_“à‚̃tƒ@ƒCƒ‹‚ðŠÜ‚ށj

+

(2) ƒ[ƒJƒ‹‘¤‚Ì‚Ý‚É—L‚éA‚ ‚é‚¢‚̓[ƒJƒ‹‘¤‚Ì‚Ù‚¤‚ªV‚µ‚¢ƒtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚·‚éBiƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚ށj

+

+

¦ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ł́A•\Ž¦‚µ‚Ä‚¢‚éƒtƒHƒ‹ƒ_ˆÈ‰º‚Ì‘S‚Ẵtƒ@ƒCƒ‹‚ªˆ—‚̑ΏۂƂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚ł̃tƒ@ƒCƒ‹‚Ì‘I‘ð‚͈Ӗ¡‚ðŽ‚¿‚Ü‚¹‚ñB

+

¦ƒIƒvƒVƒ‡ƒ“Ý’è‚̃~ƒ‰[ƒŠƒ“ƒO‚ŁAƒAƒbƒvƒ[ƒh‚µ‚È‚¢ƒtƒ@ƒCƒ‹AƒzƒXƒg‚©‚çíœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹‚ðŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

Žg‚¢•û

+

(1) ƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Æ‚à‚ɁAƒ~ƒ‰[ƒŠƒ“ƒO‚µ‚½‚¢ƒtƒHƒ‹ƒ_‚ð•\Ž¦‚µ‚Ü‚·B

+

(2) ƒRƒ}ƒ“ƒhƒƒjƒ…[‚̃~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ð‘I‚Ñ‚Ü‚·Bƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒhƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

(3)Šm”FƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B
@@

+

(4)ˆ—“à—e•\Ž¦ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAƒ~ƒ‰[ƒŠƒ“ƒO‚ō폜‚·‚éƒtƒ@ƒCƒ‹AƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚̈ꗗ‚ð•\Ž¦‚µ‚Ü‚·B
@@
@@iª‚±‚̃EƒCƒ“ƒhƒE‚́A‘å‚«‚³‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·j

+

‚±‚̈ꗗ‚©‚獀–Ú‚ðŽæ‚菜‚­‚ƁAŽæ‚菜‚¢‚½ˆ—‚͍s‚¢‚Ü‚¹‚ñBíœ‚µ‚½‚­‚È‚¢ƒtƒ@ƒCƒ‹AƒAƒbƒvƒ[ƒh‚µ‚½‚­‚È‚¢ƒtƒ@ƒCƒ‹‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚ÉŽg—p‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000013.HTM b/htmlhelp/HTML/H0000013.HTM new file mode 100644 index 0000000..32003db --- /dev/null +++ b/htmlhelp/HTML/H0000013.HTM @@ -0,0 +1,29 @@ + +ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh + + + +

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_“à—e‚ðAƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚߂㍁[ƒJƒ‹‘¤‚ɍČ»‚µ‚Ü‚·BƒzƒXƒg‘¤‚ƃ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_\¬‚ª“¯‚¶‚É‚È‚è‚Ü‚·B

+

¦ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚̓tƒ@ƒCƒ‹‚̍폜‚às‚¢‚Ü‚·B\•ª‚É‚²’ˆÓ‚­‚¾‚³‚¢B

+

ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚̏ˆ—‚ɂ‚¢‚Ä

+
+

(1) ƒ[ƒJƒ‹‘¤‚Ì‚Ý‚É—L‚éƒtƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_‚ðíœ‚·‚éBiƒTƒuƒtƒHƒ‹ƒ_“à‚̃tƒ@ƒCƒ‹‚ðŠÜ‚ށj

+

(2) ƒzƒXƒg‘¤‚Ì‚Ý‚É—L‚éA‚ ‚é‚¢‚̓zƒXƒg‘¤‚Ì‚Ù‚¤‚ªV‚µ‚¢ƒtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚éBiƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚ށj

+

¦ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ł́A•\Ž¦‚µ‚Ä‚¢‚éƒtƒHƒ‹ƒ_ˆÈ‰º‚Ì‘S‚Ẵtƒ@ƒCƒ‹‚ªˆ—‚̑ΏۂƂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚ł̃tƒ@ƒCƒ‹‚Ì‘I‘ð‚͈Ӗ¡‚ðŽ‚¿‚Ü‚¹‚ñB

+

¦ƒIƒvƒVƒ‡ƒ“Ý’è‚̃~ƒ‰[ƒŠƒ“ƒO‚ŁAƒ_ƒEƒ“ƒ[ƒh‚µ‚È‚¢ƒtƒ@ƒCƒ‹Aƒ[ƒJƒ‹‚©‚çíœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹‚ðŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+


ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚́Aƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚̃[ƒJƒ‹‚ƃzƒXƒg‚ÌŠÖŒW‚ð‹t‚É‚µ‚½‚à‚Ì‚Å‚·BÚ×‚̓~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+


Žg‚¢•û

+

(1) ƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Æ‚à‚ɁAƒ~ƒ‰[ƒŠƒ“ƒO‚µ‚½‚¢ƒtƒHƒ‹ƒ_‚ð•\Ž¦‚µ‚Ü‚·B

+

(2) ƒRƒ}ƒ“ƒhƒƒjƒ…[‚̃~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ð‘I‚Ñ‚Ü‚·B

+

(3)Šm”FƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B
@@

+

(4)ˆ—“à—e•\Ž¦‚֐i‚Þƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAƒ~ƒ‰[ƒŠƒ“ƒO‚ō폜‚·‚éƒtƒ@ƒCƒ‹AƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚̈ꗗ‚ð•\Ž¦‚µ‚Ü‚·B
@@
@@iª‚±‚̃EƒCƒ“ƒhƒE‚́A‘å‚«‚³‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·j

+

‚±‚̈ꗗ‚©‚獀–Ú‚ðŽæ‚菜‚­‚ƁAŽæ‚菜‚¢‚½ˆ—‚͍s‚¢‚Ü‚¹‚ñBíœ‚µ‚½‚­‚È‚¢ƒtƒ@ƒCƒ‹Aƒ_ƒEƒ“ƒ[ƒh‚µ‚½‚­‚È‚¢ƒtƒ@ƒCƒ‹‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞‚ÉŽg—p‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000014.HTM b/htmlhelp/HTML/H0000014.HTM new file mode 100644 index 0000000..5c0cdaa --- /dev/null +++ b/htmlhelp/HTML/H0000014.HTM @@ -0,0 +1,10 @@ + +ƒtƒ@ƒCƒ‹‚ðŠJ‚­ + + + +

ƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½ŽžA‚Ü‚½‚̓}ƒEƒX‚̉Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ÅŠJ‚­‚ð‘I‚ԂƁA‚»‚̃tƒ@ƒCƒ‹“à—e‚ð•\Ž¦‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹‚ðŠJ‚­Žž‚́A‚¢‚Á‚½‚ñì‹Æ—pƒtƒHƒ‹ƒ_‚Ƀtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚µA‚»‚Ì“à—e‚ð•\Ž¦‚µ‚Ü‚·Bƒ_ƒEƒ“ƒ[ƒh’†‚́AƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE‚ɏ󋵂ð•\Ž¦‚µ‚Ü‚·B

+

+

ƒ_ƒEƒ“ƒ[ƒh‚ª’x‚¢Žž‚́AŽóM’†Ž~ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä’†Ž~‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000015.HTM b/htmlhelp/HTML/H0000015.HTM new file mode 100644 index 0000000..032e437 --- /dev/null +++ b/htmlhelp/HTML/H0000015.HTM @@ -0,0 +1,9 @@ + +ƒtƒ@ƒCƒ‹íœ + + + +

íœ‚·‚éƒtƒ@ƒCƒ‹‚ð‘I‚ñ‚ŁAíœƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ü‚·B

+

íœ‚́A•¡”‚̃tƒ@ƒCƒ‹‚ð‘I‚ׂé‚Ù‚©AƒTƒuƒfƒBƒŒƒNƒgƒŠˆÈ‰º‚Ì‘S‚Ẵtƒ@ƒCƒ‹‚ð‚܂Ƃ߂čs‚È‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000016.HTM b/htmlhelp/HTML/H0000016.HTM new file mode 100644 index 0000000..59565e1 --- /dev/null +++ b/htmlhelp/HTML/H0000016.HTM @@ -0,0 +1,9 @@ + +ƒtƒ@ƒCƒ‹–¼•ÏX + + + +

–¼‘O‚ð•ÏX‚·‚éƒtƒ@ƒCƒ‹‚ð‘I‚ñ‚ŁA–¼‘O•ÏXƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ü‚·B

+

–¼‘O•ÏX‚́A•¡”‚̃tƒ@ƒCƒ‹‚ð‚܂Ƃ߂čs‚È‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000017.HTM b/htmlhelp/HTML/H0000017.HTM new file mode 100644 index 0000000..3c20488 --- /dev/null +++ b/htmlhelp/HTML/H0000017.HTM @@ -0,0 +1,17 @@ + +‘®«•ÏX + + + +

‘®«iƒp[ƒ~ƒbƒVƒ‡ƒ“j‚ð•ÏX‚·‚éƒtƒ@ƒCƒ‹‚ð‘I‚ñ‚ŁAƒRƒ}ƒ“ƒhƒƒjƒ…[‚Ì‘®«•ÏX‚ð‘I‚Ñ‚Ü‚·B

+

‘®«‚̕ύX‚Í "SITE CHMOD" ƒRƒ}ƒ“ƒh‚ðŽg—p‚µ‚Ü‚·BƒzƒXƒg‚ªƒTƒ|[ƒg‚·‚é‘®«•ÏXƒRƒ}ƒ“ƒh‚ªˆá‚¤Žž‚́AƒzƒXƒg‚Ì“o˜^|‚“x‚ŁAŽg—p‚·‚é‘®«•ÏXƒRƒ}ƒ“ƒh‚ðÝ’肵‚Ä‚­‚¾‚³‚¢B
ƒzƒXƒg‚É‚æ‚Á‚Ä‚ÍFTP‚Å‚Ì‘®«•ÏX‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B

+

FTP‚Å‚Ì‘®«•ÏX‚̃Rƒ}ƒ“ƒh‚́Aunix‚̃VƒFƒ‹‚ÅŽg—p‚·‚éƒRƒ}ƒ“ƒhichmod“™j‚Æ“¯‚¶‚Å‚Í‚ ‚è‚Ü‚¹‚ñB

+

‘®«•ÏX‚́A•¡”‚̃tƒ@ƒCƒ‹‚ð‚܂Ƃ߂čs‚È‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

+


ŠÂ‹«Ý’è‚Ì“]‘—‚R‚ŁAƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Ì‘®«‚ð‚ ‚ç‚©‚¶‚ߐݒ肵‚Ä‚¨‚­‚±‚Æ‚à‚Å‚«‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000018.HTM b/htmlhelp/HTML/H0000018.HTM new file mode 100644 index 0000000..d3565ad --- /dev/null +++ b/htmlhelp/HTML/H0000018.HTM @@ -0,0 +1,7 @@ + +ƒtƒHƒ‹ƒ_ì¬ + + +ƒtƒHƒ‹ƒ_ì¬ƒ{ƒ^ƒ“‚ð‰Ÿ‚µAƒtƒHƒ‹ƒ_–¼‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B
+

 

diff --git a/htmlhelp/HTML/H0000019.HTM b/htmlhelp/HTML/H0000019.HTM new file mode 100644 index 0000000..04f4e3b --- /dev/null +++ b/htmlhelp/HTML/H0000019.HTM @@ -0,0 +1,24 @@ + +ƒuƒbƒNƒ}[ƒN + + + +

ƒ[ƒJƒ‹‘¤AƒŠƒ‚[ƒg‘¤‚̃tƒHƒ‹ƒ_‚ðƒuƒbƒNƒ}[ƒN‚É“o˜^‚Å‚«‚Ü‚·B

+

ƒuƒbƒNƒ}[ƒN‚͐ڑ±‚µ‚Ä‚¢‚éƒzƒXƒg–ˆ‚ɐݒè‚Å‚«‚Ü‚·B
Ú‘±‚µ‚Ä‚¢‚È‚¢Žž‚́AƒuƒbƒNƒ}[ƒN‚ÍŽg‚¦‚Ü‚¹‚ñB

+

¡ƒuƒbƒNƒ}[ƒN‚É“o˜^

+

ƒuƒbƒNƒ}[ƒNƒƒjƒ…[‚̒ljÁ‚ð‘I‚ԂƁAŒ»Ý‚̃tƒHƒ‹ƒ_‚ªƒuƒbƒNƒ}[ƒN‚É“o˜^‚³‚ê‚Ü‚·B

+

¡ƒuƒbƒNƒ}[ƒN‚ðŽg‚¤

+

ƒuƒbƒNƒ}[ƒNƒƒjƒ…[‚Å•\Ž¦‚³‚ê‚éƒtƒHƒ‹ƒ_‚ð‘I‚ԂƁA‚»‚̃tƒHƒ‹ƒ_‚Ɉړ®‚µ‚Ü‚·B

+

+

¡ƒuƒbƒNƒ}[ƒN‚ð•ÒW‚·‚é

+

ƒuƒbƒNƒ}[ƒNƒƒjƒ…[‚̕ҏW‚ð‘I‚ԂƁAƒuƒbƒNƒ}[ƒN‚̈ꗗƒEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B

+


iª‚±‚̃EƒCƒ“ƒhƒE‚́A‘å‚«‚³‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·j

+

‚±‚±‚ł́A“o˜^‚̒ljÁAíœA•ÏXA•À‚וς¦‚ª‚Å‚«‚Ü‚·B

+

’ljÁA•ÏXƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAŽŸ‚̃EƒCƒ“ƒhƒE‚ð•\Ž¦‚µ‚Ü‚·B

+

+

ƒtƒHƒ‹ƒ_‚́Aƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Ì‚Ç‚¿‚ç‚©•Ð•ûA‚Ü‚½‚Í—¼•û‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000020.HTM b/htmlhelp/HTML/H0000020.HTM new file mode 100644 index 0000000..dc5c71d --- /dev/null +++ b/htmlhelp/HTML/H0000020.HTM @@ -0,0 +1,24 @@ + +ƒtƒ@ƒCƒ‹‚ÌŒŸõ + + + +

ˆê——•\Ž¦‚³‚ê‚Ä‚¢‚é’†‚©‚çAŽw’è‚̃tƒ@ƒCƒ‹‚ðŒŸõ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

•\Ž¦ƒƒjƒ…[‚ÌŒŸõ‚ð‘I‚сAŒŸõ‚·‚éƒtƒ@ƒCƒ‹–¼‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B
ŽŸ‚̃tƒ@ƒCƒ‹‚ðŒŸõ‚·‚é‚Æ‚«‚́A•\Ž¦ƒƒjƒ…[‚ÌŽŸ‚ðŒŸõ‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢B

+

ƒtƒ@ƒCƒ‹–¼‚̑啶Žš^¬•¶Žš‚Í‹æ•Ê‚³‚ê‚Ü‚¹‚ñB

+

¡ƒƒCƒ‹ƒhƒJ[ƒh‚ðŽg‚Á‚½ŒŸõ

+

ƒtƒ@ƒCƒ‹–¼‚ɁAŽŸ‚̃ƒCƒ‹ƒhƒJ[ƒh‚ðŠÜ‚߂邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

* cc ”CˆÓ‚Ì‚O•¶ŽšˆÈã‚Ì•¶Žš—ñ‚Ƀ}ƒbƒ`‚µ‚Ü‚·B
? cc +”CˆÓ‚Ì‚P•¶Žš‚Ƀ}ƒbƒ`‚µ‚Ü‚·B

+

¡³‹K•\Œ»‚ðŽg‚Á‚½ŒŸõ

+

ŒŸõ•¶Žš—ñ‚ð“ü—Í‚·‚éÛ‚ɁA³‹K•\Œ»‚Ƀ`ƒFƒbƒNƒ}[ƒN‚ð•t‚¯‚Ä‚­‚¾‚³‚¢B

+

ƒtƒ@ƒCƒ‹–¼‚ɁAŽŸ‚̃ƒ^ƒLƒƒƒ‰ƒNƒ^‚ªŽg—p‚Å‚«‚Ü‚·B

+

[] cc ƒLƒƒƒ‰ƒNƒ^ƒNƒ‰ƒX
() cc ƒpƒ^[ƒ“‚ðƒOƒ‹[ƒv‰»‚·‚é
^  cc +ƒtƒ@ƒCƒ‹–¼‚̐擪
$  cc ƒtƒ@ƒCƒ‹–¼‚Ì––”ö
.  cc ”CˆÓ‚Ì‚P•¶Žš
*  cc +’¼‘O‚̃pƒ^[ƒ“‚Ì‚O‰ñˆÈã‚ÌŒJ‚è•Ô‚µ
+  cc ’¼‘O‚̃pƒ^[ƒ“‚Ì‚P‰ñˆÈã‚ÌŒJ‚è•Ô‚µ
?  cc +’¼‘O‚̃pƒ^[ƒ“‚ª‚O‰ñA‚Ü‚½‚Í‚P‰ñŒ»‚ê‚é
|  cc ƒpƒ^[ƒ“‚̘_—˜ai‚n‚qj

+

jre32.dll‚ª•K—v‚Å‚·B

diff --git a/htmlhelp/HTML/H0000021.HTM b/htmlhelp/HTML/H0000021.HTM new file mode 100644 index 0000000..96a4fbf --- /dev/null +++ b/htmlhelp/HTML/H0000021.HTM @@ -0,0 +1,21 @@ + +ƒtƒBƒ‹ƒ^ + + + +

ƒtƒBƒ‹ƒ^‚ðŽg‚¤‚ƁA•\Ž¦‚·‚éƒtƒ@ƒCƒ‹‚ðŒÀ’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

+

ƒtƒBƒ‹ƒ^‚̓ƒCƒ‹ƒhƒJ[ƒh‚ðŽg‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B
•¡”‚̃tƒBƒ‹ƒ^‚ðŽg—p‚·‚é‚Æ‚«‚Í ; (ƒZƒ~ƒRƒƒ“j‚Å‹æØ‚Á‚ď‘‚«‚Ü‚·B

+

—áj
 *.html        +¨ Šg’£Žq‚ª .html +‚̃tƒ@ƒCƒ‹‚Ì‚Ý•\Ž¦‚µ‚Ü‚·B
 *.html;x*  ¨ Šg’£Žq‚ª +.html ‚̃tƒ@ƒCƒ‹‚ƁAƒtƒ@ƒCƒ‹–¼‚ª x ‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹‚Ì‚Ý•\Ž¦‚µ‚Ü‚·B

+

‘S•\Ž¦ƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁA‘S‚Ẵtƒ@ƒCƒ‹‚ð•\Ž¦‚·‚éÝ’è‚É–ß‚è‚Ü‚·B

+

ƒtƒBƒ‹ƒ^‚̐ݒè‚́AFFFTP‚̃^ƒCƒgƒ‹ƒo[‚É•\Ž¦‚µ‚Ü‚·B

+

ƒtƒBƒ‹ƒ^‚̐ݒè‚Í“]‘—‚·‚éƒtƒ@ƒCƒ‹‚É‚à‰e‹¿‚µ‚Ü‚·B
ƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚ß‚Ä“]‘—‚·‚éê‡AƒTƒuƒtƒHƒ‹ƒ_‚Ì’†‚É +a.html ‚Æ b.gif ‚Ì‚Q‚‚̃tƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«AƒtƒBƒ‹ƒ^‚ª +*.html ‚ÆŽw’肳‚ê‚Ä‚¢‚é‚Æ‚«‚Í a.html ‚¾‚¯‚ª“]‘—‚³‚ê‚Ü‚·B

+

ƒtƒBƒ‹ƒ^‚̐ݒè‚Í•Û‘¶‚µ‚Ü‚¹‚ñB

diff --git a/htmlhelp/HTML/H0000022.HTM b/htmlhelp/HTML/H0000022.HTM new file mode 100644 index 0000000..d50f0ed --- /dev/null +++ b/htmlhelp/HTML/H0000022.HTM @@ -0,0 +1,11 @@ + +ƒtƒHƒ‹ƒ_‚Ì“¯ŽžˆÚ“® + + + +

ƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Ì—¼•û‚É“¯‚¶–¼‘O‚̃tƒHƒ‹ƒ_‚ª‚ ‚鎞A—¼•û‚̃tƒHƒ‹ƒ_‚̈ړ®‚𓯎ž‚ɍs‚¢‚Ü‚·B

+

‰º‚̉æ–ʂ́A‚ÅŽ¦‚³‚ê‚é•”•ªiƒtƒHƒ‹ƒ_–¼‚̃_ƒuƒ‹ƒNƒŠƒbƒNA‚Ü‚½‚͈ꂏã‚̃tƒHƒ‹ƒ_‚ւ̈ړ®j‚ŃtƒHƒ‹ƒ_ˆÚ“®‚ð‚·‚éŽž‚É“®ì‚µ‚Ü‚·B‚ÅŽ¦‚³‚ê‚é•”•ª‚Å‚Í“®ì‚µ‚Ü‚¹‚ñB

+

+

 

diff --git a/htmlhelp/HTML/H0000023.HTM b/htmlhelp/HTML/H0000023.HTM new file mode 100644 index 0000000..397492f --- /dev/null +++ b/htmlhelp/HTML/H0000023.HTM @@ -0,0 +1,16 @@ + +”CˆÓ‚̃Rƒ}ƒ“ƒh + + + +

œu”CˆÓ‚̃Rƒ}ƒ“ƒhv‚ÅŽg‚¦‚éƒRƒ}ƒ“ƒh

+
+

DELE  RMD   MKD   PWD   + RNFR
RNTO  SITE  ALLO  STAT  SYST
HELP  +NOOP

+

œu”CˆÓ‚̃Rƒ}ƒ“ƒhvŽg‚¦‚È‚¢ƒRƒ}ƒ“ƒh^Žg‚í‚È‚¢‚Ù‚¤‚ª‚æ‚¢ƒRƒ}ƒ“ƒh

+
+

USER  PASS  ACCT  CWD   CDUP
SMNT  + REIN  QUIT  PORT  PASV
TYPE  STRU  MODE  + RETR  STOR
STOU  APPE  REST  ABOR  + LIST
NLST

diff --git a/htmlhelp/HTML/H0000024.HTM b/htmlhelp/HTML/H0000024.HTM new file mode 100644 index 0000000..9524bee --- /dev/null +++ b/htmlhelp/HTML/H0000024.HTM @@ -0,0 +1,85 @@ + +ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ + + + +

ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ɃzƒXƒg–¼‚âƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚āAFFFTP‹N“®Œã’¼‚¿‚ɃzƒXƒg‚ւ̐ڑ±Aƒtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

œƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ÉŠÖ‚µ‚Ä

+

ŽŸ‚̃IƒvƒVƒ‡ƒ“‚ªŽw’è‚Å‚«‚Ü‚·B

+

-z ‚Ü‚½‚Í --mpasswd     ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ðŽw’è‚·‚é

+

Žg—p—áiƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ªmymasterpassword‚̏ꍇj

+

-z mymasterpassword

+

-z‚Ì‘OŒã‚É‚Í”¼ŠpƒXƒy[ƒX‚ð“ü‚ê‚Ä‚­‚¾‚³‚¢B

+

ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ªƒXƒy[ƒX‚ðŠÜ‚ޏꍇ‚̓pƒXƒ[ƒh‘S‘Ì‚ðƒ_ƒuƒ‹ƒNƒH[ƒe[ƒVƒ‡ƒ“‚ň͂ñ‚Å‚­‚¾‚³‚¢B

+

 

+

œ“o˜^‚µ‚Ä‚ ‚éƒzƒXƒg‚̐ݒ薼‚ðŽw’è‚·‚é•û–@

+

Ú‘±‚·‚éƒzƒXƒg‚ªƒzƒXƒgˆê——‚É“o˜^‚µ‚Ä‚ ‚鎞‚́A‚»‚Ì–¼‘O‚ðŽw’肵‚Đڑ±‚Å‚«‚Ü‚·B
‚Ü‚½AÚ‘±Œã‚Ƀ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðŠJŽn‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

ŽŸ‚̏‘Ž®‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B[ ]‚ň͂܂ꂽ•”•ª‚͏ȗª‰Â”\‚Å‚·B

+

-s Ý’è–¼ [[-m | -d] [-f] [-q]]

+

ŽŸ‚̃IƒvƒVƒ‡ƒ“‚ªŽw’è‚Å‚«‚Ü‚·B

+

-s ‚Ü‚½‚Í --set         +Ú‘±‚·‚éƒzƒXƒg‚̐ݒ薼‚ðŽw’è‚·‚é
-m ‚Ü‚½‚Í --mirror      +Ú‘±Œãƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðs‚¤
-d ‚Ü‚½‚Í --mirrordown  Ú‘±Œãƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ðs‚¤
-f ‚Ü‚½‚Í +--force       ƒ~ƒ‰[ƒŠƒ“ƒOŠJŽn‚ÌŠm”F‚ð‚µ‚È‚¢
-q ‚Ü‚½‚Í +--quit        ƒ~ƒ‰[ƒŠƒ“ƒOI—¹ŒãAFFFTP‚ð•Â‚¶‚é

+

Žg—p—á

+

¡Ý’èÏ‚݂̃zƒXƒg"My Home Page"‚ɐڑ±‚µAƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðŠJŽn‚·‚éB
  +-s‚Ɛݒ薼‚ÌŠÔ‚É‚Í‹ó”’‚ª•K—v‚Å‚·B

+
+

-s "My Home Page" +-m

+

 

+

œƒzƒXƒg–¼AURL‚ðŽw’è‚·‚é•û–@

+

Ú‘±‚·‚éƒzƒXƒg–¼AURL‚È‚Ç‚ðŽw’肵‚Đڑ±‚Å‚«‚Ü‚·B

+

ŽŸ‚̏‘Ž®‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B[ ]‚ň͂܂ꂽ•”•ª‚͏ȗª‰Â”\‚Å‚·B

+

[ftp://][[userID][:password]@]hostname[:][port#][filename]

+

ŽŸ‚̃IƒvƒVƒ‡ƒ“‚ªŽw’è‚Å‚«‚Ü‚·B

+

-e ‚Ü‚½‚Í --euc      +ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh‚ÍEUC
-j ‚Ü‚½‚Í --jis      ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh‚ÍJIS
-k ‚Ü‚½‚Í +--kana     ”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·‚µ‚È‚¢
-u ‚Ü‚½‚Í --eucname  +ƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ÍEUC
-i ‚Ü‚½‚Í --jisname  ƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ÍJIS
-a ‚Ü‚½‚Í +--ascii    ƒAƒXƒL[ƒ‚[ƒh‚Å“]‘—
-b ‚Ü‚½‚Í --binary   ƒoƒCƒiƒŠƒ‚[ƒh‚Å“]‘—
-x ‚Ü‚½‚Í +--auto     ƒtƒ@ƒCƒ‹–¼‚ŃAƒXƒL[^ƒoƒCƒiƒŠƒ‚[ƒh‚ðØ‘Ö‚¦‚Ä“]‘—
-q ‚Ü‚½‚Í +--quit     ƒtƒ@ƒCƒ‹“]‘—I—¹ŒãAFFFTP‚ð•Â‚¶‚é

+

Žg—p—á

+

¡ƒzƒXƒg"host.co.jp"‚̃|[ƒg69‚ɁAƒ†[ƒU–¼"sota"AƒpƒXƒ[ƒh"password"‚эƒOƒCƒ“‚µA"/pub/readme.txt"‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚éB

+
+

ftp://sota:password@host.co.jp:69/pub/readme.txt

+

¡Å‰‚Ì"ftp://"‚âAƒzƒXƒg–¼‚ÌŒã‚ë‚Ì":"‚Í–³‚­‚Ä‚à—Ç‚¢B

+
+

sota:password@host.co.jp/pub/readme.txt

+

¡ƒzƒXƒg"host.co.jp"‚ɁAƒ†[ƒU–¼"sota"‚эƒOƒCƒ“‚µA"/pub/readme.txt"‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚éBiƒpƒXƒ[ƒh‚ª•K—v‚È‚çŒã‚Å•·‚¢‚Ä‚«‚Ü‚·j

+
+

ftp://sota@host.co.jp/pub/readme.txt

+

¡ƒzƒXƒg"host.co.jp"‚ɁAanonymous‚эƒOƒCƒ“‚µA"/pub/readme.txt"‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚éB

+
+

ftp://host.co.jp/pub/readme.txt

+

¡ƒzƒXƒg"host.co.jp"‚ɁAanonymous‚эƒOƒCƒ“‚µA"/pub"‚ɃfƒBƒŒƒNƒgƒŠ‚ðˆÚ“®‚·‚éB

+
+

ftp://host.co.jp/pub/

+

¡ƒzƒXƒg"host.co.jp"‚ɁAanonymous‚эƒOƒCƒ“‚·‚éB

+
+

host.co.jp

+

 

+

œ‚»‚Ì‘¼‚̃IƒvƒVƒ‡ƒ“

+

-h ‚Ü‚½‚Í --help    ‚±‚̉æ–Ê‚ð•\Ž¦‚·‚é

+

--saveoff           +¡ŒãAÝ’è‚ð•ÏX‚µ‚Ä‚à•Û‘¶‚µ‚È‚¢‚悤‚É‚·‚é
                     +i–ˆ‰ñ --saveoff +‚ðŽw’è‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñj
--saveon           + --saveoff ‚ð‰ðœ‚·‚é

+

-n ‚Ü‚½‚Í --ini     +-n‚Ì‚ ‚Æ‚ÉŽw’肵‚½INIƒtƒ@ƒCƒ‹‚̐ݒè‚Å‹N“®‚·‚é
                      +(Žw’肵‚È‚¢ê‡‚́AFFFTP.exe‚Æ“¯‚¶ƒtƒHƒ‹ƒ_‚ÌFFFTP.ini‚ðŽg—p)
                      +INIƒtƒ@ƒCƒ‹‚Í•K‚¸ƒtƒ‹ƒpƒX‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B
                      +-n‚ÆINIƒtƒ@ƒCƒ‹–¼‚ÌŠÔ‚É‚Í‹ó”’‚ª•K—v‚Å‚·B

                      +(Žg—p—áF-n "c:\tool\ffftp-set2.ini")

+

 

diff --git a/htmlhelp/HTML/H0000025.HTM b/htmlhelp/HTML/H0000025.HTM new file mode 100644 index 0000000..5192dda --- /dev/null +++ b/htmlhelp/HTML/H0000025.HTM @@ -0,0 +1,19 @@ + +ƒCƒ“ƒ|[ƒg + + + +

WS_FTP‚̐ݒèƒtƒ@ƒCƒ‹( WS_FTP.INIj‚©‚çAƒzƒXƒg‚̐ݒè‚ðƒCƒ“ƒ|[ƒg‚Å‚«‚Ü‚·B

+

Ú‘±ƒƒjƒ…[‚̃Cƒ“ƒ|[ƒg|WS_FTP‚ð‘I‚Ñ‚Ü‚·Bƒtƒ@ƒCƒ‹‚Ì‘I‘ð‰æ–ʂŁAWS_FTP.INI‚ð‘I‚Ñ‚Ü‚·B

+

anonymous-FTPˆÈŠO‚̃pƒXƒ[ƒh‚̓Cƒ“ƒ|[ƒg‚µ‚Ü‚¹‚ñBƒCƒ“ƒ|[ƒg‚µ‚½ŒãƒpƒXƒ[ƒh‚ðÝ’肵‚Ä‚­‚¾‚³‚¢Banonymous-FTP‚̏ꍇ‚̓[ƒ‹ƒAƒhƒŒƒX‚ðƒpƒXƒ[ƒh‚Æ‚µ‚ÄŽg—p‚µ‚Ü‚·B

+


WS_FTP.INIƒtƒ@ƒCƒ‹‚́AˆÈ‰º‚̂悤‚È“à—e‚Å‚·B

+

[Host +Name]
HOST=xxx.yyy.com
UID=sota
LOCDIR=c:\download
DIR=/pub
PASVMODE=1                         +i’l‚Í 0 ‚Ü‚½‚Í +1j
FIREWALL=1                         +i’l‚Í 0 ‚Ü‚½‚Í 1j

+

[Host Name +2]
HOST=xxx.yyy.zzz.com
@@F
@@F

+

™ WS_FTP‚Í Ipswitch, Inc. ‚ÌFTPƒNƒ‰ƒCƒAƒ“ƒgƒ\ƒtƒg‚Å‚·B

diff --git a/htmlhelp/HTML/H0000027.HTM b/htmlhelp/HTML/H0000027.HTM new file mode 100644 index 0000000..65fb97d --- /dev/null +++ b/htmlhelp/HTML/H0000027.HTM @@ -0,0 +1,27 @@ + +ƒzƒXƒgˆê—— + + + +

ƒzƒXƒg‚̐ݒèA•À‚בւ¦‚È‚Ç‚ðs‚¢‚Ü‚·B

+


iª‚±‚̃EƒCƒ“ƒhƒE‚́A‘å‚«‚³‚ð•Ï‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·j

+

¡Ú‘±

+

‘I‚ñ‚¾ƒzƒXƒg‚֐ڑ±‚µ‚Ü‚·B
ƒOƒ‹[ƒv–¼‚ð‘I‚ñ‚Å‚¢‚é‚Æ‚«‚́AÚ‘±‚Í‚Å‚«‚Ü‚¹‚ñB

+

¡V‹KƒzƒXƒg

+

V‚µ‚¢ƒzƒXƒg‚ð’ljÁ‚µ‚Ü‚·B
ƒzƒXƒg‚֐ڑ±’†‚́AV‹KƒzƒXƒg‚̒ljÁ‚Í‚Å‚«‚Ü‚¹‚ñB

+

¡V‹KƒOƒ‹[ƒv

+

V‚µ‚¢ƒOƒ‹[ƒv‚ð’ljÁ‚µ‚Ü‚·B
ƒzƒXƒg‚֐ڑ±’†‚́AV‹KƒOƒ‹[ƒv‚̒ljÁ‚Í‚Å‚«‚Ü‚¹‚ñB

+

¡Ý’è•ÏX

+

ƒzƒXƒg‚̐ݒè‚ð•ÏX‚µ‚Ü‚·B
ƒOƒ‹[ƒv–¼‚ð‘I‚ñ‚Å‚¢‚é‚Æ‚«‚́AƒOƒ‹[ƒv–¼‚ð•ÏX‚µ‚Ü‚·B

+

¡ƒRƒs[

+

ƒzƒXƒg‚̐ݒè‚ðƒRƒs[‚µ‚Ü‚·B
ƒOƒ‹[ƒv–¼‚ð‘I‚ñ‚Å‚¢‚é‚Æ‚«‚́AƒzƒXƒg‚֐ڑ±’†‚̓Rƒs[‚Í‚Å‚«‚Ü‚¹‚ñB

+

¡íœ

+

ƒzƒXƒg‚̐ݒè‚ðíœ‚µ‚Ü‚·B
ƒOƒ‹[ƒv–¼‚ð‘I‚ñ‚Å‚¢‚é‚Æ‚«‚́A‚»‚̃Oƒ‹[ƒv“à‚É‚ ‚é‘S‚ẴzƒXƒg‚̐ݒè‚ðíœ‚µ‚Ü‚·B
ƒzƒXƒg‚֐ڑ±’†‚́Aíœ‚Í‚Å‚«‚Ü‚¹‚ñB

+

¡ª@«

+

ƒzƒXƒg–¼AƒOƒ‹[ƒv–¼‚ð•À‚בւ¦‚Ü‚·B
ƒOƒ‹[ƒv‚ðˆÚ“®‚·‚é‚Æ‚«‚́AƒOƒ‹[ƒv“à‚Ì‘S‚ẴzƒXƒg‚à‚ ‚킹‚Ĉړ®‚µ‚Ü‚·B
ƒzƒXƒg‚̓Oƒ‹[ƒv‚ð‚Ü‚½‚¢‚ňړ®‚Å‚«‚Ü‚·B

+

ƒzƒXƒg‚̐ݒ肪¶‚̐}‚̂悤‚È‚Æ‚«AHost0‚ð‘I‚ñ‚Ł«‚ð‰Ÿ‚·‚ƁA‰E‚̐}‚̔ԍ†‚̈ʒu‚ɏ‡ŽŸˆÚ“®‚µ‚Ü‚·Bª‚Å‹t‡‚Ɉړ®‚µ‚Ü‚·B

+

ƒzƒXƒg‚֐ڑ±’†‚́A•À‚בւ¦‚Í‚Å‚«‚Ü‚¹‚ñB

diff --git a/htmlhelp/HTML/H0000028.HTM b/htmlhelp/HTML/H0000028.HTM new file mode 100644 index 0000000..4cfa5d6 --- /dev/null +++ b/htmlhelp/HTML/H0000028.HTM @@ -0,0 +1,31 @@ + +Šî–{ + + + +

Ú‘±ƒƒjƒ…[‚̃zƒXƒgÝ’è‚ŃzƒXƒgˆê——ƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚µAV‹K“o˜^ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚ĉŸ‚·‚ƐݒèƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚µ‚Ü‚·B
‚±‚±‚ŁAƒzƒXƒg‚̐ݒè‚ðs‚È‚¢‚Ü‚·B

+

+

¡ƒ^ƒCƒgƒ‹

+

ƒzƒXƒgˆê——‰æ–Ê‚É•\Ž¦‚·‚éƒ^ƒCƒgƒ‹‚ð“ü—Í‚µ‚Ü‚·B

+

¡ƒzƒXƒg–¼iƒAƒhƒŒƒXj

+

ƒzƒXƒg–¼iƒAƒhƒŒƒXj‚ð“ü—Í‚µ‚Ü‚·B

+

¡ƒ†[ƒU–¼

+

ƒƒOƒCƒ“ƒ†[ƒU–¼‚ð“ü—Í‚µ‚Ü‚·BAnonymous‚эƒOƒCƒ“‚·‚é‚Æ‚«‚́Aanonymousƒ{ƒbƒNƒX‚ðƒNƒŠƒbƒN‚·‚é‚ƁAƒ†[ƒU–¼‚ƃpƒXƒ[ƒh‚ªƒZƒbƒg‚³‚ê‚Ü‚·BƒpƒXƒ[ƒh‚ªƒZƒbƒg‚³‚ê‚È‚¢‚Æ‚«‚́Aƒ†[ƒUÝ’è‚ц[ƒU‚̃[ƒ‹ƒAƒhƒŒƒX‚ðÝ’肵‚Ä‚­‚¾‚³‚¢B

+

ƒ†[ƒU–¼‚ð“ü—Í‚µ‚È‚¢‚Å‚¨‚­‚ƁAÚ‘±Žž‚Ƀ†[ƒU–¼‚ð‚½‚¸‚Ë‚Ü‚·B

+

¡ƒpƒXƒ[ƒh/ƒpƒXƒtƒŒ[ƒY

+

ƒpƒXƒ[ƒhi‚Ü‚½‚̓pƒXƒtƒŒ[ƒYj‚ð“ü—Í‚µ‚Ü‚·BƒpƒXƒ[ƒh‚Í * +‚Å•\Ž¦‚³‚ê‚Ü‚·B
ƒpƒXƒ[ƒh‚ð“ü—Í‚µ‚È‚¢‚Å‚¨‚­‚ƁAÚ‘±Žž‚ɃpƒXƒ[ƒh‚ð‚½‚¸‚Ë‚Ü‚·B

+

‹ó‚̃pƒXƒ[ƒh‚ðƒzƒXƒg‚É‘—‚肽‚¢Žž‚́AƒXƒy[ƒX‚ð‚P•¶Žš‚¾‚¯“ü—Í‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B

+

¡ƒ[ƒJƒ‹‚̏‰ŠúƒtƒHƒ‹ƒ_

+

ƒƒOƒCƒ“Žž‚̃[ƒJƒ‹‘¤‚̃tƒHƒ‹ƒ_‚ð“ü—Í‚µ‚Ü‚·B

+

¡ƒzƒXƒg‚̏‰ŠúƒtƒHƒ‹ƒ_

+

ƒƒOƒCƒ“Žž‚̃zƒXƒg‘¤‚̃tƒHƒ‹ƒ_‚ð“ü—Í‚µ‚Ü‚·B

+

¡Œ»Ý‚̃tƒHƒ‹ƒ_

+

ƒzƒXƒg‚ɐڑ±‚µ‚Ä‚¢‚é‚Æ‚«AŒ»Ý‚̃tƒHƒ‹ƒ_‚ðƒƒOƒCƒ“Žž‚̃tƒHƒ‹ƒ_‚ɐݒ肵‚Ü‚·B

+

¡ÅŒã‚ɃAƒNƒZƒX‚µ‚½ƒtƒHƒ‹ƒ_‚ð‰ŠúƒtƒHƒ‹ƒ_‚Æ‚·‚é

+

ˆÈ‘O‚ɃzƒXƒg‚ɐڑ±‚µ‚½Žž‚ɍŌã‚ɃAƒNƒZƒX‚µ‚½ƒtƒHƒ‹ƒ_‚ð‰ŠúƒtƒHƒ‹ƒ_‚É‚µ‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000029.HTM b/htmlhelp/HTML/H0000029.HTM new file mode 100644 index 0000000..11c7947 --- /dev/null +++ b/htmlhelp/HTML/H0000029.HTM @@ -0,0 +1,31 @@ + +Šg’£ + + + +

+

¡FireWall‚ðŽg‚¤

+

ƒzƒXƒg‚ւ̐ڑ±‚ÉFireWall‚ðŽg‚¢‚Ü‚·B

+

¡PASVƒ‚[ƒh‚ðŽg‚¤

+

ƒtƒ@ƒCƒ‹“]‘—‚ðPASVƒ‚[ƒh‚ōs‚¢‚Ü‚·B
’ʏíPASVƒ‚[ƒh‚ÍŽg—p‚µ‚Ü‚¹‚ñ‚ªA“]‘—‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢‚Æ‚«‚ÉŽg—p‚µ‚Ä‚Ý‚Ä‚­‚¾‚³‚¢B

+

¡ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚ðŽg‚¤

+

ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚ðs‚¤‚©‚Ç‚¤‚©‚̏‰Šúó‘Ô‚ðÝ’肵‚Ü‚·B
ƒzƒXƒg‚ɐڑ±Œã‚́AƒRƒ}ƒ“ƒhƒƒjƒ…[‚©ƒc[ƒ‹ƒo[‚ňꎞ“I‚ɐݒè‚ð•ÏX‚Å‚«‚Ü‚·B

+

¡ƒ|[ƒg”ԍ†

+

ƒzƒXƒg‚̃|[ƒg”ԍ†‚ðÝ’肵‚Ü‚·B•W€‚Í21‚Å‚·B

+

¡ƒAƒJƒEƒ“ƒg

+

ƒƒOƒCƒ“‚·‚é‚̂ɃAƒJƒEƒ“ƒg‚ª•K—v‚ÈŽž‚ɁAƒAƒJƒEƒ“ƒg‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B
‚¨‚¨‚©‚½‚̃zƒXƒg‚Å‚Í•K—v‚ ‚è‚Ü‚¹‚ñB

+

¡ƒzƒXƒg‚̃^ƒCƒ€ƒ][ƒ“

+

ƒzƒXƒg‚ªAƒtƒ@ƒCƒ‹‚Ì“ú•t^ŽžŠÔ‚ðA‚ǂ̃^ƒCƒ€ƒ][ƒ“‚ŏo—Í‚·‚é‚©‚ðÝ’肵‚Ü‚·B‚±‚ê‚É‚æ‚èAƒtƒ@ƒCƒ‹‚Ì“ú•t‚ð“ú–{ŽžŠÔ‚Å•\Ž¦‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

ƒzƒXƒg‚ªƒtƒ@ƒCƒ‹‚Ì“ú•t^ŽžŠÔ‚ð“ú–{ŽžŠÔ‚ŏo—Í‚·‚鎞‚Í GMT+9:00(“ú–{) ‚ɐݒ肵‚Ü‚·B‚Ü‚½AƒOƒŠƒjƒbƒW•W€ŽžŠÔ‚ÌŽž‚Í GMT +‚ɐݒ肵‚Ü‚·B

+

“ú•t‚ð“ú–{ŽžŠÔ‚É•ÏŠ·‚µ‚½‚­‚È‚¢Žž‚́AGMT+9:00(“ú–{) ‚ɐݒ肵‚Ä‚­‚¾‚³‚¢B

+

¡ƒZƒLƒ…ƒŠƒeƒB

+

ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̐ݒè‚ð‚µ‚Ü‚·B’ʏí‚ÍŽ©“®”FŽ¯‚ɐݒ肵‚Ä‚­‚¾‚³‚¢B
ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ÌŒ`Ž®‚ðFFFTP‚ªŠÔˆá‚Á‚Ä”FŽ¯‚µ‚Ä‚¢‚é‚ÆŽv‚í‚ê‚鎞‚́AŽg—p‚µ‚Ä‚¢‚éŒ`Ž®‚ðÝ’肵‚Ä‚­‚¾‚³‚¢BMD4(S/KEY)AMD5, +SHA-1‚Ì‚¢‚¸‚ê‚©‚ð‘I‚Ô‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̓zƒXƒg‚ª‘Ήž‚µ‚Ä‚¢‚È‚¢‚ÆŽg—p‚Å‚«‚Ü‚¹‚ñB

+

¡Ú‘±Žž‚ɃzƒXƒg‚É‘—‚éƒRƒ}ƒ“ƒh

+

ƒzƒXƒg‚ւ̐ڑ±‚ªŠ®—¹‚µ‚½’¼Œã‚É‘—‚éƒRƒ}ƒ“ƒh‚ðŽw’肵‚Ü‚·B
’ʏí‚͉½‚àŽw’è‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB

+

 

diff --git a/htmlhelp/HTML/H0000030.HTM b/htmlhelp/HTML/H0000030.HTM new file mode 100644 index 0000000..cebf177 --- /dev/null +++ b/htmlhelp/HTML/H0000030.HTM @@ -0,0 +1,22 @@ + +•¶ŽšƒR[ƒh + + + +

+

¡ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh

+

ƒzƒXƒg‘¤‚ÌŠ¿ŽšƒR[ƒh‚ðÝ’肵‚Ü‚·B
ƒ[ƒJƒ‹‘¤‚ÌŠ¿ŽšƒR[ƒh‚Í SHIFT-JIS +ƒR[ƒh‚Å‚·B
ƒAƒXƒL[ƒ‚[ƒh‚Ńtƒ@ƒCƒ‹‚ð“]‘—‚·‚é‚Æ‚«AŠ¿ŽšƒR[ƒh‚ð•ÏŠ·‚µ‚Ä“]‘—‚µ‚Ü‚·B
ƒoƒCƒiƒŠƒ‚[ƒh‚Ńtƒ@ƒCƒ‹‚ð“]‘—‚·‚é‚Æ‚«‚́AŠ¿ŽšƒR[ƒh‚Ì•ÏŠ·‚͍s‚¢‚Ü‚¹‚ñB

+

JISƒR[ƒh‚̏ڍׂÍJISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä‚ðŒ©‚Ä‚­‚¾‚³‚¢B

+

¡”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·

+

ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh‚ª EUCAJIS ‚̏ꍇ‚ɁA”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·‚µ‚Ü‚·B
EUCAJISˆÈŠO‚ÌŽž‚́A”¼ŠpƒJƒi‚Ì‚Ü‚Ü‚É‚È‚è‚Ü‚·B

+

JISƒR[ƒh‚̏ڍׂÍJISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä‚ðŒ©‚Ä‚­‚¾‚³‚¢B

+

¡ƒtƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh

+

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ðÝ’肵‚Ü‚·B
Ú‚µ‚­‚́AŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚Ä‚ðŒ©‚Ä‚­‚¾‚³‚¢B

+

¡”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·

+

ƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ª EUCAJIS +‚̏ꍇ‚ɁA”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·‚µ‚Ü‚·B
EUCAJISˆÈŠO‚ÌŽž‚́A”¼ŠpƒJƒi‚Ì‚Ü‚Ü‚É‚È‚è‚Ü‚·B

+

JISƒR[ƒh‚̏ڍׂÍJISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä‚ðŒ©‚Ä‚­‚¾‚³‚¢B

+


 

+

 

diff --git a/htmlhelp/HTML/H0000031.HTM b/htmlhelp/HTML/H0000031.HTM new file mode 100644 index 0000000..50787f6 --- /dev/null +++ b/htmlhelp/HTML/H0000031.HTM @@ -0,0 +1,20 @@ + +ƒ_ƒCƒAƒ‹ƒAƒbƒv + + + +

+

¡ƒ_ƒCƒAƒ‹ƒAƒbƒv‚Őڑ±‚·‚é

+

ƒzƒXƒg‚֐ڑ±‚·‚é‘O‚Ƀ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±‚ð‚µ‚Ü‚·B
Ú‘±‚·‚é“d˜b’ ƒGƒ“ƒgƒŠ‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B

+

¡Ú‘±‚·‚é“d˜b’ ƒGƒ“ƒgƒŠ

+

ƒ_ƒCƒAƒ‹ƒAƒbƒv‚̐ڑ±æ‚ðŽw’肵‚Ü‚·B

+

¡•Ê‚̃Gƒ“ƒgƒŠ‚֐ڑ±’†‚Å‚àã‹L‚֐ڑ±‚µ‚È‚¨‚·

+

‘¼‚̃_ƒCƒAƒ‹ƒAƒbƒvæ‚֐ڑ±‚µ‚Ä‚¢‚éê‡‚ɁA‚»‚̐ڑ±‚ðØ‚Á‚āAÚ‘±‚·‚é“d˜b’ ƒGƒ“ƒgƒŠ‚ÅŽw’肵‚½æ‚֐ڑ±‚µ‚È‚¨‚µ‚Ü‚·B

+

¡Ú‘±‚µ‚È‚¨‚·Û‚ÉŠm”F‚·‚é

+

ƒ_ƒCƒAƒ‹ƒAƒbƒv‚ðÚ‘±‚µ‚È‚¨‚·Žž‚ɁAŠm”F‚ðs‚¢‚Ü‚·B

+

+

Œ»Ý‚̐ڑ±‚ðØ‚肽‚­‚È‚¢ê‡‚́AŠm”FƒEƒCƒ“ƒhƒE‚ÅŒ»Ý‚̐ڑ±‚ð•ÛŽƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000032.HTM b/htmlhelp/HTML/H0000032.HTM new file mode 100644 index 0000000..3541041 --- /dev/null +++ b/htmlhelp/HTML/H0000032.HTM @@ -0,0 +1,36 @@ + +‚“x + + + +

ƒzƒXƒg‚ւ̐ڑ±Aƒtƒ@ƒCƒ‹ˆê——AƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚È‚Ç‚É–â‘肪‹N‚«‚½Žž‚ɂ̂ݐݒè‚ð•ÏX‚µ‚Ä‚­‚¾‚³‚¢B

+

+

¡LISTƒRƒ}ƒ“ƒh‚Ńtƒ@ƒCƒ‹ˆê——‚ðŽæ“¾

+

ƒzƒXƒg‚̃tƒ@ƒCƒ‹ˆê——‚ðŽæ“¾‚·‚é‚Æ‚«A"LIST"ƒRƒ}ƒ“ƒh‚ðŽg—p‚µ‚Ü‚·B
’ʏí‚Í "NLST +-alL" ƒRƒ}ƒ“ƒh‚ðŽg—p‚µ‚Ä‚¢‚Ü‚·B

+

¡NLST -R ‚ðŽg‚Á‚č‚‘¬‚ɍċAŒŸõ

+

ƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚Þƒtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚âƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðs‚¤Žž‚ɁA"NLST -alLR" +ƒRƒ}ƒ“ƒh‚ðŽg‚Á‚āAƒtƒ@ƒCƒ‹ˆê——‚ð‚‘¬‚Ɏ擾‚µ‚Ü‚·B
ƒTƒuƒtƒHƒ‹ƒ_‚ðŠÜ‚Þƒtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒh‚âƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢Žž‚́A‚±‚̍€–ڂ̃`ƒFƒbƒNƒ}[ƒN‚ðŠO‚µ‚Ä‚Ý‚Ä‚­‚¾‚³‚¢B

+

¡ƒtƒ‹ƒpƒX‚Ńtƒ@ƒCƒ‹‚ðƒAƒNƒZƒX‚µ‚È‚¢

+

ƒtƒ‹ƒpƒX‚Í /home/sota/public_html/index.html +‚̂悤‚ɁAƒtƒHƒ‹ƒ_–¼{ƒtƒ@ƒCƒ‹–¼‚ÌŒ`Ž®‚Å‚·B‚±‚ÌŒ`Ž®‚ł̓tƒ@ƒCƒ‹–¼‚ƁA‚»‚̃tƒ@ƒCƒ‹‚Ì‚ ‚éêŠ‚ðˆê“x‚ÉŽw’è‚Å‚«‚Ü‚·‚ªAƒzƒXƒg‚É‚æ‚Á‚Ä‚Í‚±‚ÌŒ`Ž®‚ŃAƒNƒZƒX‚Å‚«‚È‚¢ê‡‚ª‚ ‚è‚Ü‚·B
‚»‚̂悤‚ÈŽž‚́A‚±‚̐ݒè‚ð•ÏX‚µ‚Ä‚­‚¾‚³‚¢B

+

¡‘®«•ÏXƒRƒ}ƒ“ƒh

+

ƒtƒ@ƒCƒ‹‚Ì‘®«‚ð•ÏX‚·‚é‚Æ‚«‚ÉŽg—p‚·‚éƒRƒ}ƒ“ƒh‚ðÝ’肵‚Ü‚·B•W€‚Í"SITE CHMOD"ƒRƒ}ƒ“ƒh‚ðŽg—p‚µ‚Ü‚·B

+

¡ƒzƒXƒg‚ÌŽí—Þ

+

ƒzƒXƒg‚ÌŽí—Þ‚ðÝ’肵‚Ü‚·B

+
+

Ž©“®”FŽ¯
’ʏí‚Í‚±‚̐ݒè‚ÅŽg—p‚µ‚Ü‚·B

+

ACOS
‘Ò‹@Œ‹‡ƒtƒ@ƒCƒ‹‚ðŽw’è‚·‚é•K—v‚Ì‚ ‚éACOS‚ɐڑ±‚·‚鎞‚ÉŽw’肵‚Ü‚·B‘Ò‹@Œ‹‡ƒtƒ@ƒCƒ‹‚́ANLSTƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“‚Ì•”•ª‚ÅŽw’肵‚Ü‚·B
ACOSƒ‚[ƒh‚ł́A‚¢‚­‚‚©‚Ì‹@”\‚ªŽg‚¦‚Ü‚¹‚ñB

+

VAX VMS
VAX‚ɐڑ±‚·‚鎞‚ÉŽw’肵‚Ü‚·B

+

IRMX
IRMX‚ɐڑ±‚·‚鎞‚ÉŽw’肵‚Ü‚·B

+

ACOS-4
ACOSƒ‚[ƒh‚Æ‚Ù‚Ú“¯‚¶‚Å‚·‚ªAƒtƒ@ƒCƒ‹–¼‚ðij‚ÅŠ‡‚ç‚È‚¢‚悤‚É‚µ‚Ü‚·B
NLSTƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“‚̍€–ڂ́A’ʏí‚Í‹ó”’‚É‚µ‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B

+

Stratus
Stratus‚ɐڑ±‚·‚鎞‚ÉŽw’肵‚Ü‚·B
Stratus‚ł́Aƒtƒ@ƒCƒ‹‚ÌŽí—ށistm,seq‚Ȃǁj‚ðƒI[ƒi–¼‚Ì—“‚É•\Ž¦‚µ‚Ü‚·B

+

Agilent Logic +Analyzer
ƒAƒWƒŒƒ“ƒgŽÐ‚̃ƒWƒbƒNƒAƒiƒ‰ƒCƒU‚ɐڑ±‚·‚鎞‚ÉŽw’肵‚Ü‚·B

+

ƒVƒoƒ\ƒN +WL
ƒVƒoƒ\ƒN‚ÌLSIƒeƒXƒgƒVƒXƒeƒ€WLƒVƒŠ[ƒY‚ɐڑ±‚·‚é‚Æ‚«‚ÉŽw’肵‚Ü‚·B

+

¡NLSTƒtƒ@ƒCƒ‹–¼^ƒIƒvƒVƒ‡ƒ“

+

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ðŽæ“¾‚·‚鎞‚ÌNLSTƒRƒ}ƒ“ƒh‚É•t‰Á‚·‚éƒIƒvƒVƒ‡ƒ“Aƒtƒ@ƒCƒ‹–¼‚ðÝ’肵‚Ü‚·B

+

ƒzƒXƒg‚ªACOS‚ÌŽž‚́A‘Ò‹@Œ‹‡ƒtƒ@ƒCƒ‹–¼‚ð‚±‚±‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000034.HTM b/htmlhelp/HTML/H0000034.HTM new file mode 100644 index 0000000..baa3145 --- /dev/null +++ b/htmlhelp/HTML/H0000034.HTM @@ -0,0 +1,28 @@ + +Ú‘± + + + +

+

¡Ú‘±

+

“o˜^‚µ‚Ä‚ ‚éƒzƒXƒg‚ɐڑ±‚µ‚Ü‚·B
Ú‘±ƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒzƒXƒg‚ւ̐ڑ±‚Ɛؒf‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡ƒNƒCƒbƒNÚ‘±

+

ƒzƒXƒg–¼‚ð“ü—Í‚µ‚ăzƒXƒg‚ɐڑ±‚µ‚Ü‚·B
ƒNƒCƒbƒNÚ‘±ƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒzƒXƒg‚ւ̐ڑ±‚Ɛؒf‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡Ø’f

+

ƒzƒXƒg‚©‚çØ’f‚µ‚Ü‚·B
Ø’fƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

¡ƒzƒXƒg‚̐ݒè

+

ƒzƒXƒg‚ð“o˜^‚µ‚Ü‚·B

+

¡Ý’è ¨ WS_FTP‚©‚çÝ’è‚ðƒCƒ“ƒ|[ƒg

+

WS_FTP‚̃zƒXƒgÝ’è‚ðFFFTP‚ÉŽæ‚荞‚Ý‚Ü‚·B

+

¡Ý’è ¨ Ý’è‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶

+

‚e‚e‚e‚s‚o‚̐ݒè‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚µ‚Ü‚·B

+

¡Ý’è ¨ ‘SÝ’è‚̏Á‹Ž

+

FFFTP‚̐ݒè‚ðÁ‹Ž‚·‚鎖‚ª‚Å‚«‚Ü‚·B
Ý’è‚̏Á‹Ž‚́AƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚鎞‚É‚Ì‚ÝŽg—p‚µ‚Ä‚­‚¾‚³‚¢B

+

¡I—¹

+

FFFTP‚ðI—¹‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000035.HTM b/htmlhelp/HTML/H0000035.HTM new file mode 100644 index 0000000..e84f874 --- /dev/null +++ b/htmlhelp/HTML/H0000035.HTM @@ -0,0 +1,61 @@ + +ƒRƒ}ƒ“ƒh + + + +

+

¡ƒ_ƒEƒ“ƒ[ƒh

+

ƒzƒXƒg‘¤‚©‚烍[ƒJƒ‹‘¤‚Öƒtƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
ƒ_ƒEƒ“ƒ[ƒhƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒ_ƒEƒ“ƒ[ƒh‚̍€–ځAƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”F‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡ƒAƒbƒvƒ[ƒh

+

ƒ[ƒJƒ‹‘¤‚©‚çƒzƒXƒg‘¤‚Öƒtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚µ‚Ü‚·B
ƒAƒbƒvƒ[ƒhƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒAƒbƒvƒ[ƒh‚̍€–ځAƒAƒbƒvƒ[ƒh‚ÌŠm”F‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡–¼‘O‚ð•Ï‚¦‚ă_ƒEƒ“ƒ[ƒh

+

ƒzƒXƒg‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹‚ð•Ê‚Ì–¼‘O‚Ń_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
¦ƒzƒXƒg‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì–¼‘O‚Í•Ï‚í‚è‚Ü‚¹‚ñB

+

¡–¼‘O‚ð•Ï‚¦‚ăAƒbƒvƒ[ƒh

+

ƒ[ƒJƒ‹‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹‚ð•Ê‚Ì–¼‘O‚ŃAƒbƒvƒ[ƒh‚µ‚Ü‚·B
¦ƒ[ƒJƒ‹‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì–¼‘O‚Í•Ï‚í‚è‚Ü‚¹‚ñB

+

¡–¼‘O‚ðŽw’肵‚ă_ƒEƒ“ƒ[ƒh

+

ƒzƒXƒg‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì–¼‘O‚ð“ü—Í‚µ‚ă_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
‚È‚ñ‚ç‚©‚Ì——R‚ŁAƒtƒ@ƒCƒ‹ˆê——‚Ƀtƒ@ƒCƒ‹–¼‚ª•\Ž¦‚³‚ê‚Ä‚¢‚È‚¢Žž‚ÉŽg—p‚µ‚Ü‚·B

+

¡ƒtƒ@ƒCƒ‹‚Æ‚µ‚ă_ƒEƒ“ƒ[ƒh

+

ƒtƒ@ƒCƒ‹‚Å‚ ‚é‚Í‚¸‚Ì‚à‚Ì‚ªƒtƒHƒ‹ƒ_‚Æ‚µ‚Ä•\Ž¦‚³‚ê‚Ä‚¢‚鎞Aƒtƒ@ƒCƒ‹‚Æ‚Ý‚È‚µ‚ă_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
¦FFFTP‚̃tƒ@ƒCƒ‹–¼‚̉ðÍ‚ª‚¤‚Ü‚­‚¢‚©‚È‚¢Žž‚ɁAã‹L‚ÌŒ»Û‚ªo‚éê‡‚ª‚ ‚è‚Ü‚·B

+

¡ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh

+

ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ðs‚È‚¢‚Ü‚·B
ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒhƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

Ú×‚̓~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚̍€–Ú‚ð‚²——‚­‚¾‚³‚¢B

+

¡ƒtƒ@ƒCƒ‹—e—ÊŒvŽZ

+

ƒtƒ@ƒCƒ‹‚Ì—e—ʁiƒTƒCƒYj‚ðŒvŽZ‚µ‚Ü‚·B

+

¡ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh

+

ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚ðs‚È‚¢‚Ü‚·B

+

Ú×‚̓~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh‚̍€–Ú‚ð‚²——‚­‚¾‚³‚¢B

+

¡íœ

+

ƒtƒ@ƒCƒ‹AƒtƒHƒ‹ƒ_‚ðíœ‚µ‚Ü‚·B
íœƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒtƒ@ƒCƒ‹íœ‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡–¼‘O•ÏX

+

ƒtƒ@ƒCƒ‹AƒtƒHƒ‹ƒ_‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚·B
–¼‘O•ÏXƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒtƒ@ƒCƒ‹–¼•ÏX‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡‘®«•ÏX

+

ƒtƒ@ƒCƒ‹‚Ì‘®«iƒp[ƒ~ƒbƒVƒ‡ƒ“j‚ð•ÏX‚µ‚Ü‚·B

+

‘®«•ÏX‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡ƒtƒHƒ‹ƒ_ì¬

+

ƒtƒHƒ‹ƒ_‚ðì¬‚µ‚Ü‚·B
ƒtƒHƒ‹ƒ_ì¬ƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒtƒHƒ‹ƒ_ì¬‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡”CˆÓ‚̃Rƒ}ƒ“ƒh

+

”CˆÓ‚̃Rƒ}ƒ“ƒh‚ðƒzƒXƒg‚É‘—‚è‚Ü‚·B

+

”CˆÓ‚̃Rƒ}ƒ“ƒh‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®

+

ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚ðs‚È‚¤‚©‚Ç‚¤‚©‚ð‘I‚Ñ‚Ü‚·B
ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®ƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000036.HTM b/htmlhelp/HTML/H0000036.HTM new file mode 100644 index 0000000..6080369 --- /dev/null +++ b/htmlhelp/HTML/H0000036.HTM @@ -0,0 +1,35 @@ + +•\Ž¦ + + + +

+

¡ƒtƒBƒ‹ƒ^

+

ƒtƒ@ƒCƒ‹ˆê——ƒEƒCƒ“ƒhƒE‚É•\Ž¦‚·‚éƒtƒ@ƒCƒ‹‚ði‚肱‚Þ‚±‚Æ‚ª‚Å‚«‚Ü‚·B
ƒtƒBƒ‹ƒ^‚̐ݒè‚́Aƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤—¼•û‚É“¯Žž‚ɍs‚È‚¢‚Ü‚·B

+

ƒtƒBƒ‹ƒ^‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡ŒŸõ

+

ƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹–¼‚ðŒŸõ‚µ‚Ü‚·B
ƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Ç‚¿‚ç‚©•Ð•û‚ª‘ΏۂƂȂè‚Ü‚·B

+

ƒtƒ@ƒCƒ‹‚ÌŒŸõ‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡ŽŸ‚ðŒŸõ

+

ŒŸõ‚ÅŒ©‚‚©‚Á‚½ƒtƒ@ƒCƒ‹–¼‚ÌŽŸ‚ÌŒó•â‚ðŒŸõ‚µ‚Ü‚·B

+

¡‘I‘ð

+

ƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ðAˆêŠ‡‚µ‚Ä‘I‘ð‚µ‚Ü‚·B
ƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Ç‚¿‚ç‚©•Ð•û‚ª‘ΏۂƂȂè‚Ü‚·B

+

ƒtƒ@ƒCƒ‹‚Ì‘I‘ð‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

¡‘S‘I‘ð^‰ðœ

+

ƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ð‘S‚Ä‘I‘ð‚µ‚Ü‚·B
‚Q‰ñ–Ú‚ÌŽÀs‚ŁA‘S‚Ä‚Ì‘I‘ð‚ð‰ðœ‚µ‚Ü‚·B
ƒ[ƒJƒ‹‘¤AƒzƒXƒg‘¤‚Ç‚¿‚ç‚©•Ð•û‚ª‘ΏۂƂȂè‚Ü‚·B

+

¡Œ`Ž®

+

ƒtƒ@ƒCƒ‹ˆê——‚ðAˆê——•\Ž¦‚ōs‚È‚¤‚©Ú×•\Ž¦‚ōs‚È‚¤‚©‚ð‘I‚Ô‚±‚Æ‚ª‚Å‚«‚Ü‚·B
ˆê——ƒ{ƒ^ƒ“‚ƁAÚ×ƒ{ƒ^ƒ“‚Å‘I‚ÔŽ–‚à‚Å‚«‚Ü‚·B

+

¡ƒ\[ƒg

+

ƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ð•À‚я‡‚ð‘I‘ð‚µ‚Ü‚·B

+

¡D‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹‚ð•\Ž¦

+

ƒtƒ@ƒCƒ‹–¼‚̐擪‚ªDiƒhƒbƒgj‚ÅŽn‚Ü‚éƒtƒ@ƒCƒ‹‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚ð‘I‚Ñ‚Ü‚·B

+

¡ƒtƒ@ƒCƒ‹ˆê——‚ðƒrƒ…[ƒ‚Å•\Ž¦

+

ƒtƒ@ƒCƒ‹ˆê——‚Ì“à—e‚ðƒrƒ…[ƒ‚Å•\Ž¦‚µ‚Ü‚·B
•\Ž¦‚³‚ê‚é“à—e‚́AƒzƒXƒg‚©‚ç‘—‚ç‚ê‚Ä‚«‚½ƒtƒ@ƒCƒ‹ˆê——î•ñ‚»‚Ì‚Ü‚Ü‚Å‚·B

+

¡ˆ—“à—e‚ðƒrƒ…[ƒ‚Å•\Ž¦

+

ˆ—“à—e‚ðƒrƒ…[ƒ‚Å•\Ž¦‚µ‚Ü‚·B
ˆ—“à—e‚́A‚R•ªŠ„‚³‚ꂽFFFTP‚̃EƒCƒ“ƒhƒE‚Ì‚¤‚¿‰º‘¤‚̃EƒCƒ“ƒhƒE‚É•\Ž¦‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚·B

+

¡ÅV‚̏î•ñ‚ɍXV

+

ƒtƒ@ƒCƒ‹ˆê——‚Ì“à—e‚ðXV‚µ‚Ü‚·B
•\Ž¦‚ðXVƒ{ƒ^ƒ“‚à“¯‚¶“­‚«‚Å‚·B

+

 

diff --git a/htmlhelp/HTML/H0000037.HTM b/htmlhelp/HTML/H0000037.HTM new file mode 100644 index 0000000..4c1654d --- /dev/null +++ b/htmlhelp/HTML/H0000037.HTM @@ -0,0 +1,24 @@ + +ƒc[ƒ‹ + + + +

+

¡ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ÌŒvŽZ

+

ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚́Aˆê”Ê“I‚ȃvƒƒoƒCƒ_“™‚Å‚ÍŽg—p‚µ‚Ä‚¢‚Ü‚¹‚ñB

+

ƒ`ƒƒƒŒƒ“ƒW•¶Žš—ñAƒpƒXƒtƒŒ[ƒY‚ð‚à‚ƂɃƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ðŒvŽZ‚µ‚Ü‚·B

+

ƒ`ƒƒƒŒƒ“ƒW‚ƃpƒXƒtƒŒ[ƒY‚ðŒ³‚ÉAƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ð‹‚ß‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·Bƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̃V[ƒPƒ“ƒX‚ðÝ’è‚·‚éê‡‚È‚Ç‚É‚²—˜—p‚­‚¾‚³‚¢B

+

¦FFFTP‚ŃzƒXƒg‚ɐڑ±‚·‚éÛ‚ÍFFFTP‚ªŽ©“®“I‚Ƀƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ðŒvŽZ‚·‚é‚̂ŁA‚±‚̃c[ƒ‹‚ÅŒvŽZ‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB

+

+

¡ƒ`ƒƒƒŒƒ“ƒW

+

ƒV[ƒPƒ“ƒX”ԍ†‚ƃV[ƒh‚ðƒXƒy[ƒX‚Å‹æØ‚Á‚Ä“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B

+

—áj 123 xy3456

+

¡ƒpƒXƒtƒŒ[ƒY

+

ƒpƒXƒtƒŒ[ƒY‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B

+

¡ƒŒƒXƒ|ƒ“ƒX

+

ƒ`ƒƒƒŒƒ“ƒW‚ƃpƒXƒtƒŒ[ƒY‚ð‚à‚Æ‚ÉŒvŽZ‚µ‚½ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚Å‚·B

+

¡ƒAƒ‹ƒSƒŠƒYƒ€

+

Žg—p‚·‚éƒAƒ‹ƒSƒŠƒYƒ€‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢B

+

 

+

 

+

 

diff --git a/htmlhelp/HTML/H0000038.HTM b/htmlhelp/HTML/H0000038.HTM new file mode 100644 index 0000000..118725a --- /dev/null +++ b/htmlhelp/HTML/H0000038.HTM @@ -0,0 +1,10 @@ + +ƒIƒvƒVƒ‡ƒ“ + + + +

+

¡ŠÂ‹«Ý’è

+

ŠeŽí‚̐ݒè‚ðs‚È‚¢‚Ü‚·B

+

Ú×‚͊‹«Ý’è‚̍€–Ú‚ð‚²——‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000039.HTM b/htmlhelp/HTML/H0000039.HTM new file mode 100644 index 0000000..404ec92 --- /dev/null +++ b/htmlhelp/HTML/H0000039.HTM @@ -0,0 +1,12 @@ + +ƒwƒ‹ƒv + + + +

+

¡–ÚŽŸ

+

‚±‚̃wƒ‹ƒv‚Ì–ÚŽŸ‚ð•\Ž¦‚µ‚Ü‚·B

+

¡–â‘肪‹N‚«‚½Žž‚É‚Í

+

‚æ‚­‹N‚±‚é–â‘è‚Æ‰ðŒˆ•û–@‚ð•\Ž¦‚µ‚Ü‚·B

+

¡FFFTP‚ɂ‚¢‚Ä

+

FFFTP‚̃o[ƒWƒ‡ƒ“î•ñ‚ð•\Ž¦‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000040.HTM b/htmlhelp/HTML/H0000040.HTM new file mode 100644 index 0000000..7e9407e --- /dev/null +++ b/htmlhelp/HTML/H0000040.HTM @@ -0,0 +1,6 @@ + +ŠÂ‹«Ý’è + + + +

 

diff --git a/htmlhelp/HTML/H0000041.HTM b/htmlhelp/HTML/H0000041.HTM new file mode 100644 index 0000000..9671cbe --- /dev/null +++ b/htmlhelp/HTML/H0000041.HTM @@ -0,0 +1,9 @@ + +ƒ†[ƒU + + + +

+

¡ƒ[ƒ‹ƒAƒhƒŒƒX

+

ƒ[ƒ‹ƒAƒhƒŒƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B
ƒ[ƒ‹ƒAƒhƒŒƒX‚Í anonymous - FTP ‚̃pƒXƒ[ƒh‚Æ‚µ‚ÄŽg—p‚µ‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000042.HTM b/htmlhelp/HTML/H0000042.HTM new file mode 100644 index 0000000..90d76e3 --- /dev/null +++ b/htmlhelp/HTML/H0000042.HTM @@ -0,0 +1,29 @@ + +“]‘—‚P + + + +

+

¡“]‘—ƒ‚[ƒh

+

ƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚ðAƒAƒXƒL[“]‘—ƒ‚[ƒh‚ōs‚È‚¤‚©AƒoƒCƒiƒŠ“]‘—ƒ‚[ƒh‚ōs‚È‚¤‚©‚ðÝ’肵‚Ü‚·B
ƒtƒ@ƒCƒ‹–¼‚Őؑւ¦‚ł́A“]‘—‚·‚éƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹–¼‚É‚æ‚Á‚Ä“]‘—ƒ‚[ƒh‚ðØ‘Ö‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·BƒAƒXƒL[“]‘—ƒ‚[ƒh‚̃tƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B

+

ƒAƒXƒL[“]‘—ƒ‚[ƒhƒ{ƒ^ƒ“AƒoƒCƒiƒŠ“]‘—ƒ‚[ƒhƒ{ƒ^ƒ“Aƒtƒ@ƒCƒ‹–¼‚Å“]‘—ƒ‚[ƒhØ‘Ö‚¦ƒ{ƒ^ƒ“‚Å‘I‚Ô‚±‚Æ‚à‚Å‚«‚Ü‚·B‚±‚Ì•û–@‚Å‘I‚ñ‚¾Ý’è‚Í•Û‘¶‚³‚ê‚Ü‚¹‚ñBÝ’è‚ð•Û‘¶‚µ‚½‚¢‚Æ‚«‚́AƒIƒvƒVƒ‡ƒ“Ý’èƒEƒCƒ“ƒhƒE‚Őݒ肵‚Ä‚­‚¾‚³‚¢B

+

¡ƒAƒXƒL[ƒ‚[ƒh‚̃tƒ@ƒCƒ‹–¼

+

“]‘—ƒ‚[ƒh‚ªƒtƒ@ƒCƒ‹–¼‚Őؑւ¦‚Ì‚Æ‚«‚ɁAƒAƒXƒL[ƒ‚[ƒh‚Å“]‘—‚·‚éƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ü‚·BƒƒCƒ‹ƒhƒJ[ƒh‚ðŽg—p‚Å‚«‚Ü‚·B

+

¡ƒAƒXƒL[ƒ‚[ƒh‚ŃAƒbƒvƒ[ƒhŽžAEOF(Ctrl-Z)‚ðŽæ‚菜‚­

+

ƒAƒbƒvƒ[ƒh‚·‚镶‘ƒtƒ@ƒCƒ‹‚ÌEOFƒR[ƒh‚ðŽæ‚菜‚«‚Ü‚·B
ƒtƒ@ƒCƒ‹‚Ì“r’†‚ÉEOFƒR[ƒh‚ª‚ ‚鎞AƒAƒbƒvƒ[ƒh‚·‚镶‘‚ÍEOF‚Ü‚Å‚É‚È‚è‚Ü‚·B

+

¡ƒ_ƒEƒ“ƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ðˆÛŽ

+

ƒ_ƒEƒ“ƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ðAƒzƒXƒg‚Ì“ú•t‚ɍ‡‚킹‚Ü‚·B

+

¡ƒtƒ@ƒCƒ‹–¼‚̃Zƒ~ƒRƒƒ“ˆÈ~‚ÍŽæ‚菜‚¢‚ă_ƒEƒ“ƒ[ƒh

+

ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹–¼‚ɃZƒ~ƒRƒƒ“iGj‚ªŠÜ‚Ü‚ê‚Ä‚¢‚鎞A‚»‚êˆÈ~‚ÍŽæ‚菜‚¢‚½ƒtƒ@ƒCƒ‹–¼‚Ń_ƒEƒ“ƒ[ƒh‚µ‚Ü‚·B
VAX +VMS‚Ì—š—ð”ԍ†‚ðŽæ‚菜‚­Žž‚ÉŽg—p‚Å‚«‚Ü‚·B

+

—áj@ƒzƒXƒg‘¤F SAMPLE.TXT;12@¨@ƒ[ƒJƒ‹‘¤F SAMPLE.TXT

+

 

diff --git a/htmlhelp/HTML/H0000043.HTM b/htmlhelp/HTML/H0000043.HTM new file mode 100644 index 0000000..06ba0c1 --- /dev/null +++ b/htmlhelp/HTML/H0000043.HTM @@ -0,0 +1,17 @@ + +“]‘—‚Q + + + +

+

¡ƒtƒ@ƒCƒ‹–¼‚̕ύX

+

ƒtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒhAƒAƒbƒvƒ[ƒh‚ðs‚¤‚Æ‚«‚ɁAƒtƒ@ƒCƒ‹–¼‚ð¬•¶ŽšA‚Ü‚½‚͑啶Žš‚É•ÏŠ·‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

‚±‚̐ݒè‚̓~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ÌŽž‚ÍŽg—p‚µ‚Ü‚¹‚ñBƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ÌŽž‚̐ݒè‚́Aƒ~ƒ‰[ƒŠƒ“ƒO‚Őݒ肵‚Ü‚·B

+

¡ƒlƒbƒgƒ[ƒNƒ^ƒCƒ€ƒAƒEƒgŽžŠÔ

+

ƒRƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒC‚Ì‘Ò‚¿ŽžŠÔ‚ð•b’PˆÊ‚Őݒ肵‚Ü‚·B

+

‚O‚É‚·‚é‚ƁAƒ^ƒCƒ€ƒAƒEƒg‚µ‚È‚¢‚悤‚É‚µ‚Ü‚·Bi‚½‚¾‚µAFFFTP‚̓^ƒCƒ€ƒAƒEƒg‚ðŒv‘ª‚µ‚Ü‚¹‚ñ‚ªAƒzƒXƒg‚ªƒ^ƒCƒ€ƒAƒEƒg‚·‚邱‚Æ‚Í‚ ‚è‚Ü‚·Bj

+

¡ƒfƒtƒHƒ‹ƒg‚̃[ƒJƒ‹ƒtƒHƒ‹ƒ_

+

ƒvƒƒOƒ‰ƒ€‹N“®Žž‚̃[ƒJƒ‹ƒtƒHƒ‹ƒ_‚ðŽw’肵‚Ü‚·B
ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Ńtƒ@ƒCƒ‹–¼‚ðŽw’肵‚ătƒ@ƒCƒ‹‚ðƒ_ƒEƒ“ƒ[ƒh‚·‚é‚Æ‚«‚́A‚±‚±‚ÅŽw’肵‚½ƒtƒHƒ‹ƒ_‚Ƀ_ƒEƒ“ƒ[ƒh‚³‚ê‚Ü‚·B

+

 

+

 

diff --git a/htmlhelp/HTML/H0000044.HTM b/htmlhelp/HTML/H0000044.HTM new file mode 100644 index 0000000..d156ec9 --- /dev/null +++ b/htmlhelp/HTML/H0000044.HTM @@ -0,0 +1,14 @@ + +“]‘—‚R + + + +

+

¡ƒAƒbƒvƒ[ƒh‚·‚éƒtƒ@ƒCƒ‹‚Ì‘®«

+

ƒtƒ@ƒCƒ‹‚Ì‘®«‚ð‚ ‚ç‚©‚¶‚ߎw’肵‚Ä‚¨‚­‚±‚Æ‚É‚æ‚èAƒAƒbƒvƒ[ƒh‚µ‚½ƒtƒ@ƒCƒ‹‚Ì‘®«‚ªŽw’è‚Ì’l‚É‚È‚è‚Ü‚·B

+

’ljÁƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚ƁAŽŸ‚̂悤‚ȃEƒCƒ“ƒhƒE‚ª•\Ž¦‚³‚ê‚Ü‚·B

+

+

ƒtƒ@ƒCƒ‹–¼‚ƁA‘®«‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B

+

¡ƒAƒbƒvƒ[ƒhŽž‚ɍ쐬‚·‚éƒtƒHƒ‹ƒ_‚Ì‘®«‚ðŽw’è‚·‚é

+

ƒAƒbƒvƒ[ƒhŽž‚ɃzƒXƒg‘¤‚ɍ쐬‚·‚éƒtƒHƒ‹ƒ_‚Ì‘®«‚ð‚ ‚ç‚©‚¶‚ߎw’è‚Å‚«‚Ü‚·B

+

‘®«‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000045.HTM b/htmlhelp/HTML/H0000045.HTM new file mode 100644 index 0000000..6127ebc --- /dev/null +++ b/htmlhelp/HTML/H0000045.HTM @@ -0,0 +1,15 @@ + +ƒ~ƒ‰[ƒŠƒ“ƒO + + + +

+

ƒ~ƒ‰[ƒŠƒ“ƒO‚ÉŠÖ‚·‚éÝ’è‚ðs‚È‚¢‚Ü‚·B

+

¡“]‘—‚µ‚È‚¢ƒtƒ@ƒCƒ‹–¼

+

ƒ[ƒJƒ‹‘¤‚É‚ ‚éƒtƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_‚Ì‚¤‚¿AƒzƒXƒg‘¤‚ÖƒAƒbƒvƒ[ƒh‚µ‚È‚¢ƒtƒ@ƒCƒ‹–¼^ƒtƒHƒ‹ƒ_–¼‚ðŽw’肵‚Ü‚·B

+

‚±‚±‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹–¼‚̃tƒ@ƒCƒ‹‚ªŠù‚ɃzƒXƒg‘¤‚É‚ ‚éê‡A‚»‚̃tƒ@ƒCƒ‹‚̓zƒXƒg‚©‚çíœ‚³‚ê‚Ü‚·B

+

¡íœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹–¼

+

ƒ[ƒJƒ‹‘¤‚É–³‚¢‚¯‚ê‚Ç‚àƒzƒXƒg‚©‚çíœ‚µ‚È‚¢ƒtƒ@ƒCƒ‹–¼^ƒtƒHƒ‹ƒ_–¼‚ðŽw’肵‚Ü‚·B

+

ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚ł́Aƒ[ƒJƒ‹‘¤‚É–³‚¢ƒtƒ@ƒCƒ‹‚̓zƒXƒg‚©‚çíœ‚µ‚Ü‚·‚ªA‚±‚±‚ÅŽw’肳‚ꂽƒtƒ@ƒCƒ‹‚͍폜‚µ‚Ü‚¹‚ñB

+

¡ƒtƒ@ƒCƒ‹–¼‚ð¬•¶Žš‚É‚µ‚Ä“]‘—

+

ƒtƒ@ƒCƒ‹–¼AƒtƒHƒ‹ƒ_–¼‚ð¬•¶Žš‚ɕύX‚µ‚Ä“]‘—‚µ‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000046.HTM b/htmlhelp/HTML/H0000046.HTM new file mode 100644 index 0000000..d206159 --- /dev/null +++ b/htmlhelp/HTML/H0000046.HTM @@ -0,0 +1,17 @@ + +‘€ì + + + +

+

¡“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞

+

ƒAƒbƒvƒ[ƒhAƒ_ƒEƒ“ƒ[ƒh‚ðs‚È‚¤Û‚ɁA“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚Á‚½‚Æ‚«‚̈µ‚¢‚ðÝ’肵‚Ü‚·B

+

¡ƒ_ƒEƒ“ƒ[ƒhŽž

+

í‚ɏ㏑‚«‚ðs‚È‚¤‚©A‚»‚Ì“s“xŠm”F‚̃EƒCƒ“ƒhƒE‚ðo‚·‚©‚Ì‚Ç‚¿‚ç‚©‚©‚ç‘I‚Ñ‚Ü‚·B

+

¡ƒAƒbƒvƒ[ƒhŽž

+

í‚ɏ㏑‚«‚ðs‚È‚¤‚©A‚»‚Ì“s“xŠm”F‚̃EƒCƒ“ƒhƒE‚ðo‚·‚©‚Ì‚Ç‚¿‚ç‚©‚©‚ç‘I‚Ñ‚Ü‚·B

+

Šm”FƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚·‚é‚Æ‚«‚́A•K—v‚ɉž‚¶‚ătƒ@ƒCƒ‹ˆê——‚ðƒzƒXƒg‚©‚çŽæ‚èŠñ‚¹‚邽‚߁A‚»‚Ì‚Ô‚ñŽžŠÔ‚ª‚©‚©‚è‚Ü‚·B

+

¡ƒ}ƒEƒX‚̃_ƒuƒ‹ƒNƒŠƒbƒN‚Ì“®ì

+

ƒ}ƒEƒX‚Ńtƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½‚Æ‚«AuŠJ‚­v‚Ì“®ì‚ð‚·‚é‚©uƒ_ƒEƒ“ƒ[ƒh£‚Ì“®ì‚ð‚·‚é‚©‚ðÝ’肵‚Ü‚·B

+

¡ƒzƒXƒg“àƒtƒ@ƒCƒ‹ˆÚ“®‹@”\

+

ƒzƒXƒg“à‚Ńhƒ‰ƒbƒO&ƒhƒƒbƒv‚É‚æ‚èƒtƒ@ƒCƒ‹‚ðˆÚ“®‚·‚é‹@”\‚ª‚ ‚è‚Ü‚·B‚»‚Ì‹@”\‚ðŽg‚¤Û‚ÉŠm”F‚ðs‚¤‚©‚Ç‚¤‚©‚ðÝ’肵‚Ü‚·BuŽg—p‚µ‚È‚¢v‚ð‘I‚ԂƁAƒtƒ@ƒCƒ‹‚ðˆÚ“®‚·‚é‹@”\‚»‚Ì‚à‚Ì‚ªŽg‚¦‚È‚­‚È‚è‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000047.HTM b/htmlhelp/HTML/H0000047.HTM new file mode 100644 index 0000000..d56359c --- /dev/null +++ b/htmlhelp/HTML/H0000047.HTM @@ -0,0 +1,13 @@ + +•\Ž¦ + + + +

+

¡ƒtƒHƒ“ƒg

+

ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ƁAƒzƒXƒg–¼ˆê——ƒ_ƒCƒAƒƒO‚ÅŽg—p‚·‚éƒtƒHƒ“ƒg‚ðÝ’肵‚Ü‚·B

+

¡‰B‚µ‘®«‚̃tƒ@ƒCƒ‹AƒtƒHƒ‹ƒ_‚Í•\Ž¦‚µ‚È‚¢

+

ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹‚ʼnB‚µ‘®«‚É‚È‚Á‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚́Aƒtƒ@ƒCƒ‹ˆê——‚É•\Ž¦‚µ‚È‚¢‚悤‚É‚µ‚Ü‚·B‚±‚̏ꍇAƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh‚È‚Ç‚Å‚àƒAƒbƒvƒ[ƒh‚µ‚È‚­‚È‚è‚Ü‚·B

+

¦ƒtƒ@ƒCƒ‹‚̃vƒƒpƒeƒB‚ʼnB‚µ‘®«ƒtƒ@ƒCƒ‹‚ðŒ©‚½‚Æ‚±‚ëB

+

 

+

 

diff --git a/htmlhelp/HTML/H0000048.HTM b/htmlhelp/HTML/H0000048.HTM new file mode 100644 index 0000000..d82b31b --- /dev/null +++ b/htmlhelp/HTML/H0000048.HTM @@ -0,0 +1,33 @@ + +Ú‘±/Ø’f + + + +

+

¡‹N“®Žž‚ɐڑ±ƒ_ƒCƒAƒƒO‚ð•\Ž¦

+

ƒvƒƒOƒ‰ƒ€‹N“®Žž‚ɁAÚ‘±‚Ì‚½‚߂̃zƒXƒgˆê——ƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚µ‚Ü‚·B

+

¡Ú‘±ƒ_ƒCƒAƒƒO‚ŃzƒXƒg‚̐ݒè‚às‚¤

+

Ú‘±ƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚½ŽžA‚ ‚é‚¢‚͐ڑ±ƒƒjƒ…[‚̐ڑ±‚ðs‚Á‚½Žž‚ɁAƒzƒXƒg‚̐ݒè‚à‚Å‚«‚éƒzƒXƒgˆê——ƒ_ƒCƒAƒƒO‚ð•\Ž¦‚µ‚Ü‚·B
ƒ`ƒFƒbƒNƒ}[ƒN‚ðŠO‚·‚ƁAŠÈˆÕ”ł̃_ƒCƒAƒƒO‚ð•\Ž¦‚µ‚Ü‚·B

+

¡ƒvƒƒOƒ‰ƒ€I—¹Žž‚Ƀ_ƒCƒAƒ‹ƒAƒbƒv(RAS)‚ðØ’f‚·‚é

+

ƒvƒƒOƒ‰ƒ€‚ðI—¹‚·‚鎞‚Ƀ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±‚ðØ’f‚µ‚Ü‚·B

+

¡ƒ_ƒCƒAƒ‹ƒAƒbƒv(RAS)Ø’f‚ÌŠm”F‚ðs‚¤

+

ƒ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±‚̐ؒf‚ð‚·‚é‚©‚Ç‚¤‚©‚ÌŠm”F‚ðs‚¢‚Ü‚·B

+

¡Ú‘±ƒzƒXƒg‚̃qƒXƒgƒŠŒÂ”

+

¡‚܂łɐڑ±‚µ‚½ƒzƒXƒg‚̃qƒXƒgƒŠ‚ð‚¢‚­‚•\Ž¦‚·‚é‚©‚ðÝ’肵‚Ü‚·B
ƒqƒXƒgƒŠ‚́A•\Ž¦ƒƒjƒ…[‚ƃNƒCƒbƒNÚ‘±‚̃EƒCƒ“ƒhƒE‚É•\Ž¦‚³‚ê‚Ü‚·B

+

¡Ú‘±ƒzƒXƒg‚̃qƒXƒgƒŠ‚ɃpƒXƒ[ƒh‚à‹L‰¯‚·‚é

+

Ú‘±‚µ‚½ƒzƒXƒg‚̃qƒXƒgƒŠ‚ɃpƒXƒ[ƒh‚à‹L‰¯‚µ‚Ü‚·B

+

Ú‘±‚·‚éÛ‚ɃpƒXƒ[ƒh‚ð“ü—Í‚·‚é•K—v‚ª‚È‚­‚È‚è‚Ü‚·‚ªA‚P‘ä‚ÌPC‚𕡐”l‚ÅŽg‚¤ê‡‚Ȃǂ́AƒZƒLƒ…ƒŠƒeƒB‚ð•Û‚‚½‚ß‚É‹L‰¯‚µ‚È‚¢‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢B

+

¡ƒNƒCƒbƒNÚ‘±‚Íanonymous-FTP‚ðŠî–{‚Æ‚·‚é

+

ƒNƒCƒbƒNÚ‘±‚̃EƒCƒ“ƒhƒE‚̃†[ƒU–¼‚Éanonymous‚ðAƒpƒXƒ[ƒh‚Ƀ[ƒ‹ƒAƒhƒŒƒX‚ð‚ ‚ç‚©‚¶‚ß“ü—Í‚µ‚Ä‚¨‚­‚©‚Ç‚¤‚©‚ð‘I‚Ñ‚Ü‚·B

+

¡Ø’fŽž‚ÉQUITƒRƒ}ƒ“ƒh‚ð‘—‚é

+

ƒzƒXƒg‚©‚çØ’f‚·‚é‚Æ‚«‚ÉQUITƒRƒ}ƒ“ƒh‚ðƒzƒXƒg‚É‘—‚é‚©‚Ç‚¤‚©‚ðÝ’肵‚Ü‚·B

+

‰Šúó‘Ԃł̓Rƒ}ƒ“ƒh‚ð‘—‚ç‚È‚¢Ý’è‚É‚È‚Á‚Ä‚¢‚Ü‚·B
iƒ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±‚̏ꍇAQUITƒRƒ}ƒ“ƒh‚¾‚¯‚Ì‚½‚߂Ƀ_ƒCƒAƒ‹ƒAƒbƒv‚ðÚ‘±‚µ‚È‚¨‚·ê‡‚ª‚ ‚邽‚߁A‰Šúó‘Ô‚Å‚Í‘—‚ç‚È‚¢‚悤‚É‚µ‚Ä‚¢‚Ü‚·Bj

+

¡RAS‚̐§Œä‚ðs‚í‚È‚¢

+

RASiƒ_ƒCƒAƒ‹ƒAƒbƒvj‚̃‰ƒCƒuƒ‰ƒŠ‚ðŽg—p‚µ‚È‚¢‚悤‚É‚µ‚Ü‚·B
FFFTP‚Ì‹N“®Žž‚ÉRASŠÖŒW‚̃Gƒ‰[‚ª•\Ž¦‚³‚ê‚鎞‚ɁAƒ`ƒFƒbƒNƒ}[ƒN‚ð•t‚¯‚Ä‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000049.HTM b/htmlhelp/HTML/H0000049.HTM new file mode 100644 index 0000000..69863af --- /dev/null +++ b/htmlhelp/HTML/H0000049.HTM @@ -0,0 +1,67 @@ + +FireWall + + + +

+

¡ƒ^ƒCƒv

+

ŽŸ‚Ì’†‚©‚çƒ^ƒCƒv‚ð‘I‚Ñ‚Ü‚·B

+
+

ƒ^ƒCƒv‚PF@FWƒ†[ƒU–¼¨FWƒpƒXƒ[ƒh¨SITE ƒzƒXƒg–¼

+

ŽŸ‚̎菇‚ŃzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

@@FireWall‚ɐڑ±¨
@@@@FireWall‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“¨
@@@@@@"SITE ƒzƒXƒg–¼"‚𑗐M¨
@@@@@@@@@ƒzƒXƒg‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“

+

ƒ^ƒCƒv‚QF@FWƒ†[ƒU–¼¨FWƒpƒXƒ[ƒh¨USER ƒ†[ƒU–¼@ƒzƒXƒg–¼

+

ŽŸ‚̎菇‚ŃzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

@@FireWall‚ɐڑ±¨
@@@@FireWall‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“¨
@@@@@@ƒzƒXƒg‚̃†[ƒU–¼@ƒzƒXƒg–¼‚ƁAƒzƒXƒg‚̃pƒXƒ[ƒh‚эƒOƒCƒ“

+

ƒ^ƒCƒv‚RF@FWƒ†[ƒU–¼¨FWƒpƒXƒ[ƒh

+

ŽŸ‚̎菇‚ŃzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

@@FireWall‚ɐڑ±¨
@@@@FireWall‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“¨
@@@@@@@ƒzƒXƒg‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“

+

ƒ^ƒCƒv‚SF@USER ƒ†[ƒU–¼@ƒzƒXƒg–¼

+

ŽŸ‚̎菇‚ŃzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

@@FireWall‚ɐڑ±¨
@@@@ƒzƒXƒg‚̃†[ƒU–¼@ƒzƒXƒg–¼‚ƁAƒzƒXƒg‚̃pƒXƒ[ƒh‚эƒOƒCƒ“

+

ƒ^ƒCƒv‚TF@OPEN ƒzƒXƒg–¼

+

ŽŸ‚̎菇‚ŃzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

@@FireWall‚ɐڑ±¨
@@@@"OPEN ƒzƒXƒg–¼"‚𑗐M¨
@@@@@@@ƒzƒXƒg‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“

+

ƒ^ƒCƒv‚UF@SOCKS4

+

SOCKS(Ver.4)‚ðŽg—p‚µ‚ăzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

ƒ^ƒCƒv‚VF@SOCKS‚T (”FØ‚È‚µ)

+

SOCKS(Ver.5)‚ðŽg—p‚µ‚ăzƒXƒg‚ɐڑ±‚µ‚Ü‚·B
”FØ‚͍s‚¢‚Ü‚¹‚ñB

+

ƒ^ƒCƒv‚WF@SOCKS‚T (ƒ†[ƒU–¼AƒpƒXƒ[ƒh”FØ)

+

SOCKS(Ver.5)‚ðŽg—p‚µ‚ăzƒXƒg‚ɐڑ±‚µ‚Ü‚·B
”FØ‚Ì‚½‚߂̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B

+

ƒ^ƒCƒv‚XF@USER FWƒ†[ƒU–¼FFWƒpƒXƒ[ƒh@ƒzƒXƒg–¼

+

ŽŸ‚̎菇‚ŃzƒXƒg‚ɐڑ±‚µ‚Ü‚·B

+

@@FireWall‚ɐڑ±¨
@@@@"USER + FWƒ†[ƒU–¼FFWƒpƒXƒ[ƒh@ƒzƒXƒg–¼"‚𑗐M¨
@@@@@@ƒzƒXƒg‚̃†[ƒU–¼‚ƃpƒXƒ[ƒh‚эƒOƒCƒ“

+

¦SOCKS‚Ì•W€‚̃|[ƒg”ԍ†‚Í 1080 ‚Å‚·B
¦SOCKS5‚ÌGSS-API”FØ‚̓Tƒ|[ƒg‚µ‚Ä‚¢‚Ü‚¹‚ñB

+

¡FireWallƒzƒXƒg

+

‚e‚‰‚’‚…‚v‚‚Œ‚Œ‚̃zƒXƒg‚̃AƒhƒŒƒX‚ðÝ’肵‚Ü‚·B

+

¡ƒ|[ƒg

+

FireWall‚̃|[ƒg”ԍ†‚ðÝ’肵‚Ü‚·B

+

¡FireWallƒ†[ƒU–¼

+

FireWall‚ɃƒOƒCƒ“‚·‚鎞‚̃†[ƒU–¼‚ðÝ’肵‚Ü‚·B
ã‹L‚̃^ƒCƒv‚Ì‚¤‚¿Aƒ^ƒCƒv‚PAƒ^ƒCƒv‚QAƒ^ƒCƒv‚T‚ðŽg—p‚·‚é‚Æ‚«‚É‚Ì‚Ý•K—v‚Å‚·B

+

¡FireWallƒpƒXƒ[ƒh

+

FireWall‚ɃƒOƒCƒ“‚·‚鎞‚̃pƒXƒ[ƒh‚ðÝ’肵‚Ü‚·B
ƒ^ƒCƒv‚P‚Ü‚½‚̓^ƒCƒv‚Q‚ÌFireWall‚ðŽg—p‚·‚é‚Æ‚«‚É‚Ì‚Ý•K—v‚Å‚·B

+

¡@‚̕ύX

+

FW‚̃^ƒCƒv‚ªƒ^ƒCƒv‚QC‚SA‚X‚ÌŽž‚ɁAu—v‚ð•Ê‚Ì•¶Žš‚É’u‚«Š·‚¦‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
‰Šú’l‚́u—v‚Å‚·B

+

¡ƒZƒLƒ…ƒŠƒeƒB

+

ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚̐ݒè‚ð‚µ‚Ü‚·B‰ŠúÝ’è‚ÍŽ©“®”FŽ¯‚Å‚·B
ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ÌŒ`Ž®‚ðFFFTP‚ªŠÔˆá‚Á‚Ä”FŽ¯‚µ‚Ä‚¢‚é‚ÆŽv‚í‚ê‚鎞‚́AŽg—p‚µ‚Ä‚¢‚éŒ`Ž®‚ðÝ’肵‚Ä‚­‚¾‚³‚¢BMD4(S/KEY)AMD5, +SHA-1‚Ì‚¢‚¸‚ê‚©‚ð‘I‚Ô‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

¡ƒzƒXƒg‚ÌŒŸõ‚ÍSOCKSƒT[ƒo‚É”C‚¹‚é

+

FFFTP‚̓zƒXƒg‚ðŒŸõ‚¹‚¸ASOCKSƒT[ƒo‚ÉŒŸõ‚ð”C‚¹‚Ü‚·B

+

‚±‚̍€–ڂɃ`ƒFƒbƒNƒ}[ƒN‚ð•t‚¯‚È‚¢ŽžiƒfƒtƒHƒ‹ƒgj‚́A‚Ü‚¸FFFTP‚ªƒzƒXƒg‚ðŒŸõ‚µAŒ©‚‚©‚ç‚È‚¯‚ê‚ÎSOCKSƒT[ƒo‚ÉŒŸõ‚ð”C‚¹‚Ü‚·B

+

¡ƒzƒXƒgˆê——‚É–¢“o˜^‚̃zƒXƒg‚ÍFireWall‚ðŽg‚Á‚Đڑ±

+

ƒNƒCƒbƒNÚ‘±A‚ ‚é‚¢‚̓Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ŃzƒXƒg‚ðŽw’肵‚Đڑ±‚·‚é‚Æ‚«AFireWall‚ðŽg‚¤‚©‚Ç‚¤‚©‚ðÝ’肵‚Ü‚·B

+

¡ƒzƒXƒgˆê——‚É–¢“o˜^‚̃zƒXƒg‚ÍPASVƒ‚[ƒh‚ðŽg‚¤

+

ƒNƒCƒbƒNÚ‘±A‚ ‚é‚¢‚̓Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ŃzƒXƒg‚ðŽw’肵‚Đڑ±‚·‚é‚Æ‚«APASVƒ‚[ƒh‚ðŽg‚¤‚©‚Ç‚¤‚©‚ðÝ’肵‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000050.HTM b/htmlhelp/HTML/H0000050.HTM new file mode 100644 index 0000000..0481d69 --- /dev/null +++ b/htmlhelp/HTML/H0000050.HTM @@ -0,0 +1,18 @@ + +ƒc[ƒ‹ + + + +

+

¡ƒrƒ…[ƒ‚P
¡ƒrƒ…[ƒ‚Q
¡ƒrƒ…[ƒ‚R

+

ƒtƒ@ƒCƒ‹“à—e‚ð•\Ž¦‚·‚é‚Æ‚«‚ÉŽg—p‚·‚éƒc[ƒ‹‚ðÝ’肵‚Ü‚·B

+

ƒtƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½‚Æ‚«Aƒtƒ@ƒCƒ‹–¼‚ÉŠÖ˜A‚¯‚ç‚ꂽƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª‚ ‚ê‚΁A‚»‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚ð‹N“®‚µ‚Ü‚·BŠÖ˜A‚¯‚ç‚ꂽƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª‚È‚¯‚ê‚΁Aƒrƒ…[ƒ‚P‚ÅŽw’肳‚ꂽƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ð‹N“®‚µ‚Ü‚·B

+

‚Ü‚½Aƒ}ƒEƒX‚̉Eƒ{ƒ^ƒ“ƒƒjƒ…[‚Ńrƒ…[ƒ‚P`ƒrƒ…[ƒ‚R‚ð‘I‚ñ‚Å‹N“®‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

 

+

·•ªƒrƒ…[ƒ

+

ƒrƒ…[ƒ‚Q‚ƃrƒ…[ƒ‚R‚ª"d "id+”¼ŠpƒXƒy[ƒXj‚ÅŽn‚Ü‚Á‚Ä‚¢‚éê‡‚́A·•ªƒrƒ…[ƒA‚Æ‚µ‚Ä“®ì‚µ‚Ü‚·B

+

+

ƒŠƒ‚[ƒgƒtƒ@ƒCƒ‹‚ð‘I‘ð‚µ‚½ó‘Ô‚Å‚±‚ê‚ç‚ðŽÀs‚·‚é‚ƁA·•ªƒrƒ…[ƒA‚ªŠJ‚«‚Ü‚·B‚æ‚萳Šm‚ɂ́Aƒrƒ…[ƒA‚É (1) ƒ[ƒJƒ‹‚Ì“¯–¼ƒtƒ@ƒCƒ‹ (2) +ƒŠƒ‚[ƒgƒtƒ@ƒCƒ‹‚ð %TEMP% ‚Ƀ_ƒEƒ“ƒ[ƒh‚µ‚½‚à‚Ì ‚Æ‚¢‚¤ 2 ‚‚̃tƒ@ƒCƒ‹‚ª“n‚³‚ê‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000051.HTM b/htmlhelp/HTML/H0000051.HTM new file mode 100644 index 0000000..ac702de --- /dev/null +++ b/htmlhelp/HTML/H0000051.HTM @@ -0,0 +1,12 @@ + +ƒTƒEƒ“ƒh + + + +

+

¡Ú‘±Žž‚ÉWaveƒtƒ@ƒCƒ‹‚ð–‚炷

+

Ú‘±‚ªŠ®—¹‚µ‚½Žž‚ÉWaveƒtƒ@ƒCƒ‹‚ð–‚炵‚Ü‚·B
Waveƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹–¼‚àŽw’肵‚Ä‚­‚¾‚³‚¢B

+

¡“]‘—I—¹Žž‚ÉWaveƒtƒ@ƒCƒ‹‚ð–‚炷

+

ƒtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒhAƒAƒbƒvƒ[ƒh‚ªI—¹‚µ‚½Žž‚ÉWaveƒtƒ@ƒCƒ‹‚ð–‚炵‚Ü‚·B•¡”‚̃tƒ@ƒCƒ‹‚ð‚Ü‚Æ‚ß‚Ä“]‘—‚µ‚Ä‚¢‚鎞‚́AÅŒã‚É‚P‰ñ‚¾‚¯–‚炵‚Ü‚·B
Waveƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹–¼‚àŽw’肵‚Ä‚­‚¾‚³‚¢B

+

¡ƒGƒ‰[‚ÌŽžWaveƒtƒ@ƒCƒ‹‚ð–‚炷

+

ƒGƒ‰[‚ª‹N‚«‚½ŽžA‰½‚©‚ÌŠm”F‚ª•K—v‚ÈŽž‚ÉWaveƒtƒ@ƒCƒ‹‚ð–‚炵‚Ü‚·B
Waveƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹–¼‚àŽw’肵‚Ä‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000052.HTM b/htmlhelp/HTML/H0000052.HTM new file mode 100644 index 0000000..2efc425 --- /dev/null +++ b/htmlhelp/HTML/H0000052.HTM @@ -0,0 +1,25 @@ + +‚»‚Ì‘¼ + + + +

+

¡ƒEƒCƒ“ƒhƒEˆÊ’u‚ð•Û‘¶

+

ƒEƒCƒ“ƒhƒE‚ðA‚¢‚Â‚à“¯‚¶ˆÊ’u‚É•\Ž¦‚µ‚Ü‚·B
ƒEƒCƒ“ƒhƒE‚̃TƒCƒY‚́A‚±‚̐ݒè‚É‚©‚©‚í‚炸•Û‘¶‚³‚ê‚Ü‚·B

+

¡ƒtƒ@ƒCƒ‹ˆê——‚ðƒLƒƒƒbƒVƒ…‚·‚é

+

ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹ˆê——‚ð•Û‘¶‚µA‚Q“x–ڈȍ~‚̓tƒ@ƒCƒ‹ˆê——‚Ì•\Ž¦‚ð‚‘¬‚ɍs‚¢‚Ü‚·B
ƒtƒ@ƒCƒ‹ˆê——‚ðXV‚·‚é‚Æ‚«‚́AXVƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚­‚¾‚³‚¢B

+

¡ƒLƒƒƒbƒVƒ…ƒoƒbƒtƒ@‚̐”

+

ƒtƒ@ƒCƒ‹ˆê——‚ð•Û‘¶‚·‚é‚Æ‚«A‰½‰æ–Ê•ª‚Ü‚Å•Û‘¶‚·‚é‚©‚ðÝ’肵‚Ü‚·B

+

¡ƒLƒƒƒbƒVƒ…‚ð•Û‘¶‚·‚é

+

ƒvƒƒOƒ‰ƒ€‚ðI—¹‚µ‚Ä‚àAƒLƒƒƒbƒVƒ…‚ðƒNƒŠƒA‚µ‚È‚¢‚Å•Û‘¶‚µ‚Ü‚·B

+

¡ƒLƒƒƒbƒVƒ…^ì‹Æƒtƒ@ƒCƒ‹‚ðì¬‚·‚éƒtƒHƒ‹ƒ_

+

FFFTP‚ªì‹Æƒtƒ@ƒCƒ‹‚ðì‚éƒtƒHƒ‹ƒ_‚ðŽw’肵‚Ü‚·B
’ʏí‚͏‰Šú’l‚Ì‚Ü‚ÜŽg—p‚µ‚Ä‚­‚¾‚³‚¢B

+

¡Ý’è‚ðƒŒƒWƒXƒgƒŠ‚Å‚È‚­INIƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚é

+

Ý’è‚ðINIƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚é‚悤‚É‚µ‚Ü‚·Bƒ}ƒ‹ƒ`ƒ†[ƒUŠÂ‹«‚Å‚È‚¢Žž‚ÉŽg—p‚µ‚Ä‚­‚¾‚³‚¢BINIƒtƒ@ƒCƒ‹‚́Affftp.exe +‚Ì‚ ‚éƒtƒHƒ‹ƒ_‚ɍ쐬‚µ‚Ü‚·B

+

‰ŠúÝ’è‚ł́AFFFTP‚̓ŒƒWƒXƒgƒŠ‚ɐݒè‚ð•Û‘¶‚µ‚Ü‚·B

+

 

+

¡ƒfƒoƒbƒO

+

ƒfƒoƒbƒO‚Ì‚½‚߂̃Rƒ“ƒ\[ƒ‹‰æ–Ê‚ð•\Ž¦‚µ‚Ü‚·B
’ʏí‚ÍŽg—p‚µ‚È‚¢‚Å‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000054.HTM b/htmlhelp/HTML/H0000054.HTM new file mode 100644 index 0000000..d7adf9d --- /dev/null +++ b/htmlhelp/HTML/H0000054.HTM @@ -0,0 +1,15 @@ + +JISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä + + + +

¡JIS ¨ SHIFT-JIS ‚Ì•¶ŽšƒR[ƒh•ÏŠ·

+

ˆÈ‰º‚̃GƒXƒP[ƒvƒV[ƒPƒ“ƒX‚ð”FŽ¯‚µ‚Ü‚·B

+

<ESC>$B  <ESC>$@ ccccccc +Š¿Žš‚֐ؑւ¦
<ESC>(I  ccccccccccc ”¼ŠpƒJƒi‚֐ؑւ¦
<ESC>(B  +<ESC>(J  <ESC>(H  cc ASCII‚֐ؑւ¦

+

SI/SO ‚Í”FŽ¯‚µ‚Ü‚¹‚ñB

+

¡SHIFT-JIS ¨ JIS ‚Ì•¶ŽšƒR[ƒh•ÏŠ·

+

ˆÈ‰º‚̃GƒXƒP[ƒvƒV[ƒPƒ“ƒX‚ðŽg—p‚µ‚Ü‚·B

+

<ESC>$B ccc Š¿Žš‚֐ؑւ¦
<ESC>(I ccc +”¼ŠpƒJƒi‚֐ؑւ¦
<ESC>(B ccc ASCII‚֐ؑւ¦

diff --git a/htmlhelp/HTML/H0000055.HTM b/htmlhelp/HTML/H0000055.HTM new file mode 100644 index 0000000..b275700 --- /dev/null +++ b/htmlhelp/HTML/H0000055.HTM @@ -0,0 +1,18 @@ + +Š¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚Ä + + + +

Šî–{“I‚ɂ́AŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚ðŽg‚¤‚±‚Æ‚Í‚¨Š©‚ß‚Å‚«‚Ü‚¹‚ñB

+

ƒtƒ@ƒCƒ‹–¼‚É‚Ç‚ÌŠ¿ŽšƒR[ƒh‚ªŽg‚¦‚é‚©AƒzƒXƒg‚ÌŠÇ—ŽÒ‚É•·‚¢‚āA³‚µ‚­Ý’肵‚Ä‚­‚¾‚³‚¢B‚ ‚é‚¢‚͉º‹L‚Ì•û–@‚ð–ÚˆÀ‚ɐݒ肵‚Ä‚­‚¾‚³‚¢B

+

ƒzƒXƒg‚ÅŽg‚¦‚È‚¢Š¿ŽšƒR[ƒh‚ðÝ’肵‚ătƒ@ƒCƒ‹‚ð‘‚«ž‚ނƁAˆÈ‰º‚̂悤‚È–â‘肪‹N‚±‚鎖‚ª‚ ‚è‚Ü‚·B

+
+

œŠÔˆá‚Á‚½ƒtƒ@ƒCƒ‹–¼‚É‚È‚Á‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚ ‚è‚Ü‚·B
œFTP‚Ì‘€ì‚ł̓AƒNƒZƒX‚Å‚«‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¤‚±‚Æ‚ª‚ ‚è‚Ü‚·B
œƒtƒ@ƒCƒ‹ˆê——‚ªˆê•”‚µ‚©•\Ž¦‚³‚ê‚È‚¢A—‚ê‚é‚È‚Ç‚ÌŒ»Û‚ª‹N‚±‚鎖‚ª‚ ‚è‚Ü‚·B

+

ƒtƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚͏\•ª‚É’ˆÓ‚µ‚Đݒ肵‚Ä‚­‚¾‚³‚¢B

+

¡UnixŒn‚̃zƒXƒg‚̏ꍇ

+

EUC‚ªŽg‚¦‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñBŠù‚ÉŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚̃tƒ@ƒCƒ‹‚ª‚ ‚é‚Æ‚«‚́A‚»‚̃tƒ@ƒCƒ‹–¼‚ª³‚µ‚­•\Ž¦‚³‚ê‚é‚悤‚ɐݒ肵‚Ä‚­‚¾‚³‚¢B
JIS‚ÍŽg‚¦‚È‚¢‚ÆŽv‚¢‚Ü‚·B

+

Unix‚ÉSamba‚ð“ü‚ê‚ÄWindows‚©‚çƒAƒNƒZƒX‚Å‚«‚é‚悤‚É‚µ‚Ä‚¢‚é‚Æ‚«‚ÍSamba-HEX‚©Samba-CAP‚ªŽg‚í‚ê‚Ä‚¢‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB

+

EUCASHIFT-JISAJIS‚Ì‚¢‚¸‚ê‚àŽg‚¦‚È‚¢‚Æ‚«‚Å‚àSamba-CAPi‚ ‚é‚¢‚Í +Samba-HEXj‚ªŽg‚¦‚é‚ÆŽv‚¢‚Ü‚·B‚½‚¾‚µA‚±‚ÌŽž‚ÍFFFTP‚ÆSambaˆÈŠO‚̃\ƒtƒg‚ł́AŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚Æ‚µ‚Ä•\Ž¦‚³‚ê‚Ü‚¹‚ñB

+

¡WindowsŒn‚̃zƒXƒg‚̏ꍇ

+

FTPƒT[ƒoƒ\ƒtƒg‚ª“ú–{Œê‚ɑΉž‚µ‚Ä‚¢‚é‚È‚ç‚΁ASHIFT-JIS‚ªŽg‚¦‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
EUCAJISASamba-HEXASamba-CAP‚͐ݒ肵‚È‚¢‚Å‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000056.HTM b/htmlhelp/HTML/H0000056.HTM new file mode 100644 index 0000000..aa68bb4 --- /dev/null +++ b/htmlhelp/HTML/H0000056.HTM @@ -0,0 +1,10 @@ + +ƒpƒXƒ[ƒh‚ÌŽæ‚舵‚¢‚ɂ‚¢‚Ä + + + +

Windows 98, Me‚ŁAƒ}ƒ‹ƒ`ƒ†[ƒUŠÂ‹«‚Å•¡”‚̐l‚ª“¯‚¶‚o‚b‚ðŽg‚¤ŽžAƒpƒXƒ[ƒh‚̓zƒXƒg‚̐ݒè‚ɏ‘‚«ž‚Ü‚È‚¢Ž–‚ð‚¨Š©‚ß‚µ‚Ü‚·BWindows +NT‚Å‚àINIƒtƒ@ƒCƒ‹‚ðŽg‚¤‚悤‚ɐݒ肵‚Ä‚¢‚鎞‚Í“¯‚¶‚Å‚·B

+

ƒzƒXƒg‚̐ݒè‚ŃpƒXƒ[ƒh‚ð“ü—Í‚µ‚È‚¢‚Ü‚Ü‚É‚µ‚Ä‚¨‚­‚ƁAÚ‘±Žž‚ɃpƒXƒ[ƒh‚Ì“ü—Í‚ð‹‚ß‚Ä‚«‚Ü‚·B

+

FFFTP‚̓vƒƒOƒ‰ƒ€‚̃\[ƒXƒR[ƒh‚àŒöŠJ‚µ‚Ä‚¢‚é‚̂ŁAƒvƒƒOƒ‰ƒ€‚Ì“Ç‚ß‚él‚ɁA•Û‘¶‚³‚ꂽƒpƒXƒ[ƒh‚ð‰ð“Ç‚³‚ê‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B

diff --git a/htmlhelp/HTML/H0000057.HTM b/htmlhelp/HTML/H0000057.HTM new file mode 100644 index 0000000..33ce96f --- /dev/null +++ b/htmlhelp/HTML/H0000057.HTM @@ -0,0 +1,9 @@ + +jre32.dll‚ɂ‚¢‚Ä + + + +

jre32.dll ‚́AŽR“c˜a•vŽ‚Ì‚¨ì‚è‚É‚È‚Á‚½A³‹K•\Œ»ŒŸõ‚ðs‚¤‚½‚ß‚ÌDLL‚Å‚·B‚±‚̃tƒ@ƒCƒ‹‚Í ffftp.exe +‚Æ“¯‚¶ƒfƒBƒŒƒNƒgƒŠ‚É“ü‚ê‚Ä‚¨‚¢‚Ä‚­‚¾‚³‚¢B

+

‚±‚̃tƒ@ƒCƒ‹‚ª–³‚¢ê‡‚́AŒŸõ‚â‘I‘ð‚Ő³‹K•\Œ»AƒƒCƒ‹ƒhƒJ[ƒh‚ðŽg‚¤‚±‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB

diff --git a/htmlhelp/HTML/H0000058.HTM b/htmlhelp/HTML/H0000058.HTM new file mode 100644 index 0000000..832c393 --- /dev/null +++ b/htmlhelp/HTML/H0000058.HTM @@ -0,0 +1,8 @@ + +ƒo[ƒWƒ‡ƒ“ƒAƒbƒv‚ɂ‚¢‚Ä + + + +

ŒÃ‚¢ƒo[ƒWƒ‡ƒ“‚ÌFFFTP‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚éƒtƒHƒ‹ƒ_‚ɁAã‘‚«‚ŃCƒ“ƒXƒg[ƒ‹‚µ‚Ä‚­‚¾‚³‚¢BŽ–‘O‚ɃAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñB

+

 

+

 

diff --git a/htmlhelp/HTML/H0000059.HTM b/htmlhelp/HTML/H0000059.HTM new file mode 100644 index 0000000..83facae --- /dev/null +++ b/htmlhelp/HTML/H0000059.HTM @@ -0,0 +1,6 @@ + +ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ɂ‚¢‚Ä + + + +

ƒRƒ“ƒgƒ[ƒ‹ƒpƒlƒ‹‚́uƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚̒ljÁ‚ƍ폜v‚ðŽg‚Á‚ăAƒ“ƒCƒ“ƒXƒg[ƒ‹‚µ‚Ä‚­‚¾‚³‚¢B

diff --git a/htmlhelp/HTML/H0000060.HTM b/htmlhelp/HTML/H0000060.HTM new file mode 100644 index 0000000..2e89494 --- /dev/null +++ b/htmlhelp/HTML/H0000060.HTM @@ -0,0 +1,20 @@ + +ì¬ + + + +

œFFFTP‚̓tƒŠ[Eƒ\ƒtƒgƒEƒGƒA‚Å‚·BŒÂlŽg—pA‹Æ–±Žg—p‚ÉŠÖ‚í‚炸Ž©—R‚ÉŽg—p‚µ‚Ä‚©‚Ü‚¢‚Ü‚¹‚ñB

+

œFFFTP‚Ì“®ì‚É•K—v‚ȃtƒ@ƒCƒ‹‚ªŠÜ‚܂ꂽŒ`‚Å‚ ‚ê‚΁AŽ©—R‚É•¡»‚µA”Еz‚µ‚Ä‚©‚Ü‚¢‚Ü‚¹‚ñB

+

œƒ\ƒtƒgƒEƒGƒA‚͏\•ª‚ɃeƒXƒg‚ð‚µ‚Ä‚¢‚Ü‚·‚ªA‚¨Žg‚¢‚̃pƒ\ƒRƒ“ŠÂ‹«‚âAƒvƒƒOƒ‰ƒ€‚Ì•s‹ï‡‚È‚Ç‚É‚æ‚Á‚Ä–â‘肪¶‚¶‚éê‡‚ª‚ ‚è‚Ü‚·B–œ‚ªˆê‘¹ŠQ‚ª¶‚¶‚Ä‚àA‘¹ŠQ‚ɑ΂·‚é•ÛØ‚͏o—ˆ‚©‚Ë‚Ü‚·‚̂ŁA‚²—¹³‚­‚¾‚³‚¢B

+

’˜ìŒ ‚ÍSotai‘]“c)‚É‚ ‚è‚Ü‚·B
ƒEƒGƒuƒy[ƒW‚à‚²——‚­‚¾‚³‚¢B
http://www2.biglobe.ne.jp/~sota/

+

šjre32.dll‚́AŽR“c˜a•vŽ‚ªì‚ç‚ꂽ³‹K•\Œ»ŒŸõDLL‚Å‚·B

+

š‚±‚̃wƒ‹ƒvƒtƒ@ƒCƒ‹‚ÍK's HTML HELP +Man‚ðŽg—p‚µ‚č쐬‚µ‚Ü‚µ‚½B

+

šFFFTP‚̃eƒXƒg‚Ì‚½‚ß‚ÉLinux‚ÆŠeŽíFTPD‚ðŽg—p‚µ‚Ü‚µ‚½B

+

šOLEƒhƒ‰ƒbƒO•ƒhƒƒbƒv‚́A•½“c–L‚³‚ñ‚ªnakka‚³‚ñ‚̃‰ƒCƒuƒ‰ƒŠ‚ðŽg‚Á‚ÄŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½B

+

šƒzƒXƒg‘¤‚ł̃tƒ@ƒCƒ‹‚̈ړ®‚́A•½“c–L‚³‚ñ‚ªŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½B

š‚¢‚­‚‚©‚̃Vƒ‡[ƒgƒJƒbƒgƒL[‚⍷•ªƒrƒ…[ƒ‚́Amiau‚³‚ñ‚ªŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½B

+

šƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚Ì‹@”\‚Í‚°‚ñ‚°‚ñ‚³‚ñ‚ªŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½B

+

šAES‚ðŽg‚Á‚½ˆÃ†‰»‚ւ̑Ήž‚ÍBrian GladmanŽ‚̃R[ƒh‚ðŒ³‚ÉAMoca‚³‚ñ‚ªŽÀ‘•‚µ‚Ä‚­‚¾‚³‚¢‚Ü‚µ‚½B

+

‚»‚Ì‘¼A‘½‚­‚Ì•ûX‚Ì‹¦—͂𓾂è‚è‚Ü‚·B‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B

+

 

diff --git a/htmlhelp/HTML/H0000061.HTM b/htmlhelp/HTML/H0000061.HTM new file mode 100644 index 0000000..2a5e6f6 --- /dev/null +++ b/htmlhelp/HTML/H0000061.HTM @@ -0,0 +1,38 @@ + +ƒtƒ@ƒCƒ‹‚Ì‘I‘ð + + + +

ˆê——•\Ž¦‚³‚ê‚Ä‚¢‚é’†‚©‚çA•¡”‚̃tƒ@ƒCƒ‹‚ð‚Ü‚Æ‚ß‚Ä‘I‘ð‚·‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B

+

¡ƒtƒ@ƒCƒ‹–¼‚ðŽw’肵‚Ä‘I‘ð

+

•\Ž¦ƒƒjƒ…[‚Ì‘I‘ð‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢B

+

ƒtƒ@ƒCƒ‹–¼‚Æ‚»‚Ì‘¼‚Ì‘I‘ððŒ‚ðŽw’肵‚Ä‚­‚¾‚³‚¢B
ƒtƒ@ƒCƒ‹–¼‚ÌŽw’è•û–@‚́Aƒtƒ@ƒCƒ‹‚ÌŒŸõ‚Æ“¯—l‚ɍs‚¢‚Ü‚·B

+
+

¡ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹‚ð‘I‚ÔŽž‚Ì‘I‘ððŒ

+
+

ƒzƒXƒg‚Ì‚Ù‚¤‚ªV‚µ‚¢ƒtƒ@ƒCƒ‹‚͏œŠO

+
+

ƒzƒXƒg‚É‚ ‚铯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚Æ“ú•t‚ð”äŠr‚µAƒzƒXƒg‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ªV‚µ‚¢ê‡‚Í‘I‘ð‚µ‚Ü‚¹‚ñB
ƒzƒXƒg‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª–³‚¢ƒtƒ@ƒCƒ‹‚Í‘I‘ð‚³‚ê‚Ü‚·B

+

ƒzƒXƒg‚Ì‚Ù‚¤‚ªŒÃ‚¢ƒtƒ@ƒCƒ‹‚͏œŠO

+
+

ƒzƒXƒg‚É‚ ‚铯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚Æ“ú•t‚ð”äŠr‚µAƒzƒXƒg‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ªŒÃ‚¢ê‡‚Í‘I‘ð‚µ‚Ü‚¹‚ñB
ƒzƒXƒg‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª–³‚¢ƒtƒ@ƒCƒ‹‚Í‘I‘ð‚³‚ê‚Ü‚·B

+

ƒzƒXƒg‚ÉŠù‚É‚ ‚éƒtƒ@ƒCƒ‹‚͏œŠO

+
+

ƒzƒXƒg‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚Í‘I‘ð‚µ‚Ü‚¹‚ñB

+

¡ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹‚ð‘I‚ÔŽž‚Ì‘I‘ððŒ

+
+

ƒ[ƒJƒ‹‚Ì‚Ù‚¤‚ªV‚µ‚¢ƒtƒ@ƒCƒ‹‚͏œŠO

+
+

ƒ[ƒJƒ‹‚É‚ ‚铯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚Æ“ú•t‚ð”äŠr‚µAƒ[ƒJƒ‹‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ªV‚µ‚¢ê‡‚Í‘I‘ð‚µ‚Ü‚¹‚ñB
ƒ[ƒJƒ‹‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª–³‚¢ƒtƒ@ƒCƒ‹‚Í‘I‘ð‚³‚ê‚Ü‚·B

+

ƒ[ƒJƒ‹‚Ì‚Ù‚¤‚ªŒÃ‚¢ƒtƒ@ƒCƒ‹‚͏œŠO

+
+

ƒ[ƒJƒ‹‚É‚ ‚铯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚Æ“ú•t‚ð”äŠr‚µAƒ[ƒJƒ‹‚É‚ ‚éƒtƒ@ƒCƒ‹‚Ì‚Ù‚¤‚ªŒÃ‚¢ê‡‚Í‘I‘ð‚µ‚Ü‚¹‚ñB
ƒ[ƒJƒ‹‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª–³‚¢ƒtƒ@ƒCƒ‹‚Í‘I‘ð‚³‚ê‚Ü‚·B

+

ƒ[ƒJƒ‹‚ÉŠù‚É‚ ‚éƒtƒ@ƒCƒ‹‚͏œŠO

+
+

ƒ[ƒJƒ‹‚É“¯‚¶–¼‘O‚̃tƒ@ƒCƒ‹‚ª‚ ‚鎞‚Í‘I‘ð‚µ‚Ü‚¹‚ñB

+


¡‘S‚Ẵtƒ@ƒCƒ‹‚ð‘I‘ð

+

•\Ž¦ƒƒjƒ…[‚Ì‘S‘I‘ð^‰ðœ‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000062.HTM b/htmlhelp/HTML/H0000062.HTM new file mode 100644 index 0000000..e147f6d --- /dev/null +++ b/htmlhelp/HTML/H0000062.HTM @@ -0,0 +1,18 @@ + +ƒuƒbƒNƒ}[ƒN + + + +

+

ƒuƒbƒNƒ}[ƒN‚̓zƒXƒg–ˆ‚É‹L‰¯‚µ‚Ü‚·B
ƒzƒXƒg‚ɐڑ±‚µ‚Ä‚¢‚È‚¢Žž‚ÍŽg—p‚Å‚«‚Ü‚¹‚ñB

+

¡’ljÁ|ƒzƒXƒg‘¤

+

ƒzƒXƒg‘¤‚ÌŒ»Ý‚̃tƒHƒ‹ƒ_–¼‚ðƒuƒbƒNƒ}[ƒN‚ɒljÁ‚µ‚Ü‚·B

+

¡’ljÁ|ƒ[ƒJƒ‹‘¤

+

ƒ[ƒJƒ‹‘¤‚ÌŒ»Ý‚̃tƒHƒ‹ƒ_–¼‚ðƒuƒbƒNƒ}[ƒN‚É“o˜^‚µ‚Ü‚·B

+

¡’ljÁ|—¼•û

+

ƒzƒXƒg‘¤Aƒ[ƒJƒ‹‘¤—¼•û‚̃tƒHƒ‹ƒ_–¼‚ðƒuƒbƒNƒ}[ƒN‚É“o˜^‚µ‚Ü‚·B

+

¡•ÒW

+

ƒuƒbƒNƒ}[ƒN‚̕ҏW‚ðs‚È‚¢‚Ü‚·B

+

ƒuƒbƒNƒ}[ƒN‚̍€–Ú‚à‚²——‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/HTML/H0000064.HTM b/htmlhelp/HTML/H0000064.HTM new file mode 100644 index 0000000..1871df4 --- /dev/null +++ b/htmlhelp/HTML/H0000064.HTM @@ -0,0 +1,16 @@ + +ƒ}ƒXƒ^[ƒpƒXƒ[ƒh + + + +

FFFTP‚É“o˜^‚µ‚½ƒzƒXƒgÝ’è‚̃pƒXƒ[ƒh‚ðˆÃ†‰»‚·‚邽‚߂̃pƒXƒ[ƒh‚ªAƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚Å‚·Bƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ðÝ’è‚·‚邱‚ƂŁAˆÀ‘S«‚ªŒüã‚µ‚Ü‚·B

+

ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚Í”ñí‚ɏd—v‚Å‚·B•K‚¸ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ðÝ’肵‚ÄŽg—p‚µ‚Ä‚­‚¾‚³‚¢B
ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚̐ݒè‚́AÚ‘±ƒƒjƒ…[‚̐ݒ聨ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚̕ύX‚ōs‚Á‚Ä‚­‚¾‚³‚¢B

+

ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ÆŠeƒzƒXƒg‚ɐڑ±‚·‚邽‚߂̃pƒXƒ[ƒh‚́A‚»‚ꂼ‚ê“Æ—§‚µ‚½‚à‚Ì‚Å‚·Bƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚́AƒzƒXƒg‚ɐڑ±‚·‚鎞‚̃pƒXƒ[ƒh‚Æ‚ÍŠÖŒW‚È‚­A”CˆÓ‚Ì‚à‚Ì‚ðŽw’è‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

ŠeƒzƒXƒg‚ɐڑ±‚·‚éƒpƒXƒ[ƒh‚́AƒzƒXƒg‚̐ݒè‰æ–Ê‚É“ü—Í‚·‚邱‚Æ‚ÅFFFTP‚ɉ¯‚¦‚³‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·‚ªAƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ÍFFFTP‚ɉ¯‚¦‚³‚¹‚邱‚Æ‚Í‚Å‚«‚Ü‚¹‚ñB–Y‚ê‚È‚¢‚悤‚É’ˆÓ‚µ‚Ä‚­‚¾‚³‚¢B

+

‚È‚¨A“ü—Í‚µ‚½ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚Ì‘OŒã‚ɃXƒy[ƒX‚ª“ü‚Á‚Ä‚¢‚éê‡‚Í‚»‚ê‚ç‚ÍŽæ‚菜‚©‚êA–³‚¢‚à‚Ì‚Æ‚µ‚Ĉµ‚í‚ê‚Ü‚·B

+

‚à‚µC–ˆ‰ñƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ð“ü—Í‚·‚é‚Ì‚ª–Ê“|‚­‚³‚¢‚ÆŽv‚¤l‚́CƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚̃pƒ‰ƒ[ƒ^‚Ń}ƒXƒ^[ƒpƒXƒ[ƒh‚ðÝ’è‚Å‚«‚Ü‚·BÚ‚µ‚­‚̓Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚̃y[ƒW‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+

 

diff --git a/htmlhelp/helpid.h b/htmlhelp/helpid.h new file mode 100644 index 0000000..b900b31 --- /dev/null +++ b/htmlhelp/helpid.h @@ -0,0 +1,59 @@ +#define IDH_HELP_TOPIC_0000001 1 /* ‚Í‚¶‚ß‚É */ +#define IDH_HELP_TOPIC_0000002 2 /* Žg‚¢•û */ +#define IDH_HELP_TOPIC_0000003 3 /* ‰æ–Ê‚Ìà–¾ */ +#define IDH_HELP_TOPIC_0000005 5 /* ƒzƒXƒg‚ւ̐ڑ±‚Ɛؒf */ +#define IDH_HELP_TOPIC_0000006 6 /* ƒtƒ@ƒCƒ‹ˆê—— */ +#define IDH_HELP_TOPIC_0000007 7 /* “]‘—ƒ‚[ƒh */ +#define IDH_HELP_TOPIC_0000008 8 /* ƒ_ƒEƒ“ƒ[ƒh */ +#define IDH_HELP_TOPIC_0000009 9 /* ƒ_ƒEƒ“ƒ[ƒh‚ÌŠm”F */ +#define IDH_HELP_TOPIC_0000010 10 /* ƒAƒbƒvƒ[ƒh */ +#define IDH_HELP_TOPIC_0000011 11 /* ƒAƒbƒvƒ[ƒh‚ÌŠm”F */ +#define IDH_HELP_TOPIC_0000012 12 /* ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh */ +#define IDH_HELP_TOPIC_0000013 13 /* ƒ~ƒ‰[ƒŠƒ“ƒOƒ_ƒEƒ“ƒ[ƒh */ +#define IDH_HELP_TOPIC_0000014 14 /* ƒtƒ@ƒCƒ‹‚ðŠJ‚­ */ +#define IDH_HELP_TOPIC_0000015 15 /* ƒtƒ@ƒCƒ‹íœ */ +#define IDH_HELP_TOPIC_0000016 16 /* ƒtƒ@ƒCƒ‹–¼•ÏX */ +#define IDH_HELP_TOPIC_0000017 17 /* ‘®«•ÏX */ +#define IDH_HELP_TOPIC_0000018 18 /* ƒtƒHƒ‹ƒ_ì¬ */ +#define IDH_HELP_TOPIC_0000019 19 /* ƒuƒbƒNƒ}[ƒN */ +#define IDH_HELP_TOPIC_0000020 20 /* ƒtƒ@ƒCƒ‹‚ÌŒŸõ */ +#define IDH_HELP_TOPIC_0000021 21 /* ƒtƒBƒ‹ƒ^ */ +#define IDH_HELP_TOPIC_0000022 22 /* ƒtƒHƒ‹ƒ_‚Ì“¯ŽžˆÚ“® */ +#define IDH_HELP_TOPIC_0000023 23 /* ”CˆÓ‚̃Rƒ}ƒ“ƒh */ +#define IDH_HELP_TOPIC_0000024 24 /* ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“ */ +#define IDH_HELP_TOPIC_0000025 25 /* ƒCƒ“ƒ|[ƒg */ +#define IDH_HELP_TOPIC_0000027 27 /* ƒzƒXƒgˆê—— */ +#define IDH_HELP_TOPIC_0000028 28 /* Šî–{ */ +#define IDH_HELP_TOPIC_0000029 29 /* Šg’£ */ +#define IDH_HELP_TOPIC_0000030 30 /* •¶ŽšƒR[ƒh */ +#define IDH_HELP_TOPIC_0000031 31 /* ƒ_ƒCƒAƒ‹ƒAƒbƒv */ +#define IDH_HELP_TOPIC_0000032 32 /* ‚“x */ +#define IDH_HELP_TOPIC_0000034 34 /* Ú‘± */ +#define IDH_HELP_TOPIC_0000035 35 /* ƒRƒ}ƒ“ƒh */ +#define IDH_HELP_TOPIC_0000036 36 /* •\Ž¦ */ +#define IDH_HELP_TOPIC_0000037 37 /* ƒc[ƒ‹ */ +#define IDH_HELP_TOPIC_0000038 38 /* ƒIƒvƒVƒ‡ƒ“ */ +#define IDH_HELP_TOPIC_0000039 39 /* ƒwƒ‹ƒv */ +#define IDH_HELP_TOPIC_0000040 40 /* ŠÂ‹«Ý’è */ +#define IDH_HELP_TOPIC_0000041 41 /* ƒ†[ƒU */ +#define IDH_HELP_TOPIC_0000042 42 /* “]‘—‚P */ +#define IDH_HELP_TOPIC_0000043 43 /* “]‘—‚Q */ +#define IDH_HELP_TOPIC_0000044 44 /* “]‘—‚R */ +#define IDH_HELP_TOPIC_0000045 45 /* ƒ~ƒ‰[ƒŠƒ“ƒO */ +#define IDH_HELP_TOPIC_0000046 46 /* ‘€ì */ +#define IDH_HELP_TOPIC_0000047 47 /* •\Ž¦ */ +#define IDH_HELP_TOPIC_0000048 48 /* Ú‘±/Ø’f */ +#define IDH_HELP_TOPIC_0000049 49 /* FireWall */ +#define IDH_HELP_TOPIC_0000050 50 /* ƒc[ƒ‹ */ +#define IDH_HELP_TOPIC_0000051 51 /* ƒTƒEƒ“ƒh */ +#define IDH_HELP_TOPIC_0000052 52 /* ‚»‚Ì‘¼ */ +#define IDH_HELP_TOPIC_0000054 54 /* JISŠ¿ŽšƒR[ƒh‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000055 55 /* Š¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000056 56 /* ƒpƒXƒ[ƒh‚ÌŽæ‚舵‚¢‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000057 57 /* jre32.dll‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000058 58 /* ƒo[ƒWƒ‡ƒ“ƒAƒbƒv‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000059 59 /* ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ɂ‚¢‚Ä */ +#define IDH_HELP_TOPIC_0000060 60 /* ì¬ */ +#define IDH_HELP_TOPIC_0000061 61 /* ƒtƒ@ƒCƒ‹‚Ì‘I‘ð */ +#define IDH_HELP_TOPIC_0000062 62 /* ƒuƒbƒNƒ}[ƒN */ +#define IDH_HELP_TOPIC_0000064 64 /* ƒ}ƒXƒ^[ƒpƒXƒ[ƒh */ diff --git a/htmlhelp/pic/__OLD_dlg_opt_notify.png b/htmlhelp/pic/__OLD_dlg_opt_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9cc117e26d406530e438f5c6091c6a454d0032 GIT binary patch literal 3514 zcmZ`+c|6oz7aucY--Zw}{1Q>tNFIb4!U);L6cdqUYzbv&@FJQSYnC1rveXz$CKaNR zrtCw;R>EXYwqk7adfuM*eg1m?IG=OR`P_TY{e18Fp7S|rHW$qJc_ev2AP~Pf>YN=2 z#6~!fKcJ8Uk8PBP#DU@rHMcV1q=O+sB4Yl~{_O)7cQDH31_&hm`Y&O7>+4{D;DmZ3 zt&kv49f5b(o&CTTw6SzBInW&)9Z5+^EEX%LoHZkEj@Hxdo z_uE?T&Jx?yxHv{J905o>KqUY^#LGd|>CZwi)xo&1&o`-r#r-aAwpZ{g zu}24)1t7LqG*Lcf-2J(s1G2t|53#-L&JvW*-iuM6k;i#jSA)Q-g3i$S`^Qs9Z@@hG zB0#}fu*mU4lH4LKvPOYBMaY|5ez1ES++qp+Asyw(p?1%;di>=0q!0DBHEgLXNT#Kn zBwkpZI~z`uxd;{-IN_UQMW%PdpyKV!{9M^oz?0)RfZu@OLA~YQJkHolaBDBDPb4a` z%h}c6kAVHCXIu$I+~ugmCebVa9Eh|9nhNFBqVCQ(dOLH z1jxOKmjiszp$2f|PmVS@R1F=0!y=j;mJOUXbSl7AqTwl|Em^K>fPk~UJrMmKoO+MV zPAM1BXC41w^JTp<77D*edSx?g>=!>-GD=6M>2S{T`o&dc`674qPj-*@*lAvZA|rcX z-Q;nACR%T5t1)aHmEt{z@VW}sP^lV99g!3ZKfkC@-uWpA^K+BgHfUoh^6TT?Y`YVt z^ElN~hIJPBq;!>I>IqdQrEKA-iwQ13MZ&o|Bhu}zr2IAfNn^)NJkswlX>l*C$^>?q z-_EDnMtCFljJXOAFayjP9p;ZdbT}!oOZySn}rR2x<(N2OXWeMRYcYCk)yra8&5Bh>_}b8KAqFk0dAS2Ds$J zUxa4X7V}UXv>%&3uTeZ!p^Hwl5fJxx`hcp7|_FB?pXBX zC`Fc5Ta{O6%9}iBC-EUrh3Bqe<(nSIA@Cgs1kSyEn@g!`UiMH`>0`uwQHmxM32Q>L zYe)}myj4`_=5?|=_00L*4YQx_m4p%<*%<4%O6!w{kq(d2kF9fM%cPzxDtbfqlF3!v#&u*|%zk=u@ZJY}R~7WRiSRA@Suy5{boUbB_)J?#q_fM$Oy+vjpg7 z`Z@V!%lwbA_itW-c`)W5mUJmmmMTR=l1wYg9Tc{Ty67d@}O|AP;84UMqhA_-Y$7u5AZtP4{b)NQ|D z&og~mdLHD(->Q@Ns5~a1)E?p5Z|BI{>=f_Y(#4ZH?bT*u3M(OSJ@zUjUZ0i7vYA?# zd~&3n9hfB^6sF%;G2SPvfa=sM#g!L|Ig>_1DX39GQ8>KQfE|2dM?>Qxu!Hxy59Yqw zmLEe!{F3f8fMo4rM7VBZM_RV70ybRuH-c^UB3s`(KRd33xYd;c`!l`4bR%dCP`%@t@`(hJ z8Ue_sR0e1Wk~zdhWsBs`BaGg11NNjM;sw6#ZChONfX%dxUCa{t#CUSrk%EmAVl0en zB>-w9+gIc5k4xfMp{yOznIkW_@7RwQm&CZD(n4c;RWR(OZO{0TUq0_G2cnNn*(=+x z$TOpxSP|>OE=!0e%}&cFEAow_q1B_5R-U!+)(KfIm7g@6LU-p~nNe^0q3y4#70QuJ zJPH4}zn5k6IUVYNHHBHFRM+A-=A0&Sh>8;U{?}fI(6^V(C;$E@u^yrfvq7p~cUB zlbqBLKK!NjGVrcJQS4)sYpWQ7p(S0Wkjk4iHiUL@-#pLz37tM)YWhdLt7<8l&*klO zeigJntojo_s0I9RRX4^=`_UdoX7f@dMM|Y*V9>VS>Zf6KjLuh+XukBV^=A|^vNxwx;0X^bl)3)U84&_>});vtASxr5Gx(R+}E-GGg-K@{2GpLas|S0oJ|ybFws4 z`WduN$&j*%z4#B`ynqxHG5==L%JpH7*F4OG#if~lILRCVY_>v37Tq2&_%)O4fD;Rk zS-OU5o=`c4VeCgY-j6kk`e~*{__x*yY6@>QyzTnU5gR#rR9#14nx1#>T?3-~wkB7| z$`MOuz$n-~PNmRy=G}0;FI*dXX}Ts?#hie6GswDbT&op$!5{(g>(^TCf+nT!X*P*t zGHm3bY5hb8l3EUsugYb5z0Qsw&ikGIBQy;5@wR?$tJ6k{Vlc5akM*)uOxef3agF{s z-hZ-&qJ`?l@K!8~x&BeSP9GI6o2oH6r7us+W@0}fhP&s@)(^cn9lPF(>OQ>m1PK2J zslTch6I+md|5Z<*?Qe8FIT&*s9?649e4vaI3eL#*4>#(L^S2kChGG9Px^Q3T^wfHc zRzY3(jrAanQPCu^4Wjl>E1)0Cz1GMs8pXa_Cb+<7$SQEj|bU z50KPj3DMEQsY|6<&t&qtoq$06^?SaqHFQkz%`~S+647glnTPGuHggGM#7=4XesW)H zFmB$7oe3{@0Sa2SzE?IDoOfTj&Bi$5DY;rxbY)u)BHMB3>Cyn1-tXuT?U%KvD3{H< zQ`^>Qg&oN`!Fkl2JW`)EZMc(;+&#*zUScQ>edo@ZnpUi;hc+h<2(EsgC-Cif6@hdT zeq-}N5_a3E?W_567#7pQW~S8Te|I$$HNykLJ0U_ADmXrOw?x{Mh>DLf zKOH5Nu%h1foqy^wh+F&amaj9H##7ghQ^4t0;v6z`WOPhZhOuS3ab|Ren+u09?gDG#eo z>$nVbvgCk@`3N*mC75?G)E8KON<*ElOh?XwDtf?bS_*b_lzWwNJf-d+yUY?Ddhadq}&S_LI#`GiB8( R2g4M|+~mSJve6aXzX9>ea037U literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/bmarkmenu.png b/htmlhelp/pic/bmarkmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe7dd90a423857f85ec16a5515a97ea011385b1 GIT binary patch literal 3122 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 M07*qoM6N<$g1ln_I{*Lx literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_abort.png b/htmlhelp/pic/btn_abort.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f0b101edadcbd568577e5318d5c797227b246e GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}{xdMd zEm&*_6pHh7aSW-rm3#g!Z-W94%Y$_dWle`zEEu1Bn}2eV=$;nuiXTj0+%I*VsH|Nn zJ>#Ye>jdVl7FB!)v=swpIsazmdK II;Vst0G7Qx_W%F@ literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_auto.png b/htmlhelp/pic/btn_auto.png new file mode 100644 index 0000000000000000000000000000000000000000..4774fb64a8c8a311f80572af294cfd8d2f700a89 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5}rP=HT}E0F&G|9?wM%dum}7+M(q zGcZion;ZocP4;wg45_%4d;TJ4g8>iA1?|!Xx7SR53T2Gkk`DHp{%eIT@pO6r{-COg z0=L1`d2g8+0tGuJB~CNeayin-Qotdywah^M=z%@uOJX)RU%SQH78JJn?gdu?ihP-OrB literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_bin.png b/htmlhelp/pic/btn_bin.png new file mode 100644 index 0000000000000000000000000000000000000000..86e5ca816e03d91ad08f2053f3c634f5e1c54ee6 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}7+M(i zUq3Y&DCF(w;uunKD_OvWfsHLOS;FAZ1A_*Jp2Hj=dIx%r2#Pcmy2QlDu+9{e5ob9b zC?L-6+pk<$RUpCejmLP>YRMTJf3SBdFJWQl(O_UW?k;z;;C@^MRNlx9K|0mFqA0zyoLj4DTAl0pUXO@geCxhs7@dN literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_con.png b/htmlhelp/pic/btn_con.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a2ee7b70d9087c3856a7329e7847e6773b711b GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}{xdMd zEm&*_6f*I2aSW-rl`P=Gz{ZxCEMcH@B$2`Ckc_y%f|g{a6zjviY~Bav9!~HPY2Q%a fGUY)7BhbL-teVSP?myoJ)X(7Q>gTe~DWM4fPxLm- literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_del.png b/htmlhelp/pic/btn_del.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1f49944255f162a30b1c3f5fde7e1198fcda64 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|APk>K|E0F&G|9?wM%dum}1eIR9 z0Qo_lE{-7;w~_^17}(enlO+t48j}w&BuO2xIOAYu93sga(8ai}y-`ww@v%h1lLyNh zOA@C#UQ2Gsk-8z5tm54}bK+d);A1^c%wpmMf|{7wL>L&hR4VVdpTxQmXgY(ZtDnm{ Hr-UW|nU+8& literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_discon.png b/htmlhelp/pic/btn_discon.png new file mode 100644 index 0000000000000000000000000000000000000000..80d510a0f4662a46dbb163992b2156e152d82dcf GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}{xdMd zEm&*_6iW4UaSW-rRoj1&w?To&C7y|Ug|r3ZMm~q6@AFTFaUFBnTX#V`<9)&|*6xzr z{Q*I%*($u58$%S*xK@>2Oi&N+;}iYFz*@`tFbP0l+XkK9*ItB literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_down.png b/htmlhelp/pic/btn_down.png new file mode 100644 index 0000000000000000000000000000000000000000..61588a934f4bd9282ca9e4c0a4c85baee7aa50d5 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}fXuU2 z6@fq@J5LwKkcwN$0xk?}Y>CMd21*AE3kwSuim@MIVeH^(dCT+AVM#)jg3t{gV>a&t p7HWDY)|IKfkXKZ-NN`|eI5I(JmCCXS=|GbhJYD@<);T3K0RUnvIFA4T literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_euc.png b/htmlhelp/pic/btn_euc.png new file mode 100644 index 0000000000000000000000000000000000000000..9e22e30b118ef324bf6a27a9bec72c8a33564266 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|APk>K|E0F&G|9?wM%dum}1eIR9 z0QnA{E{-7;w~_^17}(enlO+t48V?^haGK|E0F&G|9?wM%dum}1eIR9 z0Qt_IE{-7;x0asY$a_FRg!$rR8^=k!Gahii-!I*%;Ls(~@j5PbW-`n4`=7WPK|E0F&G|9?wM%dum}1eIR9 z0QoAOE{-7;w~_^17}(enlO+reoli_KOJERk_F)ru_u%A{2w-41?V*%+J>kc6pn3*R LS3j3^P6} zHL0l}#@X31D1k44NhOr$S%Zp`^W6hRYI=GOoZ{js%#%EyFF9zb=djt}uksQWb{-7| ZhT3B$;nO2-+yYv};OXk;vd$@?2>=fIMUnsj literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_mkdir.png b/htmlhelp/pic/btn_mkdir.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b9e493bd9346509b647a7d1314bebcdb448a0b GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}{{Lq< z+Y;vt6iV`RaSW-r)!P4-^MC@6OR)Kg<4ke88>}36{SOdzp6Yb)`}@M369n`-w(Pyq z%dj+)bLG3`tJ-4HG-Q%R9o}_2ubFJwy2IKfMUBTYt*F{>b@Dc=x%*q#6#s5H_^nm7 diLK|E0F&G|9?wM%dum}1eIR9 z0Qs(-E{-7;w~_^17}(enlO+t44kWrgGiYF#lFYzVAeq7!Aht@-lle4yD3p00i_ I>zopr01FB~zyJUM literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_refresh.png b/htmlhelp/pic/btn_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..86d116e85da0ae49b73acd0e0aee0cef17f98936 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}fXuU2 z6@fsZ08bakkcwN$0xk?}Y>CMd21+Lk3kwS!pIJCt>Pg6~kP}Xk6i!z-&eECObHvcC zpkY?;L?7m4jpIip@=R_Ro-5csv*CtI1>-TnpeANE5eA0DChd1mV+29gGI+ZBxvXK|E0F&G|9?wM%dum}1eIR9 z0QugYE{-7;w~_^17}(enlO+t4<}YSpG3XOK5tF9jE_fudsj!DPQHGh>mD%F>jL3K|E0F&G|9?wM%dum}1eIR9 z0QtI}E{-7;w~_^17}(enlO+t44kRWdusQiiGP7|UP->3mpPN!p)H3Bk10&Fw%Yq7* Uvt-h~0yQ#ty85}Sb4q9e0L$Vp(EtDd literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_sync.png b/htmlhelp/pic/btn_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..84d87857c26906600f49056bd1ad9b2c822d3973 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5}rP=HT}E0F&G|9?wM%dum}82$s< z3|$=izX3&EJY5_^DsCkUxG=D>B_>N4I6aqGP{bo4Au;3OoC_BMB-$GpPb4NdOiCnrypnHNUY`RJBNOU}T7&p)x5nuFVN(9)qW=pUXO@geCxNcRsxU literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_up.png b/htmlhelp/pic/btn_up.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4cbe9498bd66a9af3809e4c66bfd0bd8853d4b GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6M!VDyDMo5_fDfSXiUsv|)Ow58JVmT}qe*uL! z3p^r=85raaf-vLZ%#dK9AWOQVuOkD)#(wTUiL5|Ae}GSjE0F&G|9?wM%dum}fXuU2 z6@fq@H%}MGkcwN$0xk?}Y>CMd21+Li-5$-@p->nTGv}d>ae1aNgTiWC?8aQEQklL%m7SSF#f%D?o6AkahxPgg&ebxsLQ0OA-pPyhe` literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/btn_updir.png b/htmlhelp/pic/btn_updir.png new file mode 100644 index 0000000000000000000000000000000000000000..b5694fdbe1be9462202a1b4b19aa9af51b794a34 GIT binary patch literal 237 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 Ef-SO0$N&HU literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_chattr.png b/htmlhelp/pic/dlg_chattr.png new file mode 100644 index 0000000000000000000000000000000000000000..136561fb1a6e5bfbcccbf1a9c9e3478fd235fe9e GIT binary patch literal 2019 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 WZYA>6A3zoW00001GBK%`VH=UChSi2% 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_downmirror_notify.png b/htmlhelp/pic/dlg_downmirror_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4a0c61c43f941c386f2b073a7dfb715cd28e92 GIT binary patch literal 2711 zcmV;I3TX9-P)Rw%gy-ky{{R60|NoT6?_O9)A^-pi1xZ9fRCwC$olBDAHVi<4s+88?q$=xF za)D%Wfh>A%FunK6_dh~J{0LGXe`U!XvbrtFqO3;BhsSeA`N_y4^QP>UCzzYqV9%Ao;QPU#{VH=$>FKGaARE7T^5o_v%x); z%>i&(cf-wV+`*)J9!^C=N?C?;)SDAryy?TZezQSp91Ioi$#cLmu3xwzZ=<{QGd;!k zj9trB$~RSp?RXb)%h6Ds@*IO7PH?wNj9b)gs7?;?_Ik>sTl9K|ss=??EpCl>ik#=7 z)UU;rZ>Z*Lif>$+jC0HZ;c$QaXW6u?YJHH-Eb)prGyDF?@tp-rbGbaUp~a@)a*qMkk>Wu~kQ zszE^+u2qO@aY>snZ!?3GP^D}8ST|(JS_%`^XO~=ft|S&&Az8b=;2IaXaoB z?zcaVoc^5P?k&01WRM-V<96JR+i~9q7sdW1wG`XbI!59l+wIA0yU8_^PrDwM)FV>v zhGceRg)3%EbflrUAVe?UdfFAj+nZaF~;ZN@Nr`pk=xO2%g>gLw-ZTvQJTO>oIC zbb*t&MzXOkGH2XzlkMa2!_~f*E8!t!0Od57p5UtAF5hn=U3Hy8IYFvJ>~}I{psZ)2 z&w?vjK#%Ee^?)!|byRMD=4oCTgjA}jxkkwAYQeQi@i=a2mfCt2+_X5wWp@>GX$t|w zO#?R*l;&{7$yy;_k6T<>5j;5a$ls-=ArlUEmZCHP<_iRL;cKZ#-Dv&@E6?Ojx?2^N z_rUk`1Zkd$bdeqABznqRjjj}2Zo~bpyKz&jtIP%d9uyyWTc1rC!WRXoe-cv}B%o4G z6?zoIeYkt4RoolKV)n-c`1m*)@G|ZQo71s)7jfxB)0GbGeR1iRk@WL(eEIiCyi2&5 z_Q&Vv&&<0wDF4YhWnv4t>Btt z#h)`fA6&X*zJvx>bD+B)WQMf?$$+~c7+ zu$j!YDQ;|csmx_UOw)!;odog>N)9p3UD2O{Yb{y(EfK!e$QuEkAvnD?yB4IaYI11J zLb|1rU4i@YF~QwAt#!{o4%fr^O19b?;by~KaNojkXYFO(JreDgaXP)5OE0~d!}N%$ z<96J;ap#70G%Yz3Dr-zetZB*b@MK)>@2)x%2+}IJ^HBdc$1Mv|7M%&~MraCT zt0c_2WahiX`ylSbnV^PIs!TRBIZ+1KN8Irb?h)^8xWPJKa3)l41UBC*Tv>!bHah=0 z+y!Ssa3gSG2o+ZdNu|q$c`0rqUB|WgK{_cT6Mb4oe34L8SG?vf^_j7 zL-;P-HD`jm5#0S%3WUX>0_hdFshW6|W}FE&#t)vyCW*)*pr{htZN&aStBkxW#>o)Nwm*$L+Wsx8rVsi{Uk02tZZu z2hZ@{xC;TO#QC!$t}OJRu)by`02NXSYv$tXKDZYGP}Nh5UXLqbxjZYCEJMK}^m%yzoo1DtHDYP@O$ycbqV2fOl~lT^G7rLB z7Q(%8Nmsn^lqU4ZI3e6`jB~s{Za^^UmLN`O@FrppB(x{4&K3loipQyPD})x|zUi3H zz%@q=mcUIM^cP5Mvf???*`;K$onDW7*wk@5ZpZDoUkF#e7oL*x$K5jd1TW|RYl8c< zc_@N=gUIl5{@*9Ke?RSkb=)~zouSVO@-JB+$iBbk=#7ME$GMjlPRjce+)MqQHC(%P z2G=^@A;hT060u*nX+DaAE#ZrgXc5UcJhZwa5^vwvh58|MXtRnhI z)UtGAM8BbPF7FtpwrG{ZfEwnirEXoPZNms`TeMC#5CobcHm}KE7ErJOJnW8;m3zoB> zyI>I$Y%N$psc_MQK;i}5)i)KnGym`=BEo9+@X$2R`QLyo+4Vj%T4gHdI zV~A1lH(IpOq=UIGgYa8rF)iY%+jtTtX^M*>QtG;N?@iuD(rfz+52xNEo5TJ7tlu?x z4epbTpBu`Dm-BCpd&|e+75Q7-w@4kg<96JR+i^Q?$K4P2*uS#Zc23_c{Rh7Cg*3Ex Rljr~d002ovPDHLkV1kPhE&Tuh literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_downnotify.png b/htmlhelp/pic/dlg_downnotify.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a6670d0e56598afe86f825979345cef48c21c2 GIT binary patch literal 2856 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 ArvLx| literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_filter.png b/htmlhelp/pic/dlg_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..ee159e24a7a398034d55a4b25fce2ecb6c848513 GIT binary patch literal 1858 zcmV-I2fg@-P)Rw%g#Z8ll*aG-5#yEs00y>6L_t(|+U=Zaa^pA*MuD;p048&QuAU2M+86MT z-2Y4?Vk5LzrX9zkXNXR@C0imNKY|NjC6M0206x!eV1Fjgqot~`kBRfIul8++^KvxX ze};1iuZ@^+0-I9`VR-9!3wmDkML92DEp`2pb8ya~RZasN^k`_wMHigISMkrw&?M(Y z&F|7l z#`-;Tp2qBtWB%cDIcthj`n_=SIkd+qLnr8I*FsOQ{9<9>~Ob3J;= zSbqZN%dDC+9c#6mpU291K38(KZJo1owrriVbGB@qvvam=Z_9~^QX-=1;EJKWAn`ec zxBWohq#M;!&M4x>W&9o%hAmD2z9{8~ZE^9TzYu0lNFX)w+xbpA0B!{-Dp^5%HTbbN z2LK8>>U}$$luN-}A=6Hkag(()l;V-mrdq(LjTVERa;qzg-cnQzL^N(!=^SYv3hqw7 zXUKd%Atux!lSm_+q@5x~m$J~hc@l@)=6Y(4+!SvJ)3JN8{>JIt3tw1qG7kHvP?B+? za4!aTsZgiBzCAQ6iP8!xjFW&lrjCc8LZCn& zEbgD7&vBR2^rR&J%o9=d#N^Vd9zvVU>(Q?u9xHON;U)Iti4S5S7{3dA1Pe zC^hkDqWLQGw(I-Cfp0C)%j;jtiSgv7RW#-KoHSe9b{XPA_j1l;dPdIWlmX@JKu!wF zmQCJy(!{{&XQeSO=9IanaQe&vdES_`=E*{qQQq7g#EHD4Tk9!gHgEHp?#mA0|j^184pr>?3qPRf?Mo;)>! zzO%=or*T#c#w(n&Xk8Z~byJI3i=L7^u^aeR!s4=iahIEadf=KYsC$faBU%?d(Zaxa z8i{ja&M9H8#?&Q_Ly1obLzl!H#Uq@HXdPn?!GkyFEW1;Ur$tYVda*>juC4V??03R@ zIakp-YBr0@Qav$&<2eR;%rAKk506bxBG2t%$dDx~_a4r5v`z+r7Otay>Y==HYVa@K z2%dA$C|Mg^T0)v$*IXh>|);T+8%T_q4;&*SRJx#>}l4IRNn$?9ZI4ka%ivH(z+kf49=u~R1 zE^NVh`=(!=^G7*LXgo`46wbX^Vwbbr_ykUlG&hni8=Ur?eE4shGk)t_#VOBz%n25p z_O2sHbyEczlHuORoJMJ;}cDxUT1%Ff?h&Y1vZ?+$90=vFsd6{oK#FtEaKi z>I(`-RUf2Qu0>oaTF4H)tnXMNJKz1 zf@_>5MXP60?3$DOvrz97<|WNxY96-~zQsx5!6oUYt$E2FgPA+gF6WlbIc0_ifAA$1 zz2vkfKR8Jx!)k+5Kbx%^|EKl6bMA5ex%n&qZE)7b9k*NaJ9Ae2p@Zte9^$O|69!K% wY|h!XbRw%g#Z8lDJd9?z3+#tE;RrE11?EKK~#9!?b~aP+At6RU|W&@JB#|CZZD85 zN7xHks<{7EIuAcdU=s@VMDi@8AzGrZV~>qps>VZvQm4xS;tQOuQ?(^N!1?PcKMv+} zSAM2Ht|mKA;Wpm)HSyQ?&M9{qlS|w}})tGjYKA$vt`b7$3t2d5fU;q-l!9p*N9S)J8&!aSt1{s|eRG#W?U zbls_1I4z{Ja2n@RX+rWG*H*wmuW0Xd!RcJ=j6Su=d5r@>J!jGG&N*&(bYMOC&KjJq zS^q5SC_1>nbEjilvwAPaC70$S6T6{{;B?k_oKN#+?339z?^cJZR!*KbO_sxO@Z=Wr z`zJ>}9~my^;`7on>V97GQzF#N!9IVAkB!Z+kViJHNa0f1T6uoWn7k!!U?*PSZsV^ic3nmq}glDbG1fn8^u`a5@ao=pvn< z!b}FIg4Bv^cgkj-&x^=90wv`WALyJEQN=m${APE)*4Z|?vpe~$&O&EzES#s-nY$CW zPTA3&-6=V`^UY4))tT{&1Q?_B*EJoL(n6eP)ag0eEZOLyRa(O}o7gR#I0wwp>20|g zyeZ96oZe>XYZ`V$B^q_@gg$Uu?~M6`++yp?b8?@gqpvCP`LvcQi1UekK$=r)>Yo~* zeB>W_PK!1kkQAmBTb`bxoMeK7Vi_eAugMudxptsS`tM}H3751u({ZmO9_$s@FlyNCJReF^* ziIj0ZwmAO=j#GNfN>PgQr|3?B&h6jQZR&h_-SM^kFWA)i^c$aZN{H_4PRY@oFLw(4 f4=A@Y-BIEnROLpIiT=T900000NkvXXu0mjfsGQY> literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_hostcon.png b/htmlhelp/pic/dlg_hostcon.png new file mode 100644 index 0000000000000000000000000000000000000000..c98f0fca27e406834a70c8d3af1ea00071ed3a58 GIT binary patch literal 1398 zcmV-+1&R8JP)Rw%g#Z8ljJ@wA@3CV500inuL_t(|+U=YRa^oNjhULKru-iRArzfDx1w7N- z|4fU7z~D!M9SkIkk|vH5!slN?f_Q2eD>Q&lRh|9SRHcPk+lQw5bF0lNr|S1VGXcQ8 z_fy#~N0r>63K1s#T9aMQ^~+K9wV*;(U`?fort78Jr83H_wYv3}3q@2zhj&W_Wc?l$ zYDF4eP6Z=$n_Bg^t+>izznIfu+@GIUHE)&BYA1_=Vc68_a;!Zn zlPUX^F4Km97f^j0`-+;$U`*u*ESrj;_W4y+_EGJ;y);9kYE+G?HfvO8s6M_cu%8tb zl(%k!N*1@DHI*o>)V5Xt5`frbA*yYyN>eqh-dQVIrB>yrUQa8b3PHi^sg}YSvpdE?M)TVQn z1ll9?4PQx-n~LK~BS_N``iXF`V}Y+23UM@J9<2mXAplrOFrsO{iEkT1IXx&H6@N?; zk)={|VCRf>xzNgb&{D}FR2=OlgwSlXvopmEV4_fvTQAL`{`*j*{=8`&{O_q?YbN0K z#SXReLvoW!`V8xlB{w%O*Q!b?UZdK|EI4aA&)SR%^hq@*S~SjVyz69Qxu=z>GD-+b z#XZY8!%Blgvp#9zxLr^Kl2d_lT5)ed;qh>kRnlp79o4KA&tFihT`I5eTuVhh@;!)~ zYbwa#K}peW_;f_OXcx0T!TfPVgK-@;0w-U}XlJ|ojS=0QRq8yId`u<9B~<0?m8k9n z>6v%ZP=$4nO(yUA9jKPonMiCQ=JLlC7@w@Wg>7)HRyMbrbquF*u0P&;vx*{>l5tcd z3r`OeRYnIO<~3MBDj|F-3B{;nKqY;u+#Z~(vlLu@O|+YJHCJG1cdF~7-MM7Pw#!>G zrA|`8&dzMVGnBDcqS~s?B6wO@;&ov}9SjR#E!DXas<1k{vTO>mm{%@ImdS^;S{6Xz zRcDoIk@X~%a0|nv%j7gvvsP)A$%&}!bf$<0=j!a0W&4zHnH*2WcA%T2N~NNDVwrrH zs+_$L6`vop^G$OO5Hg-T*`yNQ*(LXDZB7aAP)W0_lFU^Pm8yvfxY&Wy3KA}0p4O^P z4^~Kpi{_ffpv_mp{1{V7zAA2ws!=tnM%AbqRikQDjjB;Ksz%kQ8dalu6RNQSTTy+M z7K+4LQq^RQs!=tnM%AbqRdK4}$iJFuXexkqqt5Nx{x^Zxi z(NsF%!k9}=rGvj4MvCl?_#&wEN9~>HhB0jUEERy}!ux>VtzQM2-Pek!SZWB=PT)aA zLd9@n>;kbKX~hx^bn{xK@}SvVIO3sJBV|8L)P=|MG!^*_JHcKcl8Sa4s*a8(F_qz= z9`FyMsn~-k?~qTJ6>s)E+28dakzPF2MPYZrFKW%m-;Kg1uZ%(-h;mH+?%07*qoM6N<$ Ef)qKJ7ytkO literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_hostlist.png b/htmlhelp/pic/dlg_hostlist.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2d15a335018141d5ceebbf6a60962b9e061aa3 GIT binary patch literal 2794 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_hset_adv.png b/htmlhelp/pic/dlg_hset_adv.png new file mode 100644 index 0000000000000000000000000000000000000000..02dc194049613f081f4c8f248247f16f54e25e8a GIT binary patch literal 3514 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 M?Ma(vtALb$13WVuh5!Hn literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_hset_main.png b/htmlhelp/pic/dlg_hset_main.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2cfcf762b4c1a9ba1a7629a89c2be6441581e0 GIT binary patch literal 3864 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_mailadrs.png b/htmlhelp/pic/dlg_mailadrs.png new file mode 100644 index 0000000000000000000000000000000000000000..f243837277dbac3f6c41feeb778dcda9344c89c3 GIT binary patch literal 1956 zcmV;V2V3}wP)Rw%g#Z8ll*aG-5#yEs00$UJL_t(|+U=ZccH%k=fUN@ykf(P6bMDFF;=a4GNdO6ldCMGDnm!e?U*=%*Y? zZCc>G@atq}X*7ZHP;8(P&eD5SYxL$b!n-u2Pa!K-I3zzSU8)?|K3m{yQ99?*oUdI7 zFUb|>$E!8BAXCn^rE_-9mZfuc&X#30C(fK>f`v6WA*=ugl!2%J;WF{jxKF+akIR*q*&$pRazK@gN6xa9(XX*CgI)=Z`uT9yxSVpU;p zQq`xHs8>K+Bb;ag%w@PkpJgF? zk8z4U25kYE=Q1ayvmJ!;F)wAf%RbRRNcH{ABpCY%RGh|Io`oqV=A{gGZ~|DqpvB4? z^)g&@LRR&unzL{wOShfd zPd2ciDn^D!Z)H7N(_!f6h;BZkBp(v$3{g#KJ*TT5`NUeWbWu$i`is!kBj@%FF z&6TF-WPX6z3{f84WS z>_-sWJ#FQzl^Hp`T;;^D#MM;++~U;Qp>`|1)jfx8`pj&cytFKuB;%au6Sdi;t3%Wa zPVQyGqyq%M!MvC4oV9ZANQxhDvN({@-Ddtmm8j~Riah_PDx+PTw=4OL^2634owIXx z&NqFDr$UVGKHlSsFn(FFQ2WPvfx(EdgW&2U{-GzP!>Mqce=NvAw3W8(sI07 z#RT_t6(`4`+2b;YqKX=;GpxKJtcxK8%^rv>*-Pk-@Z>W;pnVu-+Pp$PCvk-oYSZ=R$9ptafp#yv|@`L%f^RB zd=X+1amWMATl!JtbUk_0*gVW^oWZx0?t$8np#D9Er_3>x0Iq~@m({s6egew4A!BBY z8q*LMV(GvLR=p%ea#&fESTfR!SzJwXGSOnmTgLe&Wmcb8%7-|^+pf)Q8`&Hh<07%W zpT{|cyyiq7WOC+BV6qobLfPHmkS-j@8T8?C7hfh=961{XiY0@k`mP~O>9v-hr%%mM z!qPk(qJ%bOudCh;0Nbnv-GG$`j%;_RKg3-)jdm+0$~OnbF%mH>lK{imp6~1sJ)lpS zzJ(J|=S`W2Z4lAD1hZt(C!lAvA||(sGcMmPG;9-5*dnfWRAm}heP&&)`tIg&oK+|@ za8|RD8AV(JOt-9U1~`~g=SQ#r@RSpI)?bTbsq)7NKbIMD(=)lSNR`jl^*%BH49pzd*cAm76+ z$8xGRY>Npss$h>U^dsMzc#LypKdQTV2tnGD3!G?XJW<9`+ZFi}UFFmpEIM q&e=Izmd^Qf&PM;S;&k?V7x@eB%Lw~U__px?00008+P literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_mirror_list.png b/htmlhelp/pic/dlg_mirror_list.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa25fc076e80e1fe7b6a72250d1f20ec37e401f GIT binary patch literal 3329 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 LNkvXXu0mjfLd&pV literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_mirror_notify.png b/htmlhelp/pic/dlg_mirror_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..80dd6dd7fc868b89a38cb80e1ea40f091163f6fc GIT binary patch literal 2907 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_disp.png b/htmlhelp/pic/dlg_opt_disp.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a95d31bbedb84734a1507d35199f382b2f5729 GIT binary patch literal 3424 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 X&c?hhJ!S6Xzq literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_fwall.png b/htmlhelp/pic/dlg_opt_fwall.png new file mode 100644 index 0000000000000000000000000000000000000000..0eef954592f17701952bef192fc136430bc15969 GIT binary patch literal 4887 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 JPDHLkV1gg_MHc`7 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_mirror.png b/htmlhelp/pic/dlg_opt_mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..6a509fe371a3577567dceb090611c38f5fa197ee GIT binary patch literal 4574 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 K^`7cFll}$9dT~qu literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_notify.png b/htmlhelp/pic/dlg_opt_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2ca03a8312fd475d9ed7e6cdf0ace3718c8148 GIT binary patch literal 31469 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_sound.png b/htmlhelp/pic/dlg_opt_sound.png new file mode 100644 index 0000000000000000000000000000000000000000..321d84ea24eaab8fdeacdd784cc5a535aafc9279 GIT binary patch literal 3275 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_tool.png b/htmlhelp/pic/dlg_opt_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..557bdb1bf03699cf79641472c8e009441f49ffa1 GIT binary patch literal 3805 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 PodL!M=8y_~7tB8Z6Zyj# literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_trmode1.png b/htmlhelp/pic/dlg_opt_trmode1.png new file mode 100644 index 0000000000000000000000000000000000000000..6654cefe72d0a02dc88ac86ac402f085d2cde529 GIT binary patch literal 4593 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 E3pqrF3;+NC literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_trmode2.png b/htmlhelp/pic/dlg_opt_trmode2.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1233b031bd740eebfbf301b4247af39296325a GIT binary patch literal 4267 zcmXY#c{mhm8^&kDV3;BMI+lbiA!RpX8DkBVwNjRB5#pdRjD65#?368u7CQ;YR>n3? z_9c5U_Lv%5D1DvlJAXXa?|Sb)@ArPL=Xu{GYbz5DHX$|u0Kj32HL?W&fT@2<0|Ne| z*x+0R|9~af)Y6z`3Iyij;kySJIsPND24Ec@003g||1Dsb_qD5kM2IKa5)A;Wepf1Nm&VC(MY)0 z2*iz|#L9j@v6Hqk8(%Rj5xt|D1UFk!{sw~DO0*}$ef$24jZqGsKDo7Eyr4~vI&CMw z(2)m&qa@^$-(%i%9YsWyfG17`vT+NdEm_gg#~1W0`Mb9=8=3q97g%R#HFd+2os398 z>YIJDzrOs&3^%dL&4p0K_MU0QG{Alh4-|Fi;~Ntw(cjpCN3~R|?hP8$3b*z*D18rQ zoI=ed~Lq_0OT$PZN}!$Jsn$^u8P6#I*+G`|GiyE zIKB81QO&jJ^DFp3m8ObP+-CO{(%g$>W+BfvH$g!BuLH=l@Qwa zR1UYhfpU$tXZ?l@_w7~-QO$kzY~-1>qx{yM;1^H8|u(7J3(Z#4zr!daukb^P-Y z0kEhj+dkOb6@kx%$SIA2O^>?vV$=JBMaNrZv4KE? z79k=}!4phV-`V*+Gy!ceUU3Z#c_w=s#Epe(G8rj3q3gXvq+MiJ^rJPH1mv=c!pQ>3 z)eoM5wbVNsFzY8mL?qz6UMxf;hE^|aoQC;OT<0tLF4h;>jQ={p)vj?nAIK^P4{D4Y zDOr|ddMgZgjx?>#gG>>Oyyu=@+B;hg&U^h8==l9QLIDM;dDw&ck<5$G1eIQY9erB_ z_+9|-<~Rjq_IGf5QMYzq4Q4+v?j!hsHC^6E>w2YE^r`6h-5t+YPb*`P^Pa=5_H@Js z%(z@u(88Y{0S7nTgQ0r5oj5+)b<~Z8_N&~yA9;1Gh!H($^XS?^($kPRSiwR z?{)<(n={BU7kejCVhpAKsaE*dvV~Zc{%(nTaA>xGotoWH;#qS^a0MgbX2_~Xf3~ol z+CzS_|4%~rr?lR)T6Rw%d2%)>=^rQ4%;BLmtP+7=?(9H3A1!&kTu$yEDj zp2HgtHZQv7q~OU*4x$&f^4^P9cdf`nmB47>j;@+_jKdrCmB@n9IZ4615R%a)rejT` z9Q6sO^}~~hAmYMf(FthL=(Mzzl#->T)XRDGgH7yBmo|y)=$E`RV_2~SgJ7F?AY{`x?gprLAkcBw8)b@mT@p>!%A|n6L`j z>@g@7(Mw4#xjsdl-vwd^OSMv%k=?aY#_V(P^FJo#9&hz=lPr#We(F|xL;5dBJq>=z zrP*j_l5C#xp*AO4cJe(5d0J?%KAPpShu|zNuZ|RDJ$>}LfDLNh?`+)wbN8BT!rcPC zO4%~m`-H~jns;16VCgppJhKX(RydNHFjML}WocAh7iL@iNnXVZobsqF7!up;H0pDm zQRh{m4i4(h%Q>r!nqhWyUC`;QX-Or3n<;Bqhu~5bO_WmxxK#Z=9Qh$HgmJy8|6UoJ z3n$2Y&cNFjknST&i4`N>&Y4r;Y&zQIGuC|#m{!ABRE*_~-Fx_r=6k%5jYt-t1Pe6X zK2gVc=s6b=?YVw-6X4hW%$pQ}$Nw^i$rVXxAwmX{qaIykyv?~GgFapEH~!4_5s8iT z1fpwNb^}r(j86X{IP|Aq;7HDaa{tYj=8B~D=ZUh7b0bo~ftUv zjvQ9tXpq7?VE9(gWB#jgKSN})2PI}Ns*V9n=EF$C#A%t=-w*2ELTPFo%Hd{y6v`%J zg48rxTK|Eds8;hT_$igS?*+T;syhpUYPCo)5Q=v6w~<_Zo4b#in<3o1sOs;Ug%rs* z3M9l*#hz0X2u6!^psh-+?0UQj1=&SgpH&J^d7btX-F|M?{y^o-!2D*N+sKt;q)2bC z_hrxq%;DH;oFb39Vfm#Auk|RiQ_FmX>#RksufgZC^tUyJKL_lVugKFM#4C1jiW8k7Z3_$z;JBGDE@i@L`>vyk`hv>V)9LphBMc1PP zB25itk*cyrKIdAEiI-=@?PKD|C|TP)N!3>^koi0VQflx!LCOZlF`vZFb1qOCP%Bd? z4c_F__d0-Dx1%@w4tj^5WIX~ZSQTMOOUO#*+&-{*3k^)QGgmZXP)24v+0ypE^DlHG zam)H1?L<$6J)lZZ`8s?SE99L%t8Soz4L-_L zS##82rNUTcI=>dZ{4RNJTyal?Xff5VzG7h?Q?uk}_%IV>jvQQ(F;1ZuDkNsHKlg`x z8pB=?ogECSdoMb=FflS1tVqn_Dd+mt{d+!cr`RjaZwO~<$V8z&9U~T%o9OD+&^L~? zT&L>?93n`W$v`NEq{5#l*ITiNu5iReVb+wGb;r~zC(Cytw(0qr0yiUT<`{~Yh4vz< zo4g;wj}=8e6MwtB#=g5C-Bsr7Nz3YG;gw0qY-7OcDBopo7pXn|?&fq|5_+dH{HpYg zTsR^z0h73H=H$#B$bo%y5CCog?GIP^j=~FywUO0Q9I|*J`iC9ML+gOz1j8)?ihFKU z;*!D^dalpA;+(GtP3<>l6+GMtL5f}OF_C%r*Ueve4s3Su?5tijCaBS-k#|`0Lz`d~ zxW52El_D%vqU~@oHDEnzz!z4uHOjTaYulx@3Xqn-?&me$*`u_TZ0CR9Lxibyi&;mQ zI3xA`G?r9c2rspC1lCR2X$`nDVYmL>&(x4O?Q;90+H%xE73Iz52~VFI^}kd>p$Dh0 zf0&91M0og1ab|QkW#Kyjr5(j}4kx^tt0O3o_UnzKOx1}-IP|sJjHM_!AfPNP{A{XM zhWf?mXVC)!?`oZUHi^564-t8W@*<};rWs!oJH;dQSC4cN%1XhExB!$nebW;!=+9zBT_G?E+?4{p$DJV-IoT?8hVl zCx(cgRP(e`hkF}tsCL7b1Z<)zDE(j;QWM|iih3L_CvCR>40)Z@)YUgiHVqwtrcYP} z2%TuHzCex5iBcyWMji^Ya7pFbMU1)*!MKYRoYZb5E27%Rp8UL{?`p^sXhCbTAHfbY zRXFXGwembA{ImacLTjn3c^Fh}(#E6mE#YQrg_J#^hD4V?X~;3iLDGRGy0{nONj%HG zwN(#pvE6zZC4NXTLx}ob#~l>DyEAEyPIdl!C}`7O{8u{^t1Ht7x0%UM2ZH^HqlK-F z{40Vh|DVO~JnkAFUBtO8A7xlyel^`Wpv8A#c=o*E+RVOb!{>Iv)p6!{cN4wH$L=Lw z&0k|;2w%xedR*FPsC$jK_S&^IDw)5u7PF*QZ5&A+-i1z`_@4oigl;wo1 zf8CpAG77CJoBG^%xKkO`&rW<_$=kR$tM}sIyPM*i%#SboETkcsYL2?Y5^}S;l=$kj z=9QRnDRC#RrY5=aA#XB0dxdcxZLpracz7f-n$qLW+vj|!JS5pZANi#K%}tp#C*%v# zA|i3xi3tQdUt0dA$>EaXHJSM$R%uVYwlG`}Vx%u4HekK0K9;uA72RMzEvI+KZ)kz6 z=Pz8+3d3Hl1C?$oo?i+gx6zOC&G=#)l*I2U>RpCv;l95@`~2JY|2@zC15;m7+c}s& z7rgE;?!8|<2PbXgziXob9H(4E`}OTK%x!Tkl1E3E$h>-AV0BA7GUNfqUeVul$C8j($snicxLz8L?1oBR{xTdXuZU9R(_ZWiYKRpcG*YM{pxW^$-gqXy?U_(2H(2=XS3y~m@?5lq}xF^WT@eqUs zV9#Sgpr%Z|-OKR9T*U62lf_}A(P;7U@$>WZ2L}f^w3SuEi$Wj}KLc-$b&8q#ReT|W zr7wuN`;%=N_-6Onw4};24T|U&D5q-WMlPc1YL-fBGt;^sp7L()oH|SXrGS|d_2B5& zPt284AWW40;^Ugqntt-`)(i?Tm1KSSth*rcQ>uFyg<#!ea5(MPk3D1MqG^#kzJfYI zy?sp6+s=#-snC;v2EB)S??Ziv+s5-a7z|PvDgmLX$&T;6FM%_g_iOg=%Sxpj2vag|h~jqlDEl(!BPeF_LhfIx;kxz5 z#j}OFEl}Z)RCTJg#j`^QCc*aUv0n#&e!KjsP~miagc++TwRS+sqH>OFE^uH;{AjLE z_EX91dG;H;YqyQUUbqA0(XI+5e#IfIZS=+UWBk1sO9|-F^ZbNUcwlk=%UILJd0m^B z4cq#Y9(OLCrQG)V+cBW%5W*Zxbv8#you$wcON#uK^c%xpf4ekrcnMX;E5gxIyO%!) zJ;s`0YIe#}wt}BRuqWi5{o$~$cxTGd*Zc%SL+1oT=nu;;kBYp`#C~SCi9sA>ykq6x zFSbA+!|rx6l~c!ah0aqRQjX%PQMXYe*0&?H#uQ0n^)BFK4wnnoEQD110(RN57D^0B zz8cvWn4&_Gt8OdPDzKRmAT0s}gp_(fkUL${eyF_$F=eDwQW*3$$VOMhb^xQ)SH7-~ z*Kg!{Sn0?l7kCa1$iQH|+itn4WH~XeN+4qc6F`(?Ml?OB$+W|k?SmB@F>-!?Cb?D{ z^v_vxCxj5&EIBa(<_L_KEg+Z=T+9DkWsK}`ZFAxcvrktTi3&(G=jCQg0~#aP6}{8y zT_ud!aHzMq!jD|sRUz{DtLZn%U99&Q_u}a?l`dWqoD8*RAjvsy;GvTkt4Bzl9dTi{ z2}*4diB*O^ZoC$4XstEu+*6%faF#M?-%}r4312<12+NDjtD02hi9nw@^=v1FeqBY$ zqTc&zyrZ-sy|xK-A^%ixZ}0#bjpEDrx$|54_P(9aInh4rfUulyMc?|?P{Co(l7q3c zHlX1yxAggFplkA9wxuRJAHzoe33xZAM)If)@NI2c3_>MZSHXwoTqmg>!)gz2__mg9 zZQ8>NT_ka7+5ZINPj;A4{1HWo6*?Zy9<7PjDiNA|jEU3k0C7FGv`V>7B}x)ERGXIM zE@N?J{hWM_4xjLYJ@&nJ&jyk=ibtuwC!($2eH1-zh#bcw2-%p_=kVeXSWB%%u|_K8 z-K+UO6VB;$^%i6N*!M{T@pPvtqj4VE+k{E0)L)tv7k`|Sf5LyuOi_SBSZb-2s81az z7f+|hol*}=yzCx+lkaU~6YK~abd3}ecW9zBE`OH zZCmR^bL4QJYjYj?^)3YynnNcaGeVAgaj_?hL&nZJLase4m#}?a)p%8 z$pbwqT@et!ZZKK|OmG!uAP`VsY8Ukh<5! zn07Zo3Dv`CkL#5=aP_xqRPN(z=X_WNsu5gxd25NJ`w~u)FSG33h<5D)w@iB7Zv7z= z7_8Rl;neNws-EI$t{qv=nd>z<{;crxg8Z+3WmqX!MgVo=#y~Kn~!rK5~ zsh{8Wh<5zLGsZ>A`1CtRw6EoQGoZQ=AvIsAhzhT+WGV8$EeFWdyp(^nd_x)8EeHv} zl&`#!|M7zggFAU?!m!S19tGX@5_a3QCyI5I%D{A~#yE-42u+HZWHX1#@2tGFCkE^m z-fthYN z$>73%W*Nf63s=Q}!j&q}P(geAO*_TsX{A$cA7kgcN*(02QY_m;^h=Y~OvGL9x&QQr zTrP#(Sk{c*MH8#9=NKOe{bJ!wdB4@dD-so zB3g&`aFuJw+n4D1xm(SYmvv=S)|P8{;>Zk?P_(chbMPLc*Kf+j>U_M{IKC}jPV{Vi zhNHn_ukVKG4W#3>sOWDSpdRV9h2j>FBMJ$~neMaGlubB8b{>PLBQ4DfZTVSYRZfCC!= zGY`M$nHpGjt^3y}VOD#PN_lLwdTZs-uV$0owfs@-JGDBB* zj3<_yIZjqX{=o$HwLe1KD78}u}~rr?YJMb_f0arSoMqex4|@;ZCbJv9W|@->rzFX8uHH7!sSA%F^P2P zITWNh(!Ws?X$2~49cyiAtW!tc0e2*X`=h`q=NGw&YU%rRz=|n1;Z1vMbD#{272*SM z{XcE(PV%SOu@+v%d_yQh`NOI&G zX#uQWTO$e9zC>nj_6C=@vg*P*;0jL;n5^c383FaGHDz?8~med4W6H(}*#RyjC-( z)c5hg)II8e{M=U76KxA50SSp&vdc|-6u0}pk{WLdG^J@^d>p>PzWPpO!yeX(wlr2? z^Ws_t6q#!eZhdDKPhXURIo>i7+wN#rdykcwX2W5195(_h?r zlXjfX2SP1?7Y2V=>0HvGQ^NLGvyq`bj7#_Lu3wb{eoJ{ukvHw!fg=&wEmWZdAFv z2?+WSuL$w@1KZ95!WrkNO*1kuUyhG-1$moKyJ_~ar~=L44mW9rA7WyRzLI>E(=txR z&!aI~d}aI5OgW0R+8jU30GWGJR#9a?2cUkF(PeiF!Sv-eFcb~uL%>N}gTk2|fkX+9 zFhtejzP!L_{h=y& zES;ww^+qu@L4-t8FOiBhgGjFMH!{5c!AAWd1cncfz1~YHc{{Y4ZE*<~? literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_opt_user.png b/htmlhelp/pic/dlg_opt_user.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7bee1a86096c537241a5b462ebb8fcbd2caaad GIT binary patch literal 2676 zcmdT`i8s^>8=f&U&0-r%gNRWIMOh--Fh7k9A!~&!$v#N-ExQOYmQchDx?PuR%ibW_ zrYvJDSwb?_>qBZvWcl24zI*?N@0{m7&-*^-yyv{21J56 z2n0?)Dm5tNNHGg{5;-DxfPt|de4GQqCy4QaGIx(8q%YCh9|RKb_`ATJ9+nnIBGe5q z20);ibk4myu%nsR)W}lrh9T`) z(2qUb+X36eYNZVhr(k6d$JdylCrp1Awm7JUKGn&iB}^94gIBH|XDLU?;8VxOYu@_D$yy-dJW6ODL)z@{%~Hz!MtXD(aAh<7qb+;Hwh&%o?7l71{$Eqk9u8@6wDU zBCxH47bC;*8aKm*5Dzc;x!%BI^*m!O5y$Cb8g3D3;7I+A@~7=rMD87^OL0i5zwy(j ze|yEjL9L@8el%Yx(hdNU3FpwcIsu1@uEQ_lWG^C1W$KS1N+qh1^M(S&lh@Er>`;&b z4t;LpcuEM$4N+v9E8Ncvj+@g++C~@^z6y{peH<~|5@0#Q9+UyodmUF^9!HsRv?sIlErdypvK7vefqgh|k z+c#cgyss<%J_EW1yC3vjstMlJ(=+qi!?p!yZ0ma;1>rViEG#L;u~3Cfc7jOxfNQKg zV<>iDfE0RnvH|gIsCw$E%QjW~tfkesr^^z5mz8B>c@7B(a~NInEqKxCB>*iekZiX5 z6-^A6;Yn7E^O^XVO9kgVhS6L6$}?)MZU&+JAtUQc<0|_XB=UF#&p&C+I>>Qm*Kh3G zvpw*;IN!R{{9wP26O1frTvbAvUP(nT-tVI@<>o-(ui~K^_r*tJoY)6dA!h>QY(Ca2 zY-6a}ON5X)z=gqH9r_Kl#?n4nNZxd6O^YYe;9_`JL$)1mVZSDzdYooQgA}}`AUBOqV3h#1A^>|lxUO>QvzpnyAo~Lzug6_q-%F~i9+afE`d1?xZb2d11YU`e>%QE%daz2$*`2_ADxA{q_GeM)4 zaq3q0V+bxOU~06Qh#GJiLU@m5oa%7@qJb1;@H7CoO8QRlfA9o6(=lb$rZ|Y#QCGXa9lnNnj zAfJ_m+|TK@35)61{Ztw1tcPVLe*0fB1-#P3SyWWVLU#P{MVK(;d%^w)gTIP0MOy`N2<|OZwJT+EmSG(+wRUUnc z&kQ$~Jls}}X=*s9M(!i+V#LnJ7r?u$R^M5z{q%16m1{c50Qq5LlP-Bj?~$&TXw#XC zv|cGYva%siYVZ#{&wZB3>wx>xw&?OOSfqT7VlDproBMwmi@GqEVa`7eB#jdFZvI5 zwmTmycbSPJOw8!dKaV~Y&@!(7?B(5Ww!4qwXfMa63Jd2Yy^3!|PrR)kCXh|hO`wiF zaj)-b@3j?h-G^};P;U+-$y^=L6_~Ypr6HVCY9KBY=Ij`TGN&@_%<1`%q}M|HmQS8z z){Z+yJQlrnYD!LSB!b)7ISjS5*r=s>a;rN`9G)ycY3LtiD?>Tk+ZN&+rR$*aeaRYa zwDZRwi)Ooh09PQ}oKe{#F%^pUQpZI58M(XYPe98xkX!O%aED?!^NAnrb3L)0!BSge|2mf zdu@f3(At+6j$gR;&wu}Y^#4&)2HJVR?o4sugDbjW;OedavjAs@6z^>uZ(sdO&Eo4- zF}HgxzG5{E$77~@SW#^Vr9wp*ACI}V;r$)0xANp&v(!zv;v4akZQQY3@%P5STNzZR zC`|+oN;7*~PXZ#H-9qf8ykdt+6!$HX+r_$c4C}TKg9&=61B|P|j6HD>P`A2Mr&qYAfu0GWQr9u|zZjd;$^ZZW literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_otpcalc.png b/htmlhelp/pic/dlg_otpcalc.png new file mode 100644 index 0000000000000000000000000000000000000000..31d62e1bb991e171df992e91b255af33c0165cc2 GIT binary patch literal 2120 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 D#`cwY literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_sel_local.png b/htmlhelp/pic/dlg_sel_local.png new file mode 100644 index 0000000000000000000000000000000000000000..8588d495a71b8883fd99d160172f6c59bffcbecf GIT binary patch literal 1984 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 XGm^TDMG51>00000NkvXXu0mjf`$plJ literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_sort.png b/htmlhelp/pic/dlg_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..ccfaa5c789418fabf3cb27ccde4f712a99b9d043 GIT binary patch literal 3091 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 a3sk*uY%}aiIK=;@!)&cEmTxSs#{CbXU`6f# literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/dlg_upload.png b/htmlhelp/pic/dlg_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d4ffbbf543748a77e5a068423fe376248aebe1 GIT binary patch literal 1974 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 D4zr0> literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/hide_property.png b/htmlhelp/pic/hide_property.png new file mode 100644 index 0000000000000000000000000000000000000000..1f580365bbb2989a23f0439870ec813cca2b74b4 GIT binary patch literal 995 zcmV<9104K`P)W5u|Ad5u&d$~|oE5GB00UP^L_t(|+U=QJcB3#1hOKj0fCMX`Spl65^db9S zQ_;m2k^qJw1kYGGC2bSokKaO;uychPP>EK#EBC+8-Tf)el)L>Z&B~6G@~m=K?#g{V ztK5})1GjV#ghcPZ3Rtxb+bCUwhbB}TdcZ}Sm-^X3~1T|JL zD-TKvQJu)IRX~20G2{n$aBuFacZ7z>&A)Q~&J2|N`eYK{l2cp=8A~y!+%HcV-9;Wk zTUCMl{A{uf+;VKQ&-*ZQ!5!9|4%XYAv24`kDEIx`N7&-2*1CTJE^OD?W^?^v^1 zZVW|#vP{ED4H~(rADM5x{P$dL17wXuO%;QEg}amJ82T~Vsmm=Jj^VZ#hqM;V<{qiP zS?Kom)pz~L+@yLVrQDfu(vB*#&?9tr`v5m46|@KsdH1CN5Artj!-?GRiaS4_jI=b| zFlSUU%ZYl&zPr+$mgzTaHit4z4vipXNTeVL6TaT2{F$cjdmGmCIeI{Q@PNo(VPE RJ%a!M002ovPDHLkV1nHC=HLJT literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/hosttree_after.png b/htmlhelp/pic/hosttree_after.png new file mode 100644 index 0000000000000000000000000000000000000000..f1072a91018a1b8d5dce7095c425e34bbb9ae851 GIT binary patch literal 1939 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/main_mirror.png b/htmlhelp/pic/main_mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..2dba6046a1fd1cfdaeb601bd7f35204b89268c96 GIT binary patch literal 10680 zcmZwNc|6m9;5hJ7Dui-dtcYAga-=eH-mSZAF-BoSUhmiY`C8HqD`Rd>5a*#ohqz5m z3~nAe#0DHXba?UT5mt=QXYG8}+wuFRmWId2*^ZnR5W07i^qUpM5omHd|fjmr(6yMmDH44Lqg0}59k~}-VdB(_O6-%inV`6 z*p~=5^%MYt?aw@*c0=LTbFlIE>Dt|^gNj+};q^19ArRElYxvJCqSKOw+`C&4#WUu$ zv4OEJr-2`{+GH+N^{=D-*%-R%ncz~HxdqjLa=ub!>>#){E}`$$qcTcLO(N9z6C{^`la{Jk8sshf>kAg;NkdLFGNt?z$xZQ8SRI*o7p&I`^0l8pmt zp+eyd6Yi~S)QE;AF{Q@vW^SH6krx(@9S|P1Ae&NuE4j1fIdV6pBtV4_+qH_&ZsPf8 zHK%taca&qWZBW9cPTJF%8k3PZ{FMYm{nvCvTHzC_d@HRm6Bh^Axo%%k8`I{6R+~1@ zfc0RrUP0CO&N9EeIQ4Gf2L42Z6~LQ_Ssu|e(awU>^Da1Zm>yh-^=CAmaN9)l4~Iwz zxczq4%RcJr2w2VcsSFtbyiuP*XJKZ8$3VOkzB+0G^G&Htapk>a#Y}IgGWSyP_8XNS zQU--DT`NYvEHcZ=E9JHt)I73@V(SIWxDSU#FiPPgco|kfi~kzQwO19=5SMTbN}%OAJzvj2hDze-dt#403ch#Wq6qTfKRW zm+&AILg)|SXbd52cIoJX`v#c#cU8o3`fr~v1^yD=`?g#A&PwyF__OwxLc z^!A(e|A48d1TAWp^->SsOXucBc+THB)mhN6rLZ6ExGd{_v2u}4P1+a=;j8#S;-L}? znA6iZ+%wNuW=zflUfAMd`2^MS!YFihzH?ffK0Q0|P`IVqczEvq*^+S&WPmbo|8)P# zozsNsL;)u=|F}sk?EyP}d&5dQOuRfs%6v7Axnrq9a9LSUtr+~eMz@;_2d4RlTbCR$ z&%@SRV#~$`8bL7Fj+`z-H+v!mBio9kUHM5qV3s;_yhjvzvKDJIa9R(O`jAmhu-n|ra};`H;67EP>8Ed zQ|1%de<#P%Ufu>2q`oT`g$$$P*S(_9up3&x(-0F@?fp6qau0JN`^%f&k3_5MxM;tA z<&V%_XgVb0vMTL}75a(nj}VMn(HA6~73r{Jx@I)#*Iw2+zM<^tBHF>*^v9a(%5VUmbISungpOBNnl4Kkw}c& zp>ZD?cZ#C!;JrJO84S12wmH;C!Vyry$BUPYFEfwj;3i%PlVb1CHXrsxl+!UfD9t}9 z2%Sts!3jbZzT1E{Wl$@u1WlVjrBeMKFoLenZtoo;MA06vJWc%Y;LBWRTM6>O0T4rd zy6Q>8D5*kKvU7e}NS@NeDLaaZw|0egK|xNXRr(Qv2p5|Yd|BbAfz;JvGW z6JGT4(kAW$@{R-?_7GS`L5{R~ID9OStXsX6{&WXREk? z_7?lx*Q124#_)nx1EKxOjo%CP+l?b∓E)`CAjOpPxrSuGV_E@Gp;$&SnHWo0wr8 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 nPpBR_&Y=_k->$Om@A1L%2pAK%C&c;(nSDb_fE literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/main_sync.png b/htmlhelp/pic/main_sync.png new file mode 100644 index 0000000000000000000000000000000000000000..9979c18f0b0f491e5f48056413d8608cd95fcfe2 GIT binary patch literal 5794 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 Jmfy2`_dluz>+b*n literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/main_tab.png b/htmlhelp/pic/main_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc21c70bfac627fdba0226c83c35322711394d9 GIT binary patch literal 2030 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/menu_command.png b/htmlhelp/pic/menu_command.png new file mode 100644 index 0000000000000000000000000000000000000000..9f402b2524461fd17b3d1f6e27122c78baf8975c GIT binary patch literal 3645 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 literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/menu_disp.png b/htmlhelp/pic/menu_disp.png new file mode 100644 index 0000000000000000000000000000000000000000..bf88c5a65008cc12cce05f894e89771ce49840a8 GIT binary patch literal 3167 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 FV1j{J`4<2H literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/menu_help.png b/htmlhelp/pic/menu_help.png new file mode 100644 index 0000000000000000000000000000000000000000..c95636ca523687a7500e539b9d3b43d3dd9ccae7 GIT binary patch literal 874 zcmV-w1C{)VP){@9*#b|NpJ6z0t&PO!bhf*~J(lgFX7jIJJ~>uaZu0sik~B;KJ`@`*FZx z$6}{tB+x0Vu!UKRO6(0hN1*&L6u79esIVwdzUmAts$&*#G2bYcXs$3sp}GGRaGXia z{filONrSz#GECrjpfF4EC@BIQ8Tds}=jy1-=%MY)25*)~70P#3I0!hoq|iTbUvh?f}w-X%pyuNI+Dz z$8AcNZv#ys>+1r{jV4u&pC2pa2u(mjK?mS%h1!P#TBQ3iRj$ z4*bIc+xw7f^&QbZ0si+Zm6^cl3SYp715!-rh8lr1#Cat0v4+bBffG}c1|WnNW(Tf( z2~R++Mhm1r1E}HaQnOH`$W-nL-{%Z922IBP9%~uo^*XaC0z6 zp?ei#QsYXaQAZuK8YE4$LX&FCS{3>p<6I%l@cXhBn>Tv^NehZO4aj#<&vBFX0ICDX zga|fQB@2!evSTwT-UZYbcbuoBU{k-(%2A;L&BnW&#(@chqH(N#o2_#Nh!;RG`TKxk zQcl?r4Fb}B?O_Ebu*_Aj(Y(uyvCC-?REr!@{e+zcJoYc022=e8b^&SqfpMn4`WP?H z`^%F}PcPsL*a-YJ@k!e|0e}CUSN=RlAHIOk4FuZlTAbeoLj2(OM$feK_6)xXOuTI2 zjpuk>Hb`!Pfq->6aVv+}1crOm2YcWM&Dd;lp>=jX{c8nk1l$4yDl>h(#iHB=f0004sNklv98+z#;Sq?z7_hrb(I>1lszu(!el4n~(RBFinH;y8aB9o?t9O4~32r>!nMI?F`|7 zLiLs&3TLcE1NqXrlF`m7a!ayKwW*M=dQwx%x=~;G3SeN;w^tOe2Z@aUDr=BJ0V?&X zh)i5JB|xG0mF%{gLfe@ja7W~IrDl(|A}V5leoD^N0kJU=8RSYs$JA+OBuAZyBX5&T zUB@4AKKQ#BrR*~wrQD;XO&O1u&##Z|BTUcpt2n+j}TrS}<#g3YF%d3Tak10p8vjqFSUB z=z_X?#2<}5ZP{P3g@$TSA}0z)gvdk6gy^-GhQ~c>|2M{LO&Y|+1fKH{p2g5V4Vy9g hE#)39|B7-)z&D50z^Cgo+Vubc002ovPDHLkV1mHi@+JTP literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/menu_tool.png b/htmlhelp/pic/menu_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..a2403b43bcd3801f208e90e6dbec6029709e68a6 GIT binary patch literal 560 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 EA8-D6hX4Qo literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/rcvsts.png b/htmlhelp/pic/rcvsts.png new file mode 100644 index 0000000000000000000000000000000000000000..f599745b0742635852c6847406eb81985e8102fd GIT binary patch literal 445 zcmV;u0Yd(XP)tkO&XzBzB=@^jmD3JbB&YIeaP@R!)Xs@aq{VXY--B6p+uT>7>hPJz)*3div1VfQg+`4-AwhrD4 n-`U+7^an{~ph0?r{v_xd2PUZCAIMMF00000NkvXXu0mjf>;to~ literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/sym_batu.png b/htmlhelp/pic/sym_batu.png new file mode 100644 index 0000000000000000000000000000000000000000..b0abde6502185ca6c9a5a62c8590698be3958de4 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^@*vE@3?$z+aDyb+OFVsD*{?G(3yO$KGe67$3UL;A zL>4nJ$Q=Y>#>1H*!9YQlbVpxD28NCO+`wiXxP3^eXxF*PM&Koa1o4tF4blulp`n6*2w#Zjoa^*{t ibC;LC{;MayeJ|tWV!mr$pZ|lL$l&Sf=d#Wzp$P!m7gC`B literal 0 HcmV?d00001 diff --git a/htmlhelp/pic/sym_maru.png b/htmlhelp/pic/sym_maru.png new file mode 100644 index 0000000000000000000000000000000000000000..00e72777addea06c3afb4eb8b3ece6543eb93dd1 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^${@_b3?$!tUzY`>*h@TpUD>ZQF$;=_OEW*r0Sa*z zctjR6FvuMQVaCImA;CaFmUKs7M+SzC{oH>NSwV^dd_r9R|NjqUGBErP4tBc$q>DUV z978H@EuD0i^MCmYv#~pv$b4-OyV-y4Cf8qZ3B;<+7)O?eMzPJQ4Zl{PvqP<7A zT>Thw_g-CadD^$RjYTUQR&ca=&11jyS?9CVLgf|Tr$+sk>g}sL>-x`QN;a k=al}O+i%oPJPk>H!8k`w_)rvMS0l(7p00i_>zopr0HYpQEdT%j literal 0 HcmV?d00001 diff --git a/jreusr.h b/jreusr.h new file mode 100644 index 0000000..64edd27 --- /dev/null +++ b/jreusr.h @@ -0,0 +1,241 @@ +// begin of jreusr.h +// ƒ‰ƒCƒuƒ‰ƒŠ‚ÌŽg—pŽÒ—pƒwƒbƒ_ƒtƒ@ƒCƒ‹ + +#ifndef JREUSR +#define JREUSR + +// --------------------------------------------------- +// Prevent multiple includes. + +// _os_os2‚Í‚±‚ê(jreusr.h)‚ðƒCƒ“ƒNƒ‹[ƒh‚·‚郆[ƒU[‚ª’è‹`‚·‚é +#if defined(_OS_OS2) +// in case of os/2 + // __OS2_H__ is for bc 2.0 e + // __OS2_H__ is for bc 1.5 e + #if !defined(__IBMC__) || !defined(__OS2_H__) + // ‘¼‚̃Nƒ‰ƒX‚Åtype.h‚ðƒCƒ“ƒNƒ‹[ƒh‚³‚¹‚È‚¢‚悤‚ɐæ‚Éinclude‚·‚é. + // INCL_???‚È‚Ç•K—v‚Ȓ萔‚͐æ‚É’è‹`‚µ‚Ä‚¨‚­. + #include + #endif // defined(__IBMC__) || defined(__OS2_H__) + + #define JRE_BUILDTYPE_OS2PM + +#else +// in case of windows + + // bc4.5 e __WINDOWS_H, + // bc4.0 j __WINDOWS_H, + // bc3.1 j __WINDOWS_H, + // msvc4.1 j _INC_WINDOWS, _WINDOWS_ + // msvc4.0 j _INC_WINDOWS, + // msvc2.0 j ???, ??? + // msvc1.0 j _INC_WINDOWS, + // ddk _INC_WINDOWS + // WinCE SDK - WIN32 and PEGASUS + + #if !defined(__WINDOWS_H) && !defined(_INC_WINDOWS) + #ifndef STRICT + #define STRICT + #endif // STRICT + // ‘¼‚̃Nƒ‰ƒX‚Åtype.h‚ðƒCƒ“ƒNƒ‹[ƒh‚³‚¹‚È‚¢‚悤‚ɐæ‚Éinclude‚·‚é. + #include + #endif // !defined(__WINDOWS_H) && !defined(_INC_WINDOWS) + + #if defined(__WIN32__) || defined(WIN32) + #define JRE_BUILDTYPE_WIN32 + #if defined(PEGASUS) + #define JRE_SUBSET_WINCE + #endif + #else + #define JRE_BUILDTYPE_WIN16 + #endif + #define JRE_BUILDTYPE_WINDOWS + +#endif // os/2 or windows + +// --------------------------------------------------- +#if defined(JRE_BUILDTYPE_OS2PM) + // in case of JRE_BUILDTYPE_OS2PM + // ˆÈ‰ºCjre/os2ƒ[ƒJƒ‹‚Ì’è‹` + #if !defined(EXTAPI) + #define EXTAPI _export EXPENTRY + #endif // !defined(EXTAPI) + #if !defined(MEMID) + typedef void* MEMID; + #endif // !defined(MEMID) + + // os2‚É‚ÍPSZ‚ª‚ ‚é. + typedef PSZ PSTR, LPSTR; + typedef int (*FARPROC)(void); // farproc + //os2‚É‚ÍUSHORTCULONG‚ª‚ ‚é. + typedef USHORT WORD; + typedef ULONG DWORD; + // OS/2‚É‚ÍSHANDLE‚ÆLHANDLE‚ª‚ ‚é. + typedef LHANDLE HANDLE; // ”Ä—pƒnƒ“ƒhƒ‹‚ðì‚Á‚Ä‚¨‚¢‚ācc + typedef HANDLE GLOBALHANDLE; + typedef HANDLE*PHANDLE, *LPHANDLE; + +#else + // in case of JRE_BUILDTYPE_WIN32 or JRE_BUILDTYPE_WIN16 (= JRE_BUILDTYPE_WINDOWS) + // ˆÈ‰ºCjre/winƒ[ƒJƒ‹‚Ì’è‹` + #if !defined(EXTAPI) + #if defined(_MSC_VER) + #define EXTAPI WINAPI // VC2‚Å‚Í_export‚ª’Ê‚ç‚È‚¢‚Ì‚Å’ˆÓ. + #endif + #if defined(__BORLANDC__) + #if defined(_TEST_EXE) + #define EXTAPI WINAPI + #else + #define EXTAPI _export WINAPI + #endif + #endif + #endif // !defined(EXTAPI) + + #if !defined(MEMID) + #if defined(JRE_BUILDTYPE_WIN32) + typedef void*MEMID; // –¾Ž¦“I‚Ƀ|ƒCƒ“ƒ^‚É‚µ‚Ü‚µ‚½. + #else + typedef HGLOBAL MEMID; + #endif // __WIN32__ + #endif // !defined(MEMID) + +#endif + +// --------------------------------------------------- ƒOƒ[ƒoƒ‹•Ï” + + + +// ------------------------------------------------------------- ’萔 +// _JRE_ERR_CODE‚Æ_JRE_WARN_CODE‚̃Vƒ“ƒ{ƒ‹‚ÍŽR“c‚ªƒfƒoƒbƒOŽž‚ÉŽg—p‚µ‚Ä‚¢‚Ü‚·. + +#define _JRE_ERR_CODE +// ƒGƒ‰[ƒR[ƒh.nError‚ª1`63‚Ü‚Å. intŒ^ +#define CantAllocate ( 1) // ƒƒ‚ƒŠ‚ÌŠm•Û‚ª‚Å‚«‚È‚¢.â‘ΓI‚ȃƒ‚ƒŠ•s‘«. +#define MemoryTooFew1 ( 2) // ƒƒ‚ƒŠ‚ª‘«‚è‚È‚¢1.(ŽÀsŽž‚ÉŒˆ‚Ü‚é‚à‚Ì.ƒƒ‚ƒŠƒTƒCƒY‚Ì—\‘ª‚ÉŽ¸”s‚µ‚½) +#define MemoryTooFew2 ( 3) // ƒƒ‚ƒŠ‚ª‘«‚è‚È‚¢2.(DLLì¬Žž‚ÉŒˆ‚Ü‚é‚à‚Ì) +#define ReTooLong (10) // ³‹K•\Œ»‚ª’·‚·‚¬‚é. +#define TooComplex (13) // ‚à‚Á‚ÆŠÈ’P‚È•\Œ»‚É‚µ‚ĉº‚³‚¢.‚±‚ÌDLL‚ÌŽã‚¢ƒpƒ^[ƒ“‚Å,Œ©‚‚¯‚ç‚ê‚È‚¢.‚½‚¾‚µ–Å‘½‚ÈŽ–‚Å‚Í”­¶‚µ‚È‚¢. +#define MismatchBracket (20) // Š‡ŒÊ‚̑Ήž‚ª³‚µ‚­‚È‚¢. +#define InvalidChClass (21) // ƒLƒƒƒ‰ƒNƒ^ƒNƒ‰ƒX‚Ì“à—e‚ª‰ðŽß‚Å‚«‚È‚¢.–w‚ǂ̏ꍇ”͈͎w’肪³‚µ‚­‚È‚¢. +#define EscErr (24) // ƒGƒXƒP[ƒvƒV[ƒNƒFƒ“ƒX‚ª‰ðŽß‚Å‚«‚È‚¢. +#define Unknown (31) // ‚È‚ñ‚¾‚©—Ç‚­‚í‚©‚ç‚È‚¢ƒGƒ‰[.•¡‡“I‚È—vˆö‚Å”­¶‚·‚éƒGƒ‰[.–w‚Ç‚ªƒƒ‚ƒŠƒTƒCƒY‚Ì—\‘ª‚ÉŽ¸”s. +#define NoReString (32) // ŒŸõƒpƒ^[ƒ“‚ðŽw’肵‚ĉº‚³‚¢.³‹K•\Œ»’·‚ª0ƒoƒCƒg. +#define IncorrectUsing (33) // ƒpƒ‰ƒ[ƒ^‚ª‚¨‚©‚µ‚¢.DLL‚Ì•s³‚ÈŽg—p–@. +#define ReNotExist (34) // ŒŸõ‚·‚é‘O‚ɃRƒ“ƒpƒCƒ‹‚µ‚ĉº‚³‚¢. +#define InternalErr (35) // DLL‚̃oƒO‚ðŒŸo‚µ‚½.‚±‚ꂪ”­¶‚µ‚½‚çìŽÒ‚ɘA—‚µ‚Ä—~‚µ‚¢. +#define UsrAbort (36) // ƒ†[ƒU[(ƒAƒvƒŠƒP[ƒVƒ‡ƒ“)‚É‚æ‚é’†’f. +#define OldVersion (37) // ŒÃ‚¢(‰ðŽß‚Å‚«‚È‚¢)ƒo[ƒWƒ‡ƒ“‚̌Ăяo‚µŽè‡‚ðŽg—p‚µ‚½. +// CantAllocate, TooComplex, MemoryTooFew2, ReNotExist, IncorrectUsing, UsrAbort‚ÍŒŸõŽž‚É‚à”­¶‚·‚é‚à‚Ì + +#define _JRE_WARN_CODE +// ŒxƒR[ƒh. ƒŒƒ|[ƒgƒR[ƒh. jre2\‘¢‘Ì‚ÌnWarningƒƒ“ƒo. +// ‚±‚ê‚Í‚»‚ꂼ‚ê‚̃rƒbƒg‚Ƀ}ƒbƒsƒ“ƒO‚·‚é‰Â”\«‚ª‚‚¢‚̂ŁC +// if (CwInlinePattern | jre2.nWarning){ +// } +// ‚Å•]‰¿‚µ‚Ä‚­‚¾‚³‚¢. +#define CwInlinePattern (2) // s“à‚̏ˆ—‚ɂ‚«CÄŒÄ‚яo‚µ‚Ì•K—v‚Í‚È‚¢. + +#define JGC_SHORT (1) +#define JGC_LONG (2) + +// jre.dll‚ÅŽg—p‚·‚郁ƒbƒZ[ƒW‚̍ő咷(•ÛØ).‚±‚̃TƒCƒY‚̃oƒbƒtƒ@‚ÉŽû‚Ü‚ç‚È‚¢•¶Žš—ñ‚Í“n‚µ‚Ü‚¹‚ñ(null‚Ü‚ÅŠÜ‚ß‚Ä‚±‚̃TƒCƒY). +#define JRE_MAXLEN (128) + +// GetJreMessage‚ÌŒ¾Œê”ԍ†. +#define GJM_JPN (0) +#define GJM_ENG (1) + +// ----------------------------------------------------------- \‘¢‘Ì +// JRE\‘¢‘Ì. ƒo[ƒWƒ‡ƒ“‚É‚©‚©‚í‚炸jre\‘¢‘̂̃Aƒ‰ƒCƒ“ƒƒ“ƒg‚Í8bit(1byte)‚Å‚·B +#pragma pack(1) +// JRE\‘¢‘Ì‚Í‹É—ÍŽg—p‚µ‚È‚¢‚Å‚­‚¾‚³‚¢.¡Œã‚ÌÊÞ°¼Þ®Ý‚Å”pŽ~‚µ‚Ü‚·(ƒo[ƒWƒ‡ƒ“2.xx‚Ü‚Å‚Å»Î߰ĂðŽ~‚ß‚Ü‚·). +// ‚±‚ê‚É‘ã‚í‚é\‘¢‘Ì‚ÍJRE2\‘¢‘Ì‚Å‚·. +typedef struct tagJRE{ + BOOL bConv; // ‚±‚̍\‘¢‘Ì‚ÌŽg—p’†‚ðŽ¦‚·ƒtƒ‰ƒO. + int nStart; // ŒŸõŠJŽnˆÊ’u.ƒoƒCƒg”.æ“ª‚Í0. + int nWarning; // ƒEƒH[ƒjƒ“ƒOƒR[ƒh. + int nError; // ƒGƒ‰[ƒR[ƒh. + int nLength; // ƒ}ƒbƒ`’·.ƒoƒCƒg”. + int nPosition; // ƒ}ƒbƒ`ˆÊ’u.æ“ª‚Í0.(‚¨’p‚¸‚©‚µ‚¢) + WORD wTranslate; // •ÏŠ·ƒe[ƒuƒ‹”ԍ†. + LPSTR lpszTable; // •ÏŠ·ƒe[ƒuƒ‹. + FARPROC lpfnUsrFunc; // ƒR[ƒ‹ƒoƒbƒNŠÖ”‚Ö‚ÌFARƒ|ƒCƒ“ƒ^. + int nCompData1; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^1. + MEMID hCompData2; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^2.ƒnƒ“ƒhƒ‹. + MEMID hCompData3; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^3.ƒnƒ“ƒhƒ‹. + MEMID hCompData4; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^4.ƒnƒ“ƒhƒ‹. +} JRE, *PJRE, NEAR*NPJRE, FAR*LPJRE; +#pragma pack() + + +#pragma pack(1) +// ƒo[ƒWƒ‡ƒ“1.06ˆÈ~‚Í‚±‚̍\‘¢‘Ì‚ðŽg—p‚µ‚Ä‚­‚¾‚³‚¢. +// ‚½‚¾‚µ,ƒo[ƒWƒ‡ƒ“1.xx‚Å‚ÍŽd—l‚ª—¬“®“I‚Å‚·(‚Ç‚È‚¢‚¹[‚¿‚イ‚Ë‚ñ). +typedef struct tagJRE2{ + DWORD dwSize; // ‚±‚̍\‘¢‘̂̃TƒCƒY. + BOOL bConv; // ‚±‚̍\‘¢‘Ì‚ÌŽg—p’†‚ðŽ¦‚·ƒtƒ‰ƒO. + UINT nStart; // ŒŸõŠJŽnˆÊ’u.ƒoƒCƒg”.æ“ª‚Í0. + UINT nWarning; // ƒEƒH[ƒjƒ“ƒOƒR[ƒh. (v1.11‚©‚çUINT‚ɕύX) + int nError; // ƒGƒ‰[ƒR[ƒh. + UINT nLength; // ƒ}ƒbƒ`’·.ƒoƒCƒg”. + UINT nPosition; // ƒ}ƒbƒ`ˆÊ’u.æ“ª‚Í0.(‚¨’p‚¸‚©‚µ‚¢) + WORD wTranslate; // •ÏŠ·ƒe[ƒuƒ‹”ԍ†. + LPSTR lpszTable; // •ÏŠ·ƒe[ƒuƒ‹. + FARPROC lpfnUsrFunc; // ƒR[ƒ‹ƒoƒbƒNŠÖ”‚Ö‚ÌFARƒ|ƒCƒ“ƒ^(Žg‚í‚È‚¢‚悤‚É). + UINT nCompData1; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^1. + MEMID hCompData2; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^2.ƒnƒ“ƒhƒ‹. + MEMID hCompData3; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^3.ƒnƒ“ƒhƒ‹. + MEMID hCompData4; // ƒRƒ“ƒpƒCƒ‹ƒf[ƒ^4.ƒnƒ“ƒhƒ‹. +} JRE2, *PJRE2, NEAR*NPJRE2, FAR*LPJRE2; +#pragma pack() + +// ------------------------------------------------ ÌßÛÄÀ²Ì߂¨‚æ‚ÑÏ¸Û +#ifdef __cplusplus // caution! it's NOT cpulspuls!!! + extern "C"{ +#endif // __cplusplus + +// ƒo[ƒWƒ‡ƒ“‚ÉŠÖŒW‚È‚¢API +BOOL EXTAPI IsMatch(LPSTR lpszStr, LPSTR lpszRe); +int EXTAPI GlobalReplace(LPSTR lpszRe, LPSTR lpszObj, LPSTR lpszStr, LPHANDLE lphGMemTo); +WORD EXTAPI JreGetVersion(void); +#if defined(JRE_BUILDTYPE_WIN16) + MEMID EXTAPI DecodeEscSeqAlloc2(LPSTR lpszRe); // 16bit Windows‚̈╨. +#endif // defined(JRE_BUILDTYPE_WIN16) +UINT EXTAPI DecodeEscSeq(LPSTR lpszRe, LPSTR lpszBuff, UINT uiSize); // new! +int EXTAPI GetJreMessage(int nMessageType, int nLanguage, LPSTR lpszBuff, int cbBuff); +// ƒo[ƒWƒ‡ƒ“1API +BOOL EXTAPI JreOpen(LPJRE lpjreJre); +BOOL EXTAPI JreCompile(LPJRE lpjreJre, LPSTR lpszRe); +BOOL EXTAPI JreGetMatchInfo(LPJRE lpjreJre, LPSTR lpszStr); +BOOL EXTAPI JreClose(LPJRE lpjreJre); +// ƒo[ƒWƒ‡ƒ“2API +BOOL EXTAPI Jre2Open(LPJRE2 lpjreJre); +BOOL EXTAPI Jre2Compile(LPJRE2 lpjreJre, LPSTR lpszRe); +BOOL EXTAPI Jre2GetMatchInfo(LPJRE2 lpjreJre, LPSTR lpszStr); +BOOL EXTAPI Jre2Close(LPJRE2 lpjreJre); + + +#ifdef __cplusplus + } +#endif // __cplusplus + +// ----------------------------------------------------------- Œ^’è‹` +// GetProcAddress‚ðŽg—p‚·‚éÛ‚̃|ƒCƒ“ƒ^•Ï”‚ðéŒ¾‚µ‚â‚·‚­‚µ‚Ä‚¨‚­. +typedef BOOL (EXTAPI*LPISMATCH) (LPSTR, LPSTR); +typedef int (EXTAPI*LPGLOBALREPLACE) (LPSTR, LPSTR, LPSTR, LPHANDLE); +typedef WORD (EXTAPI*LPJREGETVERSION) (VOID); +#if defined(JRE_BUILDTYPE_WIN16) + typedef MEMID (EXTAPI*LPDECODEESCSEQALLOC2) (LPSTR); +#endif // defined(JRE_BUILDTYPE_WIN16) +typedef UINT (EXTAPI*LPDECODEESCSEQ) (LPSTR lpszRe, LPSTR lpszBuff, UINT uiSize); +typedef int (EXTAPI*LPGETJREMESSAGE) (int, int, LPSTR, int); +typedef BOOL (EXTAPI*LPJRE2OPEN) (LPJRE2); +typedef BOOL (EXTAPI*LPJRE2COMPILE) (LPJRE2, LPSTR); +typedef BOOL (EXTAPI*LPJRE2GETMATCHINFO) (LPJRE2, LPSTR); +typedef BOOL (EXTAPI*LPJRE2CLOSE) (LPJRE2); + + + + +#endif // JREUSR +// end of jreusr.h diff --git a/local.c b/local.c new file mode 100644 index 0000000..29d4076 --- /dev/null +++ b/local.c @@ -0,0 +1,259 @@ +/*============================================================================= +* +* ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹ƒAƒNƒZƒX +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + + +/*----- ƒ[ƒJƒ‹‘¤‚̃fƒBƒŒƒNƒgƒŠ•ÏX ------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int DoLocalCWD(char *Path) +{ + int Sts; + + Sts = SUCCESS; + SetTaskMsg(">>CD %s", Path); + if(SetCurrentDirectory(Path) != TRUE) + { + SetTaskMsg(MSGJPN145); + Sts = FAIL; + } + return(Sts); +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃fƒBƒŒƒNƒgƒŠì¬ ------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoLocalMKD(char *Path) +{ + SetTaskMsg(">>MKDIR %s", Path); + if(_mkdir(Path) != 0) + SetTaskMsg(MSGJPN146); + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠŽæ“¾ ----------------------------------- +* +* Parameter +* char *Buf : ƒpƒX–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoLocalPWD(char *Buf) +{ + if(GetCurrentDirectory(FMAX_PATH, Buf) == 0) + strcpy(Buf, ""); + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃fƒBƒŒƒNƒgƒŠíœ ------------------------------------------ +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoLocalRMD(char *Path) +{ +#if 0 + SetTaskMsg(">>RMDIR %s", Path); + if(rmdir(Path) != 0) + SetTaskMsg(MSGJPN147); +#else + SetTaskMsg(">>RMDIR %s", Path); + + if(MoveFileToTrashCan(Path) != 0) + SetTaskMsg(MSGJPN148); +#endif + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹íœ ----------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoLocalDELE(char *Path) +{ +#if 0 + SetTaskMsg(">>DEL %s", Path); + if(DeleteFile(Path) != TRUE) + SetTaskMsg(MSGJPN149); +#else + SetTaskMsg(">>DEL %s", Path); + + if(MoveFileToTrashCan(Path) != 0) + SetTaskMsg(MSGJPN150); +#endif + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹–¼•ÏX --------------------------------------------- +* +* Parameter +* char *Src : Œ³ƒtƒ@ƒCƒ‹–¼ +* char *Dst : •ÏXŒã‚̃tƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoLocalRENAME(char *Src, char *Dst) +{ + SetTaskMsg(">>REN %s %s", Src, Dst); + if(MoveFile(Src, Dst) != TRUE) + SetTaskMsg(MSGJPN151); + return; +} + + +/*----- ƒtƒ@ƒCƒ‹‚̃vƒƒpƒeƒB‚ð•\Ž¦‚·‚é ---------------------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispFileProperty(char *Fname) +{ + SHELLEXECUTEINFO sInfo; + + memset(&sInfo, NUL, sizeof(SHELLEXECUTEINFO)); + sInfo.cbSize = sizeof(SHELLEXECUTEINFO); + sInfo.fMask = SEE_MASK_INVOKEIDLIST; + sInfo.hwnd = NULL; //GetMainHwnd(); + sInfo.lpVerb = "Properties"; + sInfo.lpFile = Fname; + sInfo.lpParameters = NULL; + sInfo.lpDirectory = NULL; + sInfo.nShow = SW_NORMAL; + sInfo.lpIDList = NULL; + ShellExecuteEx(&sInfo); + return; +} + + +/*----- ‘®«‚ðƒ`ƒFƒbƒN‚·‚é FindFirstFile -------------------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* WIN32_FIND_DATA *FindData : ŒŸõƒf[ƒ^ +* int IgnHide : ‰B‚µƒtƒ@ƒCƒ‹‚𖳎‹‚·‚é‚©‚Ç‚¤‚©(YES/NO) +* +* Return Value +* HANDLE ƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HANDLE FindFirstFileAttr(char *Fname, WIN32_FIND_DATA *FindData, int IgnHide) +{ + HANDLE hFind; + + if((hFind = FindFirstFile(Fname, FindData)) != INVALID_HANDLE_VALUE) + { + if(IgnHide == YES) + { + while(FindData->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) + { + if(FindNextFile(hFind, FindData) == FALSE) + { + FindClose(hFind); + hFind = INVALID_HANDLE_VALUE; + break; + } + } + } + } + return(hFind); +} + + +/*----- ‘®«‚ðƒ`ƒFƒbƒN‚·‚é FindNextFile --------------------------------------- +* +* Parameter +* HANDLE hFind : ƒnƒ“ƒhƒ‹ +* WIN32_FIND_DATA *FindData : ŒŸõƒf[ƒ^ +* int IgnHide : ‰B‚µƒtƒ@ƒCƒ‹‚𖳎‹‚·‚é‚©‚Ç‚¤‚©(YES/NO) +* +* Return Value +* HANDLE ƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +BOOL FindNextFileAttr(HANDLE hFind, WIN32_FIND_DATA *FindData, int IgnHide) +{ + BOOL Ret; + + while((Ret = FindNextFile(hFind, FindData)) == TRUE) + { + if(IgnHide == NO) + break; + if((FindData->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0) + break; + } + return(Ret); +} + + diff --git a/lvtips.c b/lvtips.c new file mode 100644 index 0000000..5644f55 --- /dev/null +++ b/lvtips.c @@ -0,0 +1,359 @@ +/*============================================================================= +* +* ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +/* ‚±‚̃\[ƒX‚Í MFC Programmer's SourceBook (http://www.codeguru.com/)‚ðŽQl‚É‚µ‚Ü‚µ‚½ */ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static void TipsShow(HWND hWnd, RECT rectTitle, LPCTSTR lpszTitleText, int xoffset, int xoffset2, int InRect); +static int CellRectFromPoint(HWND hWnd, POINT point, RECT *cellrect, int *col); +static LRESULT CALLBACK TitleTipWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HWND hWndTips; /* tips‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ */ + + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚̃EƒCƒ“ƒhƒE‚ðì¬ ------------------------------ +* +* Parameter +* HWND hWnd : eƒEƒCƒ“ƒhƒE‚̃nƒ“ƒhƒ‹ +* HINSTANCE hInst : ƒCƒ“ƒXƒ^ƒ“ƒXƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int InitListViewTips(HWND hWnd, HINSTANCE hInst) +{ + WNDCLASSEX wClass; + int Ret; + + Ret = FAIL; + + wClass.cbSize = sizeof(WNDCLASSEX); + wClass.style = 0; + wClass.lpfnWndProc = TitleTipWndProc; + wClass.cbClsExtra = 0; + wClass.cbWndExtra = 0; + wClass.hInstance = hInst; + wClass.hIcon = NULL; + wClass.hCursor = NULL; + wClass.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_INFOBK)); + wClass.lpszMenuName = NULL; + wClass.lpszClassName = "XTitleTip"; + wClass.hIconSm = NULL; + RegisterClassEx(&wClass); + + hWndTips = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, + "XTitleTip", NULL, + WS_BORDER | WS_POPUP, + 0, 0, 0, 0, + hWnd, NULL, hInst, NULL); + + if(hWndTips != NULL) + Ret = SUCCESS; + + return(Ret); +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚̃EƒCƒ“ƒhƒE‚ðíœ ------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteListViewTips(void) +{ + if(hWndTips != NULL) + DestroyWindow(hWndTips); + return; +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚̃EƒCƒ“ƒhƒE‚ðÁ‹Ž ------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void EraseListViewTips(void) +{ + ReleaseCapture(); + ShowWindow(hWndTips, SW_HIDE); + return; +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetListViewTipsHwnd(void) +{ + return(hWndTips); +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚Ì•\Ž¦ƒ`ƒFƒbƒN ---------------------------------- +* +* Parameter +* HWND hWnd : ListView‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* LPARAM lParam : WM_MOUSEMOVE‚ÌLPARAM’l +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void CheckTipsDisplay(HWND hWnd, LPARAM lParam) +{ + RECT cellrect; + static RECT cur_rect; + static int InRect; + POINT Point; + int row, col; + int offset; + int offset2; + RECT rcLabel; + char Buf[256]; + + Point.x = LOWORD(lParam); + Point.y = HIWORD(lParam); + if(InRect == NO) + { + row = CellRectFromPoint(hWnd, Point, &cellrect, &col); + if(row != -1) + { + cur_rect=cellrect; + offset = 6; + offset2 = offset; + if( col == 0 ) + { + ListView_GetItemRect(hWnd, row, &rcLabel, LVIR_LABEL); + offset = rcLabel.left - cellrect.left + offset / 2; + offset2 = 1; + } + cellrect.top--; + strcpy(Buf, ""); + ListView_GetItemText(hWnd, row, col, Buf, 256 ); + if(strlen(Buf) > 0) + TipsShow(hWnd, cellrect, Buf, offset-1, offset2-1, InRect); + InRect = YES; + } + } + else + { + if(PtInRect(&cur_rect, Point) == FALSE) + { + EraseListViewTips(); + InRect = NO; + } + } + return; +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚ð•\Ž¦ ------------------------------------------ +* +* Parameter +* HWND hWnd : ListView‚̃EƒCƒ“ƒhƒE‚̃nƒ“ƒhƒ‹ +* RECT rectTitle : ListViewƒRƒ“ƒgƒ‹[ƒ‹‚̃AƒCƒeƒ€‚Ì‹éŒ` +* LPCTSTR lpszTitleText : •¶Žš—ñ +* int xoffset : ƒIƒtƒZƒbƒg +* int xoffset2 : ƒIƒtƒZƒbƒg‚Q +* int InRect : •\Ž¦‚·‚é‚©‚Ç‚¤‚© +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void TipsShow(HWND hWnd, RECT rectTitle, LPCTSTR lpszTitleText, int xoffset, int xoffset2, int InRect) +{ + HDC dc; + HFONT pFont; + HFONT pFontDC; + RECT rectDisplay; + SIZE size; + + if(InRect == NO) + { + if(GetFocus() != NULL) + { + RectClientToScreen(hWnd, &rectTitle); + + /* ListViewƒEƒCƒ“ƒhƒE‚̃tƒHƒ“ƒg‚𓾂é */ + dc = GetDC(hWnd); + pFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0); + ReleaseDC(hWnd, dc); + + dc = GetDC(hWndTips); + pFontDC = SelectObject(dc, pFont); + + SetTextColor(dc, GetSysColor(COLOR_INFOTEXT)); + SetBkMode(dc, TRANSPARENT); + + rectDisplay = rectTitle; + GetTextExtentPoint32(dc, lpszTitleText, strlen(lpszTitleText), &size); + rectDisplay.left += xoffset; + rectDisplay.right = rectDisplay.left + size.cx + 2; + + if(rectDisplay.right > rectTitle.right-xoffset2) + { + rectDisplay.right += 1; + + SetWindowPos(hWndTips, HWND_TOPMOST, + rectDisplay.left, rectDisplay.top, + rectDisplay.right - rectDisplay.left, + rectDisplay.bottom - rectDisplay.top, + SWP_SHOWWINDOW|SWP_NOACTIVATE ); + + TextOut(dc, 0, 0, lpszTitleText, strlen(lpszTitleText)); + + SetCapture(hWnd); + } + + SelectObject(dc, pFontDC); + ReleaseDC(hWndTips, dc); + } + } + return; +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒX‚ð•\Ž¦‚·‚éˆÊ’u‚ð•Ô‚· ---------------------------- +* +* Parameter +* HWND hWnd : ListView‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* POINT point : ƒJ[ƒ\ƒ‹‚̈ʒu +* RECT *cellrect : ƒAƒCƒeƒ€‚Ì‹éŒ`‚ð•Ô‚·ƒ[ƒN +* int *col : Œ…”ԍ†‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int s”ԍ† +* -1=ŠY“–‚È‚µ +*----------------------------------------------------------------------------*/ + +static int CellRectFromPoint(HWND hWnd, POINT point, RECT *cellrect, int *col) +{ + int colnum; + int nColumnCount; + RECT rect; + RECT rectClient; + int row; + int bottom; + int colwidth; + int Ret; + + Ret = -1; + if((GetWindowLong(hWnd, GWL_STYLE) & LVS_TYPEMASK) == LVS_REPORT ) + { + row = ListView_GetTopIndex(hWnd); + bottom = row + ListView_GetCountPerPage(hWnd); + if(bottom > ListView_GetItemCount(hWnd)) + bottom = ListView_GetItemCount(hWnd); + + nColumnCount = Header_GetItemCount(GetDlgItem(hWnd, 0)); + + for(; row <= bottom; row++) + { + ListView_GetItemRect(hWnd, row, &rect, LVIR_BOUNDS); + if(PtInRect(&rect, point)) + { + for(colnum = 0; colnum < nColumnCount; colnum++) + { + colwidth = ListView_GetColumnWidth(hWnd, colnum); + if((point.x >= rect.left) && + (point.x < (rect.left + colwidth))) + { + GetClientRect(hWnd, &rectClient); + if(point.x <= rectClient.right) + { + rect.right = rect.left + colwidth; + if(rect.right > rectClient.right) + rect.right = rectClient.right; + *cellrect = rect; + *col = colnum; + Ret = row; + break; + } + } + rect.left += colwidth; + } + break; + } + } + } + return(Ret); +} + + +/*----- ƒŠƒXƒgƒrƒ…[ƒeƒBƒbƒvƒXƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK TitleTipWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + return(DefWindowProc(hWnd, message, wParam, lParam)); +} + + diff --git a/main.c b/main.c new file mode 100644 index 0000000..e17c089 --- /dev/null +++ b/main.c @@ -0,0 +1,2620 @@ +/*============================================================================= +* +* ‚e‚e‚e‚s‚o +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" +#include "aes.h" + +#include +#include "helpid.h" + + +#define RESIZE_OFF 0 /* ƒEƒCƒ“ƒhƒE‚Ì‹æØ‚èˆÊ’u•ÏX‚µ‚Ä‚¢‚È‚¢ */ +#define RESIZE_ON 1 /* ƒEƒCƒ“ƒhƒE‚Ì‹æØ‚èˆÊ’u•ÏX’† */ +#define RESIZE_PREPARE 2 /* ƒEƒCƒ“ƒhƒE‚Ì‹æØ‚èˆÊ’u•ÏX‚̏€”õ */ + +#define RESIZE_HPOS 0 /* ƒ[ƒJƒ‹|ƒzƒXƒgŠÔ‚Ì‹æØ‚èˆÊ’u•ÏX */ +#define RESIZE_VPOS 1 /* ƒŠƒXƒg|ƒ^ƒXƒNŠÔ‚Ì‹æØ‚èˆÊ’u‚̕ύX */ + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static int InitApp(LPSTR lpszCmdLine, int cmdShow); +static int MakeAllWindows(int cmdShow); +static void DeleteAllObject(void); +static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static void StartupProc(char *Cmd); +static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max); +static int CheckIniFileName(char *Str, char *Ini); +static int CheckMasterPassword(char *Str, char *Ini); +static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 ); +static char *GetToken(char *Str, char *Buf); +static void ExitProc(HWND hWnd); +static void ChangeDir(int Win, char *Path); +static void ResizeWindowProc(void); +static void CalcWinSize(void); +// static void AskWindowPos(HWND hWnd); +static void CheckResizeFrame(WPARAM Keys, int x, int y); +static void DispDirInfo(void); +static void DeleteAlltempFile(void); +static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static int EnterMasterPasswordAndSet( int Res, HWND hWnd ); + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static const char FtpClassStr[] = "FFFTPWin"; + +static HINSTANCE hInstFtp; +static HWND hWndFtp = NULL; +static HWND hWndCurFocus = NULL; + +static HACCEL Accel; +static HBRUSH RootColorBrush = NULL; + +static int Resizing = RESIZE_OFF; +static int ResizePos; +static HCURSOR hCursor; + +int ClientWidth; +static int ClientHeight; +int SepaWidth; +int RemoteWidth; +int ListHeight; + +static TEMPFILELIST *TempFiles = NULL; + +static int SaveExit = YES; +static int AutoExit = NO; + +static char HelpPath[FMAX_PATH+1]; +static char IniPath[FMAX_PATH+1]; +static int ForceIni = NO; + +TRANSPACKET MainTransPkt; /* ƒtƒ@ƒCƒ‹“]‘——pƒpƒPƒbƒg */ + /* ‚±‚ê‚ðŽg‚Á‚Ä“]‘—‚ðs‚¤‚ƁAƒc[ƒ‹ƒo[‚Ì“]‘— */ + /* ’†Ž~ƒ{ƒ^ƒ“‚Å’†Ž~‚Å‚«‚é */ + +char TitleHostName[HOST_ADRS_LEN+1]; +char FilterStr[FILTER_EXT_LEN+1] = { "*" }; + +int CancelFlg; + +static int SuppressRefresh = 0; + +static DWORD dwCookie; + + +/*===== ƒOƒ[ƒoƒ‹‚ȃ[ƒN =====*/ + +HWND hHelpWin = NULL; + +/* Ý’è’l */ +int WinPosX = CW_USEDEFAULT; +int WinPosY = 0; +int WinWidth = 630; +int WinHeight = 393; +int LocalWidth = 309; +int TaskHeight = 50; +int LocalTabWidth[4] = { 120, 90, 60, 37 }; +int RemoteTabWidth[6] = { 120, 90, 60, 37, 60, 60 }; +char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" }; +char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } }; +HFONT ListFont = NULL; +LOGFONT ListLogFont; +int LocalFileSort = SORT_NAME; +int LocalDirSort = SORT_NAME; +int RemoteFileSort = SORT_NAME; +int RemoteDirSort = SORT_NAME; +int TransMode = TYPE_X; +int ConnectOnStart = YES; +int DebugConsole = NO; +int SaveWinPos = NO; +char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" }; +int RecvMode = TRANS_DLG; +int SendMode = TRANS_DLG; +int MoveMode = MOVE_DLG; +int ListType = LVS_REPORT; +int CacheEntry = 10; +int CacheSave = NO; +char DefaultLocalPath[FMAX_PATH+1] = { "" }; +int SaveTimeStamp = YES; +int FindMode = 0; +int DotFile = YES; +int DclickOpen = YES; +int ConnectAndSet = YES; +SOUNDFILE Sound[SOUND_TYPES] = { { NO, "" }, { NO, "" }, { NO, "" } }; +int FnameCnv = FNAME_NOCNV; +int TimeOut = 90; +int RmEOF = NO; +int RegType = REGTYPE_REG; +char FwallHost[HOST_ADRS_LEN+1] = { "" }; +char FwallUser[USER_NAME_LEN+1] = { "" }; +char FwallPass[PASSWORD_LEN+1] = { "" }; +int FwallPort = PORT_NOR; +int FwallType = 1; +int FwallDefault = NO; +int FwallSecurity = SECURITY_AUTO; +int FwallResolv = NO; +int FwallLower = NO; +int FwallDelimiter = '@'; +int PasvDefault = NO; +char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" }; +char MirrorNoDel[MIRROR_LEN+1] = { "" }; +int MirrorFnameCnv = NO; +int SplitVertical = YES; +int RasClose = NO; +int RasCloseNotify = YES; +int FileHist = 5; +char DefAttrList[DEFATTRLIST_LEN+1] = { "" }; +SIZE HostDlgSize = { -1, -1 }; +SIZE BmarkDlgSize = { -1, -1 }; +SIZE MirrorDlgSize = { -1, -1 }; +int Sizing = SW_RESTORE; +int SortSave = NO; +char TmpPath[FMAX_PATH+1]; +int QuickAnonymous = YES; +int PassToHist = YES; +int VaxSemicolon = NO; +int SendQuit = NO; +int NoRasControl = NO; +int SuppressSave = NO; +int DispIgnoreHide = NO; +int DispDrives = NO; +int MirUpDelNotify = YES; +int MirDownDelNotify = YES; +int FolderAttr = NO; +int FolderAttrNum = 777; + + + + +/*----- ƒƒCƒ“ƒ‹[ƒ`ƒ“ -------------------------------------------------------- +* +* Parameter +* HINSTANCE hInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì‚±‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ +* HINSTANCE hPrevInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì’¼‘O‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ +* LPSTR lpszCmdLine : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª‹N“®‚µ‚½‚Æ‚«‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ð‚³‚·ƒƒ“ƒOƒ|ƒCƒ“ƒ^ +* int cmdShow : Å‰‚É•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ÌŒ`Ž®B +* +* Return Value +* int ÅŒã‚̃ƒbƒZ[ƒW‚ÌwParam +*----------------------------------------------------------------------------*/ + +int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow) +{ + MSG Msg; + int Ret; + BOOL Sts; + + // yutaka + if(OleInitialize(NULL) != S_OK){ + MessageBox(NULL, MSGJPN298, "FFFTP", MB_OK | MB_ICONERROR); + return 0; + } + + InitCommonControls(); + + Ret = FALSE; + hWndFtp = NULL; + hInstFtp = hInstance; + if(InitApp(lpszCmdLine, cmdShow) == SUCCESS) + { + for(;;) + { + Sts = GetMessage(&Msg, NULL, 0, 0); + if((Sts == 0) || (Sts == -1)) + break; + + if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + { + /* ƒfƒBƒŒƒNƒgƒŠ–¼‚Ì•\Ž¦ƒRƒ“ƒ{ƒ{ƒbƒNƒX‚ÅBS‚âRET‚ªŒø‚­‚悤‚É */ + /* ƒRƒ“ƒ{ƒ{ƒbƒNƒX“à‚ł̓AƒNƒZƒ‰ƒŒ[ƒ^‚𖳌ø‚É‚·‚é */ + if((Msg.hwnd == GetLocalHistEditHwnd()) || + (Msg.hwnd == GetRemoteHistEditHwnd()) || + ((hHelpWin != NULL) && (GetAncestor(Msg.hwnd, GA_ROOT) == hHelpWin)) || + GetHideUI() == YES || + (TranslateAccelerator(hWndFtp, Accel, &Msg) == 0)) + { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } + } + Ret = Msg.wParam; + } + UnregisterClass(FtpClassStr, hInstFtp); + OleUninitialize(); + return(Ret); +} + + +/*----- ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚̏‰ŠúÝ’è -------------------------------------------- +* +* Parameter +* HINSTANCE hInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì‚±‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ +* HINSTANCE hPrevInstance : ‚±‚̃AƒvƒŠƒP[ƒVƒ‡ƒ“‚Ì’¼‘O‚̃Cƒ“ƒXƒ^ƒ“ƒX‚̃nƒ“ƒhƒ‹ +* LPSTR lpszCmdLine : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚ª‹N“®‚µ‚½‚Æ‚«‚̃Rƒ}ƒ“ƒhƒ‰ƒCƒ“‚ð‚³‚·ƒƒ“ƒOƒ|ƒCƒ“ƒ^ +* int cmdShow : Å‰‚É•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ÌŒ`Ž®B +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int InitApp(LPSTR lpszCmdLine, int cmdShow) +{ + int sts; + int Err; + WSADATA WSAData; + char PwdBuf[FMAX_PATH+1]; + int useDefautPassword = 0; /* Œx•¶•\Ž¦—p */ + int masterpass; + + sts = FAIL; + + aes_init(); + srand(GetTickCount()); + + HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie); + + SaveUpdateBellInfo(); + + if((Err = WSAStartup((WORD)0x0202, &WSAData)) != 0) + MessageBox(NULL, ReturnWSError(Err), "FFFTP - Startup", MB_OK); + else + { + Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel)); + + GetTempPath(FMAX_PATH, TmpPath); + + GetModuleFileName(NULL, HelpPath, FMAX_PATH); + strcpy(GetFileName(HelpPath), "ffftp.chm"); + + if(CheckIniFileName(lpszCmdLine, IniPath) == 0) + { + GetModuleFileName(NULL, IniPath, FMAX_PATH); + strcpy(GetFileName(IniPath), "ffftp.ini"); + } + else + { + ForceIni = YES; + RegType = REGTYPE_INI; + } + +// AllocConsole(); + + /* 2010.02.01 genta ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ð“ü—Í‚³‚¹‚é + -z ƒIƒvƒVƒ‡ƒ“‚ª‚ ‚é‚Æ‚«‚͍ŏ‰‚¾‚¯ƒXƒLƒbƒv + -z ƒIƒvƒVƒ‡ƒ“‚ª‚È‚¢‚Æ‚«‚́CƒfƒtƒHƒ‹ƒgƒpƒXƒ[ƒh‚ð‚Ü‚¸ŽŽ‚· + LoadRegistory()‚·‚é + ƒpƒXƒ[ƒh‚ª•sˆê’v‚È‚çÄ“ü—Í‚·‚é‚©q‚Ë‚éD + (”j‘¹‚µ‚Ä‚¢‚½ê‡‚Í‚³‚¹‚È‚¢) + */ + if( CheckMasterPassword(lpszCmdLine, PwdBuf)) + { + SetMasterPassword( PwdBuf ); + useDefautPassword = 0; + } + else { + /* ƒpƒXƒ[ƒhŽw’è–³‚µ */ + SetMasterPassword( NULL ); + /* ‚±‚̏ê‚Å‚Í•\Ž¦‚Å‚«‚È‚¢‚̂Ńtƒ‰ƒO‚¾‚¯—§‚Ä‚Ä‚¨‚­*/ + useDefautPassword = 2; + } + + /* ƒpƒXƒ[ƒhƒ`ƒFƒbƒN‚Ì‚ÝŽÀŽ{ */ + masterpass = 1; + while( ValidateMasterPassword() == YES && + GetMasterPasswordStatus() == PASSWORD_UNMATCH ){ + + if( useDefautPassword != 2 ){ + /* Äƒgƒ‰ƒC‚·‚é‚©Šm”F */ + if( MessageBox(NULL, MSGJPN304, "FFFTP", MB_YESNO | MB_ICONEXCLAMATION) == IDNO ){ + useDefautPassword = 0; /* •sˆê’v‚Ȃ̂ŁC‚à‚Í‚âƒfƒtƒHƒ‹ƒg‚©‚Ç‚¤‚©‚Í•ª‚©‚ç‚È‚¢ */ + break; + } + } + + /* Ä“ü—Í‚³‚¹‚é*/ + masterpass = EnterMasterPasswordAndSet(masterpasswd_dlg, NULL); + if( masterpass == 2 ){ + useDefautPassword = 1; + } + else if( masterpass == 0 ){ + SaveExit = NO; + break; + } + else { + useDefautPassword = 0; + } + } + + if(masterpass != 0) + { + LoadRegistory(); + + LoadJre(); + if(NoRasControl == NO) + LoadRasLib(); + LoadKernelLib(); + + //ƒ^ƒCƒ}‚̐¸“x‚ð‰ü‘P + timeBeginPeriod(1); + + CountPrevFfftpWindows(); + + if(MakeAllWindows(cmdShow) == SUCCESS) + { + hWndCurFocus = GetLocalHwnd(); + + if(strlen(DefaultLocalPath) > 0) + SetCurrentDirectory(DefaultLocalPath); + + SetSortTypeImm(LocalFileSort, LocalDirSort, RemoteFileSort, RemoteDirSort); + SetTransferTypeImm(TransMode); + DispTransferType(); + SetHostKanaCnvImm(YES); + SetHostKanjiCodeImm(KANJI_NOCNV); + DispListType(); + DispDotFileMode(); + DispSyncMoveMode(); + + MakeCacheBuf(CacheEntry); + if(CacheSave == YES) + LoadCache(); + + if(MakeTransferThread() == SUCCESS) + { + DoPrintf("DEBUG MESSAGE ON ! ##"); + + DispWindowTitle(); + SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators."); + + if(ForceIni) + SetTaskMsg("%s%s", MSGJPN283, IniPath); + + if(IsFolderExist(TmpPath) == NO) + { + SetTaskMsg(MSGJPN152, TmpPath); + GetTempPath(FMAX_PATH, TmpPath); + SetTaskMsg(MSGJPN153, TmpPath); + } + + DoPrintf("Tmp =%s", TmpPath); + DoPrintf("Help=%s", HelpPath); + + DragAcceptFiles(GetRemoteHwnd(), TRUE); + DragAcceptFiles(GetLocalHwnd(), TRUE); + + SetAllHistoryToMenu(); + GetLocalDirForWnd(); + MakeButtonsFocus(); + DispTransferFiles(); + + StartupProc(lpszCmdLine); + sts = SUCCESS; + + /* ƒZƒLƒ…ƒŠƒeƒBŒx•¶‚Ì•\Ž¦ */ + if( useDefautPassword ){ + SetTaskMsg(MSGJPN300); + } + + /* ƒpƒXƒ[ƒh•sˆê’vŒx•¶‚Ì•\Ž¦ */ + switch( GetMasterPasswordStatus() ){ + case PASSWORD_UNMATCH: + SetTaskMsg(MSGJPN301); + break; + case BAD_PASSWORD_HASH: + SetTaskMsg(MSGJPN302); + break; + default: + break; + } + } + } + } + } + + if(sts == FAIL) + DeleteAllObject(); + + return(sts); +} + + +/*----- ƒEƒCƒ“ƒhƒE‚ðì¬‚·‚é -------------------------------------------------- +* +* Parameter +* int cmdShow : Å‰‚É•\Ž¦‚·‚éƒEƒCƒ“ƒhƒE‚ÌŒ`Ž®B +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int MakeAllWindows(int cmdShow) +{ + RECT Rect1; + RECT Rect2; + WNDCLASSEX wClass; + int Sts; + int StsTask; + int StsSbar; + int StsTbar; + int StsList; + int StsLvtips; + int StsSocket; + + /*===== ƒƒCƒ“ƒEƒCƒ“ƒhƒE =====*/ + + RootColorBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); + + wClass.cbSize = sizeof(WNDCLASSEX); + wClass.style = 0; + wClass.lpfnWndProc = FtpWndProc; + wClass.cbClsExtra = 0; + wClass.cbWndExtra = 0; + wClass.hInstance = hInstFtp; + wClass.hIcon = LoadIcon(hInstFtp, MAKEINTRESOURCE(ffftp)); + wClass.hCursor = NULL; + wClass.hbrBackground = RootColorBrush; + wClass.lpszMenuName = (LPSTR)MAKEINTRESOURCE(main_menu); + wClass.lpszClassName = FtpClassStr; + wClass.hIconSm = NULL; + RegisterClassEx(&wClass); + + if(SaveWinPos == NO) + { + WinPosX = CW_USEDEFAULT; + WinPosY = 0; + } + hWndFtp = CreateWindow(FtpClassStr, "FFFTP", + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + WinPosX, WinPosY, WinWidth, WinHeight, + HWND_DESKTOP, 0, hInstFtp, NULL); + + if(hWndFtp != NULL) + { + SystemParametersInfo(SPI_GETWORKAREA, 0, &Rect1, 0); + GetWindowRect(hWndFtp, &Rect2); + if(Rect2.bottom > Rect1.bottom) + { + Rect2.top = max1(0, Rect2.top - (Rect2.bottom - Rect1.bottom)); + MoveWindow(hWndFtp, Rect2.left, Rect2.top, WinWidth, WinHeight, FALSE); + } + + /*===== ƒXƒeƒCƒ^ƒXƒo[ =====*/ + + StsSbar = MakeStatusBarWindow(hWndFtp, hInstFtp); + + CalcWinSize(); + + /*===== ƒc[ƒ‹ƒo[ =====*/ + + StsTbar = MakeToolBarWindow(hWndFtp, hInstFtp); + + /*===== ƒtƒ@ƒCƒ‹ƒŠƒXƒgƒEƒCƒ“ƒhƒE =====*/ + + StsList = MakeListWin(hWndFtp, hInstFtp); + + /*==== ƒ^ƒXƒNƒEƒCƒ“ƒhƒE ====*/ + + StsTask = MakeTaskWindow(hWndFtp, hInstFtp); + + if((cmdShow != SW_MINIMIZE) && (cmdShow != SW_SHOWMINIMIZED) && (cmdShow != SW_SHOWMINNOACTIVE) && + (Sizing == SW_MAXIMIZE)) + cmdShow = SW_MAXIMIZE; + + ShowWindow(hWndFtp, cmdShow); + + /*==== ƒ\ƒPƒbƒgƒEƒCƒ“ƒhƒE ====*/ + + StsSocket = MakeSocketWin(hWndFtp, hInstFtp); + + StsLvtips = InitListViewTips(hWndFtp, hInstFtp); + } + + Sts = SUCCESS; + if((hWndFtp == NULL) || + (StsTbar == FAIL) || + (StsList == FAIL) || + (StsSbar == FAIL) || + (StsTask == FAIL) || + (StsLvtips == FAIL) || + (StsSocket == FAIL)) + { + Sts = FAIL; + } + + if(Sts == SUCCESS) + SetListViewType(); + + return(Sts); +} + + +/*----- ƒEƒCƒ“ƒhƒE‚̃^ƒCƒgƒ‹‚ð•\Ž¦‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispWindowTitle(void) +{ + char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20]; + + if(AskConnecting() == YES) + sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr); + else + sprintf(Tmp, "FFFTP (%s)", FilterStr); + + SetWindowText(GetMainHwnd(), Tmp); + return; +} + + +/*----- ‘S‚ẴIƒuƒWƒFƒNƒg‚ðíœ ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DeleteAllObject(void) +{ + DeleteCacheBuf(); + +//move to WM_DESTROY + WSACleanup(); + +//test ƒVƒXƒeƒ€”C‚¹ +// if(ListFont != NULL) +// DeleteObject(ListFont); +// if(RootColorBrush != NULL) +// DeleteObject(RootColorBrush); + +//test ƒVƒXƒeƒ€”C‚¹ +// DeleteListViewTips(); +// DeleteListWin(); +// DeleteStatusBarWindow(); +// DeleteTaskWindow(); +// DeleteToolBarWindow(); +// DeleteSocketWin(); + +//move to WM_DESTROY + if(hWndFtp != NULL) + DestroyWindow(hWndFtp); + + ReleaseJre(); + ReleaseRasLib(); + ReleaseKernelLib(); + + return; +} + + +/*----- ƒƒCƒ“ƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetMainHwnd(void) +{ + return(hWndFtp); +} + + +/*----- Œ»ÝƒtƒH[ƒJƒX‚ª‚ ‚éƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· -------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetFocusHwnd(void) +{ + return(hWndCurFocus); +} + + +/*----- Œ»ÝƒtƒH[ƒJƒX‚ª‚ ‚éƒEƒCƒ“ƒhƒE‚Ì‚ðƒZƒbƒg‚·‚é -------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetFocusHwnd(HWND hWnd) +{ + hWndCurFocus = hWnd; + return; +} + + +/*----- ƒvƒƒOƒ‰ƒ€‚̃Cƒ“ƒXƒ^ƒ“ƒX‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HINSTANCE ƒCƒ“ƒXƒ^ƒ“ƒX +*----------------------------------------------------------------------------*/ + +HINSTANCE GetFtpInst(void) +{ + return(hInstFtp); +} + + +/*----- ƒƒCƒ“ƒEƒCƒ“ƒhƒE‚̃ƒbƒZ[ƒWˆ— -------------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* ƒƒbƒZ[ƒW‚ɑΉž‚·‚é–ß‚è’l +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + LPTOOLTIPTEXT lpttt; + RECT Rect; + + int TmpTransType; + + switch (message) + { + case WM_COMMAND : + switch(LOWORD(wParam)) + { + case MENU_CONNECT : + ConnectProc(DLG_TYPE_CON, -1); + break; + + case MENU_CONNECT_NUM : + ConnectProc(DLG_TYPE_CON, (int)lParam); + if(AskConnecting() == YES) + { + if(HIWORD(wParam) & OPT_MIRROR) + { + if(HIWORD(wParam) & OPT_FORCE) + MirrorUploadProc(NO); + else + MirrorUploadProc(YES); + } + else if(HIWORD(wParam) & OPT_MIRRORDOWN) + { + if(HIWORD(wParam) & OPT_FORCE) + MirrorDownloadProc(NO); + else + MirrorDownloadProc(YES); + } + } + break; + + case MENU_SET_CONNECT : + ConnectProc(DLG_TYPE_SET, -1); + break; + + case MENU_QUICK : + QuickConnectProc(); + break; + + case MENU_DISCONNECT : + if(AskTryingConnect() == YES) + CancelFlg = YES; + else if(AskConnecting() == YES) + { + SaveBookMark(); + SaveCurrentSetToHost(); + DisconnectProc(); + } + break; + + case MENU_HIST_1 : + case MENU_HIST_2 : + case MENU_HIST_3 : + case MENU_HIST_4 : + case MENU_HIST_5 : + case MENU_HIST_6 : + case MENU_HIST_7 : + case MENU_HIST_8 : + case MENU_HIST_9 : + case MENU_HIST_10 : + case MENU_HIST_11 : + case MENU_HIST_12 : + case MENU_HIST_13 : + case MENU_HIST_14 : + case MENU_HIST_15 : + case MENU_HIST_16 : + case MENU_HIST_17 : + case MENU_HIST_18 : + case MENU_HIST_19 : + case MENU_HIST_20 : + HistoryConnectProc(LOWORD(wParam)); + break; + + case MENU_UPDIR : + if(hWndCurFocus == GetLocalHwnd()) + PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_LOCAL_UPDIR, 0), 0); + else + PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(MENU_REMOTE_UPDIR, 0), 0); + break; + + case MENU_DCLICK : + if(hWndCurFocus == GetLocalHwnd()) + DoubleClickProc(WIN_LOCAL, YES, -1); + else + { + SuppressRefresh = 1; + DoubleClickProc(WIN_REMOTE, YES, -1); + SuppressRefresh = 0; + } + break; + + case MENU_OPEN1 : + if(hWndCurFocus == GetLocalHwnd()) + DoubleClickProc(WIN_LOCAL, YES, 0); + else + { + SuppressRefresh = 1; + DoubleClickProc(WIN_REMOTE, YES, 0); + SuppressRefresh = 0; + } + break; + + case MENU_OPEN2 : + if(hWndCurFocus == GetLocalHwnd()) + DoubleClickProc(WIN_LOCAL, YES, 1); + else + { + SuppressRefresh = 1; + DoubleClickProc(WIN_REMOTE, YES, 1); + SuppressRefresh = 0; + } + break; + + case MENU_OPEN3 : + if(hWndCurFocus == GetLocalHwnd()) + DoubleClickProc(WIN_LOCAL, YES, 2); + else + { + SuppressRefresh = 1; + DoubleClickProc(WIN_REMOTE, YES, 2); + SuppressRefresh = 0; + } + break; + + case MENU_REMOTE_UPDIR : + SuppressRefresh = 1; + SetCurrentDirAsDirHist(); + ChangeDir(WIN_REMOTE, ".."); + SuppressRefresh = 0; + break; + + case MENU_LOCAL_UPDIR : + SetCurrentDirAsDirHist(); + ChangeDir(WIN_LOCAL, ".."); + break; + + case MENU_REMOTE_CHDIR : + SuppressRefresh = 1; + SetCurrentDirAsDirHist(); + ChangeDirDirectProc(WIN_REMOTE); + SuppressRefresh = 0; + break; + + case MENU_LOCAL_CHDIR : + SetCurrentDirAsDirHist(); + ChangeDirDirectProc(WIN_LOCAL); + break; + + case MENU_DOWNLOAD : + SetCurrentDirAsDirHist(); + DownLoadProc(NO, NO, NO); + break; + + case MENU_DOWNLOAD_AS : + SetCurrentDirAsDirHist(); + DownLoadProc(YES, NO, NO); + break; + + case MENU_DOWNLOAD_AS_FILE : + SetCurrentDirAsDirHist(); + DownLoadProc(NO, YES, NO); + break; + + case MENU_DOWNLOAD_ALL : + SetCurrentDirAsDirHist(); + DownLoadProc(NO, NO, YES); + break; + + case MENU_DOWNLOAD_NAME : + SetCurrentDirAsDirHist(); + InputDownLoadProc(); + break; + + case MENU_UPLOAD : + SetCurrentDirAsDirHist(); + UpLoadListProc(NO, NO); + break; + + case MENU_UPLOAD_AS : + SetCurrentDirAsDirHist(); + UpLoadListProc(YES, NO); + break; + + case MENU_UPLOAD_ALL : + SetCurrentDirAsDirHist(); + UpLoadListProc(NO, YES); + break; + + case MENU_MIRROR_UPLOAD : + SetCurrentDirAsDirHist(); + MirrorUploadProc(YES); + break; + + case MENU_MIRROR_DOWNLOAD : + SetCurrentDirAsDirHist(); + MirrorDownloadProc(YES); + break; + + case MENU_FILESIZE : + SetCurrentDirAsDirHist(); + CalcFileSizeProc(); + break; + + case MENU_DELETE : + SuppressRefresh = 1; + SetCurrentDirAsDirHist(); + DeleteProc(); + SuppressRefresh = 0; + break; + + case MENU_RENAME : + SuppressRefresh = 1; + SetCurrentDirAsDirHist(); + RenameProc(); + SuppressRefresh = 0; + break; + + case MENU_MKDIR : + SuppressRefresh = 1; + SetCurrentDirAsDirHist(); + MkdirProc(); + SuppressRefresh = 0; + break; + + case MENU_CHMOD : + SuppressRefresh = 1; + ChmodProc(); + SuppressRefresh = 0; + break; + + case MENU_SOMECMD : + SuppressRefresh = 1; + SomeCmdProc(); + SuppressRefresh = 0; + break; + + case MENU_OPTION : + SetOption(0); + if(ListFont != NULL) + { + SendMessage(GetLocalHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + SendMessage(GetRemoteHwnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + SendMessage(GetTaskWnd(), WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + } + GetLocalDirForWnd(); + DispTransferType(); + CheckHistoryNum(0); + SetAllHistoryToMenu(); + break; + + case MENU_FILTER : + SetFilter(&CancelFlg); + break; + + case MENU_SORT : + if(SortSetting() == YES) + { + LocalFileSort = AskSortType(ITEM_LFILE); + LocalDirSort = AskSortType(ITEM_LDIR); + RemoteFileSort = AskSortType(ITEM_RFILE); + RemoteDirSort = AskSortType(ITEM_RDIR); + ReSortDispList(WIN_LOCAL, &CancelFlg); + ReSortDispList(WIN_REMOTE, &CancelFlg); + } + break; + + case MENU_EXIT : + PostMessage(hWnd, WM_CLOSE, 0, 0L); + break; + + case MENU_AUTO_EXIT : + if(AutoExit == YES) + PostMessage(hWnd, WM_CLOSE, 0, 0L); + break; + + case MENU_ABOUT : + DialogBox(hInstFtp, MAKEINTRESOURCE(about_dlg), hWnd, AboutDialogProc); + break; + + case MENU_TEXT : + case MENU_BINARY : + case MENU_AUTO : + SetTransferType(LOWORD(wParam)); + DispTransferType(); + break; + + case MENU_XFRMODE : + switch(AskTransferType()) + { + case TYPE_A : + TmpTransType = MENU_BINARY; + break; + + case TYPE_I : + TmpTransType = MENU_AUTO; + break; + + default : + TmpTransType = MENU_TEXT; + break; + } + SetTransferType(TmpTransType); + DispTransferType(); + break; + + case MENU_KNJ_EUC : + case MENU_KNJ_JIS : + case MENU_KNJ_NONE : + SetHostKanjiCode(LOWORD(wParam)); + break; + + case MENU_KANACNV : + SetHostKanaCnv(); + break; + + case MENU_REFRESH : + SuppressRefresh = 1; + GetLocalDirForWnd(); + if(CheckClosedAndReconnect() == SUCCESS) + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + SuppressRefresh = 0; + break; + + case MENU_LIST : + ListType = LVS_LIST; + DispListType(); + SetListViewType(); + break; + + case MENU_REPORT : + ListType = LVS_REPORT; + DispListType(); + SetListViewType(); + break; + + case REFRESH_LOCAL : + GetLocalDirForWnd(); + break; + + case REFRESH_REMOTE : + SuppressRefresh = 1; + if(CheckClosedAndReconnect() == SUCCESS) + GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); + SuppressRefresh = 0; + break; + + case COMBO_LOCAL : + case COMBO_REMOTE : + SuppressRefresh = 1; + if(HIWORD(wParam) == CBN_SELCHANGE) + { + SetCurrentDirAsDirHist(); + ChangeDirComboProc((HWND)lParam); + } + else if(HIWORD(wParam) != CBN_CLOSEUP) + { + MakeButtonsFocus(); + SuppressRefresh = 0; + return(0); + } + SuppressRefresh = 0; + break; + + case MENU_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000001); + break; + + case MENU_HELP_TROUBLE : + ShellExecute(NULL, "open", MYWEB_URL, NULL, ".", SW_SHOW); + break; + + case MENU_BMARK_ADD : + AddCurDirToBookMark(WIN_REMOTE); + break; + + case MENU_BMARK_ADD_LOCAL : + AddCurDirToBookMark(WIN_LOCAL); + break; + + case MENU_BMARK_ADD_BOTH : + AddCurDirToBookMark(WIN_BOTH); + break; + + case MENU_BMARK_EDIT : + EditBookMark(); + break; + + case MENU_SELECT_ALL : + SelectFileInList(hWndCurFocus, SELECT_ALL); + break; + + case MENU_SELECT : + SelectFileInList(hWndCurFocus, SELECT_REGEXP); + break; + + case MENU_FIND : + FindFileInList(hWndCurFocus, FIND_FIRST); + break; + + case MENU_FINDNEXT : + FindFileInList(hWndCurFocus, FIND_NEXT); + break; + + case MENU_DOTFILE : + DotFile ^= 1; + DispDotFileMode(); + GetLocalDirForWnd(); + GetRemoteDirForWnd(CACHE_LASTREAD, &CancelFlg); + break; + + case MENU_SYNC : + ToggleSyncMoveMode(); + break; + + case MENU_IMPORT_WS : + ImportFromWSFTP(); + break; + + case MENU_REGSAVE : + GetListTabWidth(); + SaveRegistory(); + SaveSettingsToFile(); + break; + + case MENU_REGLOAD : + if(LoadSettingsFromFile() == YES) + { + MessageBox(hWnd, MSGJPN292, "FFFTP", MB_OK); + SaveExit = NO; + PostMessage(hWnd, WM_CLOSE, 0, 0L); + } + break; + + case MENU_REGINIT : + if(DialogBox(hInstFtp, MAKEINTRESOURCE(reginit_dlg), hWnd, ExeEscDialogProc) == YES) + { + ClearRegistory(); + SaveExit = NO; + PostMessage(hWnd, WM_CLOSE, 0, 0L); + } + break; + case MENU_CHANGEPASSWD: /* 2010.01.31 genta */ + if( GetMasterPasswordStatus() != PASSWORD_OK ) + { + /* ‹­§“I‚ɐݒ肷‚é‚©Šm”F */ + if( DialogBox(hInstFtp, MAKEINTRESOURCE(forcepasschange_dlg), hWnd, ExeEscDialogProc) != YES){ + break; + } + } + if( EnterMasterPasswordAndSet( newmasterpasswd_dlg, hWnd ) != 0 ){ + SetTaskMsg( MSGJPN303 ); + } + break; + + case MENU_DIRINFO : + DispDirInfo(); + break; + + case MENU_TASKINFO : + DispTaskMsg(); + break; + + case MENU_ABORT : + CancelFlg = YES; + if(AskTryingConnect() == NO) + MainTransPkt.Abort = ABORT_USER; + break; + + case MENU_OTPCALC : + OtpCalcTool(); + break; + + case MENU_URL_COPY : + CopyURLtoClipBoard(); + break; + + case MENU_APPKEY : + EraseListViewTips(); + if(hWndCurFocus == GetRemoteHwnd()) + RemoteRbuttonMenu(1); + else if(hWndCurFocus == GetLocalHwnd()) + LocalRbuttonMenu(1); + break; + + default : + if((LOWORD(wParam) >= MENU_BMARK_TOP) && + (LOWORD(wParam) < MENU_BMARK_TOP+100)) + { + ChangeDirBmarkProc(LOWORD(wParam)); + } + break; + } +// í‚ɃzƒXƒg‚©ƒ[ƒJƒ‹‚ÖƒtƒH[ƒJƒX‚ðˆÚ“® +// SetFocus(hWndCurFocus); + MakeButtonsFocus(); + break; + + case WM_NOTIFY : + switch(((LPNMHDR)lParam)->code) + { + /* ƒc[ƒ‹ƒ`ƒbƒvƒRƒ“ƒgƒ[ƒ‹ƒƒbƒZ[ƒW‚̏ˆ— */ + case TTN_NEEDTEXT: + lpttt = (LPTOOLTIPTEXT)lParam; + lpttt->hinst = hInstFtp; + switch(lpttt->hdr.idFrom) + { + case MENU_CONNECT : + lpttt->lpszText = MSGJPN154; + break; + + case MENU_QUICK : + lpttt->lpszText = MSGJPN155; + break; + + case MENU_DISCONNECT : + lpttt->lpszText = MSGJPN156; + break; + + case MENU_DOWNLOAD : + lpttt->lpszText = MSGJPN157; + break; + + case MENU_UPLOAD : + lpttt->lpszText = MSGJPN158; + break; + + case MENU_MIRROR_UPLOAD : + lpttt->lpszText = MSGJPN159; + break; + + case MENU_DELETE : + lpttt->lpszText = MSGJPN160; + break; + + case MENU_RENAME : + lpttt->lpszText = MSGJPN161; + break; + + case MENU_MKDIR : + lpttt->lpszText = MSGJPN162; + break; + + case MENU_LOCAL_UPDIR : + case MENU_REMOTE_UPDIR : + lpttt->lpszText = MSGJPN163; + break; + + case MENU_LOCAL_CHDIR : + case MENU_REMOTE_CHDIR : + lpttt->lpszText = MSGJPN164; + break; + + case MENU_TEXT : + lpttt->lpszText = MSGJPN165; + break; + + case MENU_BINARY : + lpttt->lpszText = MSGJPN166; + break; + + case MENU_AUTO : + lpttt->lpszText = MSGJPN167; + break; + + case MENU_REFRESH : + lpttt->lpszText = MSGJPN168; + break; + + case MENU_LIST : + lpttt->lpszText = MSGJPN169; + break; + + case MENU_REPORT : + lpttt->lpszText = MSGJPN170; + break; + + case MENU_KNJ_EUC : + lpttt->lpszText = MSGJPN171; + break; + + case MENU_KNJ_JIS : + lpttt->lpszText = MSGJPN172; + break; + + case MENU_KNJ_NONE : + lpttt->lpszText = MSGJPN173; + break; + + case MENU_KANACNV : + lpttt->lpszText = MSGJPN174; + break; + + case MENU_SYNC : + lpttt->lpszText = MSGJPN175; + break; + + case MENU_ABORT : + lpttt->lpszText = MSGJPN176; + break; + } + break; + + case LVN_COLUMNCLICK : + if(((NMHDR *)lParam)->hwndFrom == GetLocalHwnd()) + { + SetSortTypeByColumn(WIN_LOCAL, ((NM_LISTVIEW *)lParam)->iSubItem); + ReSortDispList(WIN_LOCAL, &CancelFlg); + } + else if(((NMHDR *)lParam)->hwndFrom == GetRemoteHwnd()) + { + if(((NM_LISTVIEW *)lParam)->iSubItem != 4) + { + SetSortTypeByColumn(WIN_REMOTE, ((NM_LISTVIEW *)lParam)->iSubItem); + ReSortDispList(WIN_REMOTE, &CancelFlg); + } + } + SetFocus(hWndCurFocus); + break; + + case LVN_ITEMCHANGED : + DispSelectedSpace(); + MakeButtonsFocus(); + break; + } + break; + + case WM_SIZE : + Sizing = SW_RESTORE; + if(wParam == SIZE_RESTORED) + { + ResizeWindowProc(); + GetWindowRect(hWnd, &Rect); + WinPosX = Rect.left; + WinPosY = Rect.top; + } + else if(wParam == SIZE_MAXIMIZED) + { + Sizing = SW_MAXIMIZE; + ResizeWindowProc(); + } + else + return(DefWindowProc(hWnd, message, wParam, lParam)); + break; + + case WM_MOVING : + WinPosX = ((RECT *)lParam)->left; + WinPosY = ((RECT *)lParam)->top; + return(DefWindowProc(hWnd, message, wParam, lParam)); + + case WM_SETFOCUS : + SetFocus(hWndCurFocus); + break; + + case WM_LBUTTONDOWN : + case WM_LBUTTONUP : + case WM_MOUSEMOVE : + CheckResizeFrame(wParam, LOWORD(lParam), HIWORD(lParam)); + break; + + case WM_CHANGE_COND : + DispTransferFiles(); + break; + + case WM_REFRESH_LOCAL_FLG : + PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_LOCAL, 0), 0); + break; + + case WM_REFRESH_REMOTE_FLG : + if(SuppressRefresh == 0) + PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0); + break; + + case WM_PAINT : + BeginPaint(hWnd, (LPPAINTSTRUCT) &ps); + EndPaint(hWnd, (LPPAINTSTRUCT) &ps); + break; + + case WM_DESTROY : +// WSACleanup(); +// DestroyWindow(hWndFtp); + PostQuitMessage(0); + break; + + case WM_QUERYENDSESSION : + ExitProc(hWnd); + return(TRUE); + + case WM_CLOSE : + if((AskTransferNow() == NO) || + (DialogBox(hInstFtp, MAKEINTRESOURCE(exit_dlg), hWnd, ExeEscDialogProc) == YES)) + { + ExitProc(hWnd); + return(DefWindowProc(hWnd, message, wParam, lParam)); + } + break; + + default : + return(DefWindowProc(hWnd, message, wParam, lParam)); + } + return(0L); +} + + +/*----- ƒvƒƒOƒ‰ƒ€ŠJŽnŽž‚̏ˆ— ------------------------------------------------ +* +* Parameter +* char *Cmd : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void StartupProc(char *Cmd) +{ + int Sts; + int AutoConnect; + int CmdOption; + int Kanji; + int Kana; + int FnameKanji; + int TrMode; + char unc[FMAX_PATH+1]; + + Sts = AnalyzeComLine(Cmd, &AutoConnect, &CmdOption, unc, FMAX_PATH); + + TrMode = TYPE_DEFAULT; + Kanji = KANJI_NOCNV; + FnameKanji = KANJI_NOCNV; + Kana = YES; + if(CmdOption & OPT_ASCII) + TrMode = TYPE_A; + if(CmdOption & OPT_BINARY) + TrMode = TYPE_I; + if(CmdOption & OPT_EUC) + Kanji = KANJI_EUC; + if(CmdOption & OPT_JIS) + Kanji = KANJI_JIS; + if(CmdOption & OPT_EUC_NAME) + FnameKanji = KANJI_EUC; + if(CmdOption & OPT_JIS_NAME) + FnameKanji = KANJI_JIS; + if(CmdOption & OPT_KANA) + Kana = NO; + + if(CmdOption & OPT_QUIT) + AutoExit = YES; + + if(CmdOption & OPT_SAVEOFF) + SuppressSave = YES; + if(CmdOption & OPT_SAVEON) + SuppressSave = NO; + + if(Sts == 0) + { + if(ConnectOnStart == YES) + PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT, 0), 0); + } + else if(Sts == 1) + { + DirectConnectProc(unc, Kanji, Kana, FnameKanji, TrMode); + } + else if(Sts == 2) + { + PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_CONNECT_NUM, CmdOption), (LPARAM)AutoConnect); + } + return; +} + + +/*----- ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚ð‰ðÍ -------------------------------------------------- +* +* Parameter +* char *Str : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ +* int *AutoConnect : Ú‘±ƒzƒXƒg”ԍ†‚ð•Ô‚·ƒ[ƒN +* int *CmdOption : ƒIƒvƒVƒ‡ƒ“‚ð•Ô‚·ƒ[ƒN +* char *unc : unc‚ð•Ô‚·ƒ[ƒN +* int Max : unc‚̍ő咷 +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* 0=Žw’è‚È‚µA1=URLŽw’èA2=Ý’è–¼Žw’èA-1=ƒGƒ‰[ +* +* Note +* -m --mirror +* -d --mirrordown +* -f --force +* -q --quit +* -s --set +* -h --help +* -e --euc +* -j --jis +* -a --ascii +* -b --binary +* -x --auto +* -k --kana +* -u --eucname +* -i --jisname +* -n --ini (CheckIniFileName‚ÅŒŸõ) +* --saveoff +* --saveon +* -z --mpasswd (CheckMasterPassword‚ÅŒŸõ) 2010.01.30 genta ’ljÁ +*----------------------------------------------------------------------------*/ + +static int AnalyzeComLine(char *Str, int *AutoConnect, int *CmdOption, char *unc, int Max) +{ + int Ret; + char Tmp[FMAX_PATH+1]; + + *AutoConnect = -1; + *CmdOption = 0; + + Ret = 0; + memset(unc, NUL, Max+1); + + while((Ret != -1) && ((Str = GetToken(Str, Tmp)) != NULL)) + { + if(Tmp[0] == '-') + { + _strlwr(Tmp); + if((strcmp(&Tmp[1], "m") == 0) || (strcmp(&Tmp[1], "-mirror") == 0)) + *CmdOption |= OPT_MIRROR; + else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0)) + *CmdOption |= OPT_MIRRORDOWN; + else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0)) + *CmdOption |= OPT_EUC; + else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0)) + *CmdOption |= OPT_JIS; + else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0)) + *CmdOption |= OPT_ASCII; + else if((strcmp(&Tmp[1], "b") == 0) || (strcmp(&Tmp[1], "-binary") == 0)) + *CmdOption |= OPT_BINARY; + else if((strcmp(&Tmp[1], "x") == 0) || (strcmp(&Tmp[1], "-auto") == 0)) + *CmdOption |= OPT_AUTO; + else if((strcmp(&Tmp[1], "f") == 0) || (strcmp(&Tmp[1], "-force") == 0)) + *CmdOption |= OPT_FORCE; + else if((strcmp(&Tmp[1], "q") == 0) || (strcmp(&Tmp[1], "-quit") == 0)) + *CmdOption |= OPT_QUIT; + else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0)) + *CmdOption |= OPT_KANA; + else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0)) + *CmdOption |= OPT_EUC_NAME; + else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0)) + *CmdOption |= OPT_JIS_NAME; + else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0)) + { + if((Str = GetToken(Str, Tmp)) == NULL) + { + SetTaskMsg(MSGJPN282); + Ret = -1; + } + } + else if(strcmp(&Tmp[1], "-saveoff") == 0) + *CmdOption |= OPT_SAVEOFF; + else if(strcmp(&Tmp[1], "-saveon") == 0) + *CmdOption |= OPT_SAVEON; + else if((strcmp(&Tmp[1], "z") == 0) || (strcmp(&Tmp[1], "-mpasswd") == 0)) + { /* 2010.01.30 genta : Add master password option */ + if((Str = GetToken(Str, Tmp)) == NULL) + { + SetTaskMsg(MSGJPN299); + Ret = -1; + } + } + else if((strcmp(&Tmp[1], "s") == 0) || (strcmp(&Tmp[1], "-set") == 0)) + { + if(Ret == 0) + { + if((Str = GetToken(Str, Tmp)) != NULL) + { + if((*AutoConnect = SearchHostName(Tmp)) != -1) + Ret = 2; + else + { + SetTaskMsg(MSGJPN177, Tmp); + Ret = -1; + } + } + else + { + SetTaskMsg(MSGJPN178); + Ret = -1; + } + } + else + { + SetTaskMsg(MSGJPN179); + Ret = -1; + } + } + else if((strcmp(&Tmp[1], "h") == 0) || (strcmp(&Tmp[1], "-help") == 0)) + { + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000024); + } + else + { + SetTaskMsg(MSGJPN180, Tmp); + Ret = -1; + } + } + else + { + if(Ret == 0) + { + strncpy(unc, Tmp, Max); + Ret = 1; + } + else + { + SetTaskMsg(MSGJPN181); + Ret = -1; + } + } + } + return(Ret); +} + + +/*----- INIƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ÌŽw’è‚ðƒ`ƒFƒbƒN ------------------------------------ +* +* Parameter +* char *Str : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ +* char *Ini : iniƒtƒ@ƒCƒ‹–¼‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* 0=Žw’è‚È‚µA1=‚ ‚è +* +* Note +* -n --ini +*----------------------------------------------------------------------------*/ + +static int CheckIniFileName(char *Str, char *Ini) +{ + return GetTokenAfterOption( Str, Ini, "n", "-ini" ); +} + +/* ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ÌŽw’è‚ðƒ`ƒFƒbƒN */ +static int CheckMasterPassword(char *Str, char *Ini) +{ + return GetTokenAfterOption( Str, Ini, "z", "-mpasswd" ); +} + +/*----- ƒIƒvƒVƒ‡ƒ“‚ÌŒã‚ë‚̃g[ƒNƒ“‚ðŽæ‚èo‚· ------------------------------------ +* +* Parameter +* char *Str : ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“•¶Žš—ñ +* char *Result : Žæ‚èo‚µ‚½•¶Žš—ñ‚ðŠi”[‚·‚郏[ƒN +* const char* Opt1, *Opt2: ƒIƒvƒVƒ‡ƒ“•¶Žš—ñ(2‚Â) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* 0=Žw’è‚È‚µA1=‚ ‚è +* +* Note +* 2010.01.30 genta ƒ}ƒXƒ^[ƒpƒXƒ[ƒhŽæ‚èo‚µ‚Ì‚½‚ß‹¤’ʉ» +*----------------------------------------------------------------------------*/ +static int GetTokenAfterOption(char *Str, char *Result, const char* Opt1, const char* Opt2 ) +{ + int Ret = 0; + char Tmp[FMAX_PATH+1]; + + Result[0] = NUL; + while((Str = GetToken(Str, Tmp)) != NULL) + { + if(Tmp[0] == '-') + { + _strlwr(Tmp); + if((strcmp(&Tmp[1], Opt1) == 0) || (strcmp(&Tmp[1], Opt2) == 0)) + { + if((Str = GetToken(Str, Result)) != NULL) + Ret = 1; + break; + } + } + } + return(Ret); +} + +/*----- ƒg[ƒNƒ“‚ð•Ô‚· -------------------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char *Buf : •¶Žš—ñ‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* char *•Ô‚µ‚½ƒg[ƒNƒ“‚Ì––”ö +* NULL=I‚í‚è +*----------------------------------------------------------------------------*/ + +static char *GetToken(char *Str, char *Buf) +{ + int InQuote; + + while(*Str != NUL) + { + if((*Str != ' ') && (*Str != '\t')) + break; + Str++; + } + + if(*Str != NUL) + { + InQuote = 0; + while(*Str != NUL) + { + if(*Str == 0x22) + InQuote = !InQuote; + else + { + if(((*Str == ' ') || (*Str == '\t')) && + (InQuote == 0)) + { + break; + } + *Buf++ = *Str; + } + Str++; + } + } + else + Str = NULL; + + *Buf = NUL; + + return(Str); +} + + +/*----- ƒvƒƒOƒ‰ƒ€I—¹Žž‚̏ˆ— ------------------------------------------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void ExitProc(HWND hWnd) +{ + CancelFlg = YES; + + CloseTransferThread(); + + if(SaveExit == YES) + { + SaveBookMark(); + SaveCurrentSetToHost(); + } + DeleteAlltempFile(); + +// WSACancelBlockingCall(); + DisconnectProc(); +// CloseTransferThread(); + + if(SaveExit == YES) + { + GetListTabWidth(); + SaveRegistory(); + + if((CacheEntry > 0) && (CacheSave == YES)) + SaveCache(); + else + DeleteCache(); + } + else + DeleteCache(); + + if(RasClose == YES) + { + DisconnectRas(RasCloseNotify); + } + DeleteAllObject(); + HtmlHelp(NULL, NULL, HH_UNINITIALIZE, dwCookie); + return; +} + + +/*----- ƒtƒ@ƒCƒ‹–¼‚ðƒ_ƒuƒ‹ƒNƒŠƒbƒN‚µ‚½‚Æ‚«‚̏ˆ— ------------------------------ +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* int Mode : í‚ɁuŠJ‚­v“®ì‚ð‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* int App : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“”ԍ†i-1=ŠÖ˜A‚¯—Dæj +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoubleClickProc(int Win, int Mode, int App) +{ + int Pos; + int Type; + char Local[FMAX_PATH+1]; + char Remote[FMAX_PATH+1]; + char Tmp[FMAX_PATH+1]; + int Sts; + int UseDiffViewer; + + if(AskUserOpeDisabled() == NO) + { + SetCurrentDirAsDirHist(); + if(GetSelectedCount(Win) == 1) + { + if((Pos = GetFirstSelected(Win, NO)) != -1) + { + GetNodeName(Win, Pos, Tmp, FMAX_PATH); + Type = GetNodeType(Win, Pos); + + if(Win == WIN_LOCAL) + { + if((App != -1) || (Type == NODE_FILE)) + { + if((DclickOpen == YES) || (Mode == YES)) + { + AskLocalCurDir(Local, FMAX_PATH); + ReplaceAll(Local, '/', '\\'); + SetYenTail(Local); + strcat(Local, Tmp); + ExecViewer(Local, App); + } + else + PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0); + } + else + ChangeDir(WIN_LOCAL, Tmp); + } + else if(CheckClosedAndReconnect() == SUCCESS) + { + if((App != -1) || (Type == NODE_FILE)) + { + if((DclickOpen == YES) || (Mode == YES)) + { + // ƒrƒ…[ƒ‚QA‚R‚̃pƒX‚ª "d " ‚ÅŽn‚Ü‚Á‚Ä‚¢‚½‚獷•ªƒrƒ…[ƒAŽg—p + if ((App == 1 || App == 2) && strncmp(ViewerName[App], "d ", 2) == 0) + UseDiffViewer = YES; + else + UseDiffViewer = NO; + + strcpy(Remote, TmpPath); + SetYenTail(Remote); + if (UseDiffViewer == YES) { + strcat(Remote, "remote."); + } + strcat(Remote, Tmp); + + if(AskTransferNow() == YES) + SktShareProh(); + + // MainTransPkt.ctrl_skt = AskCmdCtrlSkt(); + strcpy(MainTransPkt.Cmd, "RETR "); + if(AskHostType() == HTYPE_ACOS) + { + strcpy(MainTransPkt.RemoteFile, "'"); + strcat(MainTransPkt.RemoteFile, AskHostLsName()); + strcat(MainTransPkt.RemoteFile, "("); + strcat(MainTransPkt.RemoteFile, Tmp); + strcat(MainTransPkt.RemoteFile, ")"); + strcat(MainTransPkt.RemoteFile, "'"); + } + else if(AskHostType() == HTYPE_ACOS_4) + { + strcpy(MainTransPkt.RemoteFile, Tmp); + } + else + { + strcpy(MainTransPkt.RemoteFile, Tmp); + } + strcpy(MainTransPkt.LocalFile, Remote); + MainTransPkt.Type = AskTransferTypeAssoc(MainTransPkt.RemoteFile, AskTransferType()); + MainTransPkt.Size = 1; + MainTransPkt.KanjiCode = AskHostKanjiCode(); + MainTransPkt.KanaCnv = AskHostKanaCnv(); + MainTransPkt.Mode = EXIST_OVW; + MainTransPkt.ExistSize = 0; + MainTransPkt.hWndTrans = NULL; + MainTransPkt.Next = NULL; + + DisableUserOpe(); + + /* •s³‚ȃpƒX‚ðŒŸo */ + if(CheckPathViolation(&MainTransPkt) == NO) + { +// if((Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO)) == 429) +// { +// ReConnectCmdSkt(); + Sts = DoDownLoad(AskCmdCtrlSkt(), &MainTransPkt, NO, &CancelFlg); +// } + } + + EnableUserOpe(); + + AddTempFileList(Remote); + if(Sts/100 == FTP_COMPLETE) { + if (UseDiffViewer == YES) { + AskLocalCurDir(Local, FMAX_PATH); + ReplaceAll(Local, '/', '\\'); + SetYenTail(Local); + strcat(Local, Tmp); + ExecViewer2(Local, Remote, App); + } else { + ExecViewer(Remote, App); + } + } + } + else + PostMessage(hWndFtp, WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0); + } + else + ChangeDir(WIN_REMOTE, Tmp); + } + } + } + MakeButtonsFocus(); + } + return; +} + + +/*----- ƒtƒHƒ‹ƒ_‚̈ړ® -------------------------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx) +* char *Path : ˆÚ“®æ‚̃pƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚̏ˆ—‚às‚¤ +*----------------------------------------------------------------------------*/ + +static void ChangeDir(int Win, char *Path) +{ + int Sync; + char Local[FMAX_PATH+1]; + char Remote[FMAX_PATH+1]; + + Sync = AskSyncMoveMode(); + if(Sync == YES) + { + if(strcmp(Path, "..") == 0) + { + AskLocalCurDir(Local, FMAX_PATH); + AskRemoteCurDir(Remote, FMAX_PATH); + if(strcmp(GetFileName(Local), GetFileName(Remote)) != 0) + Sync = NO; + } + } + + if((Win == WIN_LOCAL) || (Sync == YES)) + { + if(DoLocalCWD(Path) == SUCCESS) + GetLocalDirForWnd(); + } + + if((Win == WIN_REMOTE) || (Sync == YES)) + { + if(CheckClosedAndReconnect() == SUCCESS) + { +#if defined(HAVE_OPENVMS) + /* OpenVMS‚̏ꍇA".DIR;?"‚ðŽæ‚é */ + if (AskHostType() == HTYPE_VMS) + ReformVMSDirName(Path, TRUE); +#endif + if(DoCWD(Path, YES, NO, YES) < FTP_RETRY) + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + } + } + return; +} + + +/*----- ƒEƒCƒ“ƒhƒE‚̃TƒCƒY•ÏX‚̏ˆ— ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void ResizeWindowProc(void) +{ +#if 0 + RECT Rect; + int RemotePosX; + + GetClientRect(hWndFtp, &Rect); + SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom)); + + CalcWinSize(); + SetWindowPos(GetMainTbarWnd(), 0, 0, 0, WinWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + + SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect); + SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); + + RemotePosX = LocalWidth + SepaWidth; + if(SplitVertical == YES) + RemotePosX = 0; + + SetWindowPos(GetRemoteTbarWnd(), 0, RemotePosX, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect); + SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetRemoteHwnd(), 0, RemotePosX, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); + + SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER); +#else + RECT Rect; + + GetClientRect(hWndFtp, &Rect); + SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom)); + + CalcWinSize(); + SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER); + SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect); + SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER); + SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect); + SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER); + SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER); +#endif + + return; +} + + +/*----- ƒEƒCƒ“ƒhƒE‚ÌŠe•”•ª‚̃TƒCƒY‚ðŒvŽZ‚·‚é ---------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void CalcWinSize(void) +{ + RECT Rect; + + GetWindowRect(hWndFtp, &Rect); + + if(Sizing != SW_MAXIMIZE) + { + WinWidth = Rect.right - Rect.left; + WinHeight = Rect.bottom - Rect.top; + } + + GetClientRect(hWndFtp, &Rect); + + ClientWidth = Rect.right; + ClientHeight = Rect.bottom; + + SepaWidth = 4; + LocalWidth = max1(0, min1(LocalWidth, ClientWidth - SepaWidth)); + RemoteWidth = max1(0, ClientWidth - LocalWidth - SepaWidth); +// TaskHeight = min1(TaskHeight, max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - SepaWidth)); + + GetClientRect(GetSbarWnd(), &Rect); + + ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom); + + return; +} + + +#if 0 +/*----- ƒEƒCƒ“ƒhƒE‚Ì•\Ž¦ˆÊ’u‚ðŽæ“¾‚·‚é ---------------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AskWindowPos(HWND hWnd) +{ + WINDOWPLACEMENT WinPlace; + + WinPlace.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(hWnd, &WinPlace); + WinPosX = WinPlace.rcNormalPosition.left; + WinPosY = WinPlace.rcNormalPosition.top; + + return; +} +#endif + + +/*----- ƒfƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ƃtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì‹«ŠE•ÏXˆ— ---------------------- +* +* Parameter +* WPARAM Keys : WM_MOUSEMOVE‚È‚Ç‚ÌWPARAM‚Ì’l +* int x : ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚Ì‚wÀ•W +* int y : ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚Ì‚xÀ•W +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void CheckResizeFrame(WPARAM Keys, int x, int y) +{ + RECT Rect; + RECT Rect1; + + if((Resizing == RESIZE_OFF) && (Keys == 0)) + { + if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) && + (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight))) + { + /* ‹«ŠEˆÊ’u•ÏX—pƒJ[ƒ\ƒ‹‚ɕύX */ + SetCapture(hWndFtp); + hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_lr_csr)); + SetCursor(hCursor); + Resizing = RESIZE_PREPARE; + ResizePos = RESIZE_HPOS; + } + else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)) + { + /* ‹«ŠEˆÊ’u•ÏX—pƒJ[ƒ\ƒ‹‚ɕύX */ + SetCapture(hWndFtp); + hCursor = LoadCursor(hInstFtp, MAKEINTRESOURCE(resize_ud_csr)); + SetCursor(hCursor); + Resizing = RESIZE_PREPARE; + ResizePos = RESIZE_VPOS; + } + } + else if(Resizing == RESIZE_PREPARE) + { + if(Keys & MK_LBUTTON) + { + /* ‹«ŠEˆÊ’u•ÏXŠJŽn */ + Resizing = RESIZE_ON; + GetWindowRect(hWndFtp, &Rect); + GetClientRect(GetSbarWnd(), &Rect1); + Rect.left += GetSystemMetrics(SM_CXFRAME); + Rect.right -= GetSystemMetrics(SM_CXFRAME); + Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); + Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom; + ClipCursor(&Rect); + } + else + { + if(((ResizePos == RESIZE_HPOS) && + ((x < LocalWidth) || (x > LocalWidth + SepaWidth) || + (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) || + ((ResizePos == RESIZE_VPOS) && + ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth)))) + { + /* Œ³‚̃J[ƒ\ƒ‹‚É–ß‚· */ + ReleaseCapture(); + hCursor = LoadCursor(NULL, IDC_ARROW); + SetCursor(hCursor); + Resizing = RESIZE_OFF; + } + } + } + else if(Resizing == RESIZE_ON) + { + if(ResizePos == RESIZE_HPOS) + LocalWidth = x; + else + { + GetClientRect(hWndFtp, &Rect); + GetClientRect(GetSbarWnd(), &Rect1); + TaskHeight = max1(0, Rect.bottom - y - Rect1.bottom); + } + ResizeWindowProc(); + + if((Keys & MK_LBUTTON) == 0) + { + /* ‹«ŠEˆÊ’u•ÏXI—¹ */ + ReleaseCapture(); + ClipCursor(NULL); + hCursor = LoadCursor(NULL, IDC_ARROW); + SetCursor(hCursor); + Resizing = RESIZE_OFF; + } + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ˆê——î•ñ‚ðƒrƒ…[ƒ‚Å•\Ž¦ -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DispDirInfo(void) +{ + char Buf[FMAX_PATH+1]; + + MakeCacheFileName(AskCurrentFileListNum(), Buf); + ExecViewer(Buf, 0); + return; +} + + + +/*----- ƒrƒ…[ƒ‚ð‹N“® -------------------------------------------------------- +* +* Parameter +* char Fname : ƒtƒ@ƒCƒ‹–¼ +* int App : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“”ԍ†i-1=ŠÖ˜A‚¯—Dæj +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ExecViewer(char *Fname, int App) +{ + PROCESS_INFORMATION Info; + STARTUPINFO Startup; + char AssocProg[FMAX_PATH+1]; + char ComLine[FMAX_PATH*2+3+1]; + char CurDir[FMAX_PATH+1]; + + /* FindExecutable()‚ÍŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚̃pƒX–¼‚ɃXƒy[ƒX‚ª */ + /* ŠÜ‚Ü‚ê‚Ä‚¢‚鎞AŠÔˆá‚Á‚½ƒpƒX–¼‚ð•Ô‚·Ž–‚ª‚ ‚éB */ + /* ‚»‚±‚ŁAŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚Ì‹N“®‚ÍShellExecute()‚ðŽg‚¤B */ + + AskLocalCurDir(CurDir, FMAX_PATH); + + if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32)) + { + DoPrintf("ShellExecute - %s", Fname); + ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW); + } + else + { + App = max1(0, App); + strcpy(AssocProg, ViewerName[App]); + + if(strchr(Fname, ' ') == NULL) + sprintf(ComLine, "%s %s", AssocProg, Fname); + else + sprintf(ComLine, "%s \"%s\"", AssocProg, Fname); + + DoPrintf("FindExecutable - %s", ComLine); + + memset(&Startup, NUL, sizeof(STARTUPINFO)); + Startup.cb = sizeof(STARTUPINFO); + Startup.wShowWindow = SW_SHOW; + if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) + { + SetTaskMsg(MSGJPN182, GetLastError()); + SetTaskMsg(">>%s", ComLine); + } + } + return; +} + + +/*----- ·•ª•\Ž¦ƒrƒ…[ƒ‚ð‹N“® ------------------------------------------------ +* +* Parameter +* char Fname1 : ƒtƒ@ƒCƒ‹–¼ +* char Fname2 : ƒtƒ@ƒCƒ‹–¼2 +* int App : ƒAƒvƒŠƒP[ƒVƒ‡ƒ“”ԍ†i2 or 3j +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ExecViewer2(char *Fname1, char *Fname2, int App) +{ + PROCESS_INFORMATION Info; + STARTUPINFO Startup; + char AssocProg[FMAX_PATH+1]; + char ComLine[FMAX_PATH*2+3+1]; + char CurDir[FMAX_PATH+1]; + + /* FindExecutable()‚ÍŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚̃pƒX–¼‚ɃXƒy[ƒX‚ª */ + /* ŠÜ‚Ü‚ê‚Ä‚¢‚鎞AŠÔˆá‚Á‚½ƒpƒX–¼‚ð•Ô‚·Ž–‚ª‚ ‚éB */ + /* ‚»‚±‚ŁAŠÖ˜A•t‚¯‚ç‚ꂽƒvƒƒOƒ‰ƒ€‚Ì‹N“®‚ÍShellExecute()‚ðŽg‚¤B */ + + AskLocalCurDir(CurDir, FMAX_PATH); + + strcpy(AssocProg, ViewerName[App] + 2); /* æ“ª‚Ì "d " ‚Í“Ç‚Ý”ò‚΂· */ + + if(strchr(Fname1, ' ') == NULL && strchr(Fname2, ' ') == NULL) + sprintf(ComLine, "%s %s %s", AssocProg, Fname1, Fname2); + else + sprintf(ComLine, "%s \"%s\" \"%s\"", AssocProg, Fname1, Fname2); + + DoPrintf("FindExecutable - %s", ComLine); + + memset(&Startup, NUL, sizeof(STARTUPINFO)); + Startup.cb = sizeof(STARTUPINFO); + Startup.wShowWindow = SW_SHOW; + if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) + { + SetTaskMsg(MSGJPN182, GetLastError()); + SetTaskMsg(">>%s", ComLine); + } + + return; +} + + +/*----- ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹–¼‚ðƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹ƒŠƒXƒg‚ɒljÁ ------------------ +* +* Parameter +* char *Fname : ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AddTempFileList(char *Fname) +{ + TEMPFILELIST *New; + + if((New = malloc(sizeof(TEMPFILELIST))) != NULL) + { + if((New->Fname = malloc(strlen(Fname)+1)) != NULL) + { + strcpy(New->Fname, Fname); + if(TempFiles == NULL) + New->Next = NULL; + else + New->Next = TempFiles; + TempFiles = New; + } + else + free(New); + } + return; +} + + +/*----- ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹ƒŠƒXƒg‚É“o˜^‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹‚ð‘S‚č폜 ------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DeleteAlltempFile(void) +{ + TEMPFILELIST *Pos; + TEMPFILELIST *Next; + + Pos = TempFiles; + while(Pos != NULL) + { + DeleteFile(Pos->Fname); + + Next = Pos->Next; + free(Pos->Fname); + free(Pos); + Pos = Next; + } + + // OLE D&D‚̃eƒ“ƒ|ƒ‰ƒŠ‚ðíœ‚·‚é (2007.9.11 yutaka) + doDeleteRemoteFile(); + + return; +} + + +/*----- ‚`‚‚‚‚•‚”ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃R[ƒ‹ƒoƒbƒNŠÖ” ------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static char Tmp[80]; + int Ver; + + switch (message) + { + case WM_INITDIALOG : + Ver = GetJreVersion(); + if(Ver == -1) + sprintf(Tmp, MSGJPN183); + else + sprintf(Tmp, MSGJPN184, Ver / 0x100, Ver % 0x100); + SendDlgItemMessage(hDlg, ABOUT_JRE, WM_SETTEXT, 0, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, ABOUT_URL, EM_LIMITTEXT, 256, 0); + SendDlgItemMessage(hDlg, ABOUT_URL, WM_SETTEXT, 0, (LPARAM)MSGJPN284); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + case IDCANCEL : + EndDialog(hDlg, YES); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒTƒEƒ“ƒh‚ð–‚炷 ------------------------------------------------------ +* +* Parameter +* Int num : ƒTƒEƒ“ƒh‚ÌŽí—Þ (SND_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SoundPlay(int Num) +{ + if(Sound[Num].On == YES) + sndPlaySound(Sound[Num].Fname, SND_ASYNC | SND_NODEFAULT); + + return; +} + + +/*----- ƒwƒ‹ƒvƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ð•Ô‚· ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒpƒX–¼ +*----------------------------------------------------------------------------*/ + +char *AskHelpFilePath(void) +{ + return(HelpPath); +} + + +/*----- ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ð•Ô‚· -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒpƒX–¼ +*----------------------------------------------------------------------------*/ + +char *AskTmpFilePath(void) +{ + return(TmpPath); +} + + +/*----- INIƒtƒ@ƒCƒ‹‚̃pƒX–¼‚ð•Ô‚· --------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* char *ƒpƒX–¼ +*----------------------------------------------------------------------------*/ + +char *AskIniFilePath(void) +{ + return(IniPath); +} + +/*----- INIƒtƒ@ƒCƒ‹‚Ì‚Ý‚ðŽg‚¤‚©‚Ç‚¤‚©‚ð•Ô‚· ----------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX : YES/NO +*----------------------------------------------------------------------------*/ + +int AskForceIni(void) +{ + return(ForceIni); +} + + + + +/*----- ƒƒbƒZ[ƒWˆ— -------------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int I—¹ƒtƒ‰ƒO (YES=WM_CLOSE‚ª—ˆ‚½/NO) +*----------------------------------------------------------------------------*/ + +int BackgrndMessageProc(void) +{ + MSG Msg; + int Ret; + + Ret = NO; + while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) + { + if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg)) + { + /* ƒfƒBƒŒƒNƒgƒŠ–¼‚Ì•\Ž¦ƒRƒ“ƒ{ƒ{ƒbƒNƒX‚ÅBS‚âRET‚ªŒø‚­‚悤‚É */ + /* ƒRƒ“ƒ{ƒ{ƒbƒNƒX“à‚ł̓AƒNƒZƒ‰ƒŒ[ƒ^‚𖳌ø‚É‚·‚é */ + if((Msg.hwnd == GetLocalHistEditHwnd()) || + (Msg.hwnd == GetRemoteHistEditHwnd()) || + ((hHelpWin != NULL) && (Msg.hwnd == hHelpWin)) || + GetHideUI() == YES || + (TranslateAccelerator(GetMainHwnd(), Accel, &Msg) == 0)) + { + if(Msg.message == WM_QUIT) + { + Ret = YES; + PostQuitMessage(0); + break; + } + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } + } + return(Ret); +} + + +/*----- Ž©“®I—¹ƒtƒ‰ƒO‚ðƒNƒŠƒA‚·‚é -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ResetAutoExitFlg(void) +{ + AutoExit = NO; + return; +} + + +/*----- Ž©“®I—¹ƒtƒ‰ƒO‚ð•Ô‚· -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒtƒ‰ƒO (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskAutoExit(void) +{ + return(AutoExit); +} + +/*----- ƒ†[ƒU‚ɃpƒXƒ[ƒh‚ð“ü—Í‚³‚¹C‚»‚ê‚ðÝ’è‚·‚é ----------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int : 0/ƒ†[ƒUƒLƒƒƒ“ƒZƒ‹, 1/Ý’肵‚½, 2/ƒfƒtƒHƒ‹ƒgÝ’è +*----------------------------------------------------------------------------*/ +int EnterMasterPasswordAndSet( int Res, HWND hWnd ) +{ + char buf[MAX_PASSWORD_LEN + 1]; + char *p; + int Flag; + + buf[0] = NUL; + if( InputDialogBox(Res, hWnd, NULL, buf, MAX_PASSWORD_LEN + 1, + &Flag, IDH_HELP_TOPIC_0000064) == YES){ + /* ––”ö‚Ì‹ó”’‚ðíœ */ + RemoveTailingSpaces(buf); + /* æ“ª‚Ì‹ó”’‚ðíœ */ + for( p = buf; *p == ' '; p++ ) + ; + + if( p[0] != NUL ){ + SetMasterPassword( p ); + return 1; + } + else { + /* ‹ó‚̏ꍇ‚̓fƒtƒHƒ‹ƒg’l‚ðÝ’è */ + SetMasterPassword( NULL ); + return 2; + } + } + return 0; +} diff --git a/md4.c b/md4.c new file mode 100644 index 0000000..48b05fa --- /dev/null +++ b/md4.c @@ -0,0 +1,302 @@ +/* MD4C.C - RSA Data Security, Inc., MD4 message-digest algorithm + */ + +/* Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD4 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD4 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +#include "md4.h" + +/* Constants for MD4Transform routine. + */ +#define S11 3 +#define S12 7 +#define S13 11 +#define S14 19 +#define S21 3 +#define S22 5 +#define S23 9 +#define S24 13 +#define S31 3 +#define S32 9 +#define S33 11 +#define S34 15 + +static void MD4Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); +static void Encode PROTO_LIST + ((unsigned char *, UINT4 *, unsigned int)); +static void Decode PROTO_LIST + ((UINT4 *, unsigned char *, unsigned int)); +static void MD4_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); +static void MD4_memset PROTO_LIST ((POINTER, int, unsigned int)); + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G and H are basic MD4 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG and HH are transformations for rounds 1, 2 and 3 */ +/* Rotation is separate from addition to prevent recomputation */ + +#define FF(a, b, c, d, x, s) { \ + (a) += F ((b), (c), (d)) + (x); \ + (a) = ROTATE_LEFT ((a), (s)); \ + } +#define GG(a, b, c, d, x, s) { \ + (a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; \ + (a) = ROTATE_LEFT ((a), (s)); \ + } +#define HH(a, b, c, d, x, s) { \ + (a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; \ + (a) = ROTATE_LEFT ((a), (s)); \ + } + +/* MD4 initialization. Begins an MD4 operation, writing a new context. + */ +void MD4Init (context) +MD4_CTX *context; /* context */ +{ + context->count[0] = context->count[1] = 0; + + /* Load magic initialization constants. + */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD4 block update operation. Continues an MD4 message-digest + operation, processing another message block, and updating the + context. + */ +void MD4Update (context, input, inputLen) +MD4_CTX *context; /* context */ +unsigned char *input; /* input block */ +unsigned int inputLen; /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3)) + < ((UINT4)inputLen << 3)) + context->count[1]++; + context->count[1] += ((UINT4)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. + */ + if (inputLen >= partLen) { + MD4_memcpy + ((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD4Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD4Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + MD4_memcpy + ((POINTER)&context->buffer[index], (POINTER)&input[i], + inputLen-i); +} + +/* MD4 finalization. Ends an MD4 message-digest operation, writing the + the message digest and zeroizing the context. + */ +void MD4Final (digest, context) +unsigned char digest[16]; /* message digest */ +MD4_CTX *context; /* context */ +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. + */ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD4Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD4Update (context, bits, 8); + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. + */ + MD4_memset ((POINTER)context, 0, sizeof (*context)); +} + +/* MD4 basic transformation. Transforms state based on block. + */ +static void MD4Transform (state, block) +UINT4 state[4]; +unsigned char block[64]; +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11); /* 1 */ + FF (d, a, b, c, x[ 1], S12); /* 2 */ + FF (c, d, a, b, x[ 2], S13); /* 3 */ + FF (b, c, d, a, x[ 3], S14); /* 4 */ + FF (a, b, c, d, x[ 4], S11); /* 5 */ + FF (d, a, b, c, x[ 5], S12); /* 6 */ + FF (c, d, a, b, x[ 6], S13); /* 7 */ + FF (b, c, d, a, x[ 7], S14); /* 8 */ + FF (a, b, c, d, x[ 8], S11); /* 9 */ + FF (d, a, b, c, x[ 9], S12); /* 10 */ + FF (c, d, a, b, x[10], S13); /* 11 */ + FF (b, c, d, a, x[11], S14); /* 12 */ + FF (a, b, c, d, x[12], S11); /* 13 */ + FF (d, a, b, c, x[13], S12); /* 14 */ + FF (c, d, a, b, x[14], S13); /* 15 */ + FF (b, c, d, a, x[15], S14); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 0], S21); /* 17 */ + GG (d, a, b, c, x[ 4], S22); /* 18 */ + GG (c, d, a, b, x[ 8], S23); /* 19 */ + GG (b, c, d, a, x[12], S24); /* 20 */ + GG (a, b, c, d, x[ 1], S21); /* 21 */ + GG (d, a, b, c, x[ 5], S22); /* 22 */ + GG (c, d, a, b, x[ 9], S23); /* 23 */ + GG (b, c, d, a, x[13], S24); /* 24 */ + GG (a, b, c, d, x[ 2], S21); /* 25 */ + GG (d, a, b, c, x[ 6], S22); /* 26 */ + GG (c, d, a, b, x[10], S23); /* 27 */ + GG (b, c, d, a, x[14], S24); /* 28 */ + GG (a, b, c, d, x[ 3], S21); /* 29 */ + GG (d, a, b, c, x[ 7], S22); /* 30 */ + GG (c, d, a, b, x[11], S23); /* 31 */ + GG (b, c, d, a, x[15], S24); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 0], S31); /* 33 */ + HH (d, a, b, c, x[ 8], S32); /* 34 */ + HH (c, d, a, b, x[ 4], S33); /* 35 */ + HH (b, c, d, a, x[12], S34); /* 36 */ + HH (a, b, c, d, x[ 2], S31); /* 37 */ + HH (d, a, b, c, x[10], S32); /* 38 */ + HH (c, d, a, b, x[ 6], S33); /* 39 */ + HH (b, c, d, a, x[14], S34); /* 40 */ + HH (a, b, c, d, x[ 1], S31); /* 41 */ + HH (d, a, b, c, x[ 9], S32); /* 42 */ + HH (c, d, a, b, x[ 5], S33); /* 43 */ + HH (b, c, d, a, x[13], S34); /* 44 */ + HH (a, b, c, d, x[ 3], S31); /* 45 */ + HH (d, a, b, c, x[11], S32); /* 46 */ + HH (c, d, a, b, x[ 7], S33); /* 47 */ + HH (b, c, d, a, x[15], S34); /* 48 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + MD4_memset ((POINTER)x, 0, sizeof (x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. + */ +static void Encode (output, input, len) +unsigned char *output; +UINT4 *input; +unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. + */ +static void Decode (output, input, len) + +UINT4 *output; +unsigned char *input; +unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | + (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ +static void MD4_memcpy (output, input, len) +POINTER output; +POINTER input; +unsigned int len; +{ + unsigned int i; + + for (i = 0; i < len; i++) + output[i] = input[i]; +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +static void MD4_memset (output, value, len) +POINTER output; +int value; +unsigned int len; +{ + unsigned int i; + + for (i = 0; i < len; i++) + ((char *)output)[i] = (char)value; +} + + diff --git a/md4.h b/md4.h new file mode 100644 index 0000000..b7998b4 --- /dev/null +++ b/md4.h @@ -0,0 +1,52 @@ +/* MD4.H - header file for MD4C.C + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD4 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD4 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. +If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. + */ +#define PROTO_LIST(list) list + +/* MD4 context. */ +typedef struct { + UINT4 state[4]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD4_CTX; + +void MD4Init PROTO_LIST ((MD4_CTX *)); +void MD4Update PROTO_LIST + ((MD4_CTX *, unsigned char *, unsigned int)); +void MD4Final PROTO_LIST ((unsigned char [16], MD4_CTX *)); + diff --git a/md5.c b/md5.c new file mode 100644 index 0000000..cdba935 --- /dev/null +++ b/md5.c @@ -0,0 +1,335 @@ +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +#include "md5.h" + +/* Constants for MD5Transform routine. + */ + + +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64])); +static void Encode PROTO_LIST + ((unsigned char *, UINT4 *, unsigned int)); +static void Decode PROTO_LIST + ((UINT4 *, unsigned char *, unsigned int)); +static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); +static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int)); + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void MD5Init (context) +MD5_CTX *context; /* context */ +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. +*/ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void MD5Update (context, input, inputLen) +MD5_CTX *context; /* context */ +unsigned char *input; /* input block */ +unsigned int inputLen; /* length of input block */ +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3)) + < ((UINT4)inputLen << 3)) + context->count[1]++; + context->count[1] += ((UINT4)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. +*/ + if (inputLen >= partLen) { + MD5_memcpy + ((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + MD5_memcpy + ((POINTER)&context->buffer[index], (POINTER)&input[i], + inputLen-i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. + */ +void MD5Final (digest, context) +unsigned char digest[16]; /* message digest */ +MD5_CTX *context; /* context */ +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. +*/ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD5Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD5Update (context, bits, 8); + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. +*/ + MD5_memset ((POINTER)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (state, block) +UINT4 state[4]; +unsigned char block[64]; +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. +*/ + MD5_memset ((POINTER)x, 0, sizeof (x)); +} + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is + a multiple of 4. + */ +static void Encode (output, input, len) +unsigned char *output; +UINT4 *input; +unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is + a multiple of 4. + */ +static void Decode (output, input, len) +UINT4 *output; +unsigned char *input; +unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | + (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +/* Note: Replace "for loop" with standard memcpy if possible. + */ + +static void MD5_memcpy (output, input, len) +POINTER output; +POINTER input; +unsigned int len; +{ + unsigned int i; + + for (i = 0; i < len; i++) + output[i] = input[i]; +} + +/* Note: Replace "for loop" with standard memset if possible. + */ +static void MD5_memset (output, value, len) +POINTER output; +int value; +unsigned int len; +{ + unsigned int i; + + for (i = 0; i < len; i++) + ((char *)output)[i] = (char)value; +} diff --git a/md5.h b/md5.h new file mode 100644 index 0000000..508c507 --- /dev/null +++ b/md5.h @@ -0,0 +1,51 @@ +/* MD5.H - header file for MD5C.C + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + */ + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + +/* PROTO_LIST is defined depending on how PROTOTYPES is defined above. +If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it + returns an empty list. + */ +#define PROTO_LIST(list) list + +/* MD5 context. */ +typedef struct { + UINT4 state[4]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD5_CTX; + +void MD5Init PROTO_LIST ((MD5_CTX *)); +void MD5Update PROTO_LIST + ((MD5_CTX *, unsigned char *, unsigned int)); +void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); diff --git a/mesg-eng.h b/mesg-eng.h new file mode 100644 index 0000000..385e30d --- /dev/null +++ b/mesg-eng.h @@ -0,0 +1,304 @@ +#define MSGJPN001 "Connection cancelled." +#define MSGJPN002 "Connection cancelled." +#define MSGJPN003 "\r\nReconnect.\r\n" +#define MSGJPN004 "Disconnect." +#define MSGJPN005 "Connection was killed." +#define MSGJPN006 "Can't login to Firewall." +#define MSGJPN007 "Can't connect to host %s." +#define MSGJPN008 "Can't login." +#define MSGJPN009 "Can't connect." +#define MSGJPN010 "Firewall host not specified." +#define MSGJPN011 "Host not specified." +#define MSGJPN012 "MD5 used." +#define MSGJPN013 "SHA-1 used." +#define MSGJPN014 "MD4(S/KEY) used." +#define MSGJPN015 "Can't process One-time Password." +#define MSGJPN016 "Searching host %s." +#define MSGJPN017 "Connecting %sto host %s (%s (%d))." +#define MSGJPN018 "Connecting %sto host %s (%d)." +#define MSGJPN019 "Host %s not found." +#define MSGJPN020 "Connecting %sto host %s (%d)." +#define MSGJPN021 "SOCKS server %s not found." +#define MSGJPN022 "Connecting to SOCKS server %s (%d)." +#define MSGJPN023 "Can't connect to SOCKS server. (Err=%d)" +#define MSGJPN024 "Can't connect to SOCKS server. (Err=%d)" +#define MSGJPN025 "Connected." +#define MSGJPN026 "Can't connected." +#define MSGJPN027 "Can't create socket." +#define MSGJPN028 "Can't connect to SOCKS server. (Err=%d)" +#define MSGJPN029 "Can't connect to SOCKS server. (Err=%d)" +#define MSGJPN030 "Can't create listen socket." +#define MSGJPN031 "PORT command not accepted" +#define MSGJPN032 "Connection is cancelled by user." +#define MSGJPN033 "Can't send SOCKS command. (Cmd = %04X)" +#define MSGJPN034 "Can't receive SOCKS5 reply." +#define MSGJPN035 "Can't receive SOCKS4 reply." +#define MSGJPN036 "SOCKS certification method not match." +#define MSGJPN037 "Certification failed by SOCKS server." +#define MSGJPN038 "Name" +#define MSGJPN039 "Date" +#define MSGJPN040 "Size" +#define MSGJPN041 "Ext" +#define MSGJPN042 "Name" +#define MSGJPN043 "Date" +#define MSGJPN044 "Size" +#define MSGJPN045 "Ext" +#define MSGJPN046 "Permissions" +#define MSGJPN047 "Owner" +#define MSGJPN048 "Can't read temporary file." +#define MSGJPN049 "Failed to getting file list." +#define MSGJPN050 "Find (Local)" +#define MSGJPN051 "Find (Host)" +#define MSGJPN052 "Dele: %s" +#define MSGJPN053 "Make: %s" +#define MSGJPN054 "Tran: %s" +#define MSGJPN055 "Dele: %s" +#define MSGJPN056 "Make: %s" +#define MSGJPN057 "Tran: %s" +#define MSGJPN058 "Transfer %d files." +#define MSGJPN059 "No file to transmit." +#define MSGJPN060 "Create %d folders." +#define MSGJPN061 "No folder to create." +#define MSGJPN062 "Delete %d files/folders." +#define MSGJPN063 "No file/folder to delete." +#define MSGJPN064 "Upload as" +#define MSGJPN065 "Download as" +#define MSGJPN066 "Delete (Local)" +#define MSGJPN067 "Delete (Host)" +#define MSGJPN068 "Rename (Local)" +#define MSGJPN069 "Rename (Host)" +#define MSGJPN070 "New Filder (Local)" +#define MSGJPN071 "New Folder (Host)" +#define MSGJPN072 "Change Current Folder (Local)" +#define MSGJPN073 "Change Current Folder (Host)" +#define MSGJPN074 "Calculate local file size." +#define MSGJPN075 "Calculate host file size." +#define MSGJPN076 "Local file size" +#define MSGJPN077 "Host file size" +#define MSGJPN078 "New Folder" +#define MSGJPN079 "New Folder" +#define MSGJPN080 "Delete Folder" +#define MSGJPN081 "Delete File" +#define MSGJPN082 "New Folder" +#define MSGJPN083 "Delete Folder" +#define MSGJPN084 "Delete File" +#define MSGJPN085 "Can't download named %s." +#define MSGJPN086 "Download" +#define MSGJPN087 "File List" +#define MSGJPN088 "Skip" +#define MSGJPN089 "Skip file %s." +#define MSGJPN090 "Command not accepted." +#define MSGJPN091 "for download " +#define MSGJPN092 "Command not accepted." +#define MSGJPN093 "Can't get address." +#define MSGJPN094 "Time out error." +#define MSGJPN095 "Can't create file %s." +#define MSGJPN096 "Disk full" +#define MSGJPN097 "Cancel to getting file list" +#define MSGJPN098 "File List" +#define MSGJPN099 "Download cancelled. (%d Sec. %d B/S)." +#define MSGJPN100 "Download cancelled." +#define MSGJPN101 "Download file list successful. (%d Bytes)" +#define MSGJPN102 "Download successful. (%d Sec. %d B/S)." +#define MSGJPN103 "Download successful. (%d Bytes)" +#define MSGJPN104 "Upload" +#define MSGJPN105 "Can't read file %s." +#define MSGJPN106 "Skip" +#define MSGJPN107 "File %s is skipped." +#define MSGJPN108 "Command not accepted." +#define MSGJPN109 "for upload " +#define MSGJPN110 "Command not accepted." +#define MSGJPN111 "Can't get address." +#define MSGJPN112 "Can't open file %s." +#define MSGJPN113 "Upload cancelled. (%d Sec. %d B/S)." +#define MSGJPN114 "Upload cancelled." +#define MSGJPN115 "Upload successful. (%d Sec. %d B/S)." +#define MSGJPN116 "Upload successfil." +#define MSGJPN117 "Finished" +#define MSGJPN118 "Cancelled" +#define MSGJPN119 "BINARY" +#define MSGJPN120 "ASCII" +#define MSGJPN121 "NONE" +#define MSGJPN122 "JIS" +#define MSGJPN123 "EUC" +#define MSGJPN124 "Delete(Local)" +#define MSGJPN125 "Delete(Host)" +#define MSGJPN126 "WS_FTP.INI" +#define MSGJPN127 "General" +#define MSGJPN128 "Advanced" +#define MSGJPN129 "Kanji Code" +#define MSGJPN130 "Dialup" +#define MSGJPN131 "Special" +#define MSGJPN132 "Host Setting" +#define MSGJPN133 "GMT%+02d:00" +#define MSGJPN134 "None" +#define MSGJPN135 "Auto" +#define MSGJPN136 "OTP MD4, S/KEY" +#define MSGJPN137 "OTP MD5" +#define MSGJPN138 "OTP SHA-1" +#define MSGJPN139 "Auto" +#define MSGJPN140 "ACOS" +#define MSGJPN141 "VAX VMS" +#define MSGJPN142 "IRMX" +#define MSGJPN143 "ACOS-4" +#define MSGJPN144 "Stratus" +#define MSGJPN145 "Can't change folder." +#define MSGJPN146 "Can't create folder." +#define MSGJPN147 "Can't delete folder." +#define MSGJPN148 "Can't delete folder." +#define MSGJPN149 "Can't delete file." +#define MSGJPN150 "Can't delete file." +#define MSGJPN151 "Can't rename file." +#define MSGJPN152 "Temporary folder '%s' not found." +#define MSGJPN153 "Folder '%s' is used." +#define MSGJPN154 "Connect" +#define MSGJPN155 "Quick Connect" +#define MSGJPN156 "Disconnect" +#define MSGJPN157 "Download" +#define MSGJPN158 "Upload" +#define MSGJPN159 "Mirror Upload" +#define MSGJPN160 "Delete" +#define MSGJPN161 "Rename" +#define MSGJPN162 "New Folder" +#define MSGJPN163 "Parent Folder" +#define MSGJPN164 "Change Folder" +#define MSGJPN165 "ASCII Mode" +#define MSGJPN166 "BINARY Mode" +#define MSGJPN167 "Filename Depend" +#define MSGJPN168 "Refresh File List" +#define MSGJPN169 "List" +#define MSGJPN170 "Details" +#define MSGJPN171 "EUC Kanji Code" +#define MSGJPN172 "JIS Kanji Code" +#define MSGJPN173 "NO Kanji Conversin" +#define MSGJPN174 "Hankaku-Kana to Zenkaku" +#define MSGJPN175 "Sync. folder movement" +#define MSGJPN176 "Stop" +#define MSGJPN177 "Host profile '%s' not found." +#define MSGJPN178 "Host profile not specified." +#define MSGJPN179 "Host name is only used as an alternative to profile name." +#define MSGJPN180 "Wrong Option '%s'." +#define MSGJPN181 "Host name is only used as an alternative to profile name." +#define MSGJPN182 "Failed to open viewer. (ERROR=%d)" +#define MSGJPN183 "JRE32.DLL none" +#define MSGJPN184 "JRE32.DLL Ver %x.%x (C) Kazuo Yamada-san" +#define MSGJPN185 "Select folder." +#define MSGJPN186 "User" +#define MSGJPN187 "Transfer1" +#define MSGJPN188 "Transfer2" +#define MSGJPN189 "Transfer3" +#define MSGJPN190 "Mirroring" +#define MSGJPN191 "Operation" +#define MSGJPN192 "View" +#define MSGJPN193 "Connecting" +#define MSGJPN194 "Firewall" +#define MSGJPN195 "Tool" +#define MSGJPN196 "Sounds" +#define MSGJPN197 "Other" +#define MSGJPN198 "Option" +#define MSGJPN199 "Filename" +#define MSGJPN200 "Filename" +#define MSGJPN201 "Attr" +#define MSGJPN202 "Filename" +#define MSGJPN203 "Filename" +#define MSGJPN204 "FW user-> FW password-> SITE host" +#define MSGJPN205 "FW user-> FW password-> USER user@host" +#define MSGJPN206 "FW user-> FW password" +#define MSGJPN207 "USER user@host" +#define MSGJPN208 "OPEN host" +#define MSGJPN209 "SOCKS4" +#define MSGJPN210 "SOCKS5 (No certification)" +#define MSGJPN211 "SOCKS5 (User, Password certification)" +#define MSGJPN212 "None" +#define MSGJPN213 "Auto" +#define MSGJPN214 "OTP MD4,S/KEY" +#define MSGJPN215 "OTP MD5" +#define MSGJPN216 "OTP SHA-1" +#define MSGJPN217 "Select viewer" +#define MSGJPN218 "EXE file\0*.exe;*.com;*.bat\0All file(*.*)\0*\0" +#define MSGJPN219 "Wave file" +#define MSGJPN220 "Disconencting dialup." +#define MSGJPN221 "Connecting dialup." +#define MSGJPN222 "Can't use dialup. (RasDialDlg)" +#define MSGJPN223 "Connecting to %s..." +#define MSGJPN224 "Unknown error" +#define MSGJPN225 "Dialup connection" +#define MSGJPN226 "Open port..." +#define MSGJPN227 "Port opened." +#define MSGJPN228 "Dialing..." +#define MSGJPN229 "Dialed." +#define MSGJPN230 "All device connected." +#define MSGJPN231 "Authenticating..." +#define MSGJPN232 "Authenticate retry..." +#define MSGJPN233 "Please change password." +#define MSGJPN234 "Authenticated." +#define MSGJPN235 "Connected" +#define MSGJPN236 "Disconnected." +#define MSGJPN237 "Connecting..." +#define MSGJPN238 "Connecting to %s" +#define MSGJPN239 "# Do not edit this file.\n" +#define MSGJPN240 "Can't save to INI file" +#define MSGJPN241 "Failed transmit cause of timeout" +#define MSGJPN242 "Failed receive cause of timeout" +#define MSGJPN243 "Failed receive cause of timeout" +#define MSGJPN244 "Receive length error" +#define MSGJPN245 "Local" +#define MSGJPN246 "Host" +#define MSGJPN247 "Selected: %d (%s)" +#define MSGJPN248 "Local free: %s" +#define MSGJPN249 "Files in queue: %d" +#define MSGJPN250 "Receiving %s" +#define MSGJPN251 "ErrFSeed" +#define MSGJPN252 "ErrFSeed" +#define MSGJPN253 "ErrFSequence#" +#define MSGJPN254 "MS Sans Serif" +#define MSGJPN255 "&Upload" +#define MSGJPN256 "U&pload As..." +#define MSGJPN257 "Up&load All" +#define MSGJPN258 "&Delete" +#define MSGJPN259 "&Rename..." +#define MSGJPN260 "&New Folder..." +#define MSGJPN261 "&File Size..." +#define MSGJPN262 "R&efresh File List" +#define MSGJPN263 "&Download" +#define MSGJPN264 "D&ownload As..." +#define MSGJPN265 "Do&wnliad as File" +#define MSGJPN266 "Dow&nload All" +#define MSGJPN267 "De&lete..." +#define MSGJPN268 "&Rename..." +#define MSGJPN269 "&Change Permission..." +#define MSGJPN270 "&New Folder..." +#define MSGJPN271 "Copy &URL to Clipboard" +#define MSGJPN272 "&File Size..." +#define MSGJPN273 "R&efresh File List" +#define MSGJPN274 "&Open" +#define MSGJPN275 "Open in %s (&%d)" +#define MSGJPN276 "WS_FTP.INI\0ws_ftp.ini\0All file(*.*)\0*\0" +#define MSGJPN277 "Wave file\0*.wav\0All file\0*\0" +#define MSGJPN278 "Reason : %s" +#define MSGJPN279 "Can't get Listen Socket" +#define MSGJPN280 "Can't get Data Socket" +#define MSGJPN281 "Can't connect with PASV mode" +#define MSGJPN282 "INI filename is not specified" +#define MSGJPN283 "INI file : " +#define MSGJPN284 "http://www2.biglobe.ne.jp/~sota/" +#define MSGJPN285 "Failed to execute Registory Editor." +#define MSGJPN286 "Save Settings" +#define MSGJPN287 "Reg file\0*.reg\0All file\0*\0" +#define MSGJPN288 "INI file\0*.ini\0All file\0*\0" +#define MSGJPN289 "Agilent Logic analyzer" +#define MSGJPN290 "Reg file\0*.reg\0INI file\0*.ini\0All files\0*\0" +#define MSGJPN291 "Load Settings" +#define MSGJPN292 "Restart FFFTP to take effect." +#define MSGJPN293 "File must be *.reg or *.ini." +#define MSGJPN294 "USER FW user:FW password@host" +#define MSGJPN295 "ShibaSoku WL" +#define MSGJPN296 "This is a read-only file. Remove the read-only attribute?" +#define MSGJPN297 "%s is invalid path.\r\nFFFTP doesn't download this file." +#define MSGJPN298 "Failed to initialize the OLE." +#define MSGJPN299 "Master password is not specified in the command line" +#define MSGJPN300 "Default master password is chosen.\r\nSet your own master password in command line to prevent sniff of malwares" +#define MSGJPN301 "Master password is not for the current configuration. Configration will not be overwritten in this session." +#define MSGJPN302 "Master password checker looks broken." +#define MSGJPN303 "Master password has been changed." +#define MSGJPN304 "Speecified master password is not correct.\r\nAre you sure you want to re-enter?\r\nNo memorized FTP password is available if you choose 'NO'" diff --git a/mesg-jpn.h b/mesg-jpn.h new file mode 100644 index 0000000..c98010e --- /dev/null +++ b/mesg-jpn.h @@ -0,0 +1,304 @@ +#define MSGJPN001 "Ú‘±‚𒆎~‚µ‚Ü‚µ‚½." +#define MSGJPN002 "Ú‘±‚𒆎~‚µ‚Ü‚µ‚½." +#define MSGJPN003 "\r\nÄÚ‘±‚µ‚Ü‚·.\r\n" +#define MSGJPN004 "Ø’f‚µ‚Ü‚µ‚½" +#define MSGJPN005 "Ú‘±‚ªØ’f‚³‚ê‚Ü‚µ‚½." +#define MSGJPN006 "FireWall‚ɃƒOƒCƒ“‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN007 "ƒzƒXƒg %s ‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN008 "ƒƒOƒCƒ“‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN009 "Ú‘±‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN010 "FireWall‚̃zƒXƒg–¼‚ªÝ’肳‚ê‚Ä‚¢‚Ü‚¹‚ñ." +#define MSGJPN011 "ƒzƒXƒg–¼‚ª‚ ‚è‚Ü‚¹‚ñ." +#define MSGJPN012 "MD5‚ðŽg—p‚µ‚Ü‚·." +#define MSGJPN013 "SHA-1‚ðŽg—p‚µ‚Ü‚·." +#define MSGJPN014 "MD4(S/KEY)‚ðŽg—p‚µ‚Ü‚·." +#define MSGJPN015 "ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒh‚ªˆ—‚Å‚«‚Ü‚¹‚ñ" +#define MSGJPN016 "ƒzƒXƒg %s ‚ð’T‚µ‚Ä‚¢‚Ü‚·." +#define MSGJPN017 "%sƒzƒXƒg %s (%s (%d)) ‚ɐڑ±‚µ‚Ä‚¢‚Ü‚·." +#define MSGJPN018 "%sƒzƒXƒg %s (%d) ‚ɐڑ±‚µ‚Ä‚¢‚Ü‚·." +#define MSGJPN019 "ƒzƒXƒg %s ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ." +#define MSGJPN020 "%sƒzƒXƒg %s (%d) ‚ɐڑ±‚µ‚Ä‚¢‚Ü‚·." +#define MSGJPN021 "SOCKSƒT[ƒo %s ‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ." +#define MSGJPN022 "SOCKSƒT[ƒo %s (%d) ‚ɐڑ±‚µ‚Ä‚¢‚Ü‚·B" +#define MSGJPN023 "SOCKSƒT[ƒo‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ. (Err=%d)" +#define MSGJPN024 "SOCKSƒT[ƒo‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ. (Err=%d)" +#define MSGJPN025 "Ú‘±‚µ‚Ü‚µ‚½." +#define MSGJPN026 "Ú‘±‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN027 "ƒ\ƒPƒbƒg‚ªì¬‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN028 "SOCKSƒT[ƒo‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ. (Err=%d)" +#define MSGJPN029 "SOCKSƒT[ƒo‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ. (Err=%d)" +#define MSGJPN030 "Listenƒ\ƒPƒbƒg‚ªì¬‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN031 "PORTƒRƒ}ƒ“ƒh‚ªŽó‚¯•t‚¯‚ç‚ê‚Ü‚¹‚ñ." +#define MSGJPN032 "Ú‘±‚̓†[ƒU‚É‚æ‚Á‚Ä’†Ž~‚³‚ê‚Ü‚µ‚½." +#define MSGJPN033 "SOCKS‚̃Rƒ}ƒ“ƒh‚ª‘—‚ê‚Ü‚¹‚ñ‚Å‚µ‚½ (Cmd = %04X)" +#define MSGJPN034 "SOCKS5‚̃Rƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒC‚ªŽóM‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½" +#define MSGJPN035 "SOCKS4‚̃Rƒ}ƒ“ƒh‚ɑ΂·‚郊ƒvƒ‰ƒC‚ªŽóM‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½" +#define MSGJPN036 "SOCKSƒT[ƒo‚Ì”FØ•ûŽ®‚ªˆÙ‚È‚è‚Ü‚·." +#define MSGJPN037 "SOCKSƒT[ƒo‚É”FØ‚³‚ê‚Ü‚¹‚ñ‚Å‚µ‚½." +#define MSGJPN038 "–¼‘O" +#define MSGJPN039 "“ú•t" +#define MSGJPN040 "ƒTƒCƒY" +#define MSGJPN041 "Ží—Þ" +#define MSGJPN042 "–¼‘O" +#define MSGJPN043 "“ú•t" +#define MSGJPN044 "ƒTƒCƒY" +#define MSGJPN045 "Ží—Þ" +#define MSGJPN046 "‘®«" +#define MSGJPN047 "Š—LŽÒ" +#define MSGJPN048 "ƒeƒ“ƒ|ƒ‰ƒŠƒtƒ@ƒCƒ‹‚ª“ǂݏo‚¹‚Ü‚¹‚ñ." +#define MSGJPN049 "ƒtƒ@ƒCƒ‹ˆê——‚̎擾‚ÉŽ¸”s‚µ‚Ü‚µ‚½." +#define MSGJPN050 "ŒŸõiƒ[ƒJƒ‹j" +#define MSGJPN051 "ŒŸõiƒzƒXƒgj" +#define MSGJPN052 "íœF %s" +#define MSGJPN053 "ì¬F %s" +#define MSGJPN054 "“]‘—F %s" +#define MSGJPN055 "íœF %s" +#define MSGJPN056 "ì¬F %s" +#define MSGJPN057 "“]‘—F %s" +#define MSGJPN058 "%dŒÂ‚̃tƒ@ƒCƒ‹‚ð“]‘—‚µ‚Ü‚·." +#define MSGJPN059 "“]‘—‚·‚éƒtƒ@ƒCƒ‹‚Í‚ ‚è‚Ü‚¹‚ñ." +#define MSGJPN060 "%dŒÂ‚̃tƒHƒ‹ƒ_‚ðì¬‚µ‚Ü‚·." +#define MSGJPN061 "ì¬‚·‚éƒtƒHƒ‹ƒ_‚Í‚ ‚è‚Ü‚¹‚ñ." +#define MSGJPN062 "%dŒÂ‚̃tƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_‚ðíœ‚µ‚Ü‚·." +#define MSGJPN063 "íœ‚·‚éƒtƒ@ƒCƒ‹^ƒtƒHƒ‹ƒ_‚Í‚ ‚è‚Ü‚¹‚ñ." +#define MSGJPN064 "–¼‘O‚ð•ÏX‚µ‚ăAƒbƒvƒ[ƒh" +#define MSGJPN065 "–¼‘O‚ð•ÏX‚µ‚ă_ƒEƒ“ƒ[ƒh" +#define MSGJPN066 "íœiƒ[ƒJƒ‹j" +#define MSGJPN067 "íœiƒzƒXƒgj" +#define MSGJPN068 "–¼‘O•ÏXiƒ[ƒJƒ‹j" +#define MSGJPN069 "–¼‘O•ÏXiƒzƒXƒgj" +#define MSGJPN070 "ƒtƒHƒ‹ƒ_ì¬iƒ[ƒJƒ‹j" +#define MSGJPN071 "ƒtƒHƒ‹ƒ_ì¬iƒzƒXƒgj" +#define MSGJPN072 "ƒtƒHƒ‹ƒ_•ÏXiƒ[ƒJƒ‹j" +#define MSGJPN073 "ƒtƒHƒ‹ƒ_•ÏXiƒzƒXƒgj" +#define MSGJPN074 "ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹—e—Ê‚ðŒvŽZ‚µ‚Ü‚·B" +#define MSGJPN075 "ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹—e—Ê‚ðŒvŽZ‚µ‚Ü‚·B" +#define MSGJPN076 "ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹—e—Ê" +#define MSGJPN077 "ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹—e—Ê" +#define MSGJPN078 "ƒtƒHƒ‹ƒ_ì¬" +#define MSGJPN079 "ƒtƒHƒ‹ƒ_ì¬" +#define MSGJPN080 "ƒtƒHƒ‹ƒ_íœ" +#define MSGJPN081 "ƒtƒ@ƒCƒ‹íœ" +#define MSGJPN082 "ƒtƒHƒ‹ƒ_ì¬" +#define MSGJPN083 "ƒtƒHƒ‹ƒ_íœ" +#define MSGJPN084 "ƒtƒ@ƒCƒ‹íœ" +#define MSGJPN085 "%s‚Æ‚¢‚¤–¼‘O‚̃tƒ@ƒCƒ‹‚̓_ƒEƒ“ƒ[ƒh‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN086 "ƒ_ƒEƒ“ƒ[ƒh" +#define MSGJPN087 "ƒtƒ@ƒCƒ‹ˆê——Žæ“¾" +#define MSGJPN088 "ƒXƒLƒbƒv" +#define MSGJPN089 "ƒtƒ@ƒCƒ‹ %s ‚̓XƒLƒbƒv‚µ‚Ü‚·." +#define MSGJPN090 "ƒRƒ}ƒ“ƒh‚ªŽó‚¯•t‚¯‚ç‚ê‚Ü‚¹‚ñ." +#define MSGJPN091 "ƒ_ƒEƒ“ƒ[ƒh‚Ì‚½‚ß‚É" +#define MSGJPN092 "ƒRƒ}ƒ“ƒh‚ªŽó‚¯•t‚¯‚ç‚ê‚Ü‚¹‚ñ." +#define MSGJPN093 "ƒAƒhƒŒƒX‚ªŽæ“¾‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN094 "ŽóM‚̓^ƒCƒ€ƒAƒEƒg‚ÅŽ¸”s‚µ‚Ü‚µ‚½." +#define MSGJPN095 "ƒtƒ@ƒCƒ‹ %s ‚ªì¬‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN096 "ƒfƒBƒXƒN‚ª‚¢‚Á‚Ï‚¢‚ŏ‘‚«ž‚ß‚Ü‚¹‚ñ." +#define MSGJPN097 "ƒtƒ@ƒCƒ‹ˆê——‚̎擾‚𒆎~‚µ‚Ü‚µ‚½." +#define MSGJPN098 "ƒtƒ@ƒCƒ‹ˆê——" +#define MSGJPN099 "ƒ_ƒEƒ“ƒ[ƒh‚𒆎~‚µ‚Ü‚µ‚½. (%d Sec. %d B/S)." +#define MSGJPN100 "ƒ_ƒEƒ“ƒ[ƒh‚𒆎~‚µ‚Ü‚µ‚½." +#define MSGJPN101 "ƒtƒ@ƒCƒ‹ˆê——‚̎擾‚͐³íI—¹‚µ‚Ü‚µ‚½. (%d Bytes)" +#define MSGJPN102 "ƒ_ƒEƒ“ƒ[ƒh‚͐³íI—¹‚µ‚Ü‚µ‚½. (%d Sec. %d B/S)." +#define MSGJPN103 "ƒ_ƒEƒ“ƒ[ƒh‚͐³íI—¹‚µ‚Ü‚µ‚½. (%d Bytes)" +#define MSGJPN104 "ƒAƒbƒvƒ[ƒh" +#define MSGJPN105 "ƒtƒ@ƒCƒ‹ %s ‚ª“ǂݏo‚¹‚Ü‚¹‚ñ." +#define MSGJPN106 "ƒXƒLƒbƒv" +#define MSGJPN107 "ƒtƒ@ƒCƒ‹ %s ‚̓XƒLƒbƒv‚µ‚Ü‚·." +#define MSGJPN108 "ƒRƒ}ƒ“ƒh‚ªŽó‚¯•t‚¯‚ç‚ê‚Ü‚¹‚ñ." +#define MSGJPN109 "ƒAƒbƒvƒ[ƒh‚Ì‚½‚ß‚É" +#define MSGJPN110 "ƒRƒ}ƒ“ƒh‚ªŽó‚¯•t‚¯‚ç‚ê‚Ü‚¹‚ñ." +#define MSGJPN111 "ƒAƒhƒŒƒX‚ªŽæ“¾‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN112 "ƒtƒ@ƒCƒ‹ %s ‚ªƒI[ƒvƒ“‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN113 "ƒAƒbƒvƒ[ƒh‚𒆎~‚µ‚Ü‚µ‚½. (%d Sec. %d B/S)." +#define MSGJPN114 "ƒAƒbƒvƒ[ƒh‚𒆎~‚µ‚Ü‚µ‚½." +#define MSGJPN115 "ƒAƒbƒvƒ[ƒh‚͐³íI—¹‚µ‚Ü‚µ‚½. (%d Sec. %d B/S)." +#define MSGJPN116 "ƒAƒbƒvƒ[ƒh‚͐³íI—¹‚µ‚Ü‚µ‚½." +#define MSGJPN117 "Š®—¹" +#define MSGJPN118 "’†Ž~" +#define MSGJPN119 "ƒoƒCƒiƒŠ" +#define MSGJPN120 "ƒAƒXƒL[" +#define MSGJPN121 "–³•ÏŠ·" +#define MSGJPN122 "JIS" +#define MSGJPN123 "EUC" +#define MSGJPN124 "íœiƒ[ƒJƒ‹j" +#define MSGJPN125 "íœiƒzƒXƒgj" +#define MSGJPN126 "WS_FTP.INIƒtƒ@ƒCƒ‹" +#define MSGJPN127 "Šî–{" +#define MSGJPN128 "Šg’£" +#define MSGJPN129 "•¶ŽšƒR[ƒh" +#define MSGJPN130 "ƒ_ƒCƒAƒ‹ƒAƒbƒv" +#define MSGJPN131 "‚“x" +#define MSGJPN132 "ƒzƒXƒg‚̐ݒè" +#define MSGJPN133 "GMT%+02d:00 (“ú–{)" +#define MSGJPN134 "Žg—p‚µ‚È‚¢" +#define MSGJPN135 "Ž©“®”FŽ¯" +#define MSGJPN136 "OTP MD4, S/KEY" +#define MSGJPN137 "OTP MD5" +#define MSGJPN138 "OTP SHA-1" +#define MSGJPN139 "Ž©“®”FŽ¯" +#define MSGJPN140 "ACOS" +#define MSGJPN141 "VAX VMS" +#define MSGJPN142 "IRMX" +#define MSGJPN143 "ACOS-4" +#define MSGJPN144 "Stratus" +#define MSGJPN145 "ƒtƒHƒ‹ƒ_‚ð•ÏX‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN146 "ƒtƒHƒ‹ƒ_‚ðì¬‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN147 "ƒtƒHƒ‹ƒ_‚ðíœ‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN148 "ƒtƒHƒ‹ƒ_‚ðíœ‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN149 "ƒtƒ@ƒCƒ‹‚ðíœ‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN150 "ƒtƒ@ƒCƒ‹‚ðíœ‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN151 "ƒtƒ@ƒCƒ‹–¼•ÏX‚ª‚Å‚«‚Ü‚¹‚ñ." +#define MSGJPN152 "ƒeƒ“ƒ|ƒ‰ƒŠƒtƒHƒ‹ƒ_u%sv‚ª‚ ‚è‚Ü‚¹‚ñ" +#define MSGJPN153 "ƒtƒHƒ‹ƒ_u%sv‚ðŽg—p‚µ‚Ü‚·" +#define MSGJPN154 "Ú‘±" +#define MSGJPN155 "ƒNƒCƒbƒNÚ‘±" +#define MSGJPN156 "Ø’f" +#define MSGJPN157 "ƒ_ƒEƒ“ƒ[ƒh" +#define MSGJPN158 "ƒAƒbƒvƒ[ƒh" +#define MSGJPN159 "ƒ~ƒ‰[ƒŠƒ“ƒOƒAƒbƒvƒ[ƒh" +#define MSGJPN160 "íœ" +#define MSGJPN161 "–¼‘O•ÏX" +#define MSGJPN162 "ƒtƒHƒ‹ƒ_ì¬" +#define MSGJPN163 "ˆê‚ã‚̃tƒHƒ‹ƒ_‚Ö" +#define MSGJPN164 "ƒtƒHƒ‹ƒ_‚̈ړ®" +#define MSGJPN165 "ƒAƒXƒL[“]‘—ƒ‚[ƒh" +#define MSGJPN166 "ƒoƒCƒiƒŠ“]‘—ƒ‚[ƒh" +#define MSGJPN167 "ƒtƒ@ƒCƒ‹–¼‚Å“]‘—ƒ‚[ƒhØ‘Ö‚¦" +#define MSGJPN168 "•\Ž¦‚ðXV" +#define MSGJPN169 "ˆê——" +#define MSGJPN170 "Ú×" +#define MSGJPN171 "ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh‚ÍEUC" +#define MSGJPN172 "ƒzƒXƒg‚ÌŠ¿ŽšƒR[ƒh‚ÍJIS" +#define MSGJPN173 "Š¿ŽšƒR[ƒh‚Ì•ÏŠ·‚È‚µ" +#define MSGJPN174 "”¼ŠpƒJƒi‚ð‘SŠp‚É•ÏŠ·" +#define MSGJPN175 "ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®" +#define MSGJPN176 "ŽóM’†Ž~" +#define MSGJPN177 "Ý’è–¼u%sv‚Í‚ ‚è‚Ü‚¹‚ñ." +#define MSGJPN178 "Ý’è–¼‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñ." +#define MSGJPN179 "ƒzƒXƒg–¼‚Ɛݒ薼‚Ì—¼•û‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚·." +#define MSGJPN180 "ƒIƒvƒVƒ‡ƒ“u%sv‚ªŠÔˆá‚Á‚Ä‚¢‚Ü‚·." +#define MSGJPN181 "ƒzƒXƒg–¼‚Ɛݒ薼‚Ì—¼•û‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚·." +#define MSGJPN182 "ƒrƒ…[ƒ‚Ì‹N“®‚ÉŽ¸”s‚µ‚Ü‚µ‚½. (ERROR=%d)" +#define MSGJPN183 "JRE32.DLL –³‚µ" +#define MSGJPN184 "JRE32.DLL Ver %x.%x (C) ŽR“c˜a•v‚³‚ñ" +#define MSGJPN185 "ƒtƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢" +#define MSGJPN186 "ƒ†[ƒU" +#define MSGJPN187 "“]‘—‚P" +#define MSGJPN188 "“]‘—‚Q" +#define MSGJPN189 "“]‘—‚R" +#define MSGJPN190 "ƒ~ƒ‰[ƒŠƒ“ƒO" +#define MSGJPN191 "‘€ì" +#define MSGJPN192 "•\Ž¦" +#define MSGJPN193 "Ú‘±/Ø’f" +#define MSGJPN194 "FireWall" +#define MSGJPN195 "ƒc[ƒ‹" +#define MSGJPN196 "ƒTƒEƒ“ƒh" +#define MSGJPN197 "‚»‚Ì‘¼" +#define MSGJPN198 "ƒIƒvƒVƒ‡ƒ“" +#define MSGJPN199 "ƒtƒ@ƒCƒ‹–¼" +#define MSGJPN200 "ƒtƒ@ƒCƒ‹–¼" +#define MSGJPN201 "‘®«" +#define MSGJPN202 "ƒtƒ@ƒCƒ‹–¼" +#define MSGJPN203 "ƒtƒ@ƒCƒ‹–¼" +#define MSGJPN204 "FWƒ†[ƒU–¼¨ FWƒpƒXƒ[ƒh¨ SITE ƒzƒXƒg–¼" +#define MSGJPN205 "FWƒ†[ƒU–¼¨ FWƒpƒXƒ[ƒh¨ USER ƒ†[ƒU–¼@ƒzƒXƒg–¼" +#define MSGJPN206 "FWƒ†[ƒU–¼¨ FWƒpƒXƒ[ƒh" +#define MSGJPN207 "USER ƒ†[ƒU–¼@ƒzƒXƒg–¼" +#define MSGJPN208 "OPEN ƒzƒXƒg–¼" +#define MSGJPN209 "SOCKS4" +#define MSGJPN210 "SOCKS5 (”FØ‚È‚µ)" +#define MSGJPN211 "SOCKS5 (ƒ†[ƒU–¼AƒpƒXƒ[ƒh”FØ)" +#define MSGJPN212 "Žg—p‚µ‚È‚¢" +#define MSGJPN213 "Ž©“®”FŽ¯" +#define MSGJPN214 "OTP MD4,S/KEY" +#define MSGJPN215 "OTP MD5" +#define MSGJPN216 "OTP SHA-1" +#define MSGJPN217 "ƒrƒ…[ƒ‚Ì‘I‘ð" +#define MSGJPN218 "ŽÀsƒtƒ@ƒCƒ‹\0*.exe;*.com;*.bat\0‘S‚Ä‚Ì̧²Ù\0*\0" +#define MSGJPN219 "Waveƒtƒ@ƒCƒ‹" +#define MSGJPN220 "ƒ_ƒCƒAƒ‹ƒAƒbƒv‚ðØ’f‚µ‚Ä‚¢‚Ü‚·." +#define MSGJPN221 "ƒ_ƒCƒAƒ‹ƒAƒbƒv‚Őڑ±‚µ‚Ä‚¢‚Ü‚·." +#define MSGJPN222 "ƒ_ƒCƒAƒ‹ƒAƒbƒv‚ªŽg‚¦‚Ü‚¹‚ñ(RasDialDlg)" +#define MSGJPN223 "%s ‚ɐڑ±‚µ‚Ä‚¢‚Ü‚·..." +#define MSGJPN224 "•s–¾‚ȃGƒ‰[" +#define MSGJPN225 "ƒ_ƒCƒAƒ‹ƒAƒbƒvÚ‘±" +#define MSGJPN226 "ƒ|[ƒg‚ðŠJ‚¢‚Ä‚¢‚Ü‚·..." +#define MSGJPN227 "ƒ|[ƒg‚ªŠJ‚©‚ê‚Ü‚µ‚½" +#define MSGJPN228 "ƒ_ƒCƒAƒ‹’†..." +#define MSGJPN229 "ƒ_ƒCƒAƒ‹Š®—¹" +#define MSGJPN230 "‘SƒfƒoƒCƒX‚ªÚ‘±‚³‚ê‚Ü‚µ‚½" +#define MSGJPN231 "ƒ†[ƒU–¼‚ƃpƒXƒ[ƒh‚ðŒŸØ’†..." +#define MSGJPN232 "ÄŒŸØ’†..." +#define MSGJPN233 "ƒpƒXƒ[ƒh‚ð•ÏX‚µ‚ĉº‚³‚¢" +#define MSGJPN234 "ŒŸØ‚ªI—¹‚µ‚Ü‚µ‚½" +#define MSGJPN235 "Ú‘±‚µ‚Ü‚µ‚½" +#define MSGJPN236 "Ø’f‚µ‚Ü‚µ‚½" +#define MSGJPN237 "Ú‘±ˆ—’†..." +#define MSGJPN238 "%s ‚ւ̐ڑ±" +#define MSGJPN239 "# ‚±‚̃tƒ@ƒCƒ‹‚͕ҏW‚µ‚È‚¢‚Å‚­‚¾‚³‚¢B\n" +#define MSGJPN240 "INIƒtƒ@ƒCƒ‹‚ɐݒ肪•Û‘¶‚Å‚«‚Ü‚¹‚ñ" +#define MSGJPN241 "‘—M‚̓^ƒCƒ€ƒAƒEƒg‚ÅŽ¸”s‚µ‚Ü‚µ‚½." +#define MSGJPN242 "ŽóM‚̓^ƒCƒ€ƒAƒEƒg‚ÅŽ¸”s‚µ‚Ü‚µ‚½." +#define MSGJPN243 "ŽóM‚̓^ƒCƒ€ƒAƒEƒg‚ÅŽ¸”s‚µ‚Ü‚µ‚½." +#define MSGJPN244 "ŒÅ’è’·‚ÌŽóM‚ªŽ¸”s‚µ‚Ü‚µ‚½" +#define MSGJPN245 "ƒ[ƒJƒ‹" +#define MSGJPN246 "ƒzƒXƒg" +#define MSGJPN247 "‘I‘ð%dŒÂi%sj" +#define MSGJPN248 "ƒ[ƒJƒ‹‹ó %s" +#define MSGJPN249 "“]‘—‘Ò‚¿ƒtƒ@ƒCƒ‹%dŒÂ" +#define MSGJPN250 "ŽóM’† %s" +#define MSGJPN251 "ErrFƒV[ƒh•¶Žš—ñ" +#define MSGJPN252 "ErrFƒV[ƒh•¶Žš—ñ" +#define MSGJPN253 "ErrFƒV[ƒPƒ“ƒX”ԍ†" +#define MSGJPN254 "‚l‚r ‚oƒSƒVƒbƒN" +#define MSGJPN255 "ƒAƒbƒvƒ[ƒh(&U)" +#define MSGJPN256 "–¼‘O‚ð•Ï‚¦‚ăAƒbƒvƒ[ƒh(&P)..." +#define MSGJPN257 "‘S‚Ä‚ðƒAƒbƒvƒ[ƒh" +#define MSGJPN258 "íœ(&R)" +#define MSGJPN259 "–¼‘O•ÏX(&N)..." +#define MSGJPN260 "ƒtƒHƒ‹ƒ_ì¬(&K)..." +#define MSGJPN261 "ƒtƒ@ƒCƒ‹—e—ÊŒvŽZ(&Z)" +#define MSGJPN262 "ÅV‚̏î•ñ‚ɍXV(&F)" +#define MSGJPN263 "ƒ_ƒEƒ“ƒ[ƒh(&D)" +#define MSGJPN264 "–¼‘O‚ð•Ï‚¦‚ă_ƒEƒ“ƒ[ƒh(&W)..." +#define MSGJPN265 "ƒtƒ@ƒCƒ‹‚Æ‚µ‚ă_ƒEƒ“ƒ[ƒh(&I)" +#define MSGJPN266 "‘S‚Ä‚ðƒ_ƒEƒ“ƒ[ƒh" +#define MSGJPN267 "íœ(&R)" +#define MSGJPN268 "–¼‘O•ÏX(&N)..." +#define MSGJPN269 "‘®«•ÏX(&A)..." +#define MSGJPN270 "ƒtƒHƒ‹ƒ_ì¬(&K)..." +#define MSGJPN271 "URL‚ðƒNƒŠƒbƒvƒ{[ƒh‚ÖƒRƒs[(&C)" +#define MSGJPN272 "ƒtƒ@ƒCƒ‹—e—ÊŒvŽZ(&Z)" +#define MSGJPN273 "ÅV‚̏î•ñ‚ɍXV(&F)" +#define MSGJPN274 "ŠJ‚­(&O)" +#define MSGJPN275 "%s‚ÅŠJ‚­(&%d)" +#define MSGJPN276 "WS_FTP.INI\0ws_ftp.ini\0‘S‚Ä‚Ì̧²Ù\0*\0" +#define MSGJPN277 "Waveƒtƒ@ƒCƒ‹\0*.wav\0‘S‚Ẵtƒ@ƒCƒ‹\0*\0" +#define MSGJPN278 "——RF%s" +#define MSGJPN279 "Listenƒ\ƒPƒbƒg‚ªŽæ“¾‚Å‚«‚Ü‚¹‚ñ" +#define MSGJPN280 "Dataƒ\ƒPƒbƒg‚ªŽæ“¾‚Å‚«‚Ü‚¹‚ñ" +#define MSGJPN281 "PASVƒ‚[ƒh‚Őڑ±‚Å‚«‚Ü‚¹‚ñ" +#define MSGJPN282 "INIƒtƒ@ƒCƒ‹–¼‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñ" +#define MSGJPN283 "INIƒtƒ@ƒCƒ‹Žw’èF" +#define MSGJPN284 "http://www2.biglobe.ne.jp/~sota/" +#define MSGJPN285 "ƒŒƒWƒXƒgƒŠƒGƒfƒBƒ^‚ª‹N“®‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½" +#define MSGJPN286 "Ý’èƒtƒ@ƒCƒ‹‚Ì•Û‘¶" +#define MSGJPN287 "Regƒtƒ@ƒCƒ‹\0*.reg\0‘S‚Ẵtƒ@ƒCƒ‹\0*\0" +#define MSGJPN288 "INIƒtƒ@ƒCƒ‹\0*.ini\0‘S‚Ẵtƒ@ƒCƒ‹\0*\0" +#define MSGJPN289 "Agilent Logic analyzer" +#define MSGJPN290 "Regƒtƒ@ƒCƒ‹\0*.reg\0INIƒtƒ@ƒCƒ‹\0*.ini\0‘S‚Ẵtƒ@ƒCƒ‹\0*\0" +#define MSGJPN291 "Ý’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³" +#define MSGJPN292 "Ý’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³‚·‚邽‚߂ɂ́AFFFTP‚ðÄ‹N“®‚µ‚Ä‚­‚¾‚³‚¢B" +#define MSGJPN293 "Ý’èƒtƒ@ƒCƒ‹‚ÍŠg’£Žq‚ª.reg‚©.ini‚Å‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB" +#define MSGJPN294 "USER FWƒ†[ƒU–¼:FWƒpƒXƒ[ƒh@ƒzƒXƒg–¼" +#define MSGJPN295 "ƒVƒoƒ\ƒN WL" +#define MSGJPN296 "“Ç‚ÝŽæ‚èê—pƒtƒ@ƒCƒ‹‚Å‚·B“Ç‚ÝŽæ‚èê—p‘®«‚ð‰ðœ‚µ‚Ü‚·‚©H" +#define MSGJPN297 "%s ‚Í•s³‚ȃtƒ@ƒCƒ‹–¼‚Å‚·B\r\n‚±‚̃tƒ@ƒCƒ‹‚̓_ƒEƒ“ƒ[ƒh‚³‚ê‚Ü‚¹‚ñB" +#define MSGJPN298 "OLE‚̏‰Šú‰»‚ÉŽ¸”s‚µ‚Ü‚µ‚½B" +#define MSGJPN299 "ƒRƒ}ƒ“ƒhƒ‰ƒCƒ“‚Ƀ}ƒXƒ^[ƒpƒXƒ[ƒh‚ªŽw’肳‚ê‚Ä‚¢‚Ü‚¹‚ñ" +#define MSGJPN300 "ƒfƒtƒHƒ‹ƒg‚̃}ƒXƒ^[ƒpƒXƒ[ƒh‚ªŽg‚í‚ê‚Ü‚·D\r\nƒ}ƒ‹ƒEƒFƒA‚̍UŒ‚‚ð–h‚®‚½‚߁CŒÅ—L‚̃}ƒXƒ^[ƒpƒXƒ[ƒh‚ðÝ’è‚·‚邱‚Æ‚ð‚¨‚·‚·‚ß‚µ‚Ü‚·" +#define MSGJPN301 "ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ªÝ’è‚ƈê’v‚µ‚Ü‚¹‚ñDˆÀ‘S‚Ì‚½‚ߐݒè‚Ì•Û‘¶‚ðs‚¢‚Ü‚¹‚ñD" +#define MSGJPN302 "Šm”F—pƒf[ƒ^‚ª‰ó‚ê‚Ä‚¢‚邽‚߁Cƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚̐³“–«‚ðŠm”F‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½D" +#define MSGJPN303 "ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ð•ÏX‚µ‚Ü‚µ‚½" +#define MSGJPN304 "Žw’肳‚ꂽƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ª“o˜^‚³‚ꂽ‚à‚̂ƈê’v‚µ‚Ü‚¹‚ñD\r\nÄ“x“ü—Í‚µ‚Ü‚·‚©H\r\nu‚¢‚¢‚¦v‚ð‘I‚Ô‚Æ‹L‰¯‚³‚ꂽFTPƒpƒXƒ[ƒh‚Í—˜—p‚Å‚«‚Ü‚¹‚ñD" diff --git a/misc.c b/misc.c new file mode 100644 index 0000000..9cce7dd --- /dev/null +++ b/misc.c @@ -0,0 +1,1702 @@ +/*============================================================================= +* +* ‚»‚Ì‘¼‚̔ėpƒTƒuƒ‹[ƒ`ƒ“ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + + +/*===== “ü—̓_ƒCƒAƒƒOƒf[ƒ^‚̃Xƒgƒ‰ƒNƒ`ƒƒ =====*/ + +typedef struct { + char Title[80]; /* ƒ_ƒCƒAƒƒO‚̃^ƒCƒgƒ‹ */ + char Str[FMAX_PATH+1]; /* ƒfƒtƒHƒ‹ƒg•¶Žš—ñ^“ü—Í‚³‚ꂽ•¶Žš—ñ(Output) */ + int MaxLen; /* •¶Žš—ñ‚̍Œ· */ + int Anonymous; /* Anonymousƒtƒ‰ƒO(Output) */ +} DIALOGDATA; + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); + +/*===== ŠO•”ŽQÆ =====*/ + +extern HWND hHelpWin; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static DIALOGDATA *DialogData; /* “ü—̓_ƒCƒAƒƒOƒf[ƒ^ */ +static int HelpPage; + + + +/*----- “ü—̓_ƒCƒAƒƒO‚ð•\Ž¦ -------------------------------------------------- +* +* Parameter +* int Res : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚ÌID +* HWND hWnd : eƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* char *Title : ƒEƒCƒ“ƒhƒEƒ^ƒCƒgƒ‹ (NULL=Ý’肵‚È‚¢) +* char *Buf : ƒGƒfƒBƒbƒgƒ{ƒbƒNƒX‚̏‰Šú•¶Žš—ñ^“ü—Í•¶Žš—ñ‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY (FMAX_PATH+1ˆÈ‰º‚Å‚ ‚邱‚Æ) +* int *Flg : ƒtƒ‰ƒO‚̏‰Šú’l^ƒtƒ‰ƒO‚ð•Ô‚·ƒ[ƒN +* int Help : ƒwƒ‹ƒv‚̃Rƒ“ƒeƒLƒXƒg”ԍ† +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO=Žæ‚èÁ‚µ) +* +* Note +* ƒ_ƒCƒAƒƒO‚Í‚PŒÂ‚ÌEditBox‚Æ‚PŒÂ‚ÌButton‚ðŽ‚Â‚à‚Ì‚ðŽg‚¤ +*----------------------------------------------------------------------------*/ + +int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg, int Help) +{ + int Ret; + DIALOGDATA dData; + + dData.MaxLen = Max; + memset(dData.Str, NUL, FMAX_PATH+1); + strncpy(dData.Str, Buf, FMAX_PATH); + strcpy(dData.Title, ""); + if(Title != NULL) + strcpy(dData.Title, Title); + dData.Anonymous = *Flg; + DialogData = &dData; + HelpPage = Help; + + Ret = DialogBox(GetFtpInst(), MAKEINTRESOURCE(Res), hWnd, InputDialogCallBack); + + if(Ret == YES) + { + memset(Buf, NUL, Max); + strncpy(Buf, dData.Str, Max-1); + *Flg = dData.Anonymous; + } + return(Ret); +} + + +/*----- “ü—̓_ƒCƒAƒƒO‚̃R[ƒ‹ƒoƒbƒN ------------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + char Tmp[FMAX_PATH+1]; + + switch (iMessage) + { + case WM_INITDIALOG : + if(strlen(DialogData->Title) != 0) + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)DialogData->Title); + SendDlgItemMessage(hDlg, INP_INPSTR, EM_LIMITTEXT, DialogData->MaxLen-1, 0); + SendDlgItemMessage(hDlg, INP_INPSTR, WM_SETTEXT, 0, (LPARAM)DialogData->Str); + SendDlgItemMessage(hDlg, INP_ANONYMOUS, BM_SETCHECK, DialogData->Anonymous, 0); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, INP_INPSTR, WM_GETTEXT, DialogData->MaxLen, (LPARAM)DialogData->Str); + DialogData->Anonymous = SendDlgItemMessage(hDlg, INP_ANONYMOUS, BM_GETCHECK, 0, 0); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, HelpPage); + break; + + case INP_BROWSE : + if(SelectDir(hDlg, Tmp, FMAX_PATH) == TRUE) + SendDlgItemMessage(hDlg, INP_INPSTR, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- mŽÀsn‚ƁmŽæÁn‚¾‚¯‚̃_ƒCƒAƒƒO‚Ì‹¤’ʃR[ƒ‹ƒoƒbƒNŠÖ” -------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- mŽÀsn‚ƁmŽæÁn‚¾‚¯‚̃_ƒCƒAƒƒO‚Ì‹¤’ʃR[ƒ‹ƒoƒbƒNŠÖ”(ƒeƒLƒXƒg•\Ž¦‚‚«) +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, COMMON_TEXT, WM_SETTEXT, 0, lParam); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- •¶Žš—ñ‚̍Ōã‚É "\" ‚ð•t‚¯‚é ------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒIƒŠƒWƒiƒ‹‚Ì•¶Žš—ñ char *Str ‚ª•ÏX‚³‚ê‚Ü‚·B +*----------------------------------------------------------------------------*/ + +void SetYenTail(char *Str) +{ + if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "\\") != 0) + strcat(Str, "\\"); + + return;; +} + + +/*----- •¶Žš—ñ‚̍Ōã‚Ì "\" ‚ðŽæ‚菜‚­ ----------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒIƒŠƒWƒiƒ‹‚Ì•¶Žš—ñ char *Str ‚ª•ÏX‚³‚ê‚Ü‚·B +*----------------------------------------------------------------------------*/ + +void RemoveYenTail(char *Str) +{ + char *Pos; + + if(strlen(Str) > 0) + { + Pos = _mbsninc(Str, _mbslen(Str) - 1); + if(_mbscmp(Pos, "\\") == 0) + *Pos = NUL; + } + return;; +} + + +/*----- •¶Žš—ñ‚̍Ōã‚É "/" ‚ð•t‚¯‚é ------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒIƒŠƒWƒiƒ‹‚Ì•¶Žš—ñ char *Str ‚ª•ÏX‚³‚ê‚Ü‚·B +*----------------------------------------------------------------------------*/ + +void SetSlashTail(char *Str) +{ + if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0) + strcat(Str, "/"); + + return; +} + + +/*----- •¶Žš—ñ‚©‚ç‰üsƒR[ƒh‚ðŽæ‚菜‚­ ---------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒIƒŠƒWƒiƒ‹‚Ì•¶Žš—ñ char *Str ‚ª•ÏX‚³‚ê‚Ü‚·B +*----------------------------------------------------------------------------*/ + +void RemoveReturnCode(char *Str) +{ + char *Pos; + + if((Pos = strchr(Str, 0x0D)) != NULL) + *Pos = NUL; + if((Pos = strchr(Str, 0x0A)) != NULL) + *Pos = NUL; + return; +} + + +/*----- •¶Žš—ñ“à‚Ì“Á’è‚Ì•¶Žš‚ð‘S‚Ä’u‚«Š·‚¦‚é ---------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char Src : ŒŸõ•¶Žš +* char Dst : ’uŠ·•¶Žš +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ReplaceAll(char *Str, char Src, char Dst) +{ + char *Pos; + + while((Pos = _mbschr(Str, Src)) != NULL) + *Pos = Dst; + return; +} + + +/*----- ”Žš‚à‚µ‚­‚Í“Á’è‚Ì‚P•¶Žš‚©ƒ`ƒFƒbƒN ------------------------------------ +* +* Parameter +* int Ch : ƒ`ƒFƒbƒN‚·‚镶Žš +* int Sym : ‹L† +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* 0=”Žš‚Å‚à“Á’è‚Ì‹L†‚Å‚à‚È‚¢ +*----------------------------------------------------------------------------*/ + +int IsDigitSym(int Ch, int Sym) +{ + int Ret; + + if((Ret = IsDigit(Ch)) == 0) + { + if((Sym != NUL) && (Sym == Ch)) + Ret = 1; + } + return(Ret); +} + + +/*----- •¶Žš—ñ‚ª‘S‚Ä“¯‚¶•¶Žš‚©ƒ`ƒFƒbƒN ---------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* int Ch : •¶Žš +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO +*----------------------------------------------------------------------------*/ + +int StrAllSameChar(char *Str, char Ch) +{ + int Ret; + + Ret = YES; + while(*Str != NUL) + { + if(*Str != Ch) + { + Ret = NO; + break; + } + Str++; + } + return(Ret); +} + + +/*----- •¶Žš—ñ‚Ì––”ö‚̃Xƒy[ƒX‚ðíœ ------------------------------------------ +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void RemoveTailingSpaces(char *Str) +{ + char *Pos; + + Pos = Str + strlen(Str); + while(--Pos > Str) + { + if(*Pos != ' ') + break; + *Pos = NUL; + } + return; +} + + +/*----- ‘啶Žš^¬•¶Žš‚ð‹æ•Ê‚µ‚È‚¢strstr -------------------------------------- +* +* Parameter +* char *s1 : •¶Žš—ñ‚P +* char *s2 : •¶Žš—ñ‚Q +* +* Return Value +* char *•¶Žš—ñ‚P’†‚Å•¶Žš—ñ‚Q‚ªŒ©‚‚©‚Á‚½ˆÊ’u +* NULL=Œ©‚‚©‚ç‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +char *stristr(char *s1, char *s2) +{ + char *Ret; + + Ret = NULL; + while(*s1 != NUL) + { + if((tolower(*s1) == tolower(*s2)) && + (_strnicmp(s1, s2, strlen(s2)) == 0)) + { + Ret = s1; + break; + } + s1++; + } + return(Ret); +} + + +/*----- •¶Žš—ñ’†‚̃Xƒy[ƒX‚Å‹æØ‚ç‚ꂽŽŸ‚̃tƒB[ƒ‹ƒh‚ð•Ô‚· -------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* char *ŽŸ‚̃tƒB[ƒ‹ƒh +* NULL=Œ©‚‚©‚ç‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +char *GetNextField(char *Str) +{ + if((Str = strchr(Str, ' ')) != NULL) + { + while(*Str == ' ') + { + if(*Str == NUL) + { + Str = NULL; + break; + } + Str++; + } + } + return(Str); +} + + +/*----- Œ»Ý‚̃tƒB[ƒ‹ƒh‚Ì•¶Žš—ñ‚ðƒRƒs[‚·‚é ---------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* char *Buf : ƒRƒs[æ +* int Max : Å‘啶Žš” +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL=’·‚³‚ª’·‚·‚¬‚é +*----------------------------------------------------------------------------*/ + +int GetOneField(char *Str, char *Buf, int Max) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if((Pos = strchr(Str, ' ')) == NULL) + { + if((int)strlen(Str) <= Max) + { + strcpy(Buf, Str); + Sts = SUCCESS; + } + } + else + { + if(Pos - Str <= Max) + { + strncpy(Buf, Str, Pos - Str); + *(Buf + (Pos - Str)) = NUL; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒJƒ“ƒ}‚ðŽæ‚菜‚­ ------------------------------------------------------ +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void RemoveComma(char *Str) +{ + char *Put; + + Put = Str; + while(*Str != NUL) + { + if(*Str != ',') + { + *Put = *Str; + Put++; + } + Str++; + } + *Put = NUL; + return; +} + + +/*----- ƒpƒX–¼‚Ì’†‚̃tƒ@ƒCƒ‹–¼‚̐擪‚ð•Ô‚· ------------------------------------ +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* char *ƒtƒ@ƒCƒ‹–¼‚̐擪 +* +* Note +* ƒfƒBƒŒƒNƒgƒŠ‚Ì‹æØ‚è‹L†‚Í "\" ‚Æ "/" ‚Ì—¼•û‚ª—LŒø +*----------------------------------------------------------------------------*/ + +char *GetFileName(char *Path) +{ + char *Pos; + + if((Pos = _mbschr(Path, ':')) != NULL) + Path = Pos + 1; + + if((Pos = _mbsrchr(Path, '\\')) != NULL) + Path = Pos + 1; + + if((Pos = _mbsrchr(Path, '/')) != NULL) + Path = Pos + 1; + + return(Path); +} + + +/*----- ƒc[ƒ‹‚Ì•\Ž¦–¼‚ð•Ô‚· -------------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* char * : •\Ž¦–¼ +*----------------------------------------------------------------------------*/ + +char *GetToolName(char *Path) +{ + char *Pos; + + if((Pos = _mbschr(Path, ':')) != NULL) + Path = Pos + 1; + + if((Pos = _mbsrchr(Path, '\\')) != NULL) + Path = Pos + 1; + + return(Path); +} + + +/*----- ƒpƒX–¼‚Ì’†‚ÌŠg’£Žq‚̐擪‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* char *Šg’£Žq‚̐擪 +*----------------------------------------------------------------------------*/ + +char *GetFileExt(char *Path) +{ + char *Ret; + + Ret = _mbschr(Path, NUL); + if((_mbscmp(Path, ".") != 0) && + (_mbscmp(Path, "..") != 0)) + { + while((Path = _mbschr(Path, '.')) != NULL) + { + Path++; + Ret = Path; + } + } + return(Ret); +} + + +/*----- ƒpƒX–¼‚©‚çƒtƒ@ƒCƒ‹–¼‚ðŽæ‚菜‚­ ---------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* char *Buf : ƒtƒ@ƒCƒ‹–¼‚ðœ‚¢‚½ƒpƒX–¼‚̃Rƒs[æ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒfƒBƒŒƒNƒgƒŠ‚Ì‹æØ‚è‹L†‚Í "\" ‚Æ "/" ‚Ì—¼•û‚ª—LŒø +*----------------------------------------------------------------------------*/ + +void RemoveFileName(char *Path, char *Buf) +{ + char *Pos; + + strcpy(Buf, Path); + + if((Pos = _mbsrchr(Buf, '/')) != NULL) + *Pos = NUL; + else if((Pos = _mbsrchr(Buf, '\\')) != NULL) + { + if((Pos == Buf) || + ((Pos != Buf) && (*(Pos - 1) != ':'))) + *Pos = NUL; + } + return; +} + + +/*----- ãˆÊƒfƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚ðŽæ“¾ ---------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒfƒBƒŒƒNƒgƒŠ‚Ì‹æØ‚è‹L†‚Í "\" ‚Æ "/" ‚Ì—¼•û‚ª—LŒø +* Å‰‚Ì "\"‚â"/"‚ÍŽc‚· +* —áj "/pub" --> "/" +* —áj "C:\DOS" --> "C:\" +*----------------------------------------------------------------------------*/ + +void GetUpperDir(char *Path) +{ + char *Top; + char *Pos; + + if(((Top = _mbschr(Path, '/')) != NULL) || + ((Top = _mbschr(Path, '\\')) != NULL)) + { + Top++; + if(((Pos = _mbsrchr(Top, '/')) != NULL) || + ((Pos = _mbsrchr(Top, '\\')) != NULL)) + *Pos = NUL; + else + *Top = NUL; + } + return; +} + + +/*----- ãˆÊƒfƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚ðŽæ“¾ ---------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* ƒfƒBƒŒƒNƒgƒŠ‚Ì‹æØ‚è‹L†‚Í "\" ‚Æ "/" ‚Ì—¼•û‚ª—LŒø +* Å‰‚Ì "\"‚â"/"‚àÁ‚· +* —áj "/pub" --> "" +* —áj "C:\DOS" --> "C:" +*----------------------------------------------------------------------------*/ + +void GetUpperDirEraseTopSlash(char *Path) +{ + char *Pos; + + if(((Pos = _mbsrchr(Path, '/')) != NULL) || + ((Pos = _mbsrchr(Path, '\\')) != NULL)) + *Pos = NUL; + else + *Path = NUL; + + return; +} + + +/*----- ƒfƒBƒŒƒNƒgƒŠ‚ÌŠK‘w”‚ð•Ô‚· -------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +* +* Note +* ’P‚É '\' ‚Æ '/'‚̐”‚ð•Ô‚·‚¾‚¯ +*----------------------------------------------------------------------------*/ + +int AskDirLevel(char *Path) +{ + char *Pos; + int Level; + + Level = 0; + while(((Pos = _mbschr(Path, '/')) != NULL) || + ((Pos = _mbschr(Path, '\\')) != NULL)) + { + Path = Pos + 1; + Level++; + } + return(Level); +} + + +/*----- ƒtƒ@ƒCƒ‹ƒTƒCƒY‚𕶎š—ñ‚É•ÏŠ·‚·‚é -------------------------------------- +* +* Parameter +* double Size : ƒtƒ@ƒCƒ‹ƒTƒCƒY +* char *Buf : •¶Žš—ñ‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MakeSizeString(double Size, char *Buf) +{ + if(Size >= (1024*1024)) + { + Size /= (1024*1024); + sprintf(Buf, "%.2fM Bytes", Size); + } + else if (Size >= 1024) + { + Size /= 1024; + sprintf(Buf, "%.2fK Bytes", Size); + } + else + sprintf(Buf, "%.0f Bytes", Size); + + return; +} + + +/*----- StaticText‚̗̈æ‚ÉŽû‚Ü‚é‚悤‚ɃpƒX–¼‚𐮌`‚µ‚Ä•\Ž¦ -------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* char *Str : •¶Žš—ñ (’·‚³‚ÍFMAX_PATHˆÈ‰º) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispStaticText(HWND hWnd, char *Str) +{ + char Buf[FMAX_PATH+1]; + char *Pos; + char *Tmp; + RECT Rect; + SIZE fSize; + HDC hDC; + int Force; + + GetClientRect(hWnd, &Rect); + Rect.right -= Rect.left; + + hDC = GetDC(hWnd); + strcpy(Buf, Str); + Pos = Buf; + Force = NO; + while(Force == NO) + { + GetTextExtentPoint32(hDC, Pos, strlen(Pos), &fSize); + + if(fSize.cx <= Rect.right) + break; + + if(_mbslen(Pos) <= 4) + Force = YES; + else + { + Pos = _mbsninc(Pos, 4); + if((Tmp = _mbschr(Pos, '\\')) == NULL) + Tmp = _mbschr(Pos, '/'); + + if(Tmp == NULL) + Tmp = _mbsninc(Pos, 4); + + Pos = Tmp - 3; + memset(Pos, '.', 3); + } + } + ReleaseDC(hWnd, hDC); + + SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)Pos); + return; +} + + +/*----- •¶Žš—ñƒAƒŒƒC‚Ì’·‚³‚ð‹‚ß‚é -------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñƒAƒŒƒC (––”ö‚ÍNUL‚Q‚Â) +* +* Return Value +* int ’·‚³ +* +* Note +* I’[‚Ì2‚‚ÌNUL‚Ì‚¤‚¿‚̍Ōã‚Ì•¨‚͐”‚¦‚È‚¢ +* StrMultiLen("") = 0 +* StrMultiLen("abc\0xyz\0") = 8 +* StrMultiLen("abc") = I’[‚ª‚Q‚‚ÌNUL‚Å‚È‚¢‚Ì‚Å‹‚ß‚ç‚ê‚È‚¢ +*----------------------------------------------------------------------------*/ + +int StrMultiLen(char *Str) +{ + int Len; + int Tmp; + + Len = 0; + while(*Str != NUL) + { + Tmp = strlen(Str) + 1; + Str += Tmp; + Len += Tmp; + } + return(Len); +} + + +/*----- RECT‚ðƒNƒ‰ƒCƒAƒ“ƒgÀ•W‚©‚çƒXƒNƒŠ[ƒ“À•W‚É•ÏŠ· ------------------------ +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* RECT *Rect : RECT +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void RectClientToScreen(HWND hWnd, RECT *Rect) +{ + POINT Tmp; + + Tmp.x = Rect->left; + Tmp.y = Rect->top; + ClientToScreen(hWnd, &Tmp); + Rect->left = Tmp.x; + Rect->top = Tmp.y; + + Tmp.x = Rect->right; + Tmp.y = Rect->bottom; + ClientToScreen(hWnd, &Tmp); + Rect->right = Tmp.x; + Rect->bottom = Tmp.y; + + return; +} + + +/*----- 16i•¶Žš‚ðƒoƒCƒiƒŠ‚É•ÏŠ· ---------------------------------------------- +* +* Parameter +* char Ch : 16i•¶Žš +* +* Return Value +* int ƒoƒCƒiƒŠ’l +*----------------------------------------------------------------------------*/ + +int hex2bin(char Ch) +{ + int Ret; + + if((Ch >= '0') && (Ch <= '9')) + Ret = Ch - '0'; + else if((Ch >= 'A') && (Ch <= 'F')) + Ret = Ch - 'A' + 10; + else if((Ch >= 'a') && (Ch <= 'f')) + Ret = Ch - 'a' + 10; + + return(Ret); +} + + +/*----- ‚t‚m‚b•¶Žš—ñ‚ð•ª‰ð‚·‚é ------------------------------------------------ +* +* Parameter +* char *unc : UNC•¶Žš—ñ +* char *Host : ƒzƒXƒg–¼‚ðƒRƒs[‚·‚éƒoƒbƒtƒ@ (ƒTƒCƒY‚Í HOST_ADRS_LEN+1) +* char *Path : ƒpƒX–¼‚ðƒRƒs[‚·‚éƒoƒbƒtƒ@ (ƒTƒCƒY‚Í FMAX_PATH+1) +* char *File : ƒtƒ@ƒCƒ‹–¼‚ðƒRƒs[‚·‚éƒoƒbƒtƒ@ (ƒTƒCƒY‚Í FMAX_PATH+1) +* char *User : ƒ†[ƒU–¼‚ðƒRƒs[‚·‚éƒoƒbƒtƒ@ (ƒTƒCƒY‚Í USER_NAME_LEN+1) +* char *Pass : ƒpƒXƒ[ƒh‚ðƒRƒs[‚·‚éƒoƒbƒtƒ@ (ƒTƒCƒY‚Í PASSWORD_LEN+1) +* int *Port : ƒ|[ƒg”ԍ†‚ðƒRƒs[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +* +* "\"‚Í‘S‚Ä"/"‚É’u‚«Š·‚¦‚é +*----------------------------------------------------------------------------*/ + +int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char *Pass, int *Port) +{ + int Sts; + char *Pos1; + char *Pos2; + char Tmp[FMAX_PATH+1]; + + memset(Host, NUL, HOST_ADRS_LEN+1); + memset(Path, NUL, FMAX_PATH+1); + memset(File, NUL, FMAX_PATH+1); + memset(User, NUL, USER_NAME_LEN+1); + memset(Pass, NUL, PASSWORD_LEN+1); + *Port = PORT_NOR; + + ReplaceAll(unc, '\\', '/'); + + if((Pos1 = _mbsstr(unc, "//")) != NULL) + Pos1 += 2; + else + Pos1 = unc; + + if((Pos2 = _mbschr(Pos1, '@')) != NULL) + { + memset(Tmp, NUL, FMAX_PATH+1); + memcpy(Tmp, Pos1, Pos2-Pos1); + Pos1 = Pos2 + 1; + + if((Pos2 = _mbschr(Tmp, ':')) != NULL) + { + memcpy(User, Tmp, min1(Pos2-Tmp, USER_NAME_LEN)); + strncpy(Pass, Pos2+1, PASSWORD_LEN); + } + else + strncpy(User, Tmp, USER_NAME_LEN); + } + + if((Pos2 = _mbschr(Pos1, ':')) != NULL) + { + memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN)); + Pos2++; + if(IsDigit(*Pos2)) + { + *Port = atoi(Pos2); + while(*Pos2 != NUL) + { + if(IsDigit(*Pos2) == 0) + break; + Pos2++; + } + } + RemoveFileName(Pos2, Path); + strncpy(File, GetFileName(Pos2), FMAX_PATH); + } + else if((Pos2 = _mbschr(Pos1, '/')) != NULL) + { + memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN)); + RemoveFileName(Pos2, Path); + strncpy(File, GetFileName(Pos2), FMAX_PATH); + } + else + { + strncpy(Host, Pos1, HOST_ADRS_LEN); + } + + Sts = FAIL; + if(strlen(Host) > 0) + Sts = SUCCESS; + + return(Sts); +} + + +/*----- “ú•t•¶Žš—ñ(JST)‚ðFILETIME(UTC)‚É•ÏŠ· ---------------------------------- +* +* Parameter +* char *Time : “ú•t•¶Žš—ñ ("yyyy/mm/dd hh:mm") +* FILETIME *Buf : ƒtƒ@ƒCƒ‹ƒ^ƒCƒ€‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES/NO=“ú•tî•ñ‚ª‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +int TimeString2FileTime(char *Time, FILETIME *Buf) +{ + SYSTEMTIME sTime; + FILETIME fTime; + int Ret; + + Ret = NO; + Buf->dwLowDateTime = 0; + Buf->dwHighDateTime = 0; + + if(strlen(Time) >= 16) + { + if(IsDigit(Time[0]) && IsDigit(Time[5]) && IsDigit(Time[8]) && + IsDigit(Time[12]) && IsDigit(Time[14])) + { + Ret = YES; + } + + sTime.wYear = atoi(Time); + sTime.wMonth = atoi(Time + 5); + sTime.wDay = atoi(Time + 8); + if(Time[11] != ' ') + sTime.wHour = atoi(Time + 11); + else + sTime.wHour = atoi(Time + 12); + sTime.wMinute = atoi(Time + 14); + sTime.wSecond = 0; + sTime.wMilliseconds = 0; + + SystemTimeToFileTime(&sTime, &fTime); + LocalFileTimeToFileTime(&fTime, Buf); + } + return(Ret); +} + + +/*----- FILETIME(UTC)‚ð“ú•t•¶Žš—ñ(JST)‚É•ÏŠ· ---------------------------------- +* +* Parameter +* FILETIME *Time : ƒtƒ@ƒCƒ‹ƒ^ƒCƒ€ +* char *Buf : “ú•t•¶Žš—ñ‚ð•Ô‚·ƒ[ƒN +* int Mode : ƒ‚[ƒh (DISPFORM_xxx) +* int InfoExist : î•ñ‚ª‚ ‚é‚©‚Ç‚¤‚© (FINFO_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist) +{ + SYSTEMTIME sTime; + FILETIME fTime; + + if(Mode == DISPFORM_LEGACY) + { + if((Time->dwLowDateTime == 0) && (Time->dwHighDateTime == 0)) + InfoExist = 0; + + /* "yyyy/mm/dd hh:mm" */ + FileTimeToLocalFileTime(Time, &fTime); + FileTimeToSystemTime(&fTime, &sTime); + + if(InfoExist & FINFO_DATE) + sprintf(Buf, "%04d/%02d/%02d ", sTime.wYear, sTime.wMonth, sTime.wDay); + else + sprintf(Buf, " "); + + if(InfoExist & FINFO_TIME) + sprintf(Buf+11, "%2d:%02d", sTime.wHour, sTime.wMinute); + else + sprintf(Buf+11, " "); + } + else + { +// if (!strftime((char *)str, 100, "%c", (const struct tm *)thetime)) +// SetTaskMsg("strftime ‚ªŽ¸”s‚µ‚Ü‚µ‚½!\n"); + } + return; +} + + +/*----- ƒtƒ@ƒCƒ‹ƒ^ƒCƒ€‚ðŽw’èƒ^ƒCƒ€ƒ][ƒ“‚̃[ƒJƒ‹ƒ^ƒCƒ€‚©‚çGMT‚É•ÏŠ· --------- +* +* Parameter +* FILETIME *Time : ƒtƒ@ƒCƒ‹ƒ^ƒCƒ€ +* int TimeZone : ƒ^ƒCƒ€ƒ][ƒ“ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SpecificLocalFileTime2FileTime(FILETIME *Time, int TimeZone) +{ + unsigned __int64 Tmp64; + + Tmp64 = (unsigned __int64)Time->dwLowDateTime + + ((unsigned __int64)Time->dwHighDateTime << 32); + + Tmp64 -= (__int64)TimeZone * (__int64)36000000000; + + Time->dwHighDateTime = (DWORD)(Tmp64 >> 32); + Time->dwLowDateTime = (DWORD)(Tmp64 & 0xFFFFFFFF); + + return; +} + + +/*----- ‘®«•¶Žš—ñ‚ð’l‚É•ÏŠ· -------------------------------------------------- +* +* Parameter +* char *Str : ‘®«•¶Žš—ñ ("rwxrwxrwx") +* +* Return Value +* int ’l +*----------------------------------------------------------------------------*/ + +int AttrString2Value(char *Str) +{ + int Ret; + char Tmp[10]; + + Ret = 0; + memset(Tmp, 0, 10); + strncpy(Tmp, Str, 9); + + if(Tmp[0] != '-') + Ret |= 0x400; + if(Tmp[1] != '-') + Ret |= 0x200; + if(Tmp[2] != '-') + Ret |= 0x100; + + if(Tmp[3] != '-') + Ret |= 0x40; + if(Tmp[4] != '-') + Ret |= 0x20; + if(Tmp[5] != '-') + Ret |= 0x10; + + if(Tmp[6] != '-') + Ret |= 0x4; + if(Tmp[7] != '-') + Ret |= 0x2; + if(Tmp[8] != '-') + Ret |= 0x1; + + return(Ret); +} + + +/*----- ‘®«‚Ì’l‚𕶎š—ñ‚É•ÏŠ· ------------------------------------------------ +* +* Parameter +* int Attr : ‘®«‚Ì’l +* char *Buf : ‘®«•¶Žš—ñ‚ðƒZƒbƒg‚·‚éƒoƒbƒtƒ@ ("rwxrwxrwx") +* +* Return Value +* int ’l +*----------------------------------------------------------------------------*/ + +void AttrValue2String(int Attr, char *Buf) +{ + strcpy(Buf, "---------"); + + if(Attr & 0x400) + Buf[0] = 'r'; + if(Attr & 0x200) + Buf[1] = 'w'; + if(Attr & 0x100) + Buf[2] = 'x'; + + if(Attr & 0x40) + Buf[3] = 'r'; + if(Attr & 0x20) + Buf[4] = 'w'; + if(Attr & 0x10) + Buf[5] = 'x'; + + if(Attr & 0x4) + Buf[6] = 'r'; + if(Attr & 0x2) + Buf[7] = 'w'; + if(Attr & 0x1) + Buf[8] = 'x'; + + return; +} + + +/*----- INIƒtƒ@ƒCƒ‹•¶Žš—ñ‚𐮌` ----------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void FormatIniString(char *Str) +{ + char *Put; + + Put = Str; + while(*Str != NUL) + { + if((*Str != ' ') && (*Str != '\t') && (*Str != '\n')) + *Put++ = *Str; + if(*Str++ == '=') + break; + } + + while(*Str != NUL) + { + if((*Str != 0x22) && (*Str != '\n')) + *Put++ = *Str; + Str++; + } + *Put = NUL; + + return; +} + + +/*----- ƒtƒ@ƒCƒ‹‘I‘ð ---------------------------------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* char *Fname : ƒtƒ@ƒCƒ‹–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* char *Title : ƒ^ƒCƒgƒ‹ +* char *Filters : ƒtƒBƒ‹ƒ^[•¶Žš—ñ +* char *Ext : ƒfƒtƒHƒ‹ƒgŠg’£Žq +* int Flags : ’ljÁ‚·‚éƒtƒ‰ƒO +* int Save : uŠJ‚­v‚©u•Û‘¶v‚© (0=ŠJ‚­, 1=•Û‘¶) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* TRUE/FALSE=ŽæÁ +*----------------------------------------------------------------------------*/ + +int SelectFile(HWND hWnd, char *Fname, char *Title, char *Filters, char *Ext, int Flags, int Save) +{ + OPENFILENAME OpenFile; + char Tmp[FMAX_PATH+1]; + char Cur[FMAX_PATH+1]; + int Sts; + + GetCurrentDirectory(FMAX_PATH, Cur); + + strcpy(Tmp, Fname); + OpenFile.lStructSize = sizeof(OPENFILENAME); + OpenFile.hwndOwner = hWnd; + OpenFile.hInstance = 0; + OpenFile.lpstrFilter = Filters; + OpenFile.lpstrCustomFilter = NULL; + OpenFile.nFilterIndex = 1; + OpenFile.lpstrFile = Tmp; + OpenFile.nMaxFile = FMAX_PATH; + OpenFile.lpstrFileTitle = NULL; + OpenFile.nMaxFileTitle = 0; + OpenFile.lpstrInitialDir = NULL; + OpenFile.lpstrTitle = Title; + OpenFile.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | Flags; + OpenFile.nFileOffset = 0; + OpenFile.nFileExtension = 0; + OpenFile.lpstrDefExt = Ext; + OpenFile.lCustData = 0; + OpenFile.lpfnHook = NULL; + OpenFile.lpTemplateName = NULL; + + if(Save == 0) + { + if((Sts = GetOpenFileName(&OpenFile)) == TRUE) + strcpy(Fname,Tmp); + } + else + { + if((Sts = GetSaveFileName(&OpenFile)) == TRUE) + strcpy(Fname,Tmp); + } + SetCurrentDirectory(Cur); + return(Sts); +} + + +/*----- ƒfƒBƒŒƒNƒgƒŠ‚ð‘I‘ð ---------------------------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* char *Buf : ƒfƒBƒŒƒNƒgƒŠ–¼‚ð•Ô‚·ƒoƒbƒtƒ@i‰ŠúƒfƒBƒŒƒNƒgƒŠ–¼j +* int MaxLen : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* TRUE/FALSE=ŽæÁ +*----------------------------------------------------------------------------*/ + +int SelectDir(HWND hWnd, char *Buf, int MaxLen) +{ + char Tmp[FMAX_PATH+1]; + char Cur[FMAX_PATH+1]; + BROWSEINFO Binfo; + LPITEMIDLIST lpIdll; + int Sts; + LPMALLOC lpMalloc; + + Sts = FALSE; + GetCurrentDirectory(FMAX_PATH, Cur); + + if(SHGetMalloc(&lpMalloc) == NOERROR) + { + Binfo.hwndOwner = hWnd; + Binfo.pidlRoot = NULL; + Binfo.pszDisplayName = Tmp; + Binfo.lpszTitle = MSGJPN185; + Binfo.ulFlags = BIF_RETURNONLYFSDIRS; + Binfo.lpfn = NULL; + Binfo.lParam = 0; + Binfo.iImage = 0; + if((lpIdll = SHBrowseForFolder(&Binfo)) != NULL) + { + SHGetPathFromIDList(lpIdll, Tmp); + memset(Buf, NUL, MaxLen); + strncpy(Buf, Tmp, MaxLen-1); + Sts = TRUE; + lpMalloc->lpVtbl->Free(lpMalloc, lpIdll); + } + lpMalloc->lpVtbl->Release(lpMalloc); + SetCurrentDirectory(Cur); + } + return(Sts); +} + + +/*----- ’l‚ÉŠÖ˜A•t‚¯‚ç‚ꂽƒ‰ƒWƒIƒ{ƒ^ƒ“‚ðƒ`ƒFƒbƒN‚·‚é -------------------------- +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Value : ’l +* const RADIOBUTTON *Buttons : ƒ‰ƒWƒIƒ{ƒ^ƒ“‚Æ’l‚ÌŠÖ˜A•t‚¯ƒe[ƒuƒ‹ +* int Num : ƒ{ƒ^ƒ“‚̐” +* +* Return Value +* ‚È‚µ +* +* Note +* ’l‚ÉŠÖ˜A•t‚¯‚ç‚ꂽƒ{ƒ^ƒ“‚ª–³‚¢Žž‚́Aƒe[ƒuƒ‹‚̍ŏ‰‚É“o˜^‚³‚ê‚Ä‚¢‚éƒ{ƒ^ +* ƒ“‚ðƒ`ƒFƒbƒN‚·‚é +*----------------------------------------------------------------------------*/ + +void SetRadioButtonByValue(HWND hDlg, int Value, const RADIOBUTTON *Buttons, int Num) +{ + int i; + int Def; + + Def = Buttons->ButID; + for(i = 0; i < Num; i++) + { + if(Value == Buttons->Value) + { + SendDlgItemMessage(hDlg, Buttons->ButID, BM_SETCHECK, 1, 0); + /* ƒ‰ƒWƒIƒ{ƒ^ƒ“‚ð•ÏX‚µ‚½Žž‚É‘¼‚̍€–ڂ̃nƒCƒh‚È‚Ç‚ðs‚È‚¤Ž–‚ª */ + /* ‚ ‚é‚̂ŁA‚»‚Ì‚½‚ß‚É WM_COMMAND ‚ð‘—‚é */ + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(Buttons->ButID, 0), 0); + break; + } + Buttons++; + } + if(i == Num) + { + SendDlgItemMessage(hDlg, Def, BM_SETCHECK, 1, 0); + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(Def, 0), 0); + } + return; +} + + +/*----- ƒ`ƒFƒbƒN‚³‚ê‚Ä‚¢‚éƒ{ƒ^ƒ“‚ÉŠÖ˜A•t‚¯‚ç‚ꂽ’l‚ð•Ô‚· ---------------------- +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* const RADIOBUTTON *Buttons : ƒ‰ƒWƒIƒ{ƒ^ƒ“‚Æ’l‚ÌŠÖ˜A•t‚¯ƒe[ƒuƒ‹ +* int Num : ƒ{ƒ^ƒ“‚̐” +* +* Return Value +* int ’l +* +* Note +* ‚ǂ̃{ƒ^ƒ“‚àƒ`ƒFƒbƒN‚³‚ê‚Ä‚¢‚È‚¢Žž‚́Aƒe[ƒuƒ‹‚̍ŏ‰‚É“o˜^‚³‚ê‚Ä‚¢‚éƒ{ +* ƒ^ƒ“‚Ì’l‚ð•Ô‚· +*----------------------------------------------------------------------------*/ + +int AskRadioButtonValue(HWND hDlg, const RADIOBUTTON *Buttons, int Num) +{ + int i; + int Ret; + + Ret = Buttons->Value; + for(i = 0; i < Num; i++) + { + if(SendDlgItemMessage(hDlg, Buttons->ButID, BM_GETCHECK, 0, 0) == 1) + { + Ret = Buttons->Value; + break; + } + Buttons++; + } + return(Ret); +} + + +/*----- ‚P‚Ui•¶Žš—ñ‚𐔒l‚É•ÏŠ· ---------------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* +* Return Value +* int ’l +*----------------------------------------------------------------------------*/ + +int xtoi(char *Str) +{ + int Ret; + + Ret = 0; + while(*Str != NUL) + { + Ret *= 0x10; + if((*Str >= '0') && (*Str <= '9')) + Ret += *Str - '0'; + else if((*Str >= 'A') && (*Str <= 'F')) + Ret += *Str - 'A' + 10; + else if((*Str >= 'a') && (*Str <= 'f')) + Ret += *Str - 'a' + 10; + else + break; + + Str++; + } + return(Ret); +} + + +/*----- ƒtƒ@ƒCƒ‹‚ª“Ç‚ÝŽæ‚è‰Â”\‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int CheckFileReadable(char *Fname) +{ + int Sts; + HANDLE iFileHandle; + SECURITY_ATTRIBUTES Sec; + + Sts = FAIL; + + Sec.nLength = sizeof(SECURITY_ATTRIBUTES); + Sec.lpSecurityDescriptor = NULL; + Sec.bInheritHandle = FALSE; + + if((iFileHandle = CreateFile(Fname, GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE, &Sec, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE) + { + Sts = SUCCESS; + CloseHandle(iFileHandle); + } + return(Sts); +} + + + + + +int max1(int n, int m) +{ + if(n > m) + return(n); + else + return(m); +} + + + +int min1(int n, int m) +{ + if(n < m) + return(n); + else + return(m); +} + + +void ExcEndianDWORD(DWORD *x) +{ + BYTE *Pos; + BYTE Tmp; + + Pos = (BYTE *)x; + Tmp = *(Pos + 0); + *(Pos + 0) = *(Pos + 3); + *(Pos + 3) = Tmp; + Tmp = *(Pos + 1); + *(Pos + 1) = *(Pos + 2); + *(Pos + 2) = Tmp; + return; +} + + + + +/*----- int’l‚Ì“ü‚ê‘Ö‚¦ ------------------------------------------------------- +* +* Parameter +* int *Num1 : ”’l‚P +* int *Num2 : ”’l‚Q +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SwapInt(int *Num1, int *Num2) +{ + int Tmp; + + Tmp = *Num1; + *Num1 = *Num2; + *Num2 = Tmp; + return; +} + + +/*----- Žw’肳‚ꂽƒtƒHƒ‹ƒ_‚ª‚ ‚é‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN ------------------------------- +* +* Parameter +* char *Path : ƒpƒX +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES/NO) +*----------------------------------------------------------------------------*/ + +int IsFolderExist(char *Path) +{ + int Sts; + char Tmp[FMAX_PATH+1]; + DWORD Attr; + + Sts = YES; + if(strlen(Path) > 0) + { + strcpy(Tmp, Path); + if(_mbscmp(Tmp+1, ":\\") != 0) + RemoveYenTail(Tmp); + + Attr = GetFileAttributes(Tmp); + if((Attr == 0xFFFFFFFF) || ((Attr & FILE_ATTRIBUTE_DIRECTORY) == 0)) + Sts = NO; + } + return(Sts); +} + + +/*----- ƒe[ƒuƒ‹‚É‚µ‚½‚ª‚Á‚Đ”’l‚ð“o˜^ ----------------------------------------- +* +* Parameter +* int x : ”’l +* int Dir : •ÏŠ·•ûŒü +* INTCONVTBL *Tbl : ƒe[ƒuƒ‹ +* int Num : ƒe[ƒuƒ‹‚̐”’l‚̐” +* +* Return Value +* int ”’l +*----------------------------------------------------------------------------*/ + +int ConvertNum(int x, int Dir, const INTCONVTBL *Tbl, int Num) +{ + int i; + int Ret; + + Ret = x; + for(i = 0; i < Num; i++) + { + if((Dir == 0) && (Tbl->Num1 == x)) + { + Ret = Tbl->Num2; + break; + } + else if((Dir == 1) && (Tbl->Num2 == x)) + { + Ret = Tbl->Num1; + break; + } + Tbl++; + } + return(Ret); +} + + + + + + +/*----- ƒtƒ@ƒCƒ‹‚ðƒSƒ~” ‚ɍ폜 ------------------------------------------------ +* +* Parameter +* char *Path : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (0=³íI—¹) +*----------------------------------------------------------------------------*/ + +int MoveFileToTrashCan(char *Path) +{ + SHFILEOPSTRUCT FileOp; + char Tmp[FMAX_PATH+2]; + + memset(Tmp, 0, FMAX_PATH+2); + strcpy(Tmp, Path); + FileOp.hwnd = NULL; + FileOp.wFunc = FO_DELETE; + FileOp.pFrom = Tmp; + FileOp.pTo = ""; + FileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_ALLOWUNDO; + FileOp.lpszProgressTitle = ""; + return(SHFileOperation(&FileOp)); +} + + + + +LONGLONG MakeLongLong(DWORD High, DWORD Low) +{ + LONGLONG z; + LONGLONG x1, y1; + + x1 = (LONGLONG)Low; + y1 = (LONGLONG)High; + z = x1 | (y1 << 32); + return(z); +} + + +char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma) +{ + int i; + char *Pos; + + Pos = Buf; + *Pos = '\0'; + + i = 1; + do + { + *Pos++ = (char)(Num % 10) + '0'; + Num /= 10; + if((Comma == TRUE) && ((i % 3) == 0) && (Num != 0)) + *Pos++ = ','; + i++; + } + while(Num != 0); + *Pos = NUL; + _strrev(Buf); + + return(Buf); +} + + diff --git a/option.c b/option.c new file mode 100644 index 0000000..e577d19 --- /dev/null +++ b/option.c @@ -0,0 +1,1792 @@ +/*============================================================================= +* +* ƒIƒvƒVƒ‡ƒ“Ý’è +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL CALLBACK UserSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK Trmode1SettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK Trmode2SettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK Trmode3SettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK DefAttrDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static void AddFnameAttrToListView(HWND hDlg, char *Fname, char *Attr); +static void GetFnameAttrFromListView(HWND hDlg, char *Buf); +static BOOL CALLBACK MirrorSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK NotifySettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK DispSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static int SelectListFont(HWND hWnd, LOGFONT *lFont); +static BOOL CALLBACK ConnectSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK FireSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK ToolSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK SoundSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK MiscSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static BOOL CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static int GetDecimalText(HWND hDlg, int Ctrl); +static void SetDecimalText(HWND hDlg, int Ctrl, int Num); +static void CheckRange2(int *Cur, int Max, int Min); +static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize); +static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text); +static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize); + + + +typedef struct { + char Fname[FMAX_PATH+1]; + char Attr[5]; +} ATTRSET; + + + + + +/*===== ŠO•”ŽQÆ =====*/ + +extern HWND hHelpWin; + +/* Ý’è’l */ +extern char UserMailAdrs[USER_MAIL_LEN+1]; +extern char ViewerName[VIEWERS][FMAX_PATH+1]; +extern int ConnectOnStart; +extern int DebugConsole; +extern int SaveWinPos; +extern char AsciiExt[ASCII_EXT_LEN+1]; +extern int RecvMode; +extern int SendMode; +extern int MoveMode; +extern int CacheEntry; +extern int CacheSave; +extern char FwallHost[HOST_ADRS_LEN+1]; +extern char FwallUser[USER_NAME_LEN+1]; +extern char FwallPass[PASSWORD_LEN+1]; +extern int FwallPort; +extern int FwallType; +extern int FwallDefault; +extern int FwallSecurity; +extern int FwallResolv; +extern int FwallLower; +extern int FwallDelimiter; +extern int PasvDefault; +extern char DefaultLocalPath[FMAX_PATH+1]; +extern int SaveTimeStamp; +extern int DclickOpen; +extern SOUNDFILE Sound[SOUND_TYPES]; +extern int FnameCnv; +extern int ConnectAndSet; +extern int TimeOut; +extern int RmEOF; +extern int RegType; +extern char MirrorNoTrn[MIRROR_LEN+1]; +extern char MirrorNoDel[MIRROR_LEN+1]; +extern int MirrorFnameCnv; +extern int RasClose; +extern int RasCloseNotify; +extern int FileHist; +extern char DefAttrList[DEFATTRLIST_LEN+1]; +extern char TmpPath[FMAX_PATH+1]; +extern int QuickAnonymous; +extern int PassToHist; +extern int VaxSemicolon; +extern int SendQuit; +extern int NoRasControl; +extern int DispIgnoreHide; +extern int DispDrives; +extern HFONT ListFont; +extern LOGFONT ListLogFont; +extern int MirUpDelNotify; +extern int MirDownDelNotify; +extern int FolderAttr; +extern int FolderAttrNum; + + +/*----- ƒIƒvƒVƒ‡ƒ“‚̃vƒƒpƒeƒBƒV[ƒg ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetOption(int Start) +{ + PROPSHEETPAGE psp[12]; + PROPSHEETHEADER psh; + + psp[0].dwSize = sizeof(PROPSHEETPAGE); + psp[0].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[0].hInstance = GetFtpInst(); + psp[0].pszTemplate = MAKEINTRESOURCE(opt_user_dlg); + psp[0].pszIcon = NULL; + psp[0].pfnDlgProc = UserSettingProc; + psp[0].pszTitle = MSGJPN186; + psp[0].lParam = 0; + psp[0].pfnCallback = NULL; + + psp[1].dwSize = sizeof(PROPSHEETPAGE); + psp[1].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[1].hInstance = GetFtpInst(); + psp[1].pszTemplate = MAKEINTRESOURCE(opt_trmode1_dlg); + psp[1].pszIcon = NULL; + psp[1].pfnDlgProc = Trmode1SettingProc; + psp[1].pszTitle = MSGJPN187; + psp[1].lParam = 0; + psp[1].pfnCallback = NULL; + + psp[2].dwSize = sizeof(PROPSHEETPAGE); + psp[2].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[2].hInstance = GetFtpInst(); + psp[2].pszTemplate = MAKEINTRESOURCE(opt_trmode2_dlg); + psp[2].pszIcon = NULL; + psp[2].pfnDlgProc = Trmode2SettingProc; + psp[2].pszTitle = MSGJPN188; + psp[2].lParam = 0; + psp[2].pfnCallback = NULL; + + psp[3].dwSize = sizeof(PROPSHEETPAGE); + psp[3].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[3].hInstance = GetFtpInst(); + psp[3].pszTemplate = MAKEINTRESOURCE(opt_trmode3_dlg); + psp[3].pszIcon = NULL; + psp[3].pfnDlgProc = Trmode3SettingProc; + psp[3].pszTitle = MSGJPN189; + psp[3].lParam = 0; + psp[3].pfnCallback = NULL; + + psp[4].dwSize = sizeof(PROPSHEETPAGE); + psp[4].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[4].hInstance = GetFtpInst(); + psp[4].pszTemplate = MAKEINTRESOURCE(opt_mirror_dlg); + psp[4].pszIcon = NULL; + psp[4].pfnDlgProc = MirrorSettingProc; + psp[4].pszTitle = MSGJPN190; + psp[4].lParam = 0; + psp[4].pfnCallback = NULL; + + psp[5].dwSize = sizeof(PROPSHEETPAGE); + psp[5].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[5].hInstance = GetFtpInst(); + psp[5].pszTemplate = MAKEINTRESOURCE(opt_notify_dlg); + psp[5].pszIcon = NULL; + psp[5].pfnDlgProc = NotifySettingProc; + psp[5].pszTitle = MSGJPN191; + psp[5].lParam = 0; + psp[5].pfnCallback = NULL; + + psp[6].dwSize = sizeof(PROPSHEETPAGE); + psp[6].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[6].hInstance = GetFtpInst(); + psp[6].pszTemplate = MAKEINTRESOURCE(opt_disp_dlg); + psp[6].pszIcon = NULL; + psp[6].pfnDlgProc = DispSettingProc; + psp[6].pszTitle = MSGJPN192; + psp[6].lParam = 0; + psp[6].pfnCallback = NULL; + + psp[7].dwSize = sizeof(PROPSHEETPAGE); + psp[7].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[7].hInstance = GetFtpInst(); + psp[7].pszTemplate = MAKEINTRESOURCE(opt_connect_dlg); + psp[7].pszIcon = NULL; + psp[7].pfnDlgProc = ConnectSettingProc; + psp[7].pszTitle = MSGJPN193; + psp[7].lParam = 0; + psp[7].pfnCallback = NULL; + + psp[8].dwSize = sizeof(PROPSHEETPAGE); + psp[8].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[8].hInstance = GetFtpInst(); + psp[8].pszTemplate = MAKEINTRESOURCE(opt_fire_dlg); + psp[8].pszIcon = NULL; + psp[8].pfnDlgProc = FireSettingProc; + psp[8].pszTitle = MSGJPN194; + psp[8].lParam = 0; + psp[8].pfnCallback = NULL; + + psp[9].dwSize = sizeof(PROPSHEETPAGE); + psp[9].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[9].hInstance = GetFtpInst(); + psp[9].pszTemplate = MAKEINTRESOURCE(opt_tool_dlg); + psp[9].pszIcon = NULL; + psp[9].pfnDlgProc = ToolSettingProc; + psp[9].pszTitle = MSGJPN195; + psp[9].lParam = 0; + psp[9].pfnCallback = NULL; + + psp[10].dwSize = sizeof(PROPSHEETPAGE); + psp[10].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[10].hInstance = GetFtpInst(); + psp[10].pszTemplate = MAKEINTRESOURCE(opt_sound_dlg); + psp[10].pszIcon = NULL; + psp[10].pfnDlgProc = SoundSettingProc; + psp[10].pszTitle = MSGJPN196; + psp[10].lParam = 0; + psp[10].pfnCallback = NULL; + + psp[11].dwSize = sizeof(PROPSHEETPAGE); + psp[11].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[11].hInstance = GetFtpInst(); + psp[11].pszTemplate = MAKEINTRESOURCE(opt_misc_dlg); + psp[11].pszIcon = NULL; + psp[11].pfnDlgProc = MiscSettingProc; + psp[11].pszTitle = MSGJPN197; + psp[11].lParam = 0; + psp[11].pfnCallback = NULL; + + psh.dwSize = sizeof(PROPSHEETHEADER); + psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE; + psh.hwndParent = GetMainHwnd(); + psh.hInstance = GetFtpInst(); + psh.pszIcon = NULL; + psh.pszCaption = MSGJPN198; + psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); + psh.nStartPage = Start; + psh.ppsp = (LPCPROPSHEETPAGE)&psp; + psh.pfnCallback = NULL; + + PropertySheet(&psh); + return; +} + + +/*----- ƒ†[ƒUÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK UserSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, USER_ADRS, EM_LIMITTEXT, PASSWORD_LEN, 0); + SendDlgItemMessage(hDlg, USER_ADRS, WM_SETTEXT, 0, (LPARAM)UserMailAdrs); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SendDlgItemMessage(hDlg, USER_ADRS, WM_GETTEXT, USER_MAIL_LEN+1, (LPARAM)UserMailAdrs); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000041); + break; + } + break; + } + return(FALSE); +} + + +/*----- “]‘—Ý’è‚PƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK Trmode1SettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + int Num; + char Tmp[FMAX_PATH+1]; + int Trash; + + static const RADIOBUTTON ModeButton[] = { + { TRMODE_AUTO, TYPE_X }, + { TRMODE_ASCII, TYPE_A }, + { TRMODE_BIN, TYPE_I } + }; + #define MODEBUTTONS (sizeof(ModeButton)/sizeof(RADIOBUTTON)) + + switch (message) + { + case WM_INITDIALOG : + SetMultiTextToList(hDlg, TRMODE_EXT_LIST, AsciiExt); + SetRadioButtonByValue(hDlg, AskTransferType(), ModeButton, MODEBUTTONS); + SendDlgItemMessage(hDlg, TRMODE_TIME, BM_SETCHECK, SaveTimeStamp, 0); + SendDlgItemMessage(hDlg, TRMODE_EOF, BM_SETCHECK, RmEOF, 0); + SendDlgItemMessage(hDlg, TRMODE_SEMICOLON, BM_SETCHECK, VaxSemicolon, 0); + + SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(TRMODE_EXT_LIST, 0), 0); + + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SetTransferTypeImm(AskRadioButtonValue(hDlg, ModeButton, MODEBUTTONS)); + SaveTransferType(); + GetMultiTextFromList(hDlg, TRMODE_EXT_LIST, AsciiExt, ASCII_EXT_LEN+1); + SaveTimeStamp = SendDlgItemMessage(hDlg, TRMODE_TIME, BM_GETCHECK, 0, 0); + RmEOF = SendDlgItemMessage(hDlg, TRMODE_EOF, BM_GETCHECK, 0, 0); + VaxSemicolon = SendDlgItemMessage(hDlg, TRMODE_SEMICOLON, BM_GETCHECK, 0, 0); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000042); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case TRMODE_ASCII : + case TRMODE_BIN : + EnableWindow(GetDlgItem(hDlg, TRMODE_EXT_LIST), FALSE); + EnableWindow(GetDlgItem(hDlg, TRMODE_ADD), FALSE); + EnableWindow(GetDlgItem(hDlg, TRMODE_DEL), FALSE); + break; + + case TRMODE_AUTO : + EnableWindow(GetDlgItem(hDlg, TRMODE_EXT_LIST), TRUE); + EnableWindow(GetDlgItem(hDlg, TRMODE_ADD), TRUE); + EnableWindow(GetDlgItem(hDlg, TRMODE_DEL), TRUE); + break; + + case TRMODE_ADD : + strcpy(Tmp, ""); + if(InputDialogBox(fname_in_dlg, hDlg, MSGJPN199, Tmp, FMAX_PATH, &Trash, IDH_HELP_TOPIC_0000001) == YES) + AddTextToListBox(hDlg, Tmp, TRMODE_EXT_LIST, ASCII_EXT_LEN+1); + break; + + case TRMODE_DEL : + if((Num = SendDlgItemMessage(hDlg, TRMODE_EXT_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + SendDlgItemMessage(hDlg, TRMODE_EXT_LIST, LB_DELETESTRING, Num, 0); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- “]‘—Ý’è‚QƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK Trmode2SettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + char Tmp[FMAX_PATH+1]; + + static const RADIOBUTTON CnvButton[] = { + { TRMODE2_NOCNV, FNAME_NOCNV }, + { TRMODE2_LOWER, FNAME_LOWER }, + { TRMODE2_UPPER, FNAME_UPPER } + }; + #define CNVBUTTONS (sizeof(CnvButton)/sizeof(RADIOBUTTON)) + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, TRMODE2_LOCAL, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, TRMODE2_LOCAL, WM_SETTEXT, 0, (LPARAM)DefaultLocalPath); + + SetRadioButtonByValue(hDlg, FnameCnv, CnvButton, CNVBUTTONS); + + SendDlgItemMessage(hDlg, TRMODE2_TIMEOUT, EM_LIMITTEXT, (WPARAM)5, 0); + sprintf(Tmp, "%d", TimeOut); + SendDlgItemMessage(hDlg, TRMODE2_TIMEOUT, WM_SETTEXT, 0, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, TRMODE2_TIMEOUT_SPN, UDM_SETRANGE, 0, MAKELONG(300, 0)); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SendDlgItemMessage(hDlg, TRMODE2_LOCAL, WM_GETTEXT, FMAX_PATH+1, (LPARAM)DefaultLocalPath); + + FnameCnv = AskRadioButtonValue(hDlg, CnvButton, CNVBUTTONS); + + SendDlgItemMessage(hDlg, TRMODE2_TIMEOUT, WM_GETTEXT, 5+1, (LPARAM)Tmp); + TimeOut = atoi(Tmp); + CheckRange2(&TimeOut, 300, 0); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000043); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case TRMODE2_LOCAL_BR : + if(SelectDir(hDlg, Tmp, FMAX_PATH) == TRUE) + SendDlgItemMessage(hDlg, TRMODE2_LOCAL, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- “]‘—Ý’è‚RƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK Trmode3SettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + LV_COLUMN LvCol; + long Tmp; + RECT Rect; + ATTRSET AttrSet; + char *Fname; + char *Attr; + char TmpStr[10]; + + switch (message) + { + case WM_INITDIALOG : + Tmp = SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + Tmp |= LVS_EX_FULLROWSELECT; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp); + + GetClientRect(GetDlgItem(hDlg, TRMODE3_LIST), &Rect); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = (Rect.right / 3) * 2; + LvCol.pszText = MSGJPN200; + LvCol.iSubItem = 0; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol); + + LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; + LvCol.cx = Rect.right - LvCol.cx; + LvCol.pszText = MSGJPN201; + LvCol.iSubItem = 1; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol); + + Fname = DefAttrList; + while(*Fname != NUL) + { + Attr = strchr(Fname, NUL) + 1; + if(*Attr != NUL) + AddFnameAttrToListView(hDlg, Fname, Attr); + Fname = strchr(Attr, NUL) + 1; + } + + SendDlgItemMessage(hDlg, TRMODE3_FOLDER, BM_SETCHECK, FolderAttr, 0); + if(FolderAttr == NO) + EnableWindow(GetDlgItem(hDlg, TRMODE3_FOLDER_ATTR), FALSE); + + SendDlgItemMessage(hDlg, TRMODE3_FOLDER_ATTR, EM_LIMITTEXT, (WPARAM)5, 0); + sprintf(TmpStr, "%03d", FolderAttrNum); + SendDlgItemMessage(hDlg, TRMODE3_FOLDER_ATTR, WM_SETTEXT, 0, (LPARAM)TmpStr); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + GetFnameAttrFromListView(hDlg, DefAttrList); + SendDlgItemMessage(hDlg, TRMODE3_FOLDER_ATTR, WM_GETTEXT, 5+1, (LPARAM)TmpStr); + FolderAttrNum = atoi(TmpStr); + FolderAttr = SendDlgItemMessage(hDlg, TRMODE3_FOLDER, BM_GETCHECK, 0, 0); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000044); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case TRMODE3_ADD : + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(def_attr_dlg), hDlg, DefAttrDlgProc, (LPARAM)&AttrSet) == YES) + { + if((strlen(AttrSet.Fname) > 0) && (strlen(AttrSet.Attr) > 0)) + AddFnameAttrToListView(hDlg, AttrSet.Fname, AttrSet.Attr); + } + break; + + case TRMODE3_DEL : + if((Tmp = SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0))) != -1) + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_DELETEITEM, Tmp, 0); + break; + + case TRMODE3_FOLDER : + if(SendDlgItemMessage(hDlg, TRMODE3_FOLDER, BM_GETCHECK, 0, 0) == 1) + EnableWindow(GetDlgItem(hDlg, TRMODE3_FOLDER_ATTR), TRUE); + else + EnableWindow(GetDlgItem(hDlg, TRMODE3_FOLDER_ATTR), FALSE); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒ@ƒCƒ‹‘®«Ý’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DefAttrDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static ATTRSET *AttrSet; + char Tmp[5]; + + switch (message) + { + case WM_INITDIALOG : + AttrSet = (ATTRSET *)lParam; + SendDlgItemMessage(hDlg, DEFATTR_FNAME, EM_LIMITTEXT, (WPARAM)FMAX_PATH, 0); + SendDlgItemMessage(hDlg, DEFATTR_ATTR, EM_LIMITTEXT, (WPARAM)4, 0); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, DEFATTR_FNAME, WM_GETTEXT, (WPARAM)FMAX_PATH+1, (LPARAM)AttrSet->Fname); + SendDlgItemMessage(hDlg, DEFATTR_ATTR, WM_GETTEXT, (WPARAM)4+1, (LPARAM)AttrSet->Attr); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case DEFATTR_ATTR_BR : + SendDlgItemMessage(hDlg, DEFATTR_ATTR, WM_GETTEXT, (WPARAM)4+1, (LPARAM)Tmp); + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(chmod_dlg), GetMainHwnd(), ChmodDialogCallBack, (LPARAM)Tmp) == YES) + SendDlgItemMessage(hDlg, DEFATTR_ATTR, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒ@ƒCƒ‹–¼‚Æ‘®«‚ðƒŠƒXƒgƒrƒ…[‚ɒljÁ ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* char *Attr : ‘®« +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddFnameAttrToListView(HWND hDlg, char *Fname, char *Attr) +{ + int Num; + LV_ITEM LvItem; + char Buf[DEFATTRLIST_LEN+1]; + + GetFnameAttrFromListView(hDlg, Buf); + if(StrMultiLen(Buf) + strlen(Fname) + strlen(Attr) + 2 <= DEFATTRLIST_LEN) + { + Num = SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_GETITEMCOUNT, 0, 0); + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Num; + LvItem.iSubItem = 0; + LvItem.pszText = Fname; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_INSERTITEM, 0, (LPARAM)&LvItem); + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = Num; + LvItem.iSubItem = 1; + LvItem.pszText = Attr; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_SETITEM, 0, (LPARAM)&LvItem); + } + else + MessageBeep(-1); + + return; +} + + +/*----- ƒŠƒXƒgƒrƒ…[‚Ì“à—e‚ðƒ}ƒ‹ƒ`•¶Žš—ñ‚É‚·‚é -------------------------------- +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int CtrlList : ƒŠƒXƒgƒ{ƒbƒNƒX‚ÌID +* char *Buf : •¶Žš—ñ‚ðƒZƒbƒg‚·‚éƒoƒbƒtƒ@ +* int BufSize : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void GetFnameAttrFromListView(HWND hDlg, char *Buf) +{ + int Num; + int i; + LV_ITEM LvItem; + + Num = SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_GETITEMCOUNT, 0, 0); + for(i = 0; i < Num; i++) + { + LvItem.mask = LVIF_TEXT; + LvItem.iItem = i; + LvItem.iSubItem = 0; + LvItem.pszText = Buf; + LvItem.cchTextMax = FMAX_PATH; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_GETITEM, 0, (LPARAM)&LvItem); + Buf = strchr(Buf, NUL) + 1; + + LvItem.mask = LVIF_TEXT; + LvItem.iItem = i; + LvItem.iSubItem = 1; + LvItem.pszText = Buf; + LvItem.cchTextMax = FMAX_PATH; + SendDlgItemMessage(hDlg, TRMODE3_LIST, LVM_GETITEM, 0, (LPARAM)&LvItem); + Buf = strchr(Buf, NUL) + 1; + } + *Buf = NUL; + + return; +} + + +/*----- ƒ~ƒ‰[ƒŠƒ“ƒOƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK MirrorSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + int Num; + char Tmp[FMAX_PATH+1]; + int Trash; + + switch (message) + { + case WM_INITDIALOG : + SetMultiTextToList(hDlg, MIRROR_NOTRN_LIST, MirrorNoTrn); + SetMultiTextToList(hDlg, MIRROR_NODEL_LIST, MirrorNoDel); + SendDlgItemMessage(hDlg, MIRROR_LOW, BM_SETCHECK, MirrorFnameCnv, 0); + SendDlgItemMessage(hDlg, MIRROR_UPDEL_NOTIFY, BM_SETCHECK, MirUpDelNotify, 0); + SendDlgItemMessage(hDlg, MIRROR_DOWNDEL_NOTIFY, BM_SETCHECK, MirDownDelNotify, 0); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + GetMultiTextFromList(hDlg, MIRROR_NOTRN_LIST, MirrorNoTrn, MIRROR_LEN+1); + GetMultiTextFromList(hDlg, MIRROR_NODEL_LIST, MirrorNoDel, MIRROR_LEN+1); + MirrorFnameCnv = SendDlgItemMessage(hDlg, MIRROR_LOW, BM_GETCHECK, 0, 0); + MirUpDelNotify = SendDlgItemMessage(hDlg, MIRROR_UPDEL_NOTIFY, BM_GETCHECK, 0, 0); + MirDownDelNotify = SendDlgItemMessage(hDlg, MIRROR_DOWNDEL_NOTIFY, BM_GETCHECK, 0, 0); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000045); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case MIRROR_NOTRN_ADD : + strcpy(Tmp, ""); + if(InputDialogBox(fname_in_dlg, hDlg, MSGJPN202, Tmp, FMAX_PATH, &Trash, IDH_HELP_TOPIC_0000001) == YES) + AddTextToListBox(hDlg, Tmp, MIRROR_NOTRN_LIST, MIRROR_LEN+1); + break; + + case MIRROR_NODEL_ADD : + strcpy(Tmp, ""); + if(InputDialogBox(fname_in_dlg, hDlg, MSGJPN203, Tmp, FMAX_PATH, &Trash, IDH_HELP_TOPIC_0000001) == YES) + AddTextToListBox(hDlg, Tmp, MIRROR_NODEL_LIST, MIRROR_LEN+1); + break; + + case MIRROR_NOTRN_DEL : + if((Num = SendDlgItemMessage(hDlg, MIRROR_NOTRN_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + SendDlgItemMessage(hDlg, MIRROR_NOTRN_LIST, LB_DELETESTRING, Num, 0); + break; + + case MIRROR_NODEL_DEL : + if((Num = SendDlgItemMessage(hDlg, MIRROR_NODEL_LIST, LB_GETCURSEL, 0, 0)) != LB_ERR) + SendDlgItemMessage(hDlg, MIRROR_NODEL_LIST, LB_DELETESTRING, Num, 0); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ‘€ìÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK NotifySettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + + static const RADIOBUTTON DownButton[] = { + { NOTIFY_D_DLG, TRANS_DLG }, + { NOTIFY_D_OVW, TRANS_OVW } + }; + #define DOWNBUTTONS (sizeof(DownButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON UpButton[] = { + { NOTIFY_U_DLG, TRANS_DLG }, + { NOTIFY_U_OVW, TRANS_OVW } + }; + #define UPBUTTONS (sizeof(UpButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON DclickButton[] = { + { NOTIFY_OPEN, YES }, + { NOTIFY_DOWNLOAD, NO } + }; + #define DCLICKBUTTONS (sizeof(DclickButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON MoveButton[] = { + { NOTIFY_M_NODLG, MOVE_NODLG }, + { NOTIFY_M_DLG, MOVE_DLG }, + { NOTIFY_M_DISABLE, MOVE_DISABLE } + }; + #define MOVEBUTTONS (sizeof(MoveButton)/sizeof(RADIOBUTTON)) + + switch (message) + { + case WM_INITDIALOG : + SetRadioButtonByValue(hDlg, RecvMode, DownButton, DOWNBUTTONS); + SetRadioButtonByValue(hDlg, SendMode, UpButton, UPBUTTONS); + SetRadioButtonByValue(hDlg, DclickOpen, DclickButton, DCLICKBUTTONS); + SetRadioButtonByValue(hDlg, MoveMode, MoveButton, MOVEBUTTONS); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + RecvMode = AskRadioButtonValue(hDlg, DownButton, DOWNBUTTONS); + SendMode = AskRadioButtonValue(hDlg, UpButton, UPBUTTONS); + DclickOpen = AskRadioButtonValue(hDlg, DclickButton, DCLICKBUTTONS); + MoveMode = AskRadioButtonValue(hDlg, MoveButton, MOVEBUTTONS); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000046); + break; + } + break; + } + return(FALSE); +} + + +/*----- •\Ž¦Ý’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DispSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + static LOGFONT TmpFont; + + switch (message) + { + case WM_INITDIALOG : + memcpy(&TmpFont, &ListLogFont, sizeof(LOGFONT)); + if(ListFont != NULL) + SendDlgItemMessage(hDlg, DISP_FONT, WM_SETTEXT, 0, (LPARAM)TmpFont.lfFaceName); + SendDlgItemMessage(hDlg, DISP_HIDE, BM_SETCHECK, DispIgnoreHide, 0); + SendDlgItemMessage(hDlg, DISP_DRIVE, BM_SETCHECK, DispDrives, 0); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + DispIgnoreHide = SendDlgItemMessage(hDlg, DISP_HIDE, BM_GETCHECK, 0, 0); + DispDrives = SendDlgItemMessage(hDlg, DISP_DRIVE, BM_GETCHECK, 0, 0); + if(strlen(TmpFont.lfFaceName) > 0) + { + memcpy(&ListLogFont, &TmpFont, sizeof(LOGFONT)); + ListFont = CreateFontIndirect(&ListLogFont); + } + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000047); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case DISP_FONT_BR : + if(SelectListFont(hDlg, &TmpFont) == YES) + SendDlgItemMessage(hDlg, DISP_FONT, WM_SETTEXT, 0, (LPARAM)TmpFont.lfFaceName); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒtƒHƒ“ƒg‚ð‘I‚Ô -------------------------------------------------------- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* LOGFONT *lFont : ƒtƒHƒ“ƒgî•ñ +* +* Return Value +* ‚È‚µ +* +* Parameter change +* HFONT *hFont : ƒtƒHƒ“ƒg‚̃nƒ“ƒhƒ‹ +* LOGFONT *lFont : ƒtƒHƒ“ƒgî•ñ +*----------------------------------------------------------------------------*/ + +static int SelectListFont(HWND hWnd, LOGFONT *lFont) +{ + static CHOOSEFONT cFont; + int Sts; + + cFont.lStructSize = sizeof(CHOOSEFONT); + cFont.hwndOwner = hWnd; + cFont.hDC = 0; + cFont.lpLogFont = lFont; + cFont.Flags = CF_FORCEFONTEXIST | CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT; + cFont.nFontType = SCREEN_FONTTYPE; + + Sts = NO; + if(ChooseFont(&cFont) == TRUE) + Sts = YES; + + return(Sts); +} + + +/*----- Ú‘±^Ø’fÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN -------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK ConnectSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, CONNECT_CONNECT, BM_SETCHECK, ConnectOnStart, 0); + SendDlgItemMessage(hDlg, CONNECT_OLDDLG, BM_SETCHECK, ConnectAndSet, 0); + SendDlgItemMessage(hDlg, CONNECT_RASCLOSE, BM_SETCHECK, RasClose, 0); + if(AskRasUsable() == NO) + EnableWindow(GetDlgItem(hDlg, CONNECT_RASCLOSE), FALSE); + SendDlgItemMessage(hDlg, CONNECT_CLOSE_NOTIFY, BM_SETCHECK, RasCloseNotify, 0); + if((RasClose == NO) || (AskRasUsable() == NO)) + EnableWindow(GetDlgItem(hDlg, CONNECT_CLOSE_NOTIFY), FALSE); + SendDlgItemMessage(hDlg, CONNECT_HIST, EM_LIMITTEXT, (WPARAM)2, 0); + SetDecimalText(hDlg, CONNECT_HIST, FileHist); + SendDlgItemMessage(hDlg, CONNECT_HIST_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(HISTORY_MAX, 0)); + SendDlgItemMessage(hDlg, CONNECT_QUICK_ANONY, BM_SETCHECK, QuickAnonymous, 0); + SendDlgItemMessage(hDlg, CONNECT_HIST_PASS, BM_SETCHECK, PassToHist, 0); + SendDlgItemMessage(hDlg, CONNECT_SENDQUIT, BM_SETCHECK, SendQuit, 0); + SendDlgItemMessage(hDlg, CONNECT_NORAS, BM_SETCHECK, NoRasControl, 0); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + ConnectOnStart = SendDlgItemMessage(hDlg, MISC_CONNECT, BM_GETCHECK, 0, 0); + ConnectAndSet = SendDlgItemMessage(hDlg, MISC_OLDDLG, BM_GETCHECK, 0, 0); + RasClose = SendDlgItemMessage(hDlg, CONNECT_RASCLOSE, BM_GETCHECK, 0, 0); + RasCloseNotify = SendDlgItemMessage(hDlg, CONNECT_CLOSE_NOTIFY, BM_GETCHECK, 0, 0); + FileHist = GetDecimalText(hDlg, CONNECT_HIST); + CheckRange2(&FileHist, HISTORY_MAX, 0); + QuickAnonymous = SendDlgItemMessage(hDlg, CONNECT_QUICK_ANONY, BM_GETCHECK, 0, 0); + PassToHist = SendDlgItemMessage(hDlg, CONNECT_HIST_PASS, BM_GETCHECK, 0, 0); + SendQuit = SendDlgItemMessage(hDlg, CONNECT_SENDQUIT, BM_GETCHECK, 0, 0); + NoRasControl = SendDlgItemMessage(hDlg, CONNECT_NORAS, BM_GETCHECK, 0, 0); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000048); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case CONNECT_RASCLOSE : + if(SendDlgItemMessage(hDlg, CONNECT_RASCLOSE, BM_GETCHECK, 0, 0) == 1) + EnableWindow(GetDlgItem(hDlg, CONNECT_CLOSE_NOTIFY), TRUE); + else + EnableWindow(GetDlgItem(hDlg, CONNECT_CLOSE_NOTIFY), FALSE); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- FireWallÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK FireSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + char Tmp[10]; + int Num; + static int Type; + static const INTCONVTBL TypeTbl[] = { + { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 8 }, + { 4, 3 }, { 5, 4 }, { 6, 5 }, { 7, 6 }, + { 8, 7 }, { 9, 9 } + }; + + static const int HideTbl[9][6] = { + { TRUE, TRUE, TRUE, FALSE, TRUE, FALSE }, + { TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + { TRUE, TRUE, TRUE, FALSE, FALSE, FALSE }, + { FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, + { FALSE, FALSE, FALSE, FALSE, TRUE, FALSE }, + { TRUE, FALSE, FALSE, FALSE, FALSE, FALSE }, + { FALSE, FALSE, FALSE, TRUE, FALSE, FALSE }, + { TRUE, TRUE, FALSE, TRUE, FALSE, FALSE }, + { TRUE, TRUE, FALSE, FALSE, TRUE, TRUE } + }; + + switch (message) + { + case WM_INITDIALOG : + Type = ConvertNum(FwallType, 1, TypeTbl, sizeof(TypeTbl)/sizeof(INTCONVTBL)); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN204); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN205); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN206); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN207); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN208); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN209); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN210); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN211); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN294); + SendDlgItemMessage(hDlg, FIRE_TYPE, CB_SETCURSEL, Type-1, 0); + + SendDlgItemMessage(hDlg, FIRE_HOST, EM_LIMITTEXT, HOST_ADRS_LEN, 0); + SendDlgItemMessage(hDlg, FIRE_USER, EM_LIMITTEXT, USER_NAME_LEN, 0); + SendDlgItemMessage(hDlg, FIRE_PASS, EM_LIMITTEXT, PASSWORD_LEN, 0); + SendDlgItemMessage(hDlg, FIRE_PORT, EM_LIMITTEXT, 5, 0); + SendDlgItemMessage(hDlg, FIRE_DELIMIT, EM_LIMITTEXT, 1, 0); + + SendDlgItemMessage(hDlg, FIRE_HOST, WM_SETTEXT, 0, (LPARAM)FwallHost); + SendDlgItemMessage(hDlg, FIRE_USER, WM_SETTEXT, 0, (LPARAM)FwallUser); + SendDlgItemMessage(hDlg, FIRE_PASS, WM_SETTEXT, 0, (LPARAM)FwallPass); + sprintf(Tmp, "%d", FwallPort); + SendDlgItemMessage(hDlg, FIRE_PORT, WM_SETTEXT, 0, (LPARAM)Tmp); + sprintf(Tmp, "%c", FwallDelimiter); + SendDlgItemMessage(hDlg, FIRE_DELIMIT, WM_SETTEXT, 0, (LPARAM)Tmp); + + SendDlgItemMessage(hDlg, FIRE_USEIT, BM_SETCHECK, FwallDefault, 0); + SendDlgItemMessage(hDlg, FIRE_PASV, BM_SETCHECK, PasvDefault, 0); + SendDlgItemMessage(hDlg, FIRE_RESOLV, BM_SETCHECK, FwallResolv, 0); + SendDlgItemMessage(hDlg, FIRE_LOWER, BM_SETCHECK, FwallLower, 0); + + SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN212); + SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN213); + SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN214); + SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN215); + SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_ADDSTRING, 0, (LPARAM)MSGJPN216); + SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_SETCURSEL, FwallSecurity, 0); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + Type = SendDlgItemMessage(hDlg, FIRE_TYPE, CB_GETCURSEL, 0, 0) + 1; + FwallType = ConvertNum(Type, 0, TypeTbl, sizeof(TypeTbl)/sizeof(INTCONVTBL)); + SendDlgItemMessage(hDlg, FIRE_HOST, WM_GETTEXT, HOST_ADRS_LEN+1, (LPARAM)FwallHost); + SendDlgItemMessage(hDlg, FIRE_USER, WM_GETTEXT, USER_NAME_LEN+1, (LPARAM)FwallUser); + SendDlgItemMessage(hDlg, FIRE_PASS, WM_GETTEXT, PASSWORD_LEN, (LPARAM)FwallPass); + SendDlgItemMessage(hDlg, FIRE_PORT, WM_GETTEXT, 5+1, (LPARAM)Tmp); + FwallPort = atoi(Tmp); + SendDlgItemMessage(hDlg, FIRE_DELIMIT, WM_GETTEXT, 5, (LPARAM)Tmp); + FwallDelimiter = Tmp[0]; + FwallDefault = SendDlgItemMessage(hDlg, FIRE_USEIT, BM_GETCHECK, 0, 0); + PasvDefault = SendDlgItemMessage(hDlg, FIRE_PASV, BM_GETCHECK, 0, 0); + FwallResolv = SendDlgItemMessage(hDlg, FIRE_RESOLV, BM_GETCHECK, 0, 0); + FwallLower = SendDlgItemMessage(hDlg, FIRE_LOWER, BM_GETCHECK, 0, 0); + FwallSecurity = SendDlgItemMessage(hDlg, FIRE_SECURITY, CB_GETCURSEL, 0, 0); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000049); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case FIRE_TYPE : + Num = SendDlgItemMessage(hDlg, FIRE_TYPE, CB_GETCURSEL, 0, 0); + EnableWindow(GetDlgItem(hDlg, FIRE_USER), HideTbl[Num][0]); + EnableWindow(GetDlgItem(hDlg, FIRE_PASS), HideTbl[Num][1]); + EnableWindow(GetDlgItem(hDlg, FIRE_SECURITY), HideTbl[Num][2]); + EnableWindow(GetDlgItem(hDlg, FIRE_RESOLV), HideTbl[Num][3]); + EnableWindow(GetDlgItem(hDlg, FIRE_LOWER), HideTbl[Num][4]); + EnableWindow(GetDlgItem(hDlg, FIRE_DELIMIT), HideTbl[Num][5]); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒc[ƒ‹Ý’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK ToolSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + char Tmp[FMAX_PATH+1]; + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, TOOL_EDITOR1, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, TOOL_EDITOR2, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, TOOL_EDITOR3, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, TOOL_EDITOR1, WM_SETTEXT, 0, (LPARAM)ViewerName[0]); + SendDlgItemMessage(hDlg, TOOL_EDITOR2, WM_SETTEXT, 0, (LPARAM)ViewerName[1]); + SendDlgItemMessage(hDlg, TOOL_EDITOR3, WM_SETTEXT, 0, (LPARAM)ViewerName[2]); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SendDlgItemMessage(hDlg, TOOL_EDITOR1, WM_GETTEXT, FMAX_PATH+1, (LPARAM)ViewerName[0]); + SendDlgItemMessage(hDlg, TOOL_EDITOR2, WM_GETTEXT, FMAX_PATH+1, (LPARAM)ViewerName[1]); + SendDlgItemMessage(hDlg, TOOL_EDITOR3, WM_GETTEXT, FMAX_PATH+1, (LPARAM)ViewerName[2]); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000050); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case TOOL_EDITOR1_BR : + case TOOL_EDITOR2_BR : + case TOOL_EDITOR3_BR : + strcpy(Tmp, ""); + if(SelectFile(hDlg, Tmp, MSGJPN217, MSGJPN218, NULL, OFN_FILEMUSTEXIST, 0) == TRUE) + { + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case TOOL_EDITOR1_BR : + SendDlgItemMessage(hDlg, TOOL_EDITOR1, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case TOOL_EDITOR2_BR : + SendDlgItemMessage(hDlg, TOOL_EDITOR2, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case TOOL_EDITOR3_BR : + SendDlgItemMessage(hDlg, TOOL_EDITOR3, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + } + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒTƒEƒ“ƒhÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK SoundSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + char Tmp[FMAX_PATH+1]; + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, SOUND_CONNECT, BM_SETCHECK, Sound[SND_CONNECT].On, 0); + SendDlgItemMessage(hDlg, SOUND_TRANS, BM_SETCHECK, Sound[SND_TRANS].On, 0); + SendDlgItemMessage(hDlg, SOUND_ERROR, BM_SETCHECK, Sound[SND_ERROR].On, 0); + + SendDlgItemMessage(hDlg, SOUND_CONNECT_WAV, EM_LIMITTEXT, (WPARAM)FMAX_PATH, 0); + SendDlgItemMessage(hDlg, SOUND_TRANS_WAV, EM_LIMITTEXT, (WPARAM)FMAX_PATH, 0); + SendDlgItemMessage(hDlg, SOUND_ERROR_WAV, EM_LIMITTEXT, (WPARAM)FMAX_PATH, 0); + SendDlgItemMessage(hDlg, SOUND_CONNECT_WAV, WM_SETTEXT, 0, (LPARAM)Sound[SND_CONNECT].Fname); + SendDlgItemMessage(hDlg, SOUND_TRANS_WAV, WM_SETTEXT, 0, (LPARAM)Sound[SND_TRANS].Fname); + SendDlgItemMessage(hDlg, SOUND_ERROR_WAV, WM_SETTEXT, 0, (LPARAM)Sound[SND_ERROR].Fname); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + Sound[SND_CONNECT].On = SendDlgItemMessage(hDlg, SOUND_CONNECT, BM_GETCHECK, 0, 0); + Sound[SND_TRANS].On = SendDlgItemMessage(hDlg, SOUND_TRANS, BM_GETCHECK, 0, 0); + Sound[SND_ERROR].On = SendDlgItemMessage(hDlg, SOUND_ERROR, BM_GETCHECK, 0, 0); + SendDlgItemMessage(hDlg, SOUND_CONNECT_WAV, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Sound[SND_CONNECT].Fname); + SendDlgItemMessage(hDlg, SOUND_TRANS_WAV, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Sound[SND_TRANS].Fname); + SendDlgItemMessage(hDlg, SOUND_ERROR_WAV, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Sound[SND_ERROR].Fname); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000051); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case SOUND_CONNECT_BR : + case SOUND_TRANS_BR : + case SOUND_ERROR_BR : + strcpy(Tmp, ""); + if(SelectFile(hDlg, Tmp, MSGJPN219, MSGJPN277, NULL, OFN_FILEMUSTEXIST, 0) == TRUE) + { + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case SOUND_CONNECT_BR : + SendDlgItemMessage(hDlg, SOUND_CONNECT_WAV, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case SOUND_TRANS_BR : + SendDlgItemMessage(hDlg, SOUND_TRANS_WAV, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case SOUND_ERROR_BR : + SendDlgItemMessage(hDlg, SOUND_ERROR_WAV, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + } + break; + + case SOUND_CONNECT_TEST : + SendDlgItemMessage(hDlg, SOUND_CONNECT_WAV, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Tmp); + sndPlaySound(Tmp, SND_ASYNC | SND_NODEFAULT); + break; + + case SOUND_TRANS_TEST : + SendDlgItemMessage(hDlg, SOUND_TRANS_WAV, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Tmp); + sndPlaySound(Tmp, SND_ASYNC | SND_NODEFAULT); + break; + + case SOUND_ERROR_TEST : + SendDlgItemMessage(hDlg, SOUND_ERROR_WAV, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Tmp); + sndPlaySound(Tmp, SND_ASYNC | SND_NODEFAULT); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ‚»‚Ì‘¼‚̐ݒèƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK MiscSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + char Tmp[FMAX_PATH+1]; + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, MISC_WINPOS, BM_SETCHECK, SaveWinPos, 0); + SendDlgItemMessage(hDlg, MISC_DEBUG, BM_SETCHECK, DebugConsole, 0); + SendDlgItemMessage(hDlg, MISC_REGTYPE, BM_SETCHECK, RegType, 0); + + SendDlgItemMessage(hDlg, MISC_CACHE_SAVE, BM_SETCHECK, CacheSave, 0); + SendDlgItemMessage(hDlg, MISC_BUFNUM, EM_LIMITTEXT, (WPARAM)2, 0); + SetDecimalText(hDlg, MISC_BUFNUM, abs(CacheEntry)); + SendDlgItemMessage(hDlg, MISC_BUFNUM_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(99, 1)); + if(CacheEntry > 0) + { + SendDlgItemMessage(hDlg, MISC_CACHE, BM_SETCHECK, 1, 0); + EnableWindow(GetDlgItem(hDlg, MISC_BUFNUM), TRUE); + EnableWindow(GetDlgItem(hDlg, MISC_CACHE_SAVE), TRUE); + } + else + { + SendDlgItemMessage(hDlg, MISC_CACHE, BM_SETCHECK, 0, 0); + EnableWindow(GetDlgItem(hDlg, MISC_BUFNUM), FALSE); + EnableWindow(GetDlgItem(hDlg, MISC_CACHE_SAVE), FALSE); + } + + SendDlgItemMessage(hDlg, MISC_CACHEDIR, EM_LIMITTEXT, (WPARAM)FMAX_PATH, 0); + SendDlgItemMessage(hDlg, MISC_CACHEDIR, WM_SETTEXT, 0, (LPARAM)TmpPath); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + SaveWinPos = SendDlgItemMessage(hDlg, MISC_WINPOS, BM_GETCHECK, 0, 0); + DebugConsole = SendDlgItemMessage(hDlg, MISC_DEBUG, BM_GETCHECK, 0, 0); + RegType = SendDlgItemMessage(hDlg, MISC_REGTYPE, BM_GETCHECK, 0, 0); + + CacheSave = SendDlgItemMessage(hDlg, MISC_CACHE_SAVE, BM_GETCHECK, 0, 0); + CacheEntry = GetDecimalText(hDlg, MISC_BUFNUM); + if(SendDlgItemMessage(hDlg, MISC_CACHE, BM_GETCHECK, 0, 0) == 0) + CacheEntry = -CacheEntry; + + SendDlgItemMessage(hDlg, MISC_CACHEDIR, WM_GETTEXT, FMAX_PATH+1, (LPARAM)TmpPath); + break; + + case PSN_RESET : + break; + + case PSN_HELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000052); + break; + } + break; + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case MISC_CACHE : + if(SendDlgItemMessage(hDlg, MISC_CACHE, BM_GETCHECK, 0, 0) == 1) + { + EnableWindow(GetDlgItem(hDlg, TRMODE_EXT), TRUE); + EnableWindow(GetDlgItem(hDlg, MISC_CACHE_SAVE), TRUE); + } + else + { + EnableWindow(GetDlgItem(hDlg, TRMODE_EXT), FALSE); + EnableWindow(GetDlgItem(hDlg, MISC_CACHE_SAVE), FALSE); + } + break; + + case MISC_CACHEDIR_BR : + if(SelectDir(hDlg, Tmp, FMAX_PATH) == TRUE) + SendDlgItemMessage(hDlg, MISC_CACHEDIR, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case MISC_CACHEDIR_DEF : + GetTempPath(FMAX_PATH, Tmp); + SendDlgItemMessage(hDlg, MISC_CACHEDIR, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒ\[ƒgÝ’èƒEƒCƒ“ƒhƒE -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (YES=ŽÀs/NO=ŽæÁ) +*----------------------------------------------------------------------------*/ + +int SortSetting(void) +{ + int Sts; + + Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(sort_dlg), GetMainHwnd(), SortSettingProc); + return(Sts); +} + + +/*----- ƒ\[ƒgÝ’èƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ------------------------------------ +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + int LFsort; + int LDsort; + int RFsort; + int RDsort; + + static const RADIOBUTTON LsortOrdButton[] = { + { SORT_LFILE_NAME, SORT_NAME }, + { SORT_LFILE_EXT, SORT_EXT }, + { SORT_LFILE_SIZE, SORT_SIZE }, + { SORT_LFILE_DATE, SORT_DATE } + }; + #define LSORTORDBUTTONS (sizeof(LsortOrdButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON LDirsortOrdButton[] = { + { SORT_LDIR_NAME, SORT_NAME }, + { SORT_LDIR_DATE, SORT_DATE } + }; + #define LDIRSORTORDBUTTONS (sizeof(LDirsortOrdButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON RsortOrdButton[] = { + { SORT_RFILE_NAME, SORT_NAME }, + { SORT_RFILE_EXT, SORT_EXT }, + { SORT_RFILE_SIZE, SORT_SIZE }, + { SORT_RFILE_DATE, SORT_DATE } + }; + #define RSORTORDBUTTONS (sizeof(RsortOrdButton)/sizeof(RADIOBUTTON)) + + static const RADIOBUTTON RDirsortOrdButton[] = { + { SORT_RDIR_NAME, SORT_NAME }, + { SORT_RDIR_DATE, SORT_DATE } + }; + #define RDIRSORTORDBUTTONS (sizeof(RDirsortOrdButton)/sizeof(RADIOBUTTON)) + + switch (message) + { + case WM_INITDIALOG : + + SetRadioButtonByValue(hDlg, AskSortType(ITEM_LFILE) & SORT_MASK_ORD, LsortOrdButton, LSORTORDBUTTONS); + + if((AskSortType(ITEM_LFILE) & SORT_GET_ORD) == SORT_ASCENT) + SendDlgItemMessage(hDlg, SORT_LFILE_REV, BM_SETCHECK, 0, 0); + else + SendDlgItemMessage(hDlg, SORT_LFILE_REV, BM_SETCHECK, 1, 0); + + SetRadioButtonByValue(hDlg, AskSortType(ITEM_LDIR) & SORT_MASK_ORD, LDirsortOrdButton, LDIRSORTORDBUTTONS); + + if((AskSortType(ITEM_LDIR) & SORT_GET_ORD) == SORT_ASCENT) + SendDlgItemMessage(hDlg, SORT_LDIR_REV, BM_SETCHECK, 0, 0); + else + SendDlgItemMessage(hDlg, SORT_LDIR_REV, BM_SETCHECK, 1, 0); + + SetRadioButtonByValue(hDlg, AskSortType(ITEM_RFILE) & SORT_MASK_ORD, RsortOrdButton, RSORTORDBUTTONS); + + if((AskSortType(ITEM_RFILE) & SORT_GET_ORD) == SORT_ASCENT) + SendDlgItemMessage(hDlg, SORT_RFILE_REV, BM_SETCHECK, 0, 0); + else + SendDlgItemMessage(hDlg, SORT_RFILE_REV, BM_SETCHECK, 1, 0); + + SetRadioButtonByValue(hDlg, AskSortType(ITEM_RDIR) & SORT_MASK_ORD, RDirsortOrdButton, RDIRSORTORDBUTTONS); + + if((AskSortType(ITEM_RDIR) & SORT_GET_ORD) == SORT_ASCENT) + SendDlgItemMessage(hDlg, SORT_RDIR_REV, BM_SETCHECK, 0, 0); + else + SendDlgItemMessage(hDlg, SORT_RDIR_REV, BM_SETCHECK, 1, 0); + + SendDlgItemMessage(hDlg, SORT_SAVEHOST, BM_SETCHECK, AskSaveSortToHost(), 0); + + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + LFsort = AskRadioButtonValue(hDlg, LsortOrdButton, LSORTORDBUTTONS); + + if(SendDlgItemMessage(hDlg, SORT_LFILE_REV, BM_GETCHECK, 0, 0) == 1) + LFsort |= SORT_DESCENT; + + LDsort = AskRadioButtonValue(hDlg, LDirsortOrdButton, LDIRSORTORDBUTTONS); + + if(SendDlgItemMessage(hDlg, SORT_LDIR_REV, BM_GETCHECK, 0, 0) == 1) + LDsort |= SORT_DESCENT; + + RFsort = AskRadioButtonValue(hDlg, RsortOrdButton, RSORTORDBUTTONS); + + if(SendDlgItemMessage(hDlg, SORT_RFILE_REV, BM_GETCHECK, 0, 0) == 1) + RFsort |= SORT_DESCENT; + + RDsort = AskRadioButtonValue(hDlg, RDirsortOrdButton, RDIRSORTORDBUTTONS); + + if(SendDlgItemMessage(hDlg, SORT_RDIR_REV, BM_GETCHECK, 0, 0) == 1) + RDsort |= SORT_DESCENT; + + SetSortTypeImm(LFsort, LDsort, RFsort, RDsort); + + SetSaveSortToHost(SendDlgItemMessage(hDlg, SORT_SAVEHOST, BM_GETCHECK, 0, 0)); + + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000001); + break; + } + return(TRUE); + } + return(FALSE); +} + + +/*----- ƒ_ƒCƒAƒƒO‚̃Rƒ“ƒgƒ[ƒ‹‚©‚ç‚P‚Oi”‚ðŽæ“¾ ---------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Ctrl : ƒRƒ“ƒgƒ[ƒ‹‚ÌID +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static int GetDecimalText(HWND hDlg, int Ctrl) +{ + char Tmp[40]; + + SendDlgItemMessage(hDlg, Ctrl, WM_GETTEXT, (WPARAM)39, (LPARAM)Tmp); + return(atoi(Tmp)); +} + + +/*----- ƒ_ƒCƒAƒƒO‚̃Rƒ“ƒgƒ[ƒ‹‚É‚P‚Oi”‚ðƒZƒbƒg ---------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int Ctrl : ƒRƒ“ƒgƒ[ƒ‹‚ÌID +* int Num : ”’l +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void SetDecimalText(HWND hDlg, int Ctrl, int Num) +{ + char Tmp[40]; + + sprintf(Tmp, "%d", Num); + SendDlgItemMessage(hDlg, Ctrl, WM_SETTEXT, 0, (LPARAM)Tmp); + return; +} + + +/*----- Ý’è’l‚͈̔̓`ƒFƒbƒN -------------------------------------------------- +* +* Parameter +* int *Cur : Ý’è’l +* int Max : Å‘å’l +* int Min : Å¬’l +* +* Return Value +* ‚È‚µ +* +* Parameter change +* int *Cur : Ý’è’l +*----------------------------------------------------------------------------*/ + +static void CheckRange2(int *Cur, int Max, int Min) +{ + if(*Cur < Min) + *Cur = Min; + if(*Cur > Max) + *Cur = Max; + return; +} + + +/*----- •¶Žš—ñ‚ðƒŠƒXƒgƒ{ƒbƒNƒX‚ɒljÁ ------------------------------------------ +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* char *Str : •¶Žš—ñ +* int CtrlList : ƒŠƒXƒgƒ{ƒbƒNƒX‚ÌID +* int BufSize : ƒoƒbƒtƒ@ƒTƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize) +{ + char Tmp[FMAX_PATH+1]; + int Num; + int i; + int Len; + + Len = strlen(Str); + if(Len > 0) + { + Len++; + Num = SendDlgItemMessage(hDlg, CtrlList, LB_GETCOUNT, 0, 0); + for(i = 0; i < Num; i++) + { + SendDlgItemMessage(hDlg, CtrlList, LB_GETTEXT, i, (LPARAM)Tmp); + Len += strlen(Tmp) + 1; + } + + if(Len > (BufSize-1)) + MessageBeep(-1); + else + SendDlgItemMessage(hDlg, CtrlList, LB_ADDSTRING, 0, (LPARAM)Str); + } + return; +} + + +/*----- ƒ}ƒ‹ƒ`•¶Žš—ñ‚ðƒŠƒXƒgƒ{ƒbƒNƒX‚ɃZƒbƒg ---------------------------------- +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int CtrlList : ƒŠƒXƒgƒ{ƒbƒNƒX‚ÌID +* char *Text : •¶Žš—ñ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text) +{ + char *Pos; + + Pos = Text; + while(*Pos != NUL) + { + SendDlgItemMessage(hDlg, CtrlList, LB_ADDSTRING, 0, (LPARAM)Pos); + Pos += strlen(Pos) + 1; + } + return; +} + + +/*----- ƒŠƒXƒgƒ{ƒbƒNƒX‚Ì“à—e‚ðƒ}ƒ‹ƒ`•¶Žš—ñ‚É‚·‚é ------------------------------ +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* int CtrlList : ƒŠƒXƒgƒ{ƒbƒNƒX‚ÌID +* char *Buf : •¶Žš—ñ‚ðƒZƒbƒg‚·‚éƒoƒbƒtƒ@ +* int BufSize : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize) +{ + char Tmp[FMAX_PATH+1]; + int Num; + int i; + + memset(Buf, NUL, BufSize); + Num = SendDlgItemMessage(hDlg, CtrlList, LB_GETCOUNT, 0, 0); + for(i = 0; i < Num; i++) + { + SendDlgItemMessage(hDlg, CtrlList, LB_GETTEXT, i, (LPARAM)Tmp); + strcpy(Buf + StrMultiLen(Buf), Tmp); + } + return; +} + + diff --git a/ras.c b/ras.c new file mode 100644 index 0000000..22aa804 --- /dev/null +++ b/ras.c @@ -0,0 +1,693 @@ +/*============================================================================= +* +* ‚q‚`‚rŠÖŒW +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT + +#define WINVER 0x400 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +typedef DWORD (WINAPI*FUNC_RASENUMCONNECTIONS) (LPRASCONN, LPDWORD, LPDWORD); +typedef DWORD (WINAPI*FUNC_RASENUMENTRIES) (LPCTSTR, LPCTSTR, LPRASENTRYNAME, LPDWORD, LPDWORD); +typedef DWORD (WINAPI*FUNC_RASHANGUP) (HRASCONN); +typedef BOOL (WINAPI*FUNC_RASDIAL) (LPRASDIALEXTENSIONS, LPCTSTR, LPRASDIALPARAMS, DWORD, LPVOID, LPHRASCONN); +typedef BOOL (WINAPI*FUNC_RASGETENTRYDIALPARAMS) (LPCTSTR, LPRASDIALPARAMS, LPBOOL); +typedef BOOL (WINAPI*FUNC_RASGETCONNECTSTATUS) (HRASCONN, LPRASCONNSTATUS); +typedef BOOL (WINAPI*FUNC_RASGETERRORSTRING)(UINT, LPTSTR, DWORD); + +typedef BOOL (WINAPI*FUNC_RASDIALDLG) (LPSTR, LPSTR, LPSTR, LPRASDIALDLG); + + +static int GetCurConnections(RASCONN **Buf); +static DWORD RasHangUpWait(HRASCONN hRasConn); +static int DoDisconnect(RASCONN *Buf, int Num); +static BOOL CALLBACK DialCallBackProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static VOID WINAPI RasDialFunc( UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError ); +static void MakeRasConnMsg(char *Phone, RASCONNSTATE rasconn, char *Buf); +static BOOL CALLBACK DialPassCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HINSTANCE m_hDll = NULL; +static HINSTANCE m_hDll2 = NULL; + +static FUNC_RASENUMCONNECTIONS m_RasEnumConnections = NULL; +static FUNC_RASENUMENTRIES m_RasEnumEntries = NULL; +static FUNC_RASHANGUP m_RasHangUp = NULL; +static FUNC_RASDIAL m_RasDial = NULL; +static FUNC_RASGETENTRYDIALPARAMS m_RasGetEntryDialParams = NULL; +static FUNC_RASGETCONNECTSTATUS m_RasGetConnectStatus = NULL; +static FUNC_RASGETERRORSTRING m_RasGetErrorString = NULL; + +static FUNC_RASDIALDLG m_RasDialDlg = NULL; + +static HWND hWndDial; + + + +/*----- RASƒ‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚·‚é --------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +* +* Note +* RASƒ‰ƒCƒuƒ‰ƒŠ‚Í•K‚¸ƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚é‚à‚Ì‚Å‚Í‚È‚¢‚̂ŁAƒXƒ^ƒeƒBƒbƒN‚É +* ƒŠƒ“ƒN‚µ‚È‚¢B +*----------------------------------------------------------------------------*/ + +void LoadRasLib(void) +{ + if((m_hDll = LoadLibrary("rasapi32.dll")) != NULL) + { + m_RasEnumConnections = (FUNC_RASENUMCONNECTIONS)GetProcAddress(m_hDll, "RasEnumConnectionsA"); + m_RasEnumEntries = (FUNC_RASENUMENTRIES)GetProcAddress(m_hDll, "RasEnumEntriesA"); + m_RasHangUp = (FUNC_RASHANGUP)GetProcAddress(m_hDll, "RasHangUpA"); + m_RasDial = (FUNC_RASDIAL)GetProcAddress(m_hDll, "RasDialA"); + m_RasGetEntryDialParams = (FUNC_RASGETENTRYDIALPARAMS)GetProcAddress(m_hDll, "RasGetEntryDialParamsA"); + m_RasGetConnectStatus = (FUNC_RASGETCONNECTSTATUS)GetProcAddress(m_hDll, "RasGetConnectStatusA"); + m_RasGetErrorString = (FUNC_RASGETERRORSTRING)GetProcAddress(m_hDll, "RasGetErrorStringA"); + + if((m_RasEnumConnections == NULL) || + (m_RasEnumEntries == NULL) || + (m_RasHangUp == NULL) || + (m_RasDial == NULL) || + (m_RasGetEntryDialParams == NULL) || + (m_RasGetConnectStatus == NULL) || + (m_RasGetErrorString == NULL)) + { + FreeLibrary(m_hDll); + m_hDll = NULL; + } + } + + if(m_hDll != NULL) + { + if((m_hDll2 = LoadLibrary("rasdlg.dll")) != NULL) + { + m_RasDialDlg = (FUNC_RASDIALDLG)GetProcAddress(m_hDll2, "RasDialDlgA"); + + if(m_RasDialDlg == NULL) + { + FreeLibrary(m_hDll2); + m_hDll2 = NULL; + } + } + } + return; +} + + +/*----- RASƒ‰ƒCƒuƒ‰ƒŠ‚ðƒŠƒŠ[ƒX‚·‚é ------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ReleaseRasLib(void) +{ + if(m_hDll != NULL) + FreeLibrary(m_hDll); + m_hDll = NULL; + + if(m_hDll2 != NULL) + FreeLibrary(m_hDll2); + m_hDll2 = NULL; + + return; +} + + +/*----- RAS‚ªŽg‚¦‚é‚©‚Ç‚¤‚©‚ð•Ô‚· --------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int RAS‚ªŽg‚¦‚é‚©‚Ç‚¤‚© +* YES/NO +*----------------------------------------------------------------------------*/ + +int AskRasUsable(void) +{ + int Sts; + + Sts = NO; + if(m_hDll != NULL) + Sts = YES; + + return(Sts); +} + + +/*----- Œ»Ý‚ÌRASƒRƒlƒNƒVƒ‡ƒ“ˆê——‚ð•Ô‚· --------------------------------------- +* +* Parameter +* RASCONN **Buf : ˆê——‚ւ̃|ƒCƒ“ƒ^‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ŒÂ” (-1=ƒGƒ‰[) +* +* Note +* Buf‚̗̈æ‚͌ďo‘¤‚ÅŠJ•ú‚·‚邱‚Æ +*----------------------------------------------------------------------------*/ + +static int GetCurConnections(RASCONN **Buf) +{ + RASCONN *RasConn; + RASCONN *Tmp; + DWORD Size; + DWORD Num; + DWORD Sts; + int Ret; + + Ret = -1; + Size = sizeof(RASCONN); + if((RasConn = malloc(Size)) != NULL) + { + RasConn->dwSize = sizeof(RASCONN); + Sts = (*m_RasEnumConnections)(RasConn, &Size, &Num); + if((Sts == ERROR_BUFFER_TOO_SMALL) || (Sts == ERROR_NOT_ENOUGH_MEMORY)) + { + if((Tmp = realloc(RasConn, Size)) != NULL) + { + RasConn = Tmp; + Sts = (*m_RasEnumConnections)(RasConn, &Size, &Num); + } + } + + if(Sts == 0) + { + Ret = Num; + *Buf = RasConn; + } + else + free(RasConn); + } + return(Ret); +} + + +/*----- RasHangUp()------------------------------------------------------------ +* +* Parameter +* HRASCONN hRasConn : ƒnƒ“ƒhƒ‹ +* +* Return Value +* DWORD ƒXƒe[ƒ^ƒX +* +* Note +* Ø’f‚ªŠ®—¹‚·‚é‚Ü‚Å‘Ò‚Â +*----------------------------------------------------------------------------*/ + +static DWORD RasHangUpWait(HRASCONN hRasConn) +{ + RASCONNSTATUS RasSts; + DWORD Sts; + + Sts = (*m_RasHangUp)(hRasConn); + + RasSts.dwSize = sizeof(RASCONNSTATUS); + while((*m_RasGetConnectStatus)(hRasConn, &RasSts) != ERROR_INVALID_HANDLE) + Sleep(10); + + return(Sts); +} + + +/*----- Œ»Ý‚ÌRASƒRƒlƒNƒVƒ‡ƒ“‚ðØ’f‚·‚é --------------------------------------- +* +* Parameter +* RASCONN *RasConn : Ú‘±ˆê—— +* int Num : ŒÂ” +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +static int DoDisconnect(RASCONN *RasConn, int Num) +{ + int i; + int Sts; + + Sts = SUCCESS; + if(Num > 0) + { + SetTaskMsg(MSGJPN220); + for(i = 0; i < Num; i++) + { + if(RasHangUpWait(RasConn[i].hrasconn) != 0) + Sts = FAIL; + } + } + return(Sts); +} + + +/*----- RAS‚ðØ’f‚·‚é --------------------------------------------------------- +* +* Parameter +* int Notify : Šm”F‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DisconnectRas(int Notify) +{ + RASCONN *RasConn; + int Num; + + if(m_hDll != NULL) + { + if((Num = GetCurConnections(&RasConn)) != -1) + { + if(Num > 0) + { + if((Notify == NO) || + (DialogBox(GetFtpInst(), MAKEINTRESOURCE(rasnotify_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)) + { + DoDisconnect(RasConn, Num); + } + } + free(RasConn); + } + } + return; +} + + +/*----- RAS‚̃Gƒ“ƒgƒŠˆê——‚ðƒRƒ“ƒ{ƒ{ƒbƒNƒX‚ɃZƒbƒg‚·‚é ------------------------- +* +* Parameter +* HWND hDlg : ƒ_ƒCƒAƒƒOƒ{ƒbƒNƒX‚̃nƒ“ƒhƒ‹ +* int Item : ƒRƒ“ƒ{ƒ{ƒbƒNƒX‚̃Šƒ\[ƒX”ԍ† +* char *CurName : ‰Šú’l +* +* Return Value +* int ƒGƒ“ƒgƒŠ” +*----------------------------------------------------------------------------*/ + +int SetRasEntryToComboBox(HWND hDlg, int Item, char *CurName) +{ + RASENTRYNAME *Entry; + RASENTRYNAME *Tmp; + DWORD i; + DWORD Size; + DWORD Num; + DWORD Sts; + + Num = 0; + if(m_hDll != NULL) + { + Size = sizeof(RASENTRYNAME); + if((Entry = malloc(Size)) != NULL) + { + Entry->dwSize = sizeof(RASENTRYNAME); + Sts = (*m_RasEnumEntries)(NULL, NULL, Entry, &Size, &Num); + if((Sts == ERROR_BUFFER_TOO_SMALL) || (Sts == ERROR_NOT_ENOUGH_MEMORY)) + { + if((Tmp = realloc(Entry, Size)) != NULL) + { + Entry = Tmp; + Sts = (*m_RasEnumEntries)(NULL, NULL, Entry, &Size, &Num); + } + } + + if((Sts == 0) && (Num > 0)) + { + for(i = 0; i < Num; i++) + SendDlgItemMessage(hDlg, Item, CB_ADDSTRING, 0, (LPARAM)Entry[i].szEntryName); + + SendDlgItemMessage(hDlg, Item, CB_SELECTSTRING, -1, (LPARAM)CurName); + } + free(Entry); + } + } + return(Num); +} + + +/*----- RAS‚̐ڑ±‚ðs‚¤ ------------------------------------------------------- +* +* Parameter +* int Dialup : ƒ_ƒCƒAƒ‹ƒAƒbƒv‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* int UseThis : •K‚¸‚±‚̃Gƒ“ƒgƒŠ‚ɐڑ±‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* int Notify : ÄÚ‘±‘O‚ÉŠm”F‚·‚é‚©‚Ç‚¤‚© (YES/NO) +* char *Name : Ú‘±æ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +*----------------------------------------------------------------------------*/ + +int ConnectRas(int Dialup, int UseThis, int Notify, char *Name) +{ + RASDIALDLG DlgParam; + RASCONN *RasConn; + int i; + int Num; + int Sts; + int DoDial; + RASDIALPARAMS Param; + BOOL Flg; + OSVERSIONINFO VerInfo; + + Sts = SUCCESS; + if(Dialup == YES) + { + if(m_hDll != NULL) + { + /* Œ»Ý‚̐ڑ±‚ðŠm”F */ + DoDial = 1; + if((Num = GetCurConnections(&RasConn)) != -1) + { + if(Num > 0) + { + DoDial = 0; + if(UseThis == YES) + { + DoDial = 2; + for(i = 0; i < Num; i++) + { + if(_mbscmp(RasConn[i].szEntryName, Name) == 0) + DoDial = 0; + } + + if(DoDial == 2) + { + if((Notify == NO) || + (DialogBox(GetFtpInst(), MAKEINTRESOURCE(rasreconnect_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)) + { + DoDisconnect(RasConn, Num); + } + else + DoDial = 0; + } + } + } + free(RasConn); + } + + if(DoDial != 0) + { + /* Ú‘±‚·‚é */ + SetTaskMsg(MSGJPN221); + Sts = FAIL; + + Num = 0; + VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if(GetVersionEx(&VerInfo) == TRUE) + { + if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) + Num = 1; + } + + if(Num == 1) + { + if(m_hDll2 != NULL) + { + /* Windows NT */ + DlgParam.dwSize = sizeof(RASDIALDLG); + DlgParam.hwndOwner = GetMainHwnd(); + DlgParam.dwFlags = 0; + DlgParam.dwSubEntry = 0; + DlgParam.reserved = 0; + DlgParam.reserved2 = 0; + if((*m_RasDialDlg)(NULL, Name, NULL, &DlgParam) != 0) + Sts = SUCCESS; + } + else + SetTaskMsg(MSGJPN222); + } + else + { + /* Windows 95,98 */ + Param.dwSize = sizeof(RASDIALPARAMS); + strcpy(Param.szEntryName, Name); + Flg = TRUE; + Sts = (*m_RasGetEntryDialParams)(NULL, &Param, &Flg); + strcpy(Param.szPhoneNumber, ""); + + if(((strlen(Param.szUserName) != 0) && (strlen(Param.szPassword) != 0)) || + (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(dial_password_dlg), GetMainHwnd(), (DLGPROC)DialPassCallBackProc, (LPARAM)&Param) == YES)) + { + if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(dial_dlg), GetMainHwnd(), (DLGPROC)DialCallBackProc, (LPARAM)&Param) == YES) + Sts = SUCCESS; + } + } + } + } + } + return(Sts); +} + + +/*----- RASƒ_ƒCƒAƒ‹ƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ----------------------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DialCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static RASDIALPARAMS *Param; + static HRASCONN hRasConn; + char Tmp[RAS_NAME_LEN+25]; + DWORD Sts; + + switch (message) + { + case WM_INITDIALOG : + Param = (RASDIALPARAMS *)lParam; + hWndDial = hDlg; + hRasConn = NULL; + sprintf(Tmp, MSGJPN223, Param->szEntryName); + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)Tmp); + Sts = (*m_RasDial)(NULL, NULL, Param, 0, &RasDialFunc, &hRasConn); + if(Sts != 0) + EndDialog(hDlg, NO); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDCANCEL : + RasHangUpWait(hRasConn); + EndDialog(hDlg, NO); + break; + } + return(TRUE); + + case WM_DIAL_MSG : + if(lParam != 0) + { + /* ƒGƒ‰[”­¶ */ + if((*m_RasGetErrorString)((UINT)lParam, (LPTSTR)Tmp, RAS_NAME_LEN+25) != 0) + sprintf(Tmp, MSGJPN224); + RasHangUpWait(hRasConn); + MessageBox(hDlg, Tmp, MSGJPN225, MB_OK | MB_ICONSTOP); + EndDialog(hDlg, NO); + } + else if(wParam & RASCS_DONE) + { + /* I—¹ */ + EndDialog(hDlg, YES); + } + else + { + /* ƒXƒe[ƒ^ƒX•ÏX */ + MakeRasConnMsg(Param->szPhoneNumber, wParam, Tmp); + SendDlgItemMessage(hDlg, DIAL_STATUS, WM_SETTEXT, 0, (LPARAM)Tmp); + } + return(TRUE); + } + return(FALSE); +} + + +/*----- RasDial()‚̃R[ƒ‹ƒoƒbƒN ----------------------------------------------- +* +* Parameter +* UINT unMsg : ƒƒbƒZ[ƒW +* RASCONNSTATE rasconnstate : ƒXƒe[ƒ^ƒX +* DWORD dwError : ƒGƒ‰[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError) +{ + PostMessage(hWndDial, WM_DIAL_MSG, (WPARAM)rasconnstate, (LPARAM)dwError ); +} + + +/*----- RasDial()‚̃Xƒe[ƒ^ƒXƒƒbƒZ[ƒW‚ðì¬‚·‚é ----------------------------- +* +* Parameter +* char *Phone : “d˜b”ԍ† +* RASCONNSTATE rasconn : ƒXƒe[ƒ^ƒX +* char *Buf : •¶Žš—ñ‚ðƒZƒbƒg‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void MakeRasConnMsg(char *Phone, RASCONNSTATE rasconn, char *Buf) +{ + switch( rasconn ) + { + case RASCS_OpenPort: + strcpy(Buf, MSGJPN226); + break; + case RASCS_PortOpened: + strcpy(Buf, MSGJPN227); + break; + case RASCS_ConnectDevice: + sprintf(Buf, MSGJPN228); + break; + case RASCS_DeviceConnected: + strcpy(Buf, MSGJPN229); + break; + case RASCS_AllDevicesConnected: + strcpy(Buf, MSGJPN230); + break; + case RASCS_Authenticate: + case RASCS_AuthNotify: + strcpy(Buf, MSGJPN231); + break; + case RASCS_AuthRetry: + case RASCS_ReAuthenticate: + strcpy(Buf, MSGJPN232); + break; + case RASCS_AuthChangePassword: + strcpy(Buf, MSGJPN233); + break; + case RASCS_Authenticated: + strcpy(Buf, MSGJPN234); + break; + case RASCS_Connected: + strcpy(Buf, MSGJPN235); + break; + case RASCS_Disconnected: + strcpy(Buf, MSGJPN236); + break; + case RASCS_AuthCallback: + case RASCS_PrepareForCallback: + case RASCS_WaitForModemReset: + case RASCS_WaitForCallback: + case RASCS_Interactive: + case RASCS_RetryAuthentication: + case RASCS_CallbackSetByCaller: + case RASCS_PasswordExpired: + case RASCS_AuthProject: + case RASCS_AuthLinkSpeed: + case RASCS_AuthAck: + default: + strcpy(Buf, MSGJPN237); + break; + } + return; +} + + +/*----- ƒ†[ƒU–¼AƒpƒXƒ[ƒh“ü—̓EƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK DialPassCallBackProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static RASDIALPARAMS *Param; + char Tmp[RAS_NAME_LEN+25]; + + switch (message) + { + case WM_INITDIALOG : + Param = (RASDIALPARAMS *)lParam; + sprintf(Tmp, MSGJPN238, Param->szEntryName); + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, RASPASS_USER, EM_LIMITTEXT, UNLEN, 0); + SendDlgItemMessage(hDlg, RASPASS_PASS, EM_LIMITTEXT, PWLEN, 0); + SendDlgItemMessage(hDlg, RASPASS_USER, WM_SETTEXT, 0, (LPARAM)Param->szUserName); + SendDlgItemMessage(hDlg, RASPASS_PASS, WM_SETTEXT, 0, (LPARAM)Param->szPassword); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, RASPASS_USER, WM_GETTEXT, UNLEN+1, (LPARAM)Param->szUserName); + SendDlgItemMessage(hDlg, RASPASS_PASS, WM_GETTEXT, PWLEN+1, (LPARAM)Param->szPassword); + EndDialog(hDlg, YES); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + } + return(TRUE); + } + return(FALSE); +} + + diff --git a/regexp.c b/regexp.c new file mode 100644 index 0000000..5bcb37e --- /dev/null +++ b/regexp.c @@ -0,0 +1,208 @@ +/*============================================================================= +* +* ³‹K•\Œ»ŒŸõ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include + +#include "common.h" +#include "jreusr.h" + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static JRE2 m_jreData; +static HINSTANCE m_hDll = NULL; +static LPJRE2OPEN m_lpJre2Open = NULL; +static LPJRE2COMPILE m_lpJre2Compile = NULL; +static LPJRE2GETMATCHINFO m_lpJre2MatchInfo = NULL; +static LPJRE2CLOSE m_lpJre2Close = NULL; +static LPJREGETVERSION m_lpJreGetVersion = NULL; +static LPGETJREMESSAGE m_lpGetJreMessage = NULL; + + + +/*----- ³‹K•\Œ»ƒ‰ƒCƒuƒ‰ƒŠ‚ðƒ[ƒh‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* TRUE/FALSE +*----------------------------------------------------------------------------*/ + +int LoadJre(void) +{ + int Sts; + + Sts = FALSE; + if((m_hDll = LoadLibrary("jre32.dll")) != NULL) + { + m_lpJre2Open = (LPJRE2OPEN)GetProcAddress(m_hDll, "Jre2Open"); + m_lpJre2Compile = (LPJRE2COMPILE)GetProcAddress(m_hDll, "Jre2Compile"); + m_lpJre2MatchInfo = (LPJRE2GETMATCHINFO)GetProcAddress(m_hDll, "Jre2GetMatchInfo"); + m_lpJre2Close = (LPJRE2CLOSE)GetProcAddress(m_hDll, "Jre2Close"); + m_lpJreGetVersion = (LPJREGETVERSION)GetProcAddress(m_hDll, "JreGetVersion"); + m_lpGetJreMessage = (LPGETJREMESSAGE)GetProcAddress(m_hDll, "GetJreMessage"); + + if((m_lpJre2Open != NULL) && + (m_lpJre2Compile != NULL) && + (m_lpJre2MatchInfo != NULL) && + (m_lpJre2Close != NULL) && + (m_lpJreGetVersion != NULL) && + (m_lpJreGetVersion != NULL)) + { + memset(&m_jreData, 0, sizeof(JRE2)); + m_jreData.dwSize = sizeof(JRE2); + m_jreData.wTranslate = 1; + + if((*m_lpJre2Open)(&m_jreData) == TRUE) + Sts = TRUE; + else + ReleaseJre(); + } + + } + return(Sts);; +} + + +/*----- ³‹K•\Œ»ƒ‰ƒCƒuƒ‰ƒŠ‚ðƒŠƒŠ[ƒX‚·‚é -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ReleaseJre(void) +{ + if(m_hDll != NULL) + FreeLibrary(m_hDll); + m_hDll = NULL; + + return; +} + + +/*----- ³‹K•\Œ»ƒ‰ƒCƒuƒ‰ƒŠ‚ªŽg‚¦‚é‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ³‹K•\Œ»ƒ‰ƒCƒuƒ‰ƒŠ‚ªŽg‚¦‚é‚©‚Ç‚¤‚© +* TRUE/FALSE +*----------------------------------------------------------------------------*/ + +int AskJreUsable(void) +{ + int Sts; + + Sts = FALSE; + if(m_hDll != NULL) + Sts = TRUE; + + return(Sts); +} + + +/*----- ³‹K•\Œ»ƒ‰ƒCƒuƒ‰ƒŠ‚̃o[ƒWƒ‡ƒ“‚ð•Ô‚· a--------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒo[ƒWƒ‡ƒ“ +*----------------------------------------------------------------------------*/ + +int GetJreVersion(void) +{ + int Ver; + + Ver = -1; + if(m_hDll != NULL) + Ver = (*m_lpJreGetVersion)(); + + return(Ver); +} + + +/*----- ³‹K•\Œ»ŒŸõŽ®‚ðƒRƒ“ƒpƒCƒ‹‚·‚é ---------------------------------------- +* +* Parameter +* kchar *Str : ŒŸõŽ® +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* TRUE/FALSE +*----------------------------------------------------------------------------*/ + +int JreCompileStr(char *Str) +{ + int Sts; + + Sts = FALSE; + if(m_hDll != NULL) + Sts = (*m_lpJre2Compile)(&m_jreData, Str); + + return(Sts); +} + + +/*----- •¶Žš—ñ‚ªˆê’v‚·‚é‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* UINT nStart : ŒŸõŠJŽnˆÊ’u +* +* Return Value +* char *Œ©‚‚©‚Á‚½ˆÊ’u +* NULL=Œ©‚‚©‚ç‚È‚©‚Á‚½ +*----------------------------------------------------------------------------*/ + +char *JreGetStrMatchInfo(char *Str, UINT nStart) +{ + char *Ret; + + Ret = NULL; + if(m_hDll != NULL) + { + m_jreData.nStart = nStart; + if((*m_lpJre2MatchInfo)(&m_jreData, Str) == TRUE) + Ret = Str + m_jreData.nPosition; + } + return(Ret); +} + + diff --git a/registory.c b/registory.c new file mode 100644 index 0000000..d36c574 --- /dev/null +++ b/registory.c @@ -0,0 +1,2671 @@ +/*============================================================================= +* ƒŒƒWƒXƒgƒŠŠÖŒW +* +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +// VC 8.0(2005)ˆÈã‚Å‚Ì‚Ý rand_s ‚ð—˜—p‰Â”\ +#if 1400 <= _MSC_VER +//#define _CRT_RAND_S +#endif + +#define STRICT +#include +#include +#include +#include +#include +#include +#include + + +#include "common.h" +#include "resource.h" +#include "sample.h" +#include "sha.h" +#include "aes.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr); +static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum); +static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf); +static int RestoreFontData(char *Str, LOGFONT *Font); + +static void EncodePassword(char *Str, char *Buf); +static void EncodePasswordOriginal(char *Str, char *Buf); +static void EncodePassword2(char *Str, char *Buf, const char *Key); +static void EncodePassword3(char *Str, char *Buf, const char *Key); + +static void DecodePassword(char *Str, char *Buf); +static void DecodePasswordOriginal(char *Str, char *Buf); +static void DecodePassword2(char *Str, char *Buf, const char *Key); +static void DecodePassword3(char *Str, char *Buf, const char *Key); +static int CreateAesKey(unsigned char *AesKey, const char* Key); + +static void SetRegType(int Type); +static int OpenReg(char *Name, void **Handle); +static int CreateReg(char *Name, void **Handle); +static int CloseReg(void *Handle); +static int OpenSubKey(void *Parent, char *Name, void **Handle); +static int CreateSubKey(void *Parent, char *Name, void **Handle); +static int CloseSubKey(void *Handle); +static int DeleteSubKey(void *Handle, char *Name); +static int DeleteValue(void *Handle, char *Name); +static int ReadIntValueFromReg(void *Handle, char *Name, int *Value); +static int WriteIntValueToReg(void *Handle, char *Name, int Value); +static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size); +static int WriteStringToReg(void *Handle, char *Name, char *Str); +static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Size); +static int WriteMultiStringToReg(void *Handle, char *Name, char *Str); +static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size); +static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len); + +int CheckPasswordValidity( char* Password, int length, const char* HashStr ); +void CreatePasswordHash( char* Password, int length, char* HashStr ); +void SetHashSalt( DWORD salt ); + +DWORD GetRandamDWRODValue(void); + +/* 2010.01.30 genta ’ljÁ */ +static char SecretKey[FMAX_PATH+1]; +static int SecretKeyLength; +static int IsMasterPasswordError = PASSWORD_OK; + +static int IsRndSourceInit = 0; +static ulong RndSource[9]; + +/*===== ŠO•”ŽQÆ =====*/ + +/* Ý’è’l */ +extern int WinPosX; +extern int WinPosY; +extern int WinWidth; +extern int WinHeight; +extern int LocalWidth; +extern int TaskHeight; +extern int LocalTabWidth[4]; +extern int RemoteTabWidth[6]; +extern char UserMailAdrs[USER_MAIL_LEN+1]; +extern char ViewerName[VIEWERS][FMAX_PATH+1]; +extern HFONT ListFont; +extern LOGFONT ListLogFont; +extern int LocalFileSort; +extern int LocalDirSort; +extern int RemoteFileSort; +extern int RemoteDirSort; +extern int TransMode; +extern int ConnectOnStart; +extern int DebugConsole; +extern int SaveWinPos; +extern char AsciiExt[ASCII_EXT_LEN+1]; +extern int RecvMode; +extern int SendMode; +extern int MoveMode; +extern int ListType; +extern int CacheEntry; +extern int CacheSave; +extern char DefaultLocalPath[FMAX_PATH+1]; +extern int SaveTimeStamp; +extern int FindMode; +extern int DotFile; +extern int DclickOpen; +extern SOUNDFILE Sound[SOUND_TYPES]; +extern int FnameCnv; +extern int ConnectAndSet; +extern int TimeOut; +extern int RmEOF; +extern int RegType; +extern char FwallHost[HOST_ADRS_LEN+1]; +extern char FwallUser[USER_NAME_LEN+1]; +extern char FwallPass[PASSWORD_LEN+1]; +extern int FwallPort; +extern int FwallType; +extern int FwallDefault; +extern int FwallSecurity; +extern int FwallResolv; +extern int FwallLower; +extern int FwallDelimiter; +extern int PasvDefault; +extern char MirrorNoTrn[MIRROR_LEN+1]; +extern char MirrorNoDel[MIRROR_LEN+1]; +extern int MirrorFnameCnv; +//extern int MirrorFolderCnv; +extern int RasClose; +extern int RasCloseNotify; +extern int FileHist; +extern char DefAttrList[DEFATTRLIST_LEN+1]; +extern SIZE HostDlgSize; +extern SIZE BmarkDlgSize; +extern SIZE MirrorDlgSize; +extern int Sizing; +extern int SortSave; +extern char TmpPath[FMAX_PATH+1]; +extern int QuickAnonymous; +extern int PassToHist; +extern int VaxSemicolon; +extern int SendQuit; +extern int NoRasControl; +extern int SuppressSave; + +extern int UpExistMode; +extern int ExistMode; +extern int DispIgnoreHide; +extern int DispDrives; +extern int MirUpDelNotify; +extern int MirDownDelNotify; + +extern int FolderAttr; +extern int FolderAttrNum; + +/*----- ƒ}ƒXƒ^ƒpƒXƒ[ƒh‚̐ݒè ---------------------------------------------- +* +* Parameter +* const char* Password : ƒ}ƒXƒ^[ƒpƒXƒ[ƒh +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +void SetMasterPassword( const char* Password ) +{ + ZeroMemory( SecretKey, MAX_PASSWORD_LEN + 12 ); + if( Password != NULL ){ + strncpy( SecretKey, Password, MAX_PASSWORD_LEN ); + } + else { + strcpy( SecretKey, DEFAULT_PASSWORD ); + } + SecretKeyLength = strlen( SecretKey ); + + /* –¢ŒŸØ‚Ȃ̂ŁC‰Šúó‘Ô‚ÍOK‚É‚·‚é (‹­§ÄÝ’聨•Û‘¶‚É‚ð‰Â”\‚É‚·‚é)*/ + IsMasterPasswordError = PASSWORD_OK; +} + +/*----- ƒ}ƒXƒ^ƒpƒXƒ[ƒh‚̏ó‘Ԏ擾 ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* PASSWORD_OK : OK +* PASSWORD_UNMATCH : ƒpƒXƒ[ƒh•sˆê’v +* BAD_PASSWORD_HASH : ƒpƒXƒ[ƒhŠm”FŽ¸”s +*----------------------------------------------------------------------------*/ +int GetMasterPasswordStatus(void) +{ + return IsMasterPasswordError; +} + +/*----- ƒŒƒWƒXƒgƒŠ^INIƒtƒ@ƒCƒ‹‚̃}ƒXƒ^[ƒpƒXƒ[ƒh‚ÌŒŸØ‚ðs‚¤ ------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +int ValidateMasterPassword(void) +{ + void *hKey3; + int i; + + SetRegType(REGTYPE_INI); + if((i = OpenReg("FFFTP", &hKey3)) != SUCCESS) + { + if(AskForceIni() == NO) + { + SetRegType(REGTYPE_REG); + i = OpenReg("FFFTP", &hKey3); + } + } + if(i == SUCCESS){ + char checkbuf[48]; + int salt = 0; + + if( ReadIntValueFromReg(hKey3, "CredentialSalt", &salt)){ + SetHashSalt( salt ); + } + if( ReadStringFromReg(hKey3, "CredentialCheck", checkbuf, sizeof( checkbuf )) == SUCCESS ){ + switch( CheckPasswordValidity( SecretKey, SecretKeyLength, checkbuf ) ){ + case 0: /* not match */ + IsMasterPasswordError = PASSWORD_UNMATCH; + break; + case 1: /* match */ + IsMasterPasswordError = PASSWORD_OK; + break; + case 2: /* invalid hash */ + default: + IsMasterPasswordError = BAD_PASSWORD_HASH; + break; + } + } + CloseReg(hKey3); + return YES; + } + return NO; +} + +/*----- ƒŒƒWƒXƒgƒŠ^INIƒtƒ@ƒCƒ‹‚ɐݒè’l‚ð•Û‘¶ --------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SaveRegistory(void) +{ + void *hKey3; + void *hKey4; + void *hKey5; + char Str[FMAX_PATH+1]; + int i; + int n; + HOSTDATA DefaultHost; + HOSTDATA Host; + HISTORYDATA Hist; + HISTORYDATA DefaultHist; + + if( GetMasterPasswordStatus() == PASSWORD_UNMATCH ){ + /* 2010.01.30 genta: ƒ}ƒXƒ^[ƒpƒXƒ[ƒh‚ª•sˆê’v‚̏ꍇ‚Í•s—pˆÓ‚ɏ㏑‚«‚µ‚È‚¢ */ + return; + } + + SetRegType(RegType); + if(CreateReg("FFFTP", &hKey3) == SUCCESS) + { + char buf[48]; + int salt = GetTickCount(); + + WriteIntValueToReg(hKey3, "Version", VER_NUM); + WriteIntValueToReg(hKey3, "CredentialSalt", salt); + + SetHashSalt( salt ); + /* save password hash */ + CreatePasswordHash( SecretKey, SecretKeyLength, buf ); + WriteStringToReg(hKey3, "CredentialCheck", buf); + + if(CreateSubKey(hKey3, "Options", &hKey4) == SUCCESS) + { + WriteIntValueToReg(hKey4, "NoSave", SuppressSave); + + if(SuppressSave != YES) + { + WriteIntValueToReg(hKey4, "WinPosX", WinPosX); + WriteIntValueToReg(hKey4, "WinPosY", WinPosY); + WriteIntValueToReg(hKey4, "WinWidth", WinWidth); + WriteIntValueToReg(hKey4, "WinHeight", WinHeight); + WriteIntValueToReg(hKey4, "LocalWidth", LocalWidth); + WriteIntValueToReg(hKey4, "TaskHeight", TaskHeight); + WriteBinaryToReg(hKey4, "LocalColm", LocalTabWidth, sizeof(LocalTabWidth)); + WriteBinaryToReg(hKey4, "RemoteColm", RemoteTabWidth, sizeof(RemoteTabWidth)); + WriteIntValueToReg(hKey4, "SwCmd", Sizing); + + WriteStringToReg(hKey4, "UserMail", UserMailAdrs); + WriteStringToReg(hKey4, "Viewer", ViewerName[0]); + WriteStringToReg(hKey4, "Viewer2", ViewerName[1]); + WriteStringToReg(hKey4, "Viewer3", ViewerName[2]); + + WriteIntValueToReg(hKey4, "TrType", TransMode); + WriteIntValueToReg(hKey4, "Recv", RecvMode); + WriteIntValueToReg(hKey4, "Send", SendMode); + WriteIntValueToReg(hKey4, "Move", MoveMode); + WriteStringToReg(hKey4, "Path", DefaultLocalPath); + WriteIntValueToReg(hKey4, "Time", SaveTimeStamp); + WriteIntValueToReg(hKey4, "EOF", RmEOF); + WriteIntValueToReg(hKey4, "Scolon", VaxSemicolon); + + WriteIntValueToReg(hKey4, "RecvEx", ExistMode); + WriteIntValueToReg(hKey4, "SendEx", UpExistMode); + + WriteIntValueToReg(hKey4, "LFsort", LocalFileSort); + WriteIntValueToReg(hKey4, "LDsort", LocalDirSort); + WriteIntValueToReg(hKey4, "RFsort", RemoteFileSort); + WriteIntValueToReg(hKey4, "RDsort", RemoteDirSort); + WriteIntValueToReg(hKey4, "SortSave", SortSave); + + WriteIntValueToReg(hKey4, "ListType", ListType); + WriteIntValueToReg(hKey4, "Cache", CacheEntry); + WriteIntValueToReg(hKey4, "CacheSave", CacheSave); + WriteIntValueToReg(hKey4, "DotFile", DotFile); + WriteIntValueToReg(hKey4, "Dclick", DclickOpen); + + WriteIntValueToReg(hKey4, "ConS", ConnectOnStart); + WriteIntValueToReg(hKey4, "OldDlg", ConnectAndSet); + WriteIntValueToReg(hKey4, "RasClose", RasClose); + WriteIntValueToReg(hKey4, "RasNotify", RasCloseNotify); + WriteIntValueToReg(hKey4, "Qanony", QuickAnonymous); + WriteIntValueToReg(hKey4, "PassHist", PassToHist); + WriteIntValueToReg(hKey4, "SendQuit", SendQuit); + WriteIntValueToReg(hKey4, "NoRas", NoRasControl); + + WriteIntValueToReg(hKey4, "Debug", DebugConsole); + WriteIntValueToReg(hKey4, "WinPos", SaveWinPos); + WriteIntValueToReg(hKey4, "RegExp", FindMode); + WriteIntValueToReg(hKey4, "Reg", RegType); + + WriteMultiStringToReg(hKey4, "AsciiFile", AsciiExt); + WriteIntValueToReg(hKey4, "LowUp", FnameCnv); + WriteIntValueToReg(hKey4, "Tout", TimeOut); + + WriteMultiStringToReg(hKey4, "NoTrn", MirrorNoTrn); + WriteMultiStringToReg(hKey4, "NoDel", MirrorNoDel); + WriteIntValueToReg(hKey4, "MirFile", MirrorFnameCnv); + WriteIntValueToReg(hKey4, "MirUNot", MirUpDelNotify); + WriteIntValueToReg(hKey4, "MirDNot", MirDownDelNotify); + + MakeFontData(ListLogFont, ListFont, Str); + WriteStringToReg(hKey4, "ListFont", Str); + WriteIntValueToReg(hKey4, "ListHide", DispIgnoreHide); + WriteIntValueToReg(hKey4, "ListDrv", DispDrives); + + WriteStringToReg(hKey4, "FwallHost", FwallHost); + WriteStringToReg(hKey4, "FwallUser", FwallUser); + EncodePassword(FwallPass, Str); + WriteStringToReg(hKey4, "FwallPass", Str); + WriteIntValueToReg(hKey4, "FwallPort", FwallPort); + WriteIntValueToReg(hKey4, "FwallType", FwallType); + WriteIntValueToReg(hKey4, "FwallDef", FwallDefault); + WriteIntValueToReg(hKey4, "FwallSec", FwallSecurity); + WriteIntValueToReg(hKey4, "PasvDef", PasvDefault); + WriteIntValueToReg(hKey4, "FwallRes", FwallResolv); + WriteIntValueToReg(hKey4, "FwallLow", FwallLower); + WriteIntValueToReg(hKey4, "FwallDel", FwallDelimiter); + + WriteIntValueToReg(hKey4, "SndConSw", Sound[SND_CONNECT].On); + WriteIntValueToReg(hKey4, "SndTrnSw", Sound[SND_TRANS].On); + WriteIntValueToReg(hKey4, "SndErrSw", Sound[SND_ERROR].On); + WriteStringToReg(hKey4, "SndCon", Sound[SND_CONNECT].Fname); + WriteStringToReg(hKey4, "SndTrn", Sound[SND_TRANS].Fname); + WriteStringToReg(hKey4, "SndErr", Sound[SND_ERROR].Fname); + + WriteMultiStringToReg(hKey4, "DefAttr", DefAttrList); + + GetTempPath(FMAX_PATH, Str); + SaveStr(hKey4, "Tmp", TmpPath, Str); + + WriteBinaryToReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE)); + WriteBinaryToReg(hKey4, "Bdlg", &BmarkDlgSize, sizeof(SIZE)); + WriteBinaryToReg(hKey4, "Mdlg", &MirrorDlgSize, sizeof(SIZE)); + + WriteIntValueToReg(hKey4, "FAttrSw", FolderAttr); + WriteIntValueToReg(hKey4, "FAttr", FolderAttrNum); + + WriteIntValueToReg(hKey4, "HistNum", FileHist); + + /* Ver1.54aˆÈ‘O‚ÌŒ`Ž®‚̃qƒXƒgƒŠƒf[ƒ^‚͍폜 */ + DeleteValue(hKey4, "Hist"); + + /* ƒqƒXƒgƒŠ‚̐ݒè‚ð•Û‘¶ */ + CopyDefaultHistory(&DefaultHist); + n = 0; + for(i = AskHistoryNum(); i > 0; i--) + { + if(GetHistoryByNum(i-1, &Hist) == SUCCESS) + { + sprintf(Str, "History%d", n); + if(CreateSubKey(hKey4, Str, &hKey5) == SUCCESS) + { + SaveStr(hKey5, "HostAdrs", Hist.HostAdrs, DefaultHist.HostAdrs); + SaveStr(hKey5, "UserName", Hist.UserName, DefaultHist.UserName); + SaveStr(hKey5, "Account", Hist.Account, DefaultHist.Account); + SaveStr(hKey5, "LocalDir", Hist.LocalInitDir, NULL); + SaveStr(hKey5, "RemoteDir", Hist.RemoteInitDir, DefaultHist.RemoteInitDir); + SaveStr(hKey5, "Chmod", Hist.ChmodCmd, DefaultHist.ChmodCmd); + SaveStr(hKey5, "Nlst", Hist.LsName, DefaultHist.LsName); + SaveStr(hKey5, "Init", Hist.InitCmd, DefaultHist.InitCmd); + EncodePassword(Hist.PassWord, Str); + SaveStr(hKey5, "Password", Str, DefaultHist.PassWord); + SaveIntNum(hKey5, "Port", Hist.Port, DefaultHist.Port); + SaveIntNum(hKey5, "Kanji", Hist.KanjiCode, DefaultHist.KanjiCode); + SaveIntNum(hKey5, "KanaCnv", Hist.KanaCnv, DefaultHist.KanaCnv); + SaveIntNum(hKey5, "NameKanji", Hist.NameKanjiCode, DefaultHist.NameKanjiCode); + SaveIntNum(hKey5, "NameKana", Hist.NameKanaCnv, DefaultHist.NameKanaCnv); + SaveIntNum(hKey5, "Pasv", Hist.Pasv, DefaultHist.Pasv); + SaveIntNum(hKey5, "Fwall", Hist.FireWall, DefaultHist.FireWall); + SaveIntNum(hKey5, "List", Hist.ListCmdOnly, DefaultHist.ListCmdOnly); + SaveIntNum(hKey5, "NLST-R", Hist.UseNLST_R, DefaultHist.UseNLST_R); + SaveIntNum(hKey5, "Tzone", Hist.TimeZone, DefaultHist.TimeZone); + SaveIntNum(hKey5, "Type", Hist.HostType, DefaultHist.HostType); + SaveIntNum(hKey5, "Sync", Hist.SyncMove, DefaultHist.SyncMove); + SaveIntNum(hKey5, "Fpath", Hist.NoFullPath, DefaultHist.NoFullPath); + WriteBinaryToReg(hKey5, "Sort", &Hist.Sort, sizeof(Hist.Sort)); + SaveIntNum(hKey5, "Secu", Hist.Security, DefaultHist.Security); + WriteIntValueToReg(hKey5, "TrType", Hist.Type); + SaveIntNum(hKey5, "Dial", Hist.Dialup, DefaultHist.Dialup); + SaveIntNum(hKey5, "UseIt", Hist.DialupAlways, DefaultHist.DialupAlways); + SaveIntNum(hKey5, "Notify", Hist.DialupNotify, DefaultHist.DialupNotify); + SaveStr(hKey5, "DialTo", Hist.DialEntry, DefaultHist.DialEntry); + + CloseSubKey(hKey5); + n++; + } + } + } + WriteIntValueToReg(hKey4, "SavedHist", n); + + /* —]•ª‚ȃqƒXƒgƒŠ‚ª‚ ‚Á‚½‚çíœ */ + for(; n < 999; n++) + { + sprintf(Str, "History%d", n); + if(DeleteSubKey(hKey4, Str) != SUCCESS) + break; + } + + /* ƒzƒXƒg‚̐ݒè‚ð•Û‘¶ */ + CopyDefaultHost(&DefaultHost); + i = 0; + while(CopyHostFromList(i, &Host) == SUCCESS) + { + sprintf(Str, "Host%d", i); + if(CreateSubKey(hKey4, Str, &hKey5) == SUCCESS) + { +// SaveIntNum(hKey5, "Set", Host.Level, DefaultHost.Level); + WriteIntValueToReg(hKey5, "Set", Host.Level); + SaveStr(hKey5, "HostName", Host.HostName, DefaultHost.HostName); + if((Host.Level & SET_LEVEL_GROUP) == 0) + { + SaveStr(hKey5, "HostAdrs", Host.HostAdrs, DefaultHost.HostAdrs); + SaveStr(hKey5, "UserName", Host.UserName, DefaultHost.UserName); + SaveStr(hKey5, "Account", Host.Account, DefaultHost.Account); + SaveStr(hKey5, "LocalDir", Host.LocalInitDir, NULL); + SaveStr(hKey5, "RemoteDir", Host.RemoteInitDir, DefaultHost.RemoteInitDir); + SaveStr(hKey5, "Chmod", Host.ChmodCmd, DefaultHost.ChmodCmd); + SaveStr(hKey5, "Nlst", Host.LsName, DefaultHost.LsName); + SaveStr(hKey5, "Init", Host.InitCmd, DefaultHost.InitCmd); + + if(Host.Anonymous == NO) + EncodePassword(Host.PassWord, Str); + else + strcpy(Str, DefaultHost.PassWord); + SaveStr(hKey5, "Password", Str, DefaultHost.PassWord); + + SaveIntNum(hKey5, "Port", Host.Port, DefaultHost.Port); + SaveIntNum(hKey5, "Anonymous", Host.Anonymous, DefaultHost.Anonymous); + SaveIntNum(hKey5, "Kanji", Host.KanjiCode, DefaultHost.KanjiCode); + SaveIntNum(hKey5, "KanaCnv", Host.KanaCnv, DefaultHost.KanaCnv); + SaveIntNum(hKey5, "NameKanji", Host.NameKanjiCode, DefaultHost.NameKanjiCode); + SaveIntNum(hKey5, "NameKana", Host.NameKanaCnv, DefaultHost.NameKanaCnv); + SaveIntNum(hKey5, "Pasv", Host.Pasv, DefaultHost.Pasv); + SaveIntNum(hKey5, "Fwall", Host.FireWall, DefaultHost.FireWall); + SaveIntNum(hKey5, "List", Host.ListCmdOnly, DefaultHost.ListCmdOnly); + SaveIntNum(hKey5, "NLST-R", Host.UseNLST_R, DefaultHost.UseNLST_R); + SaveIntNum(hKey5, "Last", Host.LastDir, DefaultHost.LastDir); + SaveIntNum(hKey5, "Tzone", Host.TimeZone, DefaultHost.TimeZone); + SaveIntNum(hKey5, "Type", Host.HostType, DefaultHost.HostType); + SaveIntNum(hKey5, "Sync", Host.SyncMove, DefaultHost.SyncMove); + SaveIntNum(hKey5, "Fpath", Host.NoFullPath, DefaultHost.NoFullPath); + WriteBinaryToReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort)); + SaveIntNum(hKey5, "Secu", Host.Security, DefaultHost.Security); + + WriteMultiStringToReg(hKey5, "Bmarks", Host.BookMark); + + SaveIntNum(hKey5, "Dial", Host.Dialup, DefaultHost.Dialup); + SaveIntNum(hKey5, "UseIt", Host.DialupAlways, DefaultHost.DialupAlways); + SaveIntNum(hKey5, "Notify", Host.DialupNotify, DefaultHost.DialupNotify); + SaveStr(hKey5, "DialTo", Host.DialEntry, DefaultHost.DialEntry); + } + CloseSubKey(hKey5); + } + i++; + } + WriteIntValueToReg(hKey4, "SetNum", i); + + /* —]•ª‚ȃzƒXƒg‚̐ݒ肪‚ ‚Á‚½‚çíœ */ + for(; i < 998; i++) + { + sprintf(Str, "Host%d", i); + if(DeleteSubKey(hKey4, Str) != SUCCESS) + break; + } + + if((i = AskCurrentHost()) == HOSTNUM_NOENTRY) + i = 0; + WriteIntValueToReg(hKey4, "CurSet", i); + } + CloseSubKey(hKey4); + } + CloseReg(hKey3); + } + return; +} + +/*----- ƒŒƒWƒXƒgƒŠ^INIƒtƒ@ƒCƒ‹‚©‚çÝ’è’l‚ðŒÄ‚яo‚· --------------------------- +* +* ‚±‚̊֐”‚𕡐”‰ñŒÄ‚яo‚·‚ƁCƒzƒXƒgÝ’肪’ljÁ‚³‚ê‚éD +* +* Parameter +* ‚È‚µ +* +* Return Value +* YES: “ǂݏo‚µ¬Œ÷ +* NO: “ǂݏo‚µŽ¸”s(Ý’è–³‚µ) +*----------------------------------------------------------------------------*/ + +int LoadRegistory(void) +{ + void *hKey3; + void *hKey4; + void *hKey5; + int i; + int Sets; + char Str[256]; /* ASCII_EXT_LEN‚æ‚è‘å‚«‚¢Ž– */ + char *Pos; + char *Pos2; + HOSTDATA Host; + HISTORYDATA Hist; + int Sts; + int Version; + + Sts = NO; + + SetRegType(REGTYPE_INI); + if((i = OpenReg("FFFTP", &hKey3)) != SUCCESS) + { + if(AskForceIni() == NO) + { + SetRegType(REGTYPE_REG); + i = OpenReg("FFFTP", &hKey3); + } + } + + if(i == SUCCESS) + { + char checkbuf[48]; + int salt = 0; + Sts = YES; + + ReadIntValueFromReg(hKey3, "Version", &Version); + + if(OpenSubKey(hKey3, "Options", &hKey4) == SUCCESS) + { + ReadIntValueFromReg(hKey4, "WinPosX", &WinPosX); + ReadIntValueFromReg(hKey4, "WinPosY", &WinPosY); + ReadIntValueFromReg(hKey4, "WinWidth", &WinWidth); + ReadIntValueFromReg(hKey4, "WinHeight", &WinHeight); + ReadIntValueFromReg(hKey4, "LocalWidth", &LocalWidth); + /* «‹Œƒo[ƒWƒ‡ƒ“‚̃oƒO‘΍ô */ + LocalWidth = max1(0, LocalWidth); + ReadIntValueFromReg(hKey4, "TaskHeight", &TaskHeight); + /* «‹Œƒo[ƒWƒ‡ƒ“‚̃oƒO‘΍ô */ + TaskHeight = max1(0, TaskHeight); + ReadBinaryFromReg(hKey4, "LocalColm", &LocalTabWidth, sizeof(LocalTabWidth)); + ReadBinaryFromReg(hKey4, "RemoteColm", &RemoteTabWidth, sizeof(RemoteTabWidth)); + ReadIntValueFromReg(hKey4, "SwCmd", &Sizing); + + ReadStringFromReg(hKey4, "UserMail", UserMailAdrs, USER_MAIL_LEN+1); + ReadStringFromReg(hKey4, "Viewer", ViewerName[0], FMAX_PATH+1); + ReadStringFromReg(hKey4, "Viewer2", ViewerName[1], FMAX_PATH+1); + ReadStringFromReg(hKey4, "Viewer3", ViewerName[2], FMAX_PATH+1); + + ReadIntValueFromReg(hKey4, "TrType", &TransMode); + ReadIntValueFromReg(hKey4, "Recv", &RecvMode); + ReadIntValueFromReg(hKey4, "Send", &SendMode); + ReadIntValueFromReg(hKey4, "Move", &MoveMode); + ReadStringFromReg(hKey4, "Path", DefaultLocalPath, FMAX_PATH+1); + ReadIntValueFromReg(hKey4, "Time", &SaveTimeStamp); + ReadIntValueFromReg(hKey4, "EOF", &RmEOF); + ReadIntValueFromReg(hKey4, "Scolon", &VaxSemicolon); + + ReadIntValueFromReg(hKey4, "RecvEx", &ExistMode); + ReadIntValueFromReg(hKey4, "SendEx", &UpExistMode); + + ReadIntValueFromReg(hKey4, "LFsort", &LocalFileSort); + ReadIntValueFromReg(hKey4, "LDsort", &LocalDirSort); + ReadIntValueFromReg(hKey4, "RFsort", &RemoteFileSort); + ReadIntValueFromReg(hKey4, "RDsort", &RemoteDirSort); + ReadIntValueFromReg(hKey4, "SortSave", &SortSave); + + ReadIntValueFromReg(hKey4, "ListType", &ListType); + ReadIntValueFromReg(hKey4, "Cache", &CacheEntry); + ReadIntValueFromReg(hKey4, "CacheSave", &CacheSave); + ReadIntValueFromReg(hKey4, "DotFile", &DotFile); + ReadIntValueFromReg(hKey4, "Dclick", &DclickOpen); + + ReadIntValueFromReg(hKey4, "ConS", &ConnectOnStart); + ReadIntValueFromReg(hKey4, "OldDlg", &ConnectAndSet); + ReadIntValueFromReg(hKey4, "RasClose", &RasClose); + ReadIntValueFromReg(hKey4, "RasNotify", &RasCloseNotify); + ReadIntValueFromReg(hKey4, "Qanony", &QuickAnonymous); + ReadIntValueFromReg(hKey4, "PassHist", &PassToHist); + ReadIntValueFromReg(hKey4, "SendQuit", &SendQuit); + ReadIntValueFromReg(hKey4, "NoRas", &NoRasControl); + + ReadIntValueFromReg(hKey4, "Debug", &DebugConsole); + ReadIntValueFromReg(hKey4, "WinPos", &SaveWinPos); + ReadIntValueFromReg(hKey4, "RegExp", &FindMode); + ReadIntValueFromReg(hKey4, "Reg", &RegType); + + if(ReadMultiStringFromReg(hKey4, "AsciiFile", AsciiExt, ASCII_EXT_LEN+1) == FAIL) + { + /* ‹ŒASCIIƒ‚[ƒh‚ÌŠg’£Žq‚̐ݒè‚ðV‚µ‚¢‚à‚Ì‚É•ÏŠ· */ + ReadStringFromReg(hKey4, "Ascii", Str, ASCII_EXT_LEN+1); + memset(AsciiExt, NUL, ASCII_EXT_LEN+1); + Pos = Str; + while(*Pos != NUL) + { + if((Pos2 = strchr(Pos, ';')) == NULL) + Pos2 = strchr(Pos, NUL); + if((Pos2 - Pos) > 0) + { + if((StrMultiLen(AsciiExt) + (Pos2 - Pos) + 2) >= ASCII_EXT_LEN) + break; + strcpy(AsciiExt + StrMultiLen(AsciiExt), "*."); + strncpy(AsciiExt + StrMultiLen(AsciiExt) - 1, Pos, (Pos2 - Pos)); + } + Pos = Pos2; + if(*Pos == ';') + Pos++; + } + } + + ReadIntValueFromReg(hKey4, "LowUp", &FnameCnv); + ReadIntValueFromReg(hKey4, "Tout", &TimeOut); + + ReadMultiStringFromReg(hKey4, "NoTrn", MirrorNoTrn, MIRROR_LEN+1); + ReadMultiStringFromReg(hKey4, "NoDel", MirrorNoDel, MIRROR_LEN+1); + ReadIntValueFromReg(hKey4, "MirFile", &MirrorFnameCnv); + ReadIntValueFromReg(hKey4, "MirUNot", &MirUpDelNotify); + ReadIntValueFromReg(hKey4, "MirDNot", &MirDownDelNotify); + + if(ReadStringFromReg(hKey4, "ListFont", Str, 256) == SUCCESS) + { + if(RestoreFontData(Str, &ListLogFont) == SUCCESS) + ListFont = CreateFontIndirect(&ListLogFont); + } + ReadIntValueFromReg(hKey4, "ListHide", &DispIgnoreHide); + ReadIntValueFromReg(hKey4, "ListDrv", &DispDrives); + + ReadStringFromReg(hKey4, "FwallHost", FwallHost, HOST_ADRS_LEN+1); + ReadStringFromReg(hKey4, "FwallUser", FwallUser, USER_NAME_LEN+1); + ReadStringFromReg(hKey4, "FwallPass", Str, 255); + DecodePassword(Str, FwallPass); + ReadIntValueFromReg(hKey4, "FwallPort", &FwallPort); + ReadIntValueFromReg(hKey4, "FwallType", &FwallType); + ReadIntValueFromReg(hKey4, "FwallDef", &FwallDefault); + ReadIntValueFromReg(hKey4, "FwallSec", &FwallSecurity); + ReadIntValueFromReg(hKey4, "PasvDef", &PasvDefault); + ReadIntValueFromReg(hKey4, "FwallRes", &FwallResolv); + ReadIntValueFromReg(hKey4, "FwallLow", &FwallLower); + ReadIntValueFromReg(hKey4, "FwallDel", &FwallDelimiter); + + ReadIntValueFromReg(hKey4, "SndConSw", &Sound[SND_CONNECT].On); + ReadIntValueFromReg(hKey4, "SndTrnSw", &Sound[SND_TRANS].On); + ReadIntValueFromReg(hKey4, "SndErrSw", &Sound[SND_ERROR].On); + ReadStringFromReg(hKey4, "SndCon", Sound[SND_CONNECT].Fname, FMAX_PATH+1); + ReadStringFromReg(hKey4, "SndTrn", Sound[SND_TRANS].Fname, FMAX_PATH+1); + ReadStringFromReg(hKey4, "SndErr", Sound[SND_ERROR].Fname, FMAX_PATH+1); + + ReadMultiStringFromReg(hKey4, "DefAttr", DefAttrList, DEFATTRLIST_LEN+1); + + ReadStringFromReg(hKey4, "Tmp", TmpPath, FMAX_PATH+1); + + ReadBinaryFromReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE)); + ReadBinaryFromReg(hKey4, "Bdlg", &BmarkDlgSize, sizeof(SIZE)); + ReadBinaryFromReg(hKey4, "Mdlg", &MirrorDlgSize, sizeof(SIZE)); + + ReadIntValueFromReg(hKey4, "FAttrSw", &FolderAttr); + ReadIntValueFromReg(hKey4, "FAttr", &FolderAttrNum); + + ReadIntValueFromReg(hKey4, "NoSave", &SuppressSave); + + ReadIntValueFromReg(hKey4, "HistNum", &FileHist); +// ReadMultiStringFromReg(hKey4, "Hist", Hist, (FMAX_PATH+1)*HISTORY_MAX+1); + + /* ƒqƒXƒgƒŠ‚̐ݒè‚ð“ǂݍž‚Þ */ + Sets = 0; + ReadIntValueFromReg(hKey4, "SavedHist", &Sets); + + for(i = 0; i < Sets; i++) + { + sprintf(Str, "History%d", i); + if(OpenSubKey(hKey4, Str, &hKey5) == SUCCESS) + { + CopyDefaultHistory(&Hist); + + ReadStringFromReg(hKey5, "HostAdrs", Hist.HostAdrs, HOST_ADRS_LEN+1); + ReadStringFromReg(hKey5, "UserName", Hist.UserName, USER_NAME_LEN+1); + ReadStringFromReg(hKey5, "Account", Hist.Account, ACCOUNT_LEN+1); + ReadStringFromReg(hKey5, "LocalDir", Hist.LocalInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "RemoteDir", Hist.RemoteInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "Chmod", Hist.ChmodCmd, CHMOD_CMD_LEN+1); + ReadStringFromReg(hKey5, "Nlst", Hist.LsName, NLST_NAME_LEN+1); + ReadStringFromReg(hKey5, "Init", Hist.InitCmd, INITCMD_LEN+1); + ReadIntValueFromReg(hKey5, "Port", &Hist.Port); + ReadIntValueFromReg(hKey5, "Kanji", &Hist.KanjiCode); + ReadIntValueFromReg(hKey5, "KanaCnv", &Hist.KanaCnv); + ReadIntValueFromReg(hKey5, "NameKanji", &Hist.NameKanjiCode); + ReadIntValueFromReg(hKey5, "NameKana", &Hist.NameKanaCnv); + ReadIntValueFromReg(hKey5, "Pasv", &Hist.Pasv); + ReadIntValueFromReg(hKey5, "Fwall", &Hist.FireWall); + ReadIntValueFromReg(hKey5, "List", &Hist.ListCmdOnly); + ReadIntValueFromReg(hKey5, "NLST-R", &Hist.UseNLST_R); + ReadIntValueFromReg(hKey5, "Tzone", &Hist.TimeZone); + ReadIntValueFromReg(hKey5, "Type", &Hist.HostType); + ReadIntValueFromReg(hKey5, "Sync", &Hist.SyncMove); + ReadIntValueFromReg(hKey5, "Fpath", &Hist.NoFullPath); + ReadBinaryFromReg(hKey5, "Sort", &Hist.Sort, sizeof(Hist.Sort)); + ReadIntValueFromReg(hKey5, "Secu", &Hist.Security); + ReadIntValueFromReg(hKey5, "TrType", &Hist.Type); + strcpy(Str, ""); + ReadStringFromReg(hKey5, "Password", Str, 255); + DecodePassword(Str, Hist.PassWord); + ReadIntValueFromReg(hKey5, "Dial", &Hist.Dialup); + ReadIntValueFromReg(hKey5, "UseIt", &Hist.DialupAlways); + ReadIntValueFromReg(hKey5, "Notify", &Hist.DialupNotify); + ReadStringFromReg(hKey5, "DialTo", Hist.DialEntry, RAS_NAME_LEN+1); + + CloseSubKey(hKey5); + AddHistoryToHistory(&Hist); + } + } + + /* ƒzƒXƒg‚̐ݒè‚ð“ǂݍž‚Þ */ + Sets = 0; + ReadIntValueFromReg(hKey4, "SetNum", &Sets); + + for(i = 0; i < Sets; i++) + { + sprintf(Str, "Host%d", i); + if(OpenSubKey(hKey4, Str, &hKey5) == SUCCESS) + { + CopyDefaultHost(&Host); + /* ‰ºˆÊŒÝŠ·«‚Ì‚½‚ß */ + if(Version < VER_NUM) + { + Host.Pasv = NO; + Host.ListCmdOnly = NO; + } + ReadIntValueFromReg(hKey5, "Set", &Host.Level); + + ReadStringFromReg(hKey5, "HostName", Host.HostName, HOST_NAME_LEN+1); + ReadStringFromReg(hKey5, "HostAdrs", Host.HostAdrs, HOST_ADRS_LEN+1); + ReadStringFromReg(hKey5, "UserName", Host.UserName, USER_NAME_LEN+1); + ReadStringFromReg(hKey5, "Account", Host.Account, ACCOUNT_LEN+1); + ReadStringFromReg(hKey5, "LocalDir", Host.LocalInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "RemoteDir", Host.RemoteInitDir, INIT_DIR_LEN+1); + ReadStringFromReg(hKey5, "Chmod", Host.ChmodCmd, CHMOD_CMD_LEN+1); + ReadStringFromReg(hKey5, "Nlst", Host.LsName, NLST_NAME_LEN+1); + ReadStringFromReg(hKey5, "Init", Host.InitCmd, INITCMD_LEN+1); + ReadIntValueFromReg(hKey5, "Port", &Host.Port); + ReadIntValueFromReg(hKey5, "Anonymous", &Host.Anonymous); + ReadIntValueFromReg(hKey5, "Kanji", &Host.KanjiCode); + ReadIntValueFromReg(hKey5, "KanaCnv", &Host.KanaCnv); + ReadIntValueFromReg(hKey5, "NameKanji", &Host.NameKanjiCode); + ReadIntValueFromReg(hKey5, "NameKana", &Host.NameKanaCnv); + ReadIntValueFromReg(hKey5, "Pasv", &Host.Pasv); + ReadIntValueFromReg(hKey5, "Fwall", &Host.FireWall); + ReadIntValueFromReg(hKey5, "List", &Host.ListCmdOnly); + ReadIntValueFromReg(hKey5, "NLST-R", &Host.UseNLST_R); + ReadIntValueFromReg(hKey5, "Last", &Host.LastDir); + ReadIntValueFromReg(hKey5, "Tzone", &Host.TimeZone); + ReadIntValueFromReg(hKey5, "Type", &Host.HostType); + ReadIntValueFromReg(hKey5, "Sync", &Host.SyncMove); + ReadIntValueFromReg(hKey5, "Fpath", &Host.NoFullPath); + ReadBinaryFromReg(hKey5, "Sort", &Host.Sort, sizeof(Host.Sort)); + ReadIntValueFromReg(hKey5, "Secu", &Host.Security); + if(Host.Anonymous != YES) + { + strcpy(Str, ""); + ReadStringFromReg(hKey5, "Password", Str, 255); + DecodePassword(Str, Host.PassWord); + } + else + strcpy(Host.PassWord, UserMailAdrs); + + ReadMultiStringFromReg(hKey5, "Bmarks", Host.BookMark, BOOKMARK_SIZE); + + ReadIntValueFromReg(hKey5, "Dial", &Host.Dialup); + ReadIntValueFromReg(hKey5, "UseIt", &Host.DialupAlways); + ReadIntValueFromReg(hKey5, "Notify", &Host.DialupNotify); + ReadStringFromReg(hKey5, "DialTo", Host.DialEntry, RAS_NAME_LEN+1); + + CloseSubKey(hKey5); + + AddHostToList(&Host, -1, Host.Level); + } + } + + ReadIntValueFromReg(hKey4, "CurSet", &Sets); + SetCurrentHost(Sets); + + CloseSubKey(hKey4); + } + CloseReg(hKey3); + } + else + { + /*===== Å‰‚Ì‹N“®ŽžiÝ’肪–³‚¢) =====*/ + +#if 0 + strcpy(UserMailAdrs, ""); + strcpy(Str, ""); + if(InputDialogBox(mailadrs_dlg, HWND_DESKTOP, NULL, Str, USER_MAIL_LEN+1, &i, IDH_HELP_TOPIC_0000001) == YES) + strcpy(UserMailAdrs, Str); + + for(i = 0; i < SAMPLE_HOSTS; i++) + { + CopyDefaultHost(&Host); + Host.Level = Sample[i].Level; + strcpy(Host.PassWord, UserMailAdrs); + strcpy(Host.HostName, Sample[i].HostName); + strcpy(Host.HostAdrs, Sample[i].HostAdrs); + strcpy(Host.UserName, "anonymous"); + AddHostToList(&Host, -1, Host.Level); + } +#endif + } + return(Sts); +} + + +/*----- ‰B‚µƒhƒ‰ƒCƒuî•ñ‚ðŽæ“¾ ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* DWORD +* YES/NO=Ý’è–³‚µ +*----------------------------------------------------------------------------*/ + +DWORD LoadHideDriveListRegistory(void) +{ + HKEY hKey1; + HKEY hKey2; + HKEY hKey3; + HKEY hKey4; + HKEY hKey5; + HKEY hKey6; + DWORD Size; + DWORD Type; + DWORD Ret; + + Ret = 0; + if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hKey1) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey1, "Microsoft", 0, KEY_READ, &hKey2) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey2, "Windows", 0, KEY_READ, &hKey3) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey3, "CurrentVersion", 0, KEY_READ, &hKey4) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey4, "Policies", 0, KEY_READ, &hKey5) == ERROR_SUCCESS) + { + if(RegOpenKeyEx(hKey5, "Explorer", 0, KEY_READ, &hKey6) == ERROR_SUCCESS) + { + Size = sizeof(DWORD); + RegQueryValueEx(hKey6, "NoDrives", NULL, &Type, (BYTE *)&Ret, &Size); + RegCloseKey(hKey6); + } + RegCloseKey(hKey5); + } + RegCloseKey(hKey4); + } + RegCloseKey(hKey3); + } + RegCloseKey(hKey2); + } + RegCloseKey(hKey1); + } + return(Ret); +} + + +/*----- ƒŒƒWƒXƒgƒŠ‚̐ݒè’l‚ðƒNƒŠƒA -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ClearRegistory(void) +{ + HKEY hKey2; + HKEY hKey3; + HKEY hKey4; + DWORD Dispos; + char Str[20]; + int i; + + if(RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Sota", 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, NULL, &hKey2, &Dispos) == ERROR_SUCCESS) + { + if(RegCreateKeyEx(hKey2, "FFFTP", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey3, &Dispos) == ERROR_SUCCESS) + { + if(RegCreateKeyEx(hKey3, "Options", 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey4, &Dispos) == ERROR_SUCCESS) + { + for(i = 0; ; i++) + { + sprintf(Str, "Host%d", i); + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) + break; + } + for(i = 0; ; i++) + { + sprintf(Str, "History%d", i); + if(RegDeleteKey(hKey4, Str) != ERROR_SUCCESS) + break; + } + RegCloseKey(hKey4); + } + RegDeleteKey(hKey3, "Options"); + RegCloseKey(hKey3); + } + RegDeleteKey(hKey2, "FFFTP"); + RegCloseKey(hKey2); + } + return; +} + + +/*----- Ý’è‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶ -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SaveSettingsToFile(void) +{ + char Tmp[FMAX_PATH*2]; + char Fname[FMAX_PATH+1]; + + if(RegType == REGTYPE_REG) + { + strcpy(Fname, "FFFTP.reg"); + if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN287, "reg", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE) + { + sprintf(Tmp, "/e \x22%s\x22 HKEY_CURRENT_USER\\Software\\sota\\FFFTP", Fname); + if(ShellExecute(NULL, "open", "regedit", Tmp, ".", SW_SHOW) <= (HINSTANCE)32) + { + MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK); + } + } + } + else + { + strcpy(Fname, "FFFTP-Backup.ini"); + if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN288, "ini", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE) + { + CopyFile(AskIniFilePath(), Fname, FALSE); + } + } + return; +} + + +/*----- Ý’è‚ðƒtƒ@ƒCƒ‹‚©‚ç•œŒ³ ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒ[ƒh‚µ‚½‚©‚Ç‚¤‚© (YES/NO) +*----------------------------------------------------------------------------*/ + +int LoadSettingsFromFile(void) +{ + int Ret; + char Tmp[FMAX_PATH*2]; + char Fname[FMAX_PATH+1]; + + Ret = NO; + strcpy(Fname, ""); + if(SelectFile(GetMainHwnd(), Fname, MSGJPN291, MSGJPN290, "", OFN_FILEMUSTEXIST, 0) == TRUE) + { + if((strlen(Fname) >= 5) && (_stricmp(&Fname[strlen(Fname)-4], ".reg") == 0)) + { + sprintf(Tmp, "\x22%s\x22", Fname); + if(ShellExecute(NULL, "open", "regedit", Tmp, ".", SW_SHOW) <= (HINSTANCE)32) + { + MessageBox(NULL, MSGJPN285, "FFFTP", MB_OK); + } + else + { + Ret = YES; + /* ƒŒƒWƒXƒgƒŠƒGƒfƒBƒ^‚ªI—¹‚·‚é‚Ì‚ð‘Ò‚Â */ +// WaitForSingleObject(Info.hProcess, INFINITE); + } + } + else if((strlen(Fname) >= 5) && (_stricmp(&Fname[strlen(Fname)-4], ".ini") == 0)) + { + CopyFile(Fname, AskIniFilePath(), FALSE); + Ret = YES; + } + else + MessageBox(NULL, MSGJPN293, "FFFTP", MB_OK); + } + return(Ret); +} + + + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚É•¶Žš—ñ‚ðƒZ[ƒu -------------------------------- +* +* Parameter +* HKEY hKey : ƒŒƒWƒXƒgƒŠƒL[ +* char *Key : ƒL[–¼ +* char *Str : ƒZ[ƒu‚·‚镶Žš—ñ +* char *DefaultStr : ƒfƒtƒHƒ‹ƒg‚Ì•¶Žš—ñ +* +* Return Value +* ‚È‚µ +* +* Note +* •¶Žš—ñ‚ªƒfƒtƒHƒ‹ƒg‚Ì•¶Žš—ñ‚Æ“¯‚¶‚È‚çƒZ[ƒu‚µ‚È‚¢ +*----------------------------------------------------------------------------*/ + +static void SaveStr(HKEY hKey, char *Key, char *Str, char *DefaultStr) +{ + if((DefaultStr != NULL) && (strcmp(Str, DefaultStr) == 0)) + DeleteValue(hKey, Key); + else + WriteStringToReg(hKey, Key, Str); + + return; +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ɐ”’l(INT)‚ðƒZ[ƒu ----------------------------- +* +* Parameter +* HKEY hKey : ƒŒƒWƒXƒgƒŠƒL[ +* char *Key : ƒL[–¼ +* int Num : ƒZ[ƒu‚·‚é’l +* int DefaultNum : ƒfƒtƒHƒ‹ƒg‚Ì’l +* +* Return Value +* ‚È‚µ +* +* Note +* ”’l‚ªƒfƒtƒHƒ‹ƒg‚Ì’l‚Æ“¯‚¶‚È‚çƒZ[ƒu‚µ‚È‚¢ +*----------------------------------------------------------------------------*/ + +static void SaveIntNum(HKEY hKey, char *Key, int Num, int DefaultNum) +{ + if(Num == DefaultNum) + DeleteValue(hKey, Key); + else + WriteIntValueToReg(hKey, Key, Num); + + return; +} + + +/*----- LOGFONTƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·‚·‚é --------------------------------------- +* +* Parameter +* LOGFONT Font : ƒtƒHƒ“ƒgƒf[ƒ^ +* HFONT hFont : ƒtƒHƒ“ƒg‚̃nƒ“ƒhƒ‹ +* NULL = ƒfƒtƒHƒ‹ƒg‚̃tƒHƒ“ƒg +* char *Buf : ƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void MakeFontData(LOGFONT Font, HFONT hFont, char *Buf) +{ + *Buf = NUL; + if(hFont != NULL) + sprintf(Buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d %s", + Font.lfHeight, Font.lfWidth, Font.lfEscapement, Font.lfOrientation, + Font.lfWeight, Font.lfItalic, Font.lfUnderline, Font.lfStrikeOut, + Font.lfCharSet, Font.lfOutPrecision, Font.lfClipPrecision, + Font.lfQuality, Font.lfPitchAndFamily, Font.lfFaceName); + return; +} + + +/*----- •¶Žš—ñ‚ðLOGFONTƒf[ƒ^‚É•ÏŠ·‚·‚é --------------------------------------- +* +* Parameter +* char *Str : •¶Žš—ñ +* LOGFONT *Font : ƒtƒHƒ“ƒgƒf[ƒ^ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL=•ÏŠ·‚Å‚«‚È‚¢ +*----------------------------------------------------------------------------*/ + +static int RestoreFontData(char *Str, LOGFONT *Font) +{ + int i; + int Sts; + + Sts = FAIL; + if(sscanf(Str, "%d %d %d %d %d %d %d %d %d %d %d %d %d", + &(Font->lfHeight), &(Font->lfWidth), &(Font->lfEscapement), &(Font->lfOrientation), + &(Font->lfWeight), &(Font->lfItalic), &(Font->lfUnderline), &(Font->lfStrikeOut), + &(Font->lfCharSet), &(Font->lfOutPrecision), &(Font->lfClipPrecision), + &(Font->lfQuality), &(Font->lfPitchAndFamily)) == 13) + { + for(i = 13; i > 0; i--) + { + if((Str = strchr(Str, ' ')) == NULL) + break; + Str++; + } + if(i == 0) + { + strcpy(Font->lfFaceName, Str); + Sts = SUCCESS; + } + } + + if(Sts == FAIL) + memset(Font, NUL, sizeof(LOGFONT)); + + return(Sts); +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é ------------------------------------------------ +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void EncodePassword(char *Str, char *Buf) +{ + EncodePassword3( Str, Buf, SecretKey ); +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€) ------------------ +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EncodePasswordOriginal(char *Str, char *Buf) +{ + unsigned char *Get; + unsigned char *Put; + int Rnd; + int Ch; + + srand((unsigned)time(NULL)); + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + if( *Get == NUL ){ + *Put = NUL; + return; + } + + /* Ž¯•ÊŽq‚ðæ“ª‚É’u‚­ */ + Put[0] = '0'; + Put[1] = 'A'; + Put += 2; + + while(*Get != NUL) + { + Rnd = rand() % 3; + Ch = ((int)*Get++) << Rnd; + Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8); + *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF); + *Put++ = 0x40 | ((Ch >> 4) & 0xF); + if((*(Put-2) & 0x1) != 0) + *Put++ = (rand() % 62) + 0x40; + } + *Put = NUL; + return; +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€OKey) ---------------- +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EncodePassword2(char *Str, char *Buf, const char* Key) +{ + unsigned char *Get; + unsigned char *Put; + int Rnd; + int Ch; + + /* 2010.01.31 genta Key */ + unsigned char *KeyHead = (unsigned char *)Key; + unsigned char *KeyEnd = KeyHead + strlen(KeyHead); + unsigned char *KeyCurrent = KeyHead; + + srand((unsigned)time(NULL)); + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + if( *Get == NUL ){ + *Put = NUL; + return; + } + + /* Ž¯•ÊŽq‚ðæ“ª‚É’u‚­ */ + Put[0] = '0'; + Put[1] = 'B'; + Put += 2; + + while(*Get != NUL) + { + Rnd = rand() % 3; + Ch = ((int)(*Get++ ^ *KeyCurrent)) << Rnd; + Ch = (unsigned char)Ch | (unsigned char)(Ch >> 8); + *Put++ = 0x40 | ((Rnd & 0x3) << 4) | (Ch & 0xF); + *Put++ = 0x40 | ((Ch >> 4) & 0xF); + if((*(Put-2) & 0x1) != 0) + *Put++ = (rand() % 62) + 0x40; + + /* 2010.01.31 genta Key */ + if( ++KeyCurrent == KeyEnd ){ + KeyCurrent = KeyHead; + } + } + *Put = NUL; + return; +} + +/*----- ƒpƒXƒ[ƒh‚ðˆÃ†‰»‚·‚é(AES) ------------------------------------------ +* +* Parameter +* char *Str : ƒpƒXƒ[ƒh +* char *Buf : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void EncodePassword3(char *Str, char *Buf, const char *Key) +{ + unsigned char *Put; + unsigned char *AesEncBuf; + unsigned char *StrPadBuf; + size_t StrLen; + size_t StrPadLen; + size_t StrPadIndex; + size_t IvIndex; + size_t EncBufIndex; + DWORD RandValue; + int RandByteCount; + unsigned char AesKey[32]; + unsigned char AesCbcIv[AES_BLOCK_SIZE]; + aes_encrypt_ctx Ctx; + + Buf[0] = NUL; + + Put = (unsigned char *)Buf; + StrLen = strlen(Str); + StrPadLen = ((StrLen + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE; + + /* Å’á’·‚ð32•¶Žš‚Æ‚·‚é */ +// StrPadLen = min1(StrPadLen, AES_BLOCK_SIZE * 2); + StrPadLen = max1(StrPadLen, AES_BLOCK_SIZE * 2); + + if((StrPadBuf = malloc(StrPadLen)) != NULL) + { + if((AesEncBuf = malloc(StrPadLen)) != NULL) + { + BOOL PutState; + + PutState = FALSE; + strncpy(StrPadBuf, Str, StrPadLen); + + /* PAD•”•ª‚𗐐”‚Å–„‚ß‚é StrPad[StrLen](‚ª—LŒø‚ȏꍇ) ‚Í NUL */ + for(StrPadIndex = StrLen + 1; StrPadIndex < StrPadLen;) + { + RandValue = GetRandamDWRODValue(); + for(RandByteCount = 0; RandByteCount < 4; RandByteCount++) + { + if(StrPadIndex < StrPadLen) + { + StrPadBuf[StrPadIndex++] = (unsigned char)(RandValue & 0xff); + RandValue >>= 8; + } + } + } + + // IV‚̏‰Šú‰» + for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE;) + { + RandValue = GetRandamDWRODValue(); + for(RandByteCount = 0; RandByteCount < 4; RandByteCount++) + { + if(IvIndex < AES_BLOCK_SIZE) + { + AesCbcIv[IvIndex++] = (unsigned char)(RandValue & 0xff); + RandValue >>= 8; + } + } + } + Put[0] = '0'; + Put[1] = 'C'; + Put += 2; + for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE; IvIndex++) + { + sprintf(Put, "%02x", AesCbcIv[IvIndex]); + Put += 2; + } + *Put++ = ':'; + + if(CreateAesKey(AesKey, Key) == SUCCESS) + { + aes_encrypt_key(AesKey, 32, &Ctx); + + if(aes_cbc_encrypt(StrPadBuf, AesEncBuf, StrPadLen, AesCbcIv, &Ctx) == EXIT_SUCCESS) + { + for(EncBufIndex = 0; EncBufIndex < StrPadLen; EncBufIndex++) + { + sprintf(Put, "%02x", AesEncBuf[EncBufIndex]); + Put += 2; + } + *Put = NUL; + PutState = TRUE; + } + } + if(FALSE == PutState) + { + Buf[0] = NUL; + } + free(StrPadBuf); + } + free(AesEncBuf); + } + return; +} + + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­ ---------------------------------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DecodePassword(char *Str, char *Buf) +{ + unsigned char *Get; + unsigned char *Put; + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + if( *Get == NUL ){ + *Put = NUL; + } + else if( 0x40 <= *Get && *Get < 0x80 ){ + /* Original algorithm */ + DecodePasswordOriginal( Str, Buf ); + } + else if( strncmp( Get, "0A", 2 ) == 0 ){ + DecodePasswordOriginal( Str + 2, Buf ); + } + else if( strncmp( Get, "0B", 2 ) == 0 ){ + DecodePassword2( Str + 2, Buf, SecretKey ); + } + else if( strncmp( Get, "0C", 2 ) == 0 ){ + DecodePassword3( Str + 2, Buf, SecretKey ); + } + else { + // unknown encoding + *Put = NUL; + return; + } +} + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€) ------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void DecodePasswordOriginal(char *Str, char *Buf) +{ + unsigned char *Get; + unsigned char *Put; + int Rnd; + int Ch; + + Get = (unsigned char *)Str; + Put = (unsigned char *)Buf; + + while(*Get != NUL) + { + Rnd = ((unsigned int)*Get >> 4) & 0x3; + Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4); + Ch <<= 8; + if((*Get & 0x1) != 0) + Get++; + Get += 2; + Ch >>= Rnd; + Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF); + *Put++ = Ch; + } + *Put = NUL; + return; +} + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­(ƒIƒŠƒWƒiƒ‹ƒAƒ‹ƒSƒŠƒYƒ€OKey) ------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void DecodePassword2(char *Str, char *Buf, const char* Key) +{ + int Rnd; + int Ch; + unsigned char *Get = (unsigned char *)Str; + unsigned char *Put = (unsigned char *)Buf; + + /* 2010.01.31 genta Key */ + unsigned char *KeyHead = (unsigned char *)Key; + unsigned char *KeyEnd = KeyHead + strlen(KeyHead); + unsigned char *KeyCurrent = KeyHead; + + while(*Get != NUL) + { + Rnd = ((unsigned int)*Get >> 4) & 0x3; + Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4); + Ch <<= 8; + if((*Get & 0x1) != 0) + Get++; + Get += 2; + Ch >>= Rnd; + Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF); + *Put++ = Ch ^ *KeyCurrent; + + /* 2010.01.31 genta Key */ + if( ++KeyCurrent == KeyEnd ){ + KeyCurrent = KeyHead; + } + } + *Put = NUL; + return; +} + +/*----- ƒpƒXƒ[ƒh‚̈͆‰»‚ð‰ð‚­(AES) --------------------------------------- +* +* Parameter +* char *Str : ˆÃ†‰»‚µ‚½ƒpƒXƒ[ƒh +* char *Buf : ƒpƒXƒ[ƒh‚ðŠi”[‚·‚éƒoƒbƒtƒ@ +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void DecodePassword3(char *Str, char *Buf, const char *Key) +{ + char *Get; + unsigned char *EncBuf; + size_t StrLen; + size_t IvIndex; + size_t EncBufIndex; + size_t EncBufLen; + unsigned char AesKey[32]; + unsigned char AesCbcIv[AES_BLOCK_SIZE]; + aes_decrypt_ctx Ctx; + + Buf[0] = NUL; + + Get = Str; + StrLen = strlen(Str); + + if(AES_BLOCK_SIZE * 2 + 1 < StrLen) + { + + EncBufLen = (StrLen - 1 ) / 2 - AES_BLOCK_SIZE; + if((EncBuf = malloc(EncBufLen)) != NULL) + { + for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE; IvIndex++) + { + AesCbcIv[IvIndex] = hex2bin(*Get++) << 4; + AesCbcIv[IvIndex] |= hex2bin(*Get++); + } + + if(*Get++ == ':') + { + if(CreateAesKey(AesKey, Key) == SUCCESS) + { + aes_decrypt_key(AesKey, 32, &Ctx); + + for(EncBufIndex = 0; EncBufIndex < EncBufLen; EncBufIndex++) + { + EncBuf[EncBufIndex] = hex2bin(*Get++) << 4; + EncBuf[EncBufIndex] |= hex2bin(*Get++); + } + if(aes_cbc_decrypt(EncBuf, Buf, EncBufLen, AesCbcIv, &Ctx) == EXIT_SUCCESS) + { + Buf[EncBufLen] = NUL; + } + } + } + free(EncBuf); + } + } + return; +} + +/*----- AES—pŒÅ’è’·ƒL[‚ðì¬ ---------------------------------------------- +* +* Parameter +* unsigned char *AesKey : AESˆÃ†Œ® +* const char *Key : ˆÃ†‰»ƒL[ +* +* Return Value +* int ƒXƒe[ƒ^ƒX (SUCCESS/FAIL) +* Note +* SHA-1‚ð‚à‚¿‚¢‚Ä32ByteŒ®‚𐶐¬‚·‚é +*----------------------------------------------------------------------------*/ + +static int CreateAesKey(unsigned char *AesKey, const char* Key) +{ + char* HashKey; + uint32 HashKeyLen; + uint32 results[10]; + int ByteOffset; + int KeyIndex; + int ResIndex; + + HashKeyLen = strlen(Key) + 16; + if((HashKey = malloc(HashKeyLen + 1)) == NULL){ + return (FAIL); + } + + strcpy(HashKey, Key); + strcat(HashKey, ">g^r=@N7=//z<[`:"); + sha_memory((uchar *)HashKey, HashKeyLen, results); + + strcpy(HashKey, Key); + strcat(HashKey, "VG77dO1#EyC]$|C@"); + sha_memory((uchar *)HashKey, HashKeyLen, results + 5); + + KeyIndex = 0; + ResIndex = 0; + while(ResIndex < 8){ + for(ByteOffset = 0; ByteOffset < 4; ByteOffset++){ + AesKey[KeyIndex++] = (results[ResIndex] >> ByteOffset * 8) & 0xff; + } + ResIndex++; + } + free(HashKey); + + return (SUCCESS); +} + + +/*===== ƒŒƒWƒXƒgƒŠ‚ÆINIƒtƒ@ƒCƒ‹‚̃AƒNƒZƒXˆ— ============*/ + + +/*===== INIƒtƒ@ƒCƒ‹—p‚̃ŒƒWƒXƒgƒŠƒf[ƒ^ =====*/ + +typedef struct regdatatbl { + char KeyName[80+1]; /* ƒL[–¼ */ + char ValTbl[REG_SECT_MAX]; /* ’l‚̃e[ƒuƒ‹ */ + int ValLen; /* ’lƒf[ƒ^‚̃oƒCƒg” */ + int Mode; /* ƒL[‚̃‚[ƒh */ + struct regdatatbl *Next; +} REGDATATBL; + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL WriteOutRegToFile(REGDATATBL *Pos); +static int ReadInReg(char *Name, REGDATATBL **Handle); +static int StrCatOut(char *Src, int Len, char *Dst); +static int StrReadIn(char *Src, int Max, char *Dst); +static char *ScanValue(void *Handle, char *Name); + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static int TmpRegType; + + + +/*----- ƒŒƒWƒXƒgƒŠ‚̃^ƒCƒv‚ðÝ’è‚·‚é ------------------------------------------ +* +* Parameter +* int Type : ƒ^ƒCƒv (REGTYPE_xxx) +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static void SetRegType(int Type) +{ + TmpRegType = Type; + return; +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ðƒI[ƒvƒ“‚·‚éi“ǂݍž‚݁j----------------------- +* +* Parameter +* char *Name : ƒŒƒWƒXƒgƒŠ–¼ +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int OpenReg(char *Name, void **Handle) +{ + int Sts; + char Tmp[FMAX_PATH+1]; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + strcpy(Tmp, "Software\\Sota\\"); + strcat(Tmp, Name); + if(RegOpenKeyEx(HKEY_CURRENT_USER, Tmp, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((Sts = ReadInReg(Name, (REGDATATBL **)Handle)) == SUCCESS) + ((REGDATATBL *)(*Handle))->Mode = 0; + } + return(Sts); +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ðì¬‚·‚éi‘‚«ž‚݁j--------------------------- +* +* Parameter +* char *Name : ƒŒƒWƒXƒgƒŠ–¼ +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CreateReg(char *Name, void **Handle) +{ + int Sts; + char Tmp[FMAX_PATH+1]; + DWORD Dispos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + strcpy(Tmp, "Software\\Sota\\"); + strcat(Tmp, Name); + if(RegCreateKeyEx(HKEY_CURRENT_USER, Tmp, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((*Handle = malloc(sizeof(REGDATATBL))) != NULL) + { + strcpy(((REGDATATBL *)(*Handle))->KeyName, Name); + ((REGDATATBL *)(*Handle))->ValLen = 0; + ((REGDATATBL *)(*Handle))->Next = NULL; + ((REGDATATBL *)(*Handle))->Mode = 1; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒŒƒWƒXƒgƒŠ/INIƒtƒ@ƒCƒ‹‚ðƒNƒ[ƒY‚·‚é ---------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CloseReg(void *Handle) +{ + REGDATATBL *Pos; + REGDATATBL *Next; + FILE *Strm; + + if(TmpRegType == REGTYPE_REG) + { + RegCloseKey(Handle); + + /* INIƒtƒ@ƒCƒ‹‚ðíœ */ + if((Strm = fopen(AskIniFilePath(), "rt")) != NULL) + { + fclose(Strm); + MoveFileToTrashCan(AskIniFilePath()); + } + } + else + { + if(((REGDATATBL *)Handle)->Mode == 1) + { + if(WriteOutRegToFile(Handle) == TRUE) + { +// /* ƒŒƒWƒXƒgƒŠ‚ðƒNƒŠƒA */ +// ClearRegistory(); + } + } + /* ƒe[ƒuƒ‹‚ðíœ */ + Pos = Handle; + while(Pos != NULL) + { + Next = Pos->Next; + free(Pos); + Pos = Next; + } + } + return(SUCCESS); +} + + +/*----- ƒŒƒWƒXƒgƒŠî•ñ‚ðINIƒtƒ@ƒCƒ‹‚ɏ‘‚«ž‚Þ --------------------------------- +* +* Parameter +* REGDATATBL *Pos : ƒŒƒWƒXƒgƒŠƒf[ƒ^ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static BOOL WriteOutRegToFile(REGDATATBL *Pos) +{ + FILE *Strm; + char *Disp; + BOOL Ret; + + Ret = FALSE; + if((Strm = fopen(AskIniFilePath(), "wt")) != NULL) + { + fprintf(Strm, MSGJPN239); + while(Pos != NULL) + { + fprintf(Strm, "\n[%s]\n", Pos->KeyName); + + Disp = Pos->ValTbl; + while(Disp < (Pos->ValTbl + Pos->ValLen)) + { + fprintf(Strm, "%s\n", Disp); + Disp = Disp + strlen(Disp) + 1; + } + Pos = Pos->Next; + } + fclose(Strm); + Ret = TRUE; + } + else + MessageBox(NULL, MSGJPN240, "FFFTP", MB_OK); + + return(Ret); +} + + +/*----- INIƒtƒ@ƒCƒ‹‚©‚烌ƒWƒXƒgƒŠî•ñ‚ð“ǂݍž‚Þ ------------------------------- +* +* Parameter +* char *Name : –¼‘O +* void *Handle : ƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadInReg(char *Name, REGDATATBL **Handle) +{ + FILE *Strm; + char *Buf; + char *Tmp; + char *Data; + REGDATATBL *New; + REGDATATBL *Pos; + int Sts; + + Sts = FAIL; + *Handle = NULL; + + if((Strm = fopen(AskIniFilePath(), "rt")) != NULL) + { + if((Buf = malloc(REG_SECT_MAX)) != NULL) + { + while(fgets(Buf, REG_SECT_MAX, Strm) != NULL) + { + if(*Buf != '#') + { + if((Tmp = strchr(Buf, '\n')) != NULL) + *Tmp = NUL; + + if(*Buf == '[') + { + if((New = malloc(sizeof(REGDATATBL))) != NULL) + { + if((Tmp = strchr(Buf, ']')) != NULL) + *Tmp = NUL; + strcpy(New->KeyName, Buf+1); + New->ValLen = 0; + New->Next = NULL; + Data = New->ValTbl; + } + if(*Handle == NULL) + *Handle = New; + else + { + Pos = *Handle; + while(Pos->Next != NULL) + Pos = Pos->Next; + Pos->Next = New; + } + } + else if(strlen(Buf) > 0) + { + strcpy(Data, Buf); + Data += strlen(Buf) + 1; + New->ValLen += strlen(Buf) + 1; + } + } + } + Sts = SUCCESS; + free(Buf); + } + fclose(Strm); + } + return(Sts); +} + + +/*----- ƒTƒuƒL[‚ðƒI[ƒvƒ“‚·‚é ------------------------------------------------ +* +* Parameter +* void *Parent : e‚̃nƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int OpenSubKey(void *Parent, char *Name, void **Handle) +{ + int Sts; + char Key[80]; + REGDATATBL *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegOpenKeyEx(Parent, Name, 0, KEY_READ, (HKEY *)Handle) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + strcpy(Key, ((REGDATATBL *)Parent)->KeyName); + strcat(Key, "\\"); + strcat(Key, Name); + Pos = Parent; + while(Pos != NULL) + { + if(strcmp(Pos->KeyName, Key) == 0) + { + *Handle = Pos; + Sts = SUCCESS; + break; + } + Pos = Pos->Next; + } + } + return(Sts); +} + + +/*----- ƒTƒuƒL[‚ðì¬‚·‚é ---------------------------------------------------- +* +* Parameter +* void *Parent : e‚̃nƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void **Handle : ƒnƒ“ƒhƒ‹‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CreateSubKey(void *Parent, char *Name, void **Handle) +{ + int Sts; + DWORD Dispos; + REGDATATBL *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegCreateKeyEx(Parent, Name, 0, "", REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, (HKEY *)Handle, &Dispos) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((*Handle = malloc(sizeof(REGDATATBL))) != NULL) + { + strcpy(((REGDATATBL *)(*Handle))->KeyName, ((REGDATATBL *)Parent)->KeyName); + strcat(((REGDATATBL *)(*Handle))->KeyName, "\\"); + strcat(((REGDATATBL *)(*Handle))->KeyName, Name); + + ((REGDATATBL *)(*Handle))->ValLen = 0; + ((REGDATATBL *)(*Handle))->Next = NULL; + + Pos = (REGDATATBL *)Parent; + while(Pos->Next != NULL) + Pos = Pos->Next; + Pos->Next = *Handle; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒTƒuƒL[‚ðƒNƒ[ƒY‚·‚é ------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CloseSubKey(void *Handle) +{ + if(TmpRegType == REGTYPE_REG) + RegCloseKey(Handle); + else + { + /* Nothing */ + } + return(SUCCESS); +} + + +/*----- ƒTƒuƒL[‚ðíœ‚·‚é ---------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int DeleteSubKey(void *Handle, char *Name) +{ + int Sts; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegDeleteKey(Handle, Name) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + Sts = FAIL; + } + return(Sts); +} + + +/*----- ’l‚ðíœ‚·‚é ---------------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int DeleteValue(void *Handle, char *Name) +{ + int Sts; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegDeleteValue(Handle, Name) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + Sts = FAIL; + } + return(Sts); +} + + +/*----- INT’l‚ð“ǂݍž‚Þ ------------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* int *Value : INT’l‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadIntValueFromReg(void *Handle, char *Name, int *Value) +{ + int Sts; + DWORD Size; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + Size = sizeof(int); + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Value, &Size) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + *Value = atoi(Pos); + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- INT’l‚ð‘‚«ž‚Þ ------------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* int Value : INT’l +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteIntValueToReg(void *Handle, char *Name, int Value) +{ + REGDATATBL *Pos; + char *Data; + char Tmp[20]; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_DWORD, (CONST BYTE *)&Value, sizeof(int)); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + sprintf(Tmp, "%d", Value); + strcat(Data, Tmp); + Pos->ValLen += strlen(Data) + 1; + } + return(SUCCESS); +} + + +/*----- •¶Žš—ñ‚ð“ǂݍž‚Þ ------------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str : •¶Žš—ñ‚ð•Ô‚·ƒ[ƒN +* DWORD Size : Å‘åƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS) + { + if(*(Str + Size - 1) != NUL) + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + Size = min1(Size-1, strlen(Pos)); + Size = StrReadIn(Pos, Size, Str); + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- •¶Žš—ñ‚ð‘‚«ž‚Þ ------------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str :•¶Žš—ñ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteStringToReg(void *Handle, char *Name, char *Str) +{ + REGDATATBL *Pos; + char *Data; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_SZ, (CONST BYTE *)Str, strlen(Str)+1); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + Pos->ValLen += strlen(Data); + Data = Pos->ValTbl + Pos->ValLen; + Pos->ValLen += StrCatOut(Str, strlen(Str), Data) + 1; + } + return(SUCCESS); +} + + +/*----- ƒ}ƒ‹ƒ`•¶Žš—ñ‚ð“ǂݍž‚Þ ------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str : •¶Žš—ñ‚ð•Ô‚·ƒ[ƒN +* DWORD Size : Å‘åƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadMultiStringFromReg(void *Handle, char *Name, char *Str, DWORD Size) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Str, &Size) == ERROR_SUCCESS) + { + if(*(Str + Size - 1) != NUL) + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + Size = min1(Size-1, strlen(Pos)); + Size = StrReadIn(Pos, Size, Str); + *(Str + Size) = NUL; + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒ}ƒ‹ƒ`•¶Žš—ñ‚ð‘‚«ž‚Þ ------------------------------------------------ +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* char *Str : •¶Žš—ñ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteMultiStringToReg(void *Handle, char *Name, char *Str) +{ + REGDATATBL *Pos; + char *Data; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_MULTI_SZ, (CONST BYTE *)Str, StrMultiLen(Str)+1); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + Pos->ValLen += strlen(Data); + Data = Pos->ValTbl + Pos->ValLen; + Pos->ValLen += StrCatOut(Str, StrMultiLen(Str), Data) + 1; + } + return(SUCCESS); +} + + +/*----- ƒoƒCƒiƒŠ‚ð“ǂݍž‚Þ----------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void *Bin : ƒoƒCƒiƒŠ‚ð•Ô‚·ƒ[ƒN +* DWORD Size : Å‘åƒTƒCƒY +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int ReadBinaryFromReg(void *Handle, char *Name, void *Bin, DWORD Size) +{ + int Sts; + char *Pos; + + Sts = FAIL; + if(TmpRegType == REGTYPE_REG) + { + if(RegQueryValueEx(Handle, Name, NULL, NULL, (BYTE *)Bin, &Size) == ERROR_SUCCESS) + Sts = SUCCESS; + } + else + { + if((Pos = ScanValue(Handle, Name)) != NULL) + { + Size = min1(Size, strlen(Pos)); + Size = StrReadIn(Pos, Size, Bin); + Sts = SUCCESS; + } + } + return(Sts); +} + + +/*----- ƒoƒCƒiƒŠ‚ð‘‚«ž‚Þ ---------------------------------------------------- +* +* Parameter +* void *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* void *Bin : ƒoƒCƒiƒŠ +* int Len : ’·‚³ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int WriteBinaryToReg(void *Handle, char *Name, void *Bin, int Len) +{ + REGDATATBL *Pos; + char *Data; + + if(TmpRegType == REGTYPE_REG) + RegSetValueEx(Handle, Name, 0, REG_BINARY, (CONST BYTE *)Bin, Len); + else + { + Pos = (REGDATATBL *)Handle; + Data = Pos->ValTbl + Pos->ValLen; + strcpy(Data, Name); + strcat(Data, "="); + Pos->ValLen += strlen(Data); + Data = Pos->ValTbl + Pos->ValLen; + Pos->ValLen += StrCatOut(Bin, Len, Data) + 1; + } + return(SUCCESS); +} + + +/*----- •¶Žš—ñ‚ðƒoƒbƒtƒ@‚ɒljÁ‘‚«ž‚Ý‚·‚é ------------------------------------ +* +* Parameter +* char *Src : •¶Žš—ñ +* int len : •¶Žš—ñ‚Ì’·‚³ +* char *Dst : ‘‚«ž‚Ý‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* int ’ljÁ‚µ‚½ƒoƒCƒg” +*----------------------------------------------------------------------------*/ + +static int StrCatOut(char *Src, int Len, char *Dst) +{ + int Count; + + Dst += strlen(Dst); + Count = 0; + for(; Len > 0; Len--) + { + if(*Src == '\\') + { + *Dst++ = '\\'; + *Dst++ = '\\'; + Count += 2; + } + else if((*Src >= 0x20) && (*Src <= 0x7E)) + { + *Dst++ = *Src; + Count++; + } + else + { + sprintf(Dst, "\\%02X", *(unsigned char *)Src); + Dst += 3; + Count += 3; + } + Src++; + } + *Dst = NUL; + return(Count); +} + + +/*----- •¶Žš—ñ‚ðƒoƒbƒtƒ@‚ɓǂݍž‚Þ -------------------------------------------- +* +* Parameter +* char *Src : •¶Žš—ñ +* int Max : Å‘åƒTƒCƒY +* char *Dst : ‘‚«ž‚Ý‚·‚éƒoƒbƒtƒ@ +* +* Return Value +* int “ǂݍž‚ñ‚¾ƒoƒCƒg” +*----------------------------------------------------------------------------*/ + +static int StrReadIn(char *Src, int Max, char *Dst) +{ + int Count; + int Tmp; + + Count = 0; + while(*Src != NUL) + { + if(Count >= Max) + break; + + if(*Src == '\\') + { + Src++; + if(*Src == '\\') + *Dst = '\\'; + else + { + sscanf(Src, "%02x", &Tmp); + *Dst = Tmp; + Src++; + } + } + else + *Dst = *Src; + + Count++; + Dst++; + Src++; + } + return(Count); +} + + +/*----- ’l‚ðŒŸõ‚·‚é ---------------------------------------------------------- +* +* Parameter +* char *Handle : ƒnƒ“ƒhƒ‹ +* char *Name : –¼‘O +* +* Return Value +* char *’lƒf[ƒ^‚̐擪 +* NULL=Žw’è‚Ì–¼‘O‚Ì’l‚ªŒ©‚‚©‚ç‚È‚¢ +*----------------------------------------------------------------------------*/ + +static char *ScanValue(void *Handle, char *Name) +{ + REGDATATBL *Cur; + char *Pos; + char *Ret; + + Ret = NULL; + Cur = Handle; + Pos = Cur->ValTbl; + while(Pos < (Cur->ValTbl + Cur->ValLen)) + { + if((strncmp(Name, Pos, strlen(Name)) == 0) && + (*(Pos + strlen(Name)) == '=')) + { + Ret = Pos + strlen(Name) + 1; + break; + } + Pos += strlen(Pos) + 1; + } + return(Ret); +} + + +/*----------- ƒpƒXƒ[ƒh‚̑Ó–«‚ðŠm”F‚·‚é ------------------------------------ +* +* Parameter +* char *Password: ƒpƒXƒ[ƒh•¶Žš—ñ +* char *HashStr: SHA-1ƒnƒbƒVƒ…•¶Žš—ñ +* +* Return Value +* int 0 •sˆê’v +* 1: ˆê’v +* 2: ˆÙí +*----------------------------------------------------------------------------*/ +int CheckPasswordValidity( char* Password, int length, const char* HashStr ) +{ + ulong hash1[5]; + ulong hash2[5]; + + int i, j; + + const char* p = HashStr; + + /* ‹ó•¶Žš—ñ‚͈ê’v‚µ‚½‚±‚Æ‚É‚·‚é */ + if( HashStr[0] == NUL ) return 1; + + /* Hash‚ðƒ`ƒFƒbƒN‚·‚é‚·‚é*/ + if( strlen(HashStr) != 40 ) return 2; + + /* Hash‚ðƒfƒR[ƒh‚·‚é*/ + for( i = 0; i < 5; i++ ){ + ulong decode = 0; + for( j = 0; j < 8; j++ ){ + if( *p < 0x40 || 0x40 + 15 < *p ){ + return 2; + } + decode = (decode << 4 ) + (*p - 0x40); + ++p; + } + hash1[i] = decode; + } + + /* Password ‚ðƒnƒbƒVƒ…‚·‚é */ + sha_memory( Password, length, hash2 ); + + if( memcmp( (char*)hash1, (char*)hash2, sizeof( hash1 )) == 0 ){ + return 1; + } + return 0; +} + +/*----------- ƒpƒXƒ[ƒh‚̑Ó–«ƒ`ƒFƒbƒN‚Ì‚½‚ß‚Ì•¶Žš—ñ‚ðì¬‚·‚é ------------ +* +* Parameter +* char *Password: ƒpƒXƒ[ƒh•¶Žš—ñ +* char *Str: SHA-1ƒnƒbƒVƒ…•¶Žš—ñŠi”[êŠ (41bytesˆÈã) +* +* Return Value +* None +*----------------------------------------------------------------------------*/ +void CreatePasswordHash( char* Password, int length, char* HashStr ) +{ + ulong hash[5]; + int i, j; + unsigned char *p = (unsigned char *)HashStr; + + sha_memory( Password, length, hash ); + + for( i = 0; i < 5; i++ ){ + ulong rest = hash[i]; + for( j = 0; j < 8; j++ ){ + *p++ = (unsigned char)((rest & 0xf0000000) >> 28) + '@'; + rest <<= 4; + } + } + *p = NUL; +} + +void SetHashSalt( DWORD salt ) +{ + unsigned char* pos = &SecretKey[strlen(SecretKey) + 1]; + *pos++ = ( salt >> 24 ) & 0xff; + *pos++ = ( salt >> 16 ) & 0xff; + *pos++ = ( salt >> 8 ) & 0xff; + *pos++ = ( salt ) & 0xff; + + SecretKeyLength = strlen( SecretKey ) + 5; +} + +/*----------- —”¶¬‚ð‚·‚é ------------------------------------------------- +* +* Parameter +* +* Return Value +* ƒ‰ƒ“ƒ_ƒ€‚È’lFƒRƒ“ƒpƒCƒ‰VS2005/“®ìŠÂ‹«WinXPˆÈã‚Å‚Í rand_s ‚©‚çŽæ“¾‚·‚é +*----------------------------------------------------------------------------*/ +DWORD GetRandamDWRODValue(void) +{ + DWORD rndValue; + int errorCode; +#ifdef _CRT_RAND_S + errno_t errnoRand_s; + errnoRand_s = rand_s(&rndValue); + errorCode = (0 != errnoRand_s ? 1 : 0); +#else + errorCode = 1; +#endif + if(0 != errorCode){ +#ifdef USE_RANDAM_C_RAND + rndValue = rand() | (rand() << 16); +#else + /* rand() ‚Ì‚©‚í‚è‚ɁASHA-1‚ƃpƒtƒH[ƒ}ƒ“ƒXƒJƒEƒ“ƒ^‚ð—p‚¢‚é */ + ulong shaValue[5]; + LARGE_INTEGER Counter; + + if(0 == IsRndSourceInit){ + /* ‰‰ñŽæ“¾Žž */ + HANDLE CurProcHandle; + HANDLE CurThreadHandle; + + if(DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), + &CurProcHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + CloseHandle(CurProcHandle); + } + if(DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), + &CurThreadHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + CloseHandle(CurThreadHandle); + } + + /* _WIN64 ‚Å‚Í64bit‚¾‚ªA‚»‚̏ꍇ‚Írand_s‚ª‘å’ï—˜—p‰Â”\‚È‚Ì‚Å‚±‚±‚Å‚Í32bit‚Ì‚Ý—p‚¢‚é */ + RndSource[0] = (ulong)CurProcHandle; + RndSource[1] = (ulong)CurThreadHandle; + RndSource[2] = (ulong)GetTickCount(); + RndSource[3] = (ulong)timeGetTime(); + RndSource[4] = 0; /* ƒJƒEƒ“ƒgƒAƒbƒv */ + RndSource[5] = RndSource[3] + 1; + IsRndSourceInit = 1; + } + RndSource[4]++; + RndSource[5] += 0x00010010; + if(QueryPerformanceCounter(&Counter)){ + RndSource[6] = Counter.LowPart; + RndSource[7] = Counter.HighPart; + RndSource[8] = (ulong)rand(); + }else{ + RndSource[6] = (ulong)timeGetTime(); + RndSource[7] = (ulong)rand(); + RndSource[8] = (ulong)rand(); + } + + sha_memory((char *)RndSource, sizeof(RndSource), shaValue); + rndValue = shaValue[0] ^ shaValue[1] ^ shaValue[2] ^ shaValue[3] ^ shaValue[4]; +#endif + } + return rndValue; +} diff --git a/remote.c b/remote.c new file mode 100644 index 0000000..a90237c --- /dev/null +++ b/remote.c @@ -0,0 +1,1487 @@ +/*============================================================================= +* +* ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‘€ì +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +/* ‚±‚̃\[ƒX‚͈ꕔAWS_FTP Version 93.12.05 ‚̃\[ƒX‚ðŽQl‚É‚µ‚Ü‚µ‚½B */ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#define PWD_XPWD 0 +#define PWD_PWD 1 + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static int DoPWD(char *Buf); +static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork); +static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, int *CancelCheckWork); +static void ChangeSepaLocal2Remote(char *Fname); +static void ChangeSepaRemote2Local(char *Fname); + +/*===== ŠO•”ŽQÆ =====*/ + +extern TRANSPACKET MainTransPkt; + +/* Ý’è’l */ +extern int TimeOut; +extern int SendQuit; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static int PwdCommandType; + +static int CheckCancelFlg = NO; + + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ•ÏX ---------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* int Disp : ƒfƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ɃpƒX–¼‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©(YES/NO) +* int ForceGet : Ž¸”s‚µ‚Ä‚àƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðŽæ“¾‚·‚é +* int ErrorBell : ƒGƒ‰[Ž–‚̉¹‚ð–‚炷‚©‚Ç‚¤‚©(YES/NO) +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoCWD(char *Path, int Disp, int ForceGet, int ErrorBell) +{ + int Sts; + char Buf[FMAX_PATH+1]; + + Sts = FTP_COMPLETE * 100; + + if(strcmp(Path, "..") == 0) + Sts = CommandProcCmd(NULL, "CDUP"); + else if(strcmp(Path, "") != 0) + { + if((AskHostType() != HTYPE_VMS) || (strchr(Path, '[') != NULL)) + Sts = CommandProcCmd(NULL, "CWD %s", Path); + else + Sts = CommandProcCmd(NULL, "CWD [.%s]", Path); /* VMS—p */ + } + + if((Sts/100 >= FTP_CONTINUE) && (ErrorBell == YES)) + SoundPlay(SND_ERROR); + + if((Sts/100 == FTP_COMPLETE) || + (ForceGet == YES)) + { + if(Disp == YES) + { + if(DoPWD(Buf) != FTP_COMPLETE) + { + /*===== PWD‚ªŽg‚¦‚È‚©‚Á‚½ê‡ =====*/ + + if(*Path == '/') + strcpy(Buf, Path); + else + { + AskRemoteCurDir(Buf, FMAX_PATH); + if(strlen(Buf) == 0) + strcpy(Buf, "/"); + + while(*Path != NUL) + { + if(strcmp(Path, ".") == 0) + Path++; + else if(strncmp(Path, "./", 2) == 0) + Path += 2; + else if(strcmp(Path, "..") == 0) + { + GetUpperDir(Buf); + Path += 2; + } + else if(strncmp(Path, "../", 2) == 0) + { + GetUpperDir(Buf); + Path += 3; + } + else + { + SetSlashTail(Buf); + strcat(Buf, Path); + break; + } + } + } + } + SetRemoteDirHist(Buf); + } + } + return(Sts/100); +} + + + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ•ÏXi‚»‚Ì‚Qj------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* char *Cur : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* +* Note +* ƒpƒX–¼‚Í "xxx/yyy/zzz" ‚ÌŒ`Ž® +* ƒfƒBƒŒƒNƒgƒŠ•ÏX‚ªŽ¸”s‚µ‚½‚çAƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚É–ß‚µ‚Ä‚¨‚­ +*----------------------------------------------------------------------------*/ + +int DoCWDStepByStep(char *Path, char *Cur) +{ + int Sts; + char *Set; + char *Set2; + char Tmp[FMAX_PATH+2]; + + Sts = FTP_COMPLETE; + + memset(Tmp, NUL, FMAX_PATH+2); + strcpy(Tmp, Path); + Set = Tmp; + while(*Set != NUL) + { + if((Set2 = strchr(Set, '/')) != NULL) + *Set2 = NUL; + if((Sts = DoCWD(Set, NO, NO, NO)) != FTP_COMPLETE) + break; + if(Set2 == NULL) + break; + Set = Set2 + 1; + } + + if(Sts != FTP_COMPLETE) + DoCWD(Cur, NO, NO, NO); + + return(Sts); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠŽæ“¾ ---------------------------------- +* +* Parameter +* char *Buf : ƒpƒX–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +static int DoPWD(char *Buf) +{ + char *Pos; + char Tmp[1024]; + int Sts; + + if(PwdCommandType == PWD_XPWD) + { + Sts = CommandProcCmd(Tmp, "XPWD"); + if(Sts/100 != FTP_COMPLETE) + PwdCommandType = PWD_PWD; + } + if(PwdCommandType == PWD_PWD) + Sts = CommandProcCmd(Tmp, "PWD"); + + if(Sts/100 == FTP_COMPLETE) + { + if((Pos = strchr(Tmp, '"')) != NULL) + { + memmove(Tmp, Pos+1, strlen(Pos+1)+1); + if((Pos = strchr(Tmp, '"')) != NULL) + *Pos = NUL; + } + else + memmove(Tmp, Tmp+4, strlen(Tmp+4)+1); + + if(strlen(Tmp) < FMAX_PATH) + { + strcpy(Buf, Tmp); + ReplaceAll(Buf, '\\', '/'); + ChangeSepaRemote2Local(Buf); + ChangeFnameRemote2Local(Buf, FMAX_PATH); + } + else + Sts = FTP_ERROR*100; + } + return(Sts/100); +} + + +/*----- PWDƒRƒ}ƒ“ƒh‚̃^ƒCƒv‚ð‰Šú‰»‚·‚é --------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void InitPWDcommand() +{ + PwdCommandType = PWD_XPWD; +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠì¬ ---------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoMKD(char *Path) +{ + int Sts; + + Sts = CommandProcCmd(NULL, "MKD %s", Path); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); + + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠíœ ------------------------------------------ +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoRMD(char *Path) +{ + int Sts; + + Sts = CommandProcCmd(NULL, "RMD %s", Path); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); + + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹íœ ---------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoDELE(char *Path) +{ + int Sts; + + Sts = CommandProcCmd(NULL, "DELE %s", Path); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); + + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹–¼•ÏX -------------------------------------------- +* +* Parameter +* char *Src : Œ³ƒtƒ@ƒCƒ‹–¼ +* char *Dst : •ÏXŒã‚̃tƒ@ƒCƒ‹–¼ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoRENAME(char *Src, char *Dst) +{ + int Sts; + + Sts = CommandProcCmd(NULL, "RNFR %s", Src); + if(Sts == 350) + Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); + + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‚Ì‘®«•ÏX ---------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* char *Mode : ƒ‚[ƒh•¶Žš—ñ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoCHMOD(char *Path, char *Mode) +{ + int Sts; + + Sts = CommandProcCmd(NULL, "%s %s %s", AskHostChmodCmd(), Mode, Path); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); + + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‚̃TƒCƒY‚ðŽæ“¾i“]‘—ƒ\ƒPƒbƒgŽg—pj----------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* LONGLONG *Size : ƒtƒ@ƒCƒ‹‚̃TƒCƒY‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* +* Note +* šš“]‘—ƒ\ƒPƒbƒg‚ðŽg—p‚·‚遚š +* ƒTƒCƒY‚ª‘I‚ç‚ê‚È‚¢Žž‚Í Size = -1 ‚ð•Ô‚· +*----------------------------------------------------------------------------*/ + +int DoSIZE(char *Path, LONGLONG *Size) +{ + int Sts; + char Tmp[1024]; + + Sts = CommandProcTrn(Tmp, "SIZE %s", Path); + + *Size = -1; + if((Sts/100 == FTP_COMPLETE) && (strlen(Tmp) > 4) && IsDigit(Tmp[4])) + *Size = _atoi64(&Tmp[4]); + + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃tƒ@ƒCƒ‹‚Ì“ú•t‚ðŽæ“¾i“]‘—ƒ\ƒPƒbƒgŽg—pj------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* FILETIME *Time : “ú•t‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +* +* Note +* šš“]‘—ƒ\ƒPƒbƒg‚ðŽg—p‚·‚遚š +* “ú•t‚ª‘I‚ç‚ê‚È‚¢Žž‚Í Time = 0 ‚ð•Ô‚· +*----------------------------------------------------------------------------*/ + +int DoMDTM(char *Path, FILETIME *Time) +{ + int Sts; + char Tmp[1024]; + SYSTEMTIME sTime; + + Time->dwLowDateTime = 0; + Time->dwHighDateTime = 0; + + Sts = CommandProcTrn(Tmp, "MDTM %s", Path); + if(Sts/100 == FTP_COMPLETE) + { + sTime.wMilliseconds = 0; + if(sscanf(Tmp+4, "%04d%02d%02d%02d%02d%02d", + &sTime.wYear, &sTime.wMonth, &sTime.wDay, + &sTime.wHour, &sTime.wMinute, &sTime.wSecond) == 6) + { + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + } + } + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃Rƒ}ƒ“ƒh‚ðŽÀs -------------------------------------------- +* +* Parameter +* char *CmdStr : ƒRƒ}ƒ“ƒh•¶Žš—ñ +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoQUOTE(char *CmdStr) +{ + int Sts; + + Sts = CommandProcCmd(NULL, "%s", CmdStr); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); + + return(Sts/100); +} + + +/*----- ƒ\ƒPƒbƒg‚ð•Â‚¶‚é ------------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* SOCKET •Â‚¶‚½Œã‚̃\ƒPƒbƒg +*----------------------------------------------------------------------------*/ + +SOCKET DoClose(SOCKET Sock) +{ + if(Sock != INVALID_SOCKET) + { +// if(WSAIsBlocking()) +// { +// DoPrintf("Skt=%u : Cancelled blocking call", Sock); +// WSACancelBlockingCall(); +// } + do_closesocket(Sock); + DoPrintf("Skt=%u : Socket closed.", Sock); + Sock = INVALID_SOCKET; + } + if(Sock != INVALID_SOCKET) + DoPrintf("Skt=%u : Failed to close socket.", Sock); + + return(Sock); +} + + +/*----- ƒzƒXƒg‚©‚烍ƒOƒAƒEƒg‚·‚é ---------------------------------------------- +* +* Parameter +* kSOCKET ctrl_skt : ƒ\ƒPƒbƒg +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoQUIT(SOCKET ctrl_skt) +{ + int Ret; + + Ret = FTP_COMPLETE; + if(SendQuit == YES) + Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100; + + return(Ret); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ðŽæ“¾iƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ðŽg—p) +* +* Parameter +* char *AddOpt : ’ljÁ‚̃IƒvƒVƒ‡ƒ“ +* char *Path : ƒpƒX–¼ +* int Num : ƒtƒ@ƒCƒ‹–¼”ԍ† +* +* Return Value +* int ‰ž“šƒR[ƒh‚Ì‚PŒ…–Ú +*----------------------------------------------------------------------------*/ + +int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork) +{ + int Sts; + + if(AskTransferNow() == YES) + SktShareProh(); + +// if((Sts = DoDirList(NULL, AskCmdCtrlSkt(), AddOpt, Path, Num)) == 429) +// { +// ReConnectCmdSkt(); + Sts = DoDirList(NULL, AskCmdCtrlSkt(), AddOpt, Path, Num, CancelCheckWork); + + if(Sts/100 >= FTP_CONTINUE) + SoundPlay(SND_ERROR); +// } + return(Sts/100); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚̃fƒBƒŒƒNƒgƒŠƒŠƒXƒg‚ðŽæ“¾ ---------------------------------- +* +* Parameter +* HWND hWnd : “]‘—’†ƒ_ƒCƒAƒƒO‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* char *AddOpt : ’ljÁ‚̃IƒvƒVƒ‡ƒ“ +* char *Path : ƒpƒX–¼ (""=ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ) +* int Num : ƒtƒ@ƒCƒ‹–¼”ԍ† +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int DoDirList(HWND hWnd, SOCKET cSkt, char *AddOpt, char *Path, int Num, int *CancelCheckWork) +{ + char Tmp[FMAX_PATH]; + int Sts; + +//#pragma aaa +//DoPrintf("===== DoDirList %d = %s", Num, Path); + + MakeCacheFileName(Num, Tmp); +// MainTransPkt.ctrl_skt = cSkt; + + if(AskListCmdMode() == NO) + { + strcpy(MainTransPkt.Cmd, "NLST"); + if(strlen(AskHostLsName()) > 0) + { + strcat(MainTransPkt.Cmd, " "); + if((AskHostType() == HTYPE_ACOS) || (AskHostType() == HTYPE_ACOS_4)) + strcat(MainTransPkt.Cmd, "'"); + strcat(MainTransPkt.Cmd, AskHostLsName()); + if((AskHostType() == HTYPE_ACOS) || (AskHostType() == HTYPE_ACOS_4)) + strcat(MainTransPkt.Cmd, "'"); + } + if(strlen(AddOpt) > 0) + strcat(MainTransPkt.Cmd, AddOpt); + } + else + { + strcpy(MainTransPkt.Cmd, "LIST"); + if(strlen(AddOpt) > 0) + { + strcat(MainTransPkt.Cmd, " -"); + strcat(MainTransPkt.Cmd, AddOpt); + } + } + + if(strlen(Path) > 0) + strcat(MainTransPkt.Cmd, " "); + + strcpy(MainTransPkt.RemoteFile, Path); + strcpy(MainTransPkt.LocalFile, Tmp); + MainTransPkt.Type = TYPE_A; + MainTransPkt.Size = -1; + /* ƒtƒ@ƒCƒ‹ƒŠƒXƒg‚Ì’†‚ÌŠ¿Žš‚̃tƒ@ƒCƒ‹–¼‚́A•Ê“r */ + /* ChangeFnameRemote2Local ‚Å•ÏŠ·‚·‚é */ + MainTransPkt.KanjiCode = KANJI_NOCNV; + MainTransPkt.KanaCnv = YES; + MainTransPkt.Mode = EXIST_OVW; + MainTransPkt.ExistSize = 0; + MainTransPkt.hWndTrans = hWnd; + MainTransPkt.Next = NULL; + + Sts = DoDownLoad(cSkt, &MainTransPkt, YES, CancelCheckWork); + +//#pragma aaa +//DoPrintf("===== DoDirList Done."); + + return(Sts); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚ÖƒRƒ}ƒ“ƒh‚𑗂胊ƒvƒ‰ƒC‚ð‘҂iƒRƒ}ƒ“ƒhƒ\ƒPƒbƒgj----------- +* +* Parameter +* char *Reply : ƒŠƒvƒ‰ƒC‚̃Rƒs[æ (NULL=ƒRƒs[‚µ‚È‚¢) +* char *fmt : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ +* ... : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* int ‰ž“šƒR[ƒh +* +* Note +* ƒRƒ}ƒ“ƒhƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ðŽg‚¤ +*----------------------------------------------------------------------------*/ + +int CommandProcCmd(char *Reply, char *fmt, ...) +{ + va_list Args; + char Cmd[1024]; + int Sts; + + va_start(Args, fmt); + wvsprintf(Cmd, fmt, Args); + va_end(Args); + + if(AskTransferNow() == YES) + SktShareProh(); + +//#pragma aaa +//DoPrintf("**CommandProcCmd : %s", Cmd); + +// if((Sts = command(AskCmdCtrlSkt(), Reply, "%s", Cmd)) == 429) +// { +// if(ReConnectCmdSkt() == SUCCESS) +// { + Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); +// } +// } + return(Sts); +} + + +/*----- ƒŠƒ‚[ƒg‘¤‚ÖƒRƒ}ƒ“ƒh‚𑗂胊ƒvƒ‰ƒC‚ð‘҂i“]‘—ƒ\ƒPƒbƒgj--------------- +* +* Parameter +* char *Reply : ƒŠƒvƒ‰ƒC‚̃Rƒs[æ (NULL=ƒRƒs[‚µ‚È‚¢) +* char *fmt : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ +* ... : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* int ‰ž“šƒR[ƒh +* +* Note +* “]‘—ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg‚ðŽg‚¤ +*----------------------------------------------------------------------------*/ + +int CommandProcTrn(char *Reply, char *fmt, ...) +{ + va_list Args; + char Cmd[1024]; + int Sts; + + va_start(Args, fmt); + wvsprintf(Cmd, fmt, Args); + va_end(Args); + +//#pragma aaa +//DoPrintf("**CommandProcTrn : %s", Cmd); + +// if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429) +// { +// if(ReConnectTrnSkt() == SUCCESS) + Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); +// } + return(Sts); +} + + +/*----- ƒRƒ}ƒ“ƒh‚𑗂胊ƒvƒ‰ƒC‚ð‘Ò‚Â ------------------------------------------ +* +* Parameter +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* char *Reply : ƒŠƒvƒ‰ƒC‚̃Rƒs[æ (NULL=ƒRƒs[‚µ‚È‚¢) +* char *fmt : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ +* ... : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* int ‰ž“šƒR[ƒh +* +* Note +* ƒzƒXƒg‚̃tƒ@ƒCƒ‹–¼‚ÌŠ¿ŽšƒR[ƒh‚ɉž‚¶‚āA‚±‚±‚ÅŠ¿ŽšƒR[ƒh‚Ì•ÏŠ·‚ðs‚È‚¤ +*----------------------------------------------------------------------------*/ + +//#pragma aaa +//static int cntcnt = 0; + +int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...) +{ + va_list Args; + char Cmd[FMAX_PATH*2]; + int Sts; + char TmpBuf[ONELINE_BUF_SIZE]; + + if(cSkt != INVALID_SOCKET) + { + va_start(Args, fmt); + wvsprintf(Cmd, fmt, Args); + va_end(Args); + + if(strncmp(Cmd, "PASS ", 5) == 0) + SetTaskMsg(">PASS [xxxxxx]"); + else if((strncmp(Cmd, "USER ", 5) == 0) || + (strncmp(Cmd, "OPEN ", 5) == 0)) + { + SetTaskMsg(">%s", Cmd); + } + else + { + ChangeSepaLocal2Remote(Cmd); + SetTaskMsg(">%s", Cmd); + ChangeFnameLocal2Remote(Cmd, FMAX_PATH*2); + } + +// DoPrintf("SEND : %s", Cmd); + strcat(Cmd, "\x0D\x0A"); + + if(Reply != NULL) + strcpy(Reply, ""); + + Sts = 429; + if(SendData(cSkt, Cmd, strlen(Cmd), 0, CancelCheckWork) == SUCCESS) + { + Sts = ReadReplyMessage(cSkt, Reply, 1024, CancelCheckWork, TmpBuf); + } + +//#pragma aaa +//if(Reply != NULL) +// DoPrintf("%x : %x : %s : %s", cSkt, &TmpBuf, Cmd, Reply); +//else +// DoPrintf("%x : %x : %s : NULL", cSkt, &TmpBuf, Cmd); + +// DoPrintf("command() RET=%d", Sts); + } + else + Sts = 429; + + return(Sts); +} + + +/*----- ƒf[ƒ^‚ð‘—‚é ---------------------------------------------------------- +* +* Parameter +* SOCKET Skt : ƒ\ƒPƒbƒg +* char *Data : ƒf[ƒ^ +* int Size : ‘—‚éƒf[ƒ^‚̃TƒCƒY +* int Mode : ƒR[ƒ‹ƒ‚[ƒh +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int SendData(SOCKET Skt, char *Data, int Size, int Mode, int *CancelCheckWork) +{ + int Sts; + int Tmp; +// fd_set SendFds; +// struct timeval Tout; +// struct timeval *ToutPtr; + int TimeOutErr; + + Sts = FAIL; + if(Skt != INVALID_SOCKET) + { + Sts = SUCCESS; + while(Size > 0) + { +// FD_ZERO(&SendFds); +// FD_SET(Skt, &SendFds); +// ToutPtr = NULL; +// if(TimeOut != 0) +// { +// Tout.tv_sec = TimeOut; +// Tout.tv_usec = 0; +// ToutPtr = &Tout; +// } +// Tmp = select(0, NULL, &SendFds, NULL, ToutPtr); +// if(Tmp == SOCKET_ERROR) +// { +// Sts = FAIL; +// ReportWSError("select", WSAGetLastError()); +// break; +// } +// else if(Tmp == 0) +// { +// Sts = FAIL; +// SetTaskMsg(MSGJPN241); +// break; +// } + + Tmp = do_send(Skt, Data, Size, Mode, &TimeOutErr, CancelCheckWork); + if(TimeOutErr == YES) + { + Sts = FAIL; + SetTaskMsg(MSGJPN241); + break; + } + else if(Tmp == SOCKET_ERROR) + { + Sts = FAIL; + ReportWSError("send", WSAGetLastError()); + break; + } + + Size -= Tmp; + Data += Tmp; + } + } + return(Sts); +} + + +/*----- ‰ž“šƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚é ---------------------------------------------- +* +* Parameter +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* char *Buf : ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒoƒbƒtƒ@ (NULL=ƒRƒs[‚µ‚È‚¢) +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* int *CancelCheckWork : +* char *Tmp : ƒeƒ“ƒ|ƒ‰ƒŠƒ[ƒN +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char *Tmp) +{ + int iRetCode; + int iContinue; + int FirstCode; + int Lines; + int i; + + if(Buf != NULL) + memset(Buf, NUL, Max); + Max--; + + FirstCode = 0; + if(cSkt != INVALID_SOCKET) + { + Lines = 0; + do + { + iContinue = NO; + iRetCode = ReadOneLine(cSkt, Tmp, ONELINE_BUF_SIZE, CancelCheckWork); + + SetTaskMsg("%s", Tmp); + + if(Buf != NULL) + { + // ‚Qs–ڈȍ~‚̉ž“šƒR[ƒh‚͏Á‚· + if(Lines > 0) + { + for(i = 0; ; i++) + { + if(IsDigit(Tmp[i]) == 0) + break; + Tmp[i] = ' '; + } + } + strncat(Buf, Tmp, Max); + Max = max1(0, Max-strlen(Tmp)); + +// strncpy(Buf, Tmp, Max); + } + + if((iRetCode != 421) && (iRetCode != 429)) + { + if((FirstCode == 0) && + (iRetCode >= 100) && (iRetCode <= 599)) + { + FirstCode = iRetCode; + } + + if((iRetCode < 100) || (iRetCode > 599) || + (*(Tmp + 3) == '-') || + ((FirstCode > 0) && (iRetCode != FirstCode))) + { + iContinue = YES; + } + } + else + FirstCode = iRetCode; + + Lines++; + } + while(iContinue == YES); + } + return(FirstCode); +} + + +/*----- ‚Ps•ª‚̃f[ƒ^‚ðŽó‚¯Žæ‚é ---------------------------------------------- +* +* Parameter +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* char *Buf : ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* int *CancelCheckWork : +* +* Return Value +* int ‰ž“šƒR[ƒh +*----------------------------------------------------------------------------*/ + +static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) +{ + char *Pos; + int SizeOnce; + int CopySize; + int ResCode; + int i; +// fd_set ReadFds; +// struct timeval Tout; +// struct timeval *ToutPtr; + char Tmp[1024]; + int TimeOutErr; + + ResCode = 0; + if(cSkt != INVALID_SOCKET) + { + memset(Buf, NUL, Max); + Max--; /* ––”ö‚ÌNULL‚Ì‚Ô‚ñ */ + Pos = Buf; + + for(;;) + { +// FD_ZERO(&ReadFds); +// FD_SET(cSkt, &ReadFds); +// ToutPtr = NULL; +// if(TimeOut != 0) +// { +// Tout.tv_sec = TimeOut; +// Tout.tv_usec = 0; +// ToutPtr = &Tout; +// } +// i = select(0, &ReadFds, NULL, NULL, ToutPtr); +// if(i == SOCKET_ERROR) +// { +// ReportWSError("select", WSAGetLastError()); +// SizeOnce = -1; +// break; +// } +// else if(i == 0) +// { +// SetTaskMsg(MSGJPN242); +// SizeOnce = -2; +// break; +// } + + /* LF‚Ü‚Å‚ðŽóM‚·‚邽‚߂ɁAÅ‰‚ÍPEEK‚ÅŽóM */ + if((SizeOnce = do_recv(cSkt, (LPSTR)Tmp, 1024, MSG_PEEK, &TimeOutErr, CancelCheckWork)) <= 0) + { + if(TimeOutErr == YES) + { + SetTaskMsg(MSGJPN242); + SizeOnce = -2; + } + else if(SizeOnce == SOCKET_ERROR) + { + SizeOnce = -1; + } + break; + } + + /* LF‚ð’T‚µ‚āA‚ ‚Á‚½‚ç‚»‚±‚Ü‚Å‚Ì’·‚³‚ðƒZƒbƒg */ + for(i = 0; i < SizeOnce ; i++) + { + if(*(Tmp + i) == NUL || *(Tmp + i) == 0x0A) + { + SizeOnce = i + 1; + break; + } + } + + /* –{ŽóM */ + if((SizeOnce = do_recv(cSkt, Tmp, SizeOnce, 0, &TimeOutErr, CancelCheckWork)) <= 0) + break; + + CopySize = min1(Max, SizeOnce); + memcpy(Pos, Tmp, CopySize); + Pos += CopySize; + Max -= CopySize; + + /* ƒf[ƒ^‚ªLF‚ŏI‚í‚Á‚Ä‚¢‚½‚ç‚PsI‚í‚è */ + if(*(Tmp + SizeOnce - 1) == 0x0A) + break; + } + *Pos = NUL; + + if(SizeOnce <= 0) + { + ResCode = 429; + memset(Buf, 0, Max); + + if((SizeOnce == -2) || (AskTransferNow() == YES)) + DisconnectSet(); + } + else + { + if(IsDigit(*Buf) && IsDigit(*(Buf+1)) && IsDigit(*(Buf+2))) + { + memset(Tmp, NUL, 4); + strncpy(Tmp, Buf, 3); + ResCode = atoi(Tmp); + } + + /* ––”ö‚Ì CR,LF,ƒXƒy[ƒX‚ðŽæ‚菜‚­ */ + while((i=strlen(Buf))>2 && + (Buf[i-1]==0x0a || Buf[i-1]==0x0d || Buf[i-1]==' ')) + Buf[i-1]=0; + } + } + return(ResCode); +} + + +/*----- ŒÅ’è’·ƒf[ƒ^‚ðŽó‚¯Žæ‚é ------------------------------------------------ +* +* Parameter +* SOCKET cSkt : ƒRƒ“ƒgƒ[ƒ‹ƒ\ƒPƒbƒg +* char *Buf : ƒƒbƒZ[ƒW‚ðŽó‚¯Žæ‚éƒoƒbƒtƒ@ +* int Size : ƒoƒCƒg” +* int *CancelCheckWork : +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int ReadNchar(SOCKET cSkt, char *Buf, int Size, int *CancelCheckWork) +{ +// struct timeval Tout; +// struct timeval *ToutPtr; +// fd_set ReadFds; +// int i; + int SizeOnce; + int Sts; + int TimeOutErr; + + Sts = FAIL; + if(cSkt != INVALID_SOCKET) + { + Sts = SUCCESS; + while(Size > 0) + { +// FD_ZERO(&ReadFds); +// FD_SET(cSkt, &ReadFds); +// ToutPtr = NULL; +// if(TimeOut != 0) +// { +// Tout.tv_sec = TimeOut; +// Tout.tv_usec = 0; +// ToutPtr = &Tout; +// } +// i = select(0, &ReadFds, NULL, NULL, ToutPtr); +// if(i == SOCKET_ERROR) +// { +// ReportWSError("select", WSAGetLastError()); +// Sts = FAIL; +// break; +// } +// else if(i == 0) +// { +// SetTaskMsg(MSGJPN243); +// Sts = FAIL; +// break; +// } + + if((SizeOnce = do_recv(cSkt, Buf, Size, 0, &TimeOutErr, CancelCheckWork)) <= 0) + { + if(TimeOutErr == YES) + SetTaskMsg(MSGJPN243); + Sts = FAIL; + break; + } + + Buf += SizeOnce; + Size -= SizeOnce; + } + } + + if(Sts == FAIL) + SetTaskMsg(MSGJPN244); + + return(Sts); +} + + +/*----- ƒGƒ‰[•¶Žš—ñ‚ðŽæ“¾ ---------------------------------------------------- +* +* Parameter +* UINT Error : ƒGƒ‰[”ԍ† +* +* Return Value +* char *ƒGƒ‰[•¶Žš—ñ +*----------------------------------------------------------------------------*/ + +char *ReturnWSError(UINT Error) +{ + static char Msg[128]; + char *Str; + + switch(Error) + { + case WSAVERNOTSUPPORTED: + Str = "version of WinSock not supported"; + break; + + case WSASYSNOTREADY: + Str = "WinSock not present or not responding"; + break; + + case WSAEINVAL: + Str = "app version not supported by DLL"; + break; + + case WSAHOST_NOT_FOUND: + Str = "Authoritive: Host not found"; + break; + + case WSATRY_AGAIN: + Str = "Non-authoritive: host not found or server failure"; + break; + + case WSANO_RECOVERY: + Str = "Non-recoverable: refused or not implemented"; + break; + + case WSANO_DATA: + Str = "Valid name, no data record for type"; + break; + +#if 0 + case WSANO_ADDRESS: + Str = "Valid name, no MX record"; + break; +#endif + + case WSANOTINITIALISED: + Str = "WSA Startup not initialized"; + break; + + case WSAENETDOWN: + Str = "Network subsystem failed"; + break; + + case WSAEINPROGRESS: + Str = "Blocking operation in progress"; + break; + + case WSAEINTR: + Str = "Blocking call cancelled"; + break; + + case WSAEAFNOSUPPORT: + Str = "address family not supported"; + break; + + case WSAEMFILE: + Str = "no file descriptors available"; + break; + + case WSAENOBUFS: + Str = "no buffer space available"; + break; + + case WSAEPROTONOSUPPORT: + Str = "specified protocol not supported"; + break; + + case WSAEPROTOTYPE: + Str = "protocol wrong type for this socket"; + break; + + case WSAESOCKTNOSUPPORT: + Str = "socket type not supported for address family"; + break; + + case WSAENOTSOCK: + Str = "descriptor is not a socket"; + break; + + case WSAEWOULDBLOCK: + Str = "socket marked as non-blocking and SO_LINGER set not 0"; + break; + + case WSAEADDRINUSE: + Str = "address already in use"; + break; + + case WSAECONNABORTED: + Str = "connection aborted"; + break; + + case WSAECONNRESET: + Str = "connection reset"; + break; + + case WSAENOTCONN: + Str = "not connected"; + break; + + case WSAETIMEDOUT: + Str = "connection timed out"; + break; + + case WSAECONNREFUSED: + Str = "connection refused"; + break; + + case WSAEHOSTDOWN: + Str = "host down"; + break; + + case WSAEHOSTUNREACH: + Str = "host unreachable"; + break; + + case WSAEADDRNOTAVAIL: + Str = "address not available"; + break; + + default: + sprintf(Msg, "error %u", Error); + return(Msg); + } + return(Str); +} + + +/*----- ƒfƒoƒbƒOƒRƒ“ƒ\[ƒ‹‚ɃGƒ‰[‚ð•\Ž¦ -------------------------------------- +* +* Parameter +* char *Msg : ƒGƒ‰[‚Ì‘O‚É•\Ž¦‚·‚郁ƒbƒZ[ƒW +* UINT Error : ƒGƒ‰[”ԍ† +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ReportWSError(char *Msg, UINT Error) +{ + if(Msg != NULL) + DoPrintf("[[%s : %s]]", Msg, ReturnWSError(Error)); + else + DoPrintf("[[%s]]", ReturnWSError(Error)); +} + + +/*----- ƒtƒ@ƒCƒ‹–¼‚ðƒ[ƒJƒ‹‘¤‚ňµ‚¦‚é‚悤‚É•ÏŠ·‚·‚é -------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* int Max : Å‘å’· +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int ChangeFnameRemote2Local(char *Fname, int Max) +{ + int Sts; + char *Buf; + char *Pos; + CODECONVINFO cInfo; + + Sts = FAIL; + if((Buf = malloc(Max)) != NULL) + { + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = NO; //AskHostNameKana(); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); + cInfo.Buf = Buf; + cInfo.BufSize = Max - 1; + + switch(AskHostNameKanji()) + { + case KANJI_JIS : + ConvJIStoSJIS(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_EUC : + ConvEUCtoSJIS(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_SMB_HEX : + case KANJI_SMB_CAP : + ConvSMBtoSJIS(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_UTF8N : + ConvUTF8NtoSJIS(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + } + free(Buf); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- ƒtƒ@ƒCƒ‹–¼‚ðƒŠƒ‚[ƒg‘¤‚ňµ‚¦‚é‚悤‚É•ÏŠ·‚·‚é -------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* int Max : Å‘å’· +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int ChangeFnameLocal2Remote(char *Fname, int Max) +{ + int Sts; + char *Buf; + char *Pos; + CODECONVINFO cInfo; + + Sts = FAIL; + if((Buf = malloc(Max)) != NULL) + { + InitCodeConvInfo(&cInfo); + cInfo.KanaCnv = AskHostNameKana(); + cInfo.Str = Fname; + cInfo.StrLen = strlen(Fname); + cInfo.Buf = Buf; + cInfo.BufSize = Max - 1; + + switch(AskHostNameKanji()) + { + case KANJI_JIS : + ConvSJIStoJIS(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_EUC : + ConvSJIStoEUC(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_SMB_HEX : + ConvSJIStoSMB_HEX(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_SMB_CAP : + ConvSJIStoSMB_CAP(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + + case KANJI_UTF8N : + ConvSJIStoUTF8N(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Fname, Buf); + Pos = strchr(Fname, NUL); + FlushRestData(&cInfo); + *(Buf + cInfo.OutLen) = NUL; + strcpy(Pos, Buf); + break; + } + free(Buf); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- ƒpƒX‚Ì‹æØ‚蕶Žš‚ðƒzƒXƒg‚ɍ‡‚킹‚ĕύX‚·‚é ---------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void ChangeSepaLocal2Remote(char *Fname) +{ + if(AskHostType() == HTYPE_STRATUS) + { + ReplaceAll(Fname, '/', '>'); + } + return; +} + + +/*----- ƒpƒX‚Ì‹æØ‚蕶Žš‚ðƒ[ƒJƒ‹‚ɍ‡‚킹‚ĕύX‚·‚é -------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ +static void ChangeSepaRemote2Local(char *Fname) +{ + if(AskHostType() == HTYPE_STRATUS) + { + ReplaceAll(Fname, '>', '/'); + } + return; +} + + + + + + + diff --git a/sample.h b/sample.h new file mode 100644 index 0000000..7ea3064 --- /dev/null +++ b/sample.h @@ -0,0 +1,55 @@ +/*============================================================================= +* ‚e‚e‚e‚s‚o‹¤’Ê’è‹`ƒtƒ@ƒCƒ‹ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +/* ƒTƒ“ƒvƒ‹ƒzƒXƒg’è‹`ƒtƒ@ƒCƒ‹ */ + +typedef struct { + int Level; /* Ý’è‚̃Œƒxƒ‹ */ + char HostName[HOST_NAME_LEN+1]; /* Ý’è–¼ */ + char HostAdrs[HOST_ADRS_LEN+1]; /* ƒzƒXƒg–¼ */ +} SAMPLEHOSTDATA; + + +#define SAMPLE_HOSTS 9 + + +static const SAMPLEHOSTDATA Sample[SAMPLE_HOSTS] = { + { 32768,"anonymous FTP site", "" }, + { 1, "Vector", "ftp.vector.co.jp" }, + { 1, "‘‹‚Ì“m(Forest)", "ftp.forest.impress.co.jp" }, + { 1, "Ring server", "ftp.ring.gr.jp" }, + { 1, "BIGLOBE", "ftp.biglobe.ne.jp" }, + { 1, "IIJ", "ftp.iij.ad.jp" }, + { 1, "SUNSITE", "sunsite.sut.ac.jp" }, + { 1, "WIN Internet Service", "ftp.win.ne.jp" }, + { 1, "Microsoft", "ftp.microsoft.com" } +}; + + + + diff --git a/sha.c b/sha.c new file mode 100644 index 0000000..53519d7 --- /dev/null +++ b/sha.c @@ -0,0 +1,355 @@ +/* Implementation of NIST's Secure Hash Algorithm (FIPS 180) + * Lightly bummed for execution efficiency. + * + * Jim Gillogly 3 May 1993 + * + * 27 Aug 93: imported SHA_LITTLE_ENDIAN mods from Peter Gutmann's implementation + * 5 Jul 94: Modified for NSA fix + * + * Compile: cc -O -o sha sha.c + * + * To remove the test wrapper and use just the nist_hash() routine, + * compile with -DONT_WRAP + * + * To reverse byte order for little-endian machines, use -DSHA_LITTLE_ENDIAN + * + * To get the original SHA definition before the 1994 fix, use -DVERSION_0 + * + * Usage: sha [-vt] [filename ...] + * + * -v switch: output the filename as well + * -t switch: suppress spaces between 32-bit blocks + * + * If no input files are specified, process standard input. + * + * Output: 40-hex-digit digest of each file specified (160 bits) + * + * Synopsis of the function calls: + * + * sha_file(char *filename, uint32 *buffer) + * Filename is a file to be opened and processed. + * buffer is a user-supplied array of 5 or more longs. + * The 5-word buffer is filled with 160 bits of non-terminated hash. + * Returns 0 if successful, non-zero if bad file. + * + * void sha_stream(FILE *stream, uint32 *buffer) + * Input is from already-opened stream, not file. + * + * void sha_memory(char *mem, int32 length, uint32 *buffer) + * Input is a memory block "length" bytes long. + * + * Caveat: + * Not tested for case that requires the high word of the length, + * which would be files larger than 1/2 gig or so. + * + * Limitation: + * sha_memory (the memory block function) will deal with blocks no longer + * than 4 gigabytes; for longer samples, the stream version will + * probably be most convenient (e.g. perl moby_data.pl | sha). + * + * Bugs: + * The standard is defined for bit strings; I assume bytes. + * + * Copyright 1993, Dr. James J. Gillogly + * This code may be freely used in any application. + */ + +/* #define VERSION_0 */ /* Define this to get the original SHA definition */ + +#include +#include +#include "sha.h" + +#ifdef MSDOS +# define SHA_LITTLE_ENDIAN +#endif + +#define VERBOSE + +#define TRUE 1 +#define FALSE 0 + +#define SUCCESS 0 +#define FAILURE -1 + +int sha_file(); /* External entries */ +void sha_stream(), sha_memory(); + +static void nist_guts(); + +#ifdef SHA_TEST_WRAP /* make a test program */ + +#define HASH_SIZE 5 /* Produces 160-bit digest of the message */ + +main(argc, argv) +int argc; +char **argv; +{ + uint32 hbuf[HASH_SIZE]; + char *s; + int file_args = FALSE; /* If no files, take it from stdin */ + int verbose = FALSE; + int terse = FALSE; + +#ifdef MEMTEST + sha_memory("abc", 3l, hbuf); /* NIST test value from appendix A */ + if (verbose) printf("Memory:"); + if (terse) printf("%08lx%08lx%08lx%08lx%08lx\n", + hbuf[0], hbuf[1], hbuf[2], hbuf[3], hbuf[4]); + else printf("%08lx %08lx %08lx %08lx %08lx\n", + hbuf[0], hbuf[1], hbuf[2], hbuf[3], hbuf[4]); +#endif + + for (++argv; --argc; ++argv) /* March down the arg list */ + { + if (**argv == '-') /* Process one or more flags */ + for (s = &(*argv)[1]; *s; s++) /* Obfuscated C contest entry */ + switch(*s) + { + case 'v': case 'V': + verbose = TRUE; + break; + case 't': case 'T': + terse = TRUE; + break; + default: + fprintf(stderr, "Unrecognized flag: %c\n", *s); + return FALSE; + } + else /* Process a file */ + { + if (verbose) printf("%s:", *argv); + file_args = TRUE; /* Whether or not we could read it */ + + if (sha_file(*argv, hbuf) == FAILURE) + printf("Can't open file %s.\n", *argv); + else + if (terse) printf("%08lx%08lx%08lx%08lx%08lx\n", + hbuf[0], hbuf[1], hbuf[2], hbuf[3], hbuf[4]); + else printf("%08lx %08lx %08lx %08lx %08lx\n", + hbuf[0], hbuf[1], hbuf[2], hbuf[3], hbuf[4]); + } + } + if (! file_args) /* No file specified */ + { + if (verbose) printf("%s:", *argv); + sha_stream(stdin, hbuf); + + if (terse) printf("%08lx%08lx%08lx%08lx%08lx\n", + hbuf[0], hbuf[1], hbuf[2], hbuf[3], hbuf[4]); + else printf("%08lx %08lx %08lx %08lx %08lx\n", + hbuf[0], hbuf[1], hbuf[2], hbuf[3], hbuf[4]); + } + return TRUE; +} + +#endif ONT_WRAP + +#ifdef SHA_LITTLE_ENDIAN /* Imported from Peter Gutmann's implementation */ + +/* When run on a little-endian CPU we need to perform byte reversal on an + array of longwords. It is possible to make the code endianness- + independant by fiddling around with data at the byte level, but this + makes for very slow code, so we rely on the user to sort out endianness + at compile time */ + +static void byteReverse( uint32 *buffer, int byteCount ) + { + uint32 value; + int count; + + byteCount /= sizeof( uint32 ); + for( count = 0; count < byteCount; count++ ) + { + value = ( buffer[ count ] << 16 ) | ( buffer[ count ] >> 16 ); + buffer[ count ] = ( ( value & 0xFF00FF00L ) >> 8 ) | ( ( value & 0x00FF00FFL ) << 8 ); + } + } +#endif /* SHA_LITTLE_ENDIAN */ + + + +union longbyte +{ + uint32 W[80]; /* Process 16 32-bit words at a time */ + char B[320]; /* But read them as bytes for counting */ +}; + +sha_file(filename, buffer) /* Hash a file */ +char *filename; +uint32 *buffer; +{ + FILE *infile; + + if ((infile = fopen(filename, "rb")) == NULL) + { + int i; + + for (i = 0; i < 5; i++) + buffer[i] = 0xdeadbeef; + return FAILURE; + } + (void) sha_stream(infile, buffer); + fclose(infile); + return SUCCESS; +} + +void sha_memory(mem, length, buffer) /* Hash a memory block */ +char *mem; +uint32 length; +uint32 *buffer; +{ + nist_guts(FALSE, (FILE *) NULL, mem, length, buffer); +} + +void sha_stream(stream, buffer) +FILE *stream; +uint32 *buffer; +{ + nist_guts(TRUE, stream, (char *) NULL, 0l, buffer); +} + +#define f0(x,y,z) (z ^ (x & (y ^ z))) /* Magic functions */ +#define f1(x,y,z) (x ^ y ^ z) +#define f2(x,y,z) ((x & y) | (z & (x | y))) +#define f3(x,y,z) (x ^ y ^ z) + +#define K0 0x5a827999 /* Magic constants */ +#define K1 0x6ed9eba1 +#define K2 0x8f1bbcdc +#define K3 0xca62c1d6 + +#define S(n, X) ((X << n) | (X >> (32 - n))) /* Barrel roll */ + +#define r0(f, K) \ + temp = S(5, A) + f(B, C, D) + E + *p0++ + K; \ + E = D; \ + D = C; \ + C = S(30, B); \ + B = A; \ + A = temp + +#ifdef VERSION_0 +#define r1(f, K) \ + temp = S(5, A) + f(B, C, D) + E + \ + (*p0++ = *p1++ ^ *p2++ ^ *p3++ ^ *p4++) + K; \ + E = D; \ + D = C; \ + C = S(30, B); \ + B = A; \ + A = temp +#else /* Version 1: Summer '94 update */ +#define r1(f, K) \ + temp = *p1++ ^ *p2++ ^ *p3++ ^ *p4++; \ + temp = S(5, A) + f(B, C, D) + E + (*p0++ = S(1,temp)) + K; \ + E = D; \ + D = C; \ + C = S(30, B); \ + B = A; \ + A = temp +#endif + +static void nist_guts(file_flag, stream, mem, length, buf) +int file_flag; /* Input from memory, or from stream? */ +FILE *stream; +char *mem; +uint32 length; +uint32 *buf; +{ + int i, nread, nbits; + union longbyte d; + uint32 hi_length, lo_length; + int padded; + char *s; + + register uint32 *p0, *p1, *p2, *p3, *p4; + uint32 A, B, C, D, E, temp; + + uint32 h0, h1, h2, h3, h4; + + h0 = 0x67452301; /* Accumulators */ + h1 = 0xefcdab89; + h2 = 0x98badcfe; + h3 = 0x10325476; + h4 = 0xc3d2e1f0; + + padded = FALSE; + s = mem; + for (hi_length = lo_length = 0; ;) /* Process 16 longs at a time */ + { + if (file_flag) + { + nread = fread(d.B, 1, 64, stream); /* Read as 64 bytes */ + } + else + { + if (length < 64) nread = length; + else nread = 64; + length -= nread; + memcpy(d.B, s, nread); + s += nread; + } + if (nread < 64) /* Partial block? */ + { + nbits = nread << 3; /* Length: bits */ + if ((lo_length += nbits) < (unsigned int)nbits) + hi_length++; /* 64-bit integer */ + + if (nread < 64 && ! padded) /* Append a single bit */ + { + d.B[nread++] = (char)0x80; /* Using up next byte */ + padded = TRUE; /* Single bit once */ + } + for (i = nread; i < 64; i++) /* Pad with nulls */ + d.B[i] = 0; + if (nread <= 56) /* Room for length in this block */ + { + d.W[14] = hi_length; + d.W[15] = lo_length; +#ifdef SHA_LITTLE_ENDIAN + byteReverse(d.W, 56 ); +#endif /* SHA_LITTLE_ENDIAN */ + } +#ifdef SHA_LITTLE_ENDIAN + else byteReverse(d.W, 64 ); +#endif /* SHA_LITTLE_ENDIAN */ + } + else /* Full block -- get efficient */ + { + if ((lo_length += 512) < 512) + hi_length++; /* 64-bit integer */ +#ifdef SHA_LITTLE_ENDIAN + byteReverse(d.W, 64 ); +#endif /* SHA_LITTLE_ENDIAN */ + } + + p0 = d.W; + A = h0; B = h1; C = h2; D = h3; E = h4; + + r0(f0,K0); r0(f0,K0); r0(f0,K0); r0(f0,K0); r0(f0,K0); + r0(f0,K0); r0(f0,K0); r0(f0,K0); r0(f0,K0); r0(f0,K0); + r0(f0,K0); r0(f0,K0); r0(f0,K0); r0(f0,K0); r0(f0,K0); + r0(f0,K0); + + p1 = &d.W[13]; p2 = &d.W[8]; p3 = &d.W[2]; p4 = &d.W[0]; + + r1(f0,K0); r1(f0,K0); r1(f0,K0); r1(f0,K0); + r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); + r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); + r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); + r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); r1(f1,K1); + r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); + r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); + r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); + r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); r1(f2,K2); + r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); + r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); + r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); + r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); r1(f3,K3); + + h0 += A; h1 += B; h2 += C; h3 += D; h4 += E; + + if (nread <= 56) break; /* If it's greater, length in next block */ + } + buf[0] = h0; buf[1] = h1; buf[2] = h2; buf[3] = h3; buf[4] = h4; +} diff --git a/sha.h b/sha.h new file mode 100644 index 0000000..241e6ae --- /dev/null +++ b/sha.h @@ -0,0 +1,15 @@ +#define MSDOS +#define LITTLE_ENDIAN + +typedef int int32; +typedef unsigned int uint32; + +//typedef unsigned int UINT4; +typedef unsigned short int UINT2; + +/* + * just enough declarations for otp_hash to deal. + */ +void sha_memory (char *, uint32, uint32 *); + + diff --git a/skey.c b/skey.c new file mode 100644 index 0000000..8e6b9c8 --- /dev/null +++ b/skey.c @@ -0,0 +1,453 @@ +/*============================================================================= +* +* ‚»‚Ì‘¼‚̔ėpƒTƒuƒ‹[ƒ`ƒ“ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +/* ‚±‚̃vƒƒOƒ‰ƒ€‚Í skey ‚̃\[ƒX‚ðŽQl‚É‚µ‚Ü‚µ‚½B */ + +#define STRICT +#include +#include +#include +#include + +#include "common.h" +#include "md4.h" +#include "md5.h" +#include "sha.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static int keycrunch(char *result, char *seed, char *passwd, int Type); +static void secure_hash(char *x, int Type); +static char *btoe(char *c, char *buf); +static ulong extract(char *s, int start, int length); + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +/* Dictionary for integer-word translations */ +static const char Wp[2048][4] = { + "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", "AGO", "AID", + "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA", "AND", + "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK", + "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", + "AVE", "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", + "BAH", "BAM", "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", + "BEG", "BEN", "BET", "BEY", "BIB", "BID", "BIG", "BIN", "BIT", + "BOB", "BOG", "BON", "BOO", "BOP", "BOW", "BOY", "BUB", "BUD", + "BUG", "BUM", "BUN", "BUS", "BUT", "BUY", "BY", "BYE", "CAB", + "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", "CAW", "COD", "COG", + "COL", "CON", "COO", "COP", "COT", "COW", "COY", "CRY", "CUB", + "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN", "DAR", + "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG", + "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", + "DUB", "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", + "EGG", "EGO", "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", + "ETC", "EVA", "EVE", "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", + "FAY", "FED", "FEE", "FEW", "FIB", "FIG", "FIN", "FIR", "FIT", + "FLO", "FLY", "FOE", "FOG", "FOR", "FRY", "FUM", "FUN", "FUR", + "GAB", "GAD", "GAG", "GAL", "GAM", "GAP", "GAS", "GAY", "GEE", + "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO", "GOT", "GUM", + "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD", "HAL", + "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", + "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", + "HIT", "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", + "HUB", "HUE", "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", + "IF", "IKE", "ILL", "INK", "INN", "IO", "ION", "IQ", "IRA", + "IRE", "IRK", "IS", "IT", "ITS", "IVY", "JAB", "JAG", "JAM", + "JAN", "JAR", "JAW", "JAY", "JET", "JIG", "JIM", "JO", "JOB", + "JOE", "JOG", "JOT", "JOY", "JUG", "JUT", "KAY", "KEG", "KEN", + "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB", "LAC", "LAD", + "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", "LEG", + "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT", + "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", + "LUG", "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", + "MAT", "MAW", "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW", + "MID", "MIN", "MIT", "MOB", "MOD", "MOE", "MOO", "MOP", "MOS", + "MOT", "MOW", "MUD", "MUG", "MUM", "MY", "NAB", "NAG", "NAN", + "NAP", "NAT", "NAY", "NE", "NED", "NEE", "NET", "NEW", "NIB", + "NIL", "NIP", "NIT", "NO", "NOB", "NOD", "NON", "NOR", "NOT", + "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", "OAK", "OAR", + "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL", "OK", + "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT", + "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", + "PAD", "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", + "PEA", "PEG", "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", + "PIE", "PIN", "PIT", "PLY", "PO", "POD", "POE", "POP", "POT", + "POW", "PRO", "PRY", "PUB", "PUG", "PUN", "PUP", "PUT", "QUO", + "RAG", "RAM", "RAN", "RAP", "RAT", "RAW", "RAY", "REB", "RED", + "REP", "RET", "RIB", "RID", "RIG", "RIM", "RIO", "RIP", "ROB", + "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB", "RUE", "RUG", + "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM", "SAN", + "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET", + "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", + "SKY", "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", + "SPA", "SPY", "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", + "TAD", "TAG", "TAN", "TAP", "TAR", "TEA", "TED", "TEE", "TEN", + "THE", "THY", "TIC", "TIE", "TIM", "TIN", "TIP", "TO", "TOE", + "TOG", "TOM", "TON", "TOO", "TOP", "TOW", "TOY", "TRY", "TUB", + "TUG", "TUM", "TUN", "TWO", "UN", "UP", "US", "USE", "VAN", + "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS", "WAY", "WE", + "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT", "WOK", + "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", + "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT", + "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS", "ADEN", + "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE", "AIDS", "AIRY", + "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA", "ALLY", "ALMA", "ALOE", + "ALSO", "ALTO", "ALUM", "ALVA", "AMEN", "AMES", "AMID", "AMMO", "AMOK", + "AMOS", "AMRA", "ANDY", "ANEW", "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", + "ARAB", "ARCH", "AREA", "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", + "ASKS", "ATOM", "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", + "AVOW", "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL", + "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM", "BAND", + "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK", "BARN", "BARR", + "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", "BAWD", "BAWL", "BEAD", + "BEAK", "BEAM", "BEAN", "BEAR", "BEAT", "BEAU", "BECK", "BEEF", "BEEN", + "BEER", "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN", + "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", "BIEN", + "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE", "BITS", "BLAB", + "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", "BLOW", "BLUE", "BLUM", + "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", "BODE", "BODY", "BOGY", "BOHR", + "BOIL", "BOLD", "BOLO", "BOLT", "BOMB", "BONA", "BOND", "BONE", "BONG", + "BONN", "BONY", "BOOK", "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", + "BOSE", "BOSS", "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", + "BRAN", "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", + "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", "BURL", + "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", "BUSY", "BYTE", + "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", "CALL", "CALM", "CAME", + "CANE", "CANT", "CARD", "CARE", "CARL", "CARR", "CART", "CASE", "CASH", + "CASK", "CAST", "CAVE", "CEIL", "CELL", "CENT", "CERN", "CHAD", "CHAR", + "CHAT", "CHAW", "CHEF", "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", + "CHUB", "CHUG", "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", + "CLAY", "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", + "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN", "COKE", + "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK", "COOL", "COON", + "COOT", "CORD", "CORE", "CORK", "CORN", "COST", "COVE", "COWL", "CRAB", + "CRAG", "CRAM", "CRAY", "CREW", "CRIB", "CROW", "CRUD", "CUBA", "CUBE", + "CUFF", "CULL", "CULT", "CUNY", "CURB", "CURD", "CURE", "CURL", "CURT", + "CUTS", "DADE", "DALE", "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", + "DARK", "DARN", "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", + "DAYS", "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", + "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", "DIAL", + "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT", "DIRE", "DIRT", + "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", "DOLE", "DOLL", "DOLT", + "DOME", "DONE", "DOOM", "DOOR", "DORA", "DOSE", "DOTE", "DOUG", "DOUR", + "DOVE", "DOWN", "DRAB", "DRAG", "DRAM", "DRAW", "DREW", "DRUB", "DRUG", + "DRUM", "DUAL", "DUCK", "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", + "DUNE", "DUNK", "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", + "EAST", "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", + "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", "EMMA", + "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", "FACE", "FACT", + "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", "FAME", "FANG", "FARM", + "FAST", "FATE", "FAWN", "FEAR", "FEAT", "FEED", "FEEL", "FEET", "FELL", + "FELT", "FEND", "FERN", "FEST", "FEUD", "FIEF", "FIGS", "FILE", "FILL", + "FILM", "FIND", "FINE", "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", + "FITS", "FIVE", "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", + "FLEW", "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", + "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", "FOOT", + "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", "FOUR", "FOWL", + "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", "FROG", "FROM", "FUEL", + "FULL", "FUME", "FUND", "FUNK", "FURY", "FUSE", "FUSS", "GAFF", "GAGE", + "GAIL", "GAIN", "GAIT", "GALA", "GALE", "GALL", "GALT", "GAME", "GANG", + "GARB", "GARY", "GASH", "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", + "GELD", "GENE", "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", + "GILT", "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", + "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", "GOAL", + "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", "GOOD", "GOOF", + "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", "GRAD", "GRAY", "GREG", + "GREW", "GREY", "GRID", "GRIM", "GRIN", "GRIT", "GROW", "GRUB", "GULF", + "GULL", "GUNK", "GURU", "GUSH", "GUST", "GWEN", "GWYN", "HAAG", "HAAS", + "HACK", "HAIL", "HAIR", "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", + "HANG", "HANK", "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", + "HATE", "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", + "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", "HELM", + "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", "HICK", "HIDE", + "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", "HIRE", "HISS", "HIVE", + "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", "HOLM", "HOLT", "HOME", "HONE", + "HONK", "HOOD", "HOOF", "HOOK", "HOOT", "HORN", "HOSE", "HOST", "HOUR", + "HOVE", "HOWE", "HOWL", "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", + "HUGO", "HULK", "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", + "HYDE", "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", + "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", "ITCH", + "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", "JAVA", "JEAN", + "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", "JILT", "JIVE", "JOAN", + "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", "JOIN", "JOKE", "JOLT", "JOVE", + "JUDD", "JUDE", "JUDO", "JUDY", "JUJU", "JUKE", "JULY", "JUNE", "JUNK", + "JUNO", "JURY", "JUST", "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", + "KATE", "KEEL", "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", + "KILL", "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", + "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", "KURT", + "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", "LAIR", "LAKE", + "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", "LARK", "LASS", "LAST", + "LATE", "LAUD", "LAVA", "LAWN", "LAWS", "LAYS", "LEAD", "LEAF", "LEAK", + "LEAN", "LEAR", "LEEK", "LEER", "LEFT", "LEND", "LENS", "LENT", "LEON", + "LESK", "LESS", "LEST", "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", + "LIES", "LIEU", "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", + "LIMB", "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST", + "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", "LOIS", + "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", "LORE", "LOSE", + "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", "LUCY", "LUGE", "LUKE", + "LULU", "LUND", "LUNG", "LURA", "LURE", "LURK", "LUSH", "LUST", "LYLE", + "LYNN", "LYON", "LYRA", "MACE", "MADE", "MAGI", "MAID", "MAIL", "MAIN", + "MAKE", "MALE", "MALI", "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", + "MARE", "MARK", "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", + "MATE", "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", + "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", "MESS", + "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", "MIMI", "MIND", + "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", "MIST", "MITE", "MITT", + "MOAN", "MOAT", "MOCK", "MODE", "MOLD", "MOLE", "MOLL", "MOLT", "MONA", + "MONK", "MONT", "MOOD", "MOON", "MOOR", "MOOT", "MORE", "MORN", "MORT", + "MOSS", "MOST", "MOTH", "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", + "MULL", "MURK", "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", + "NAIL", "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", + "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", "NEST", + "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", "NINE", "NOAH", + "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", "NORM", "NOSE", "NOTE", + "NOUN", "NOVA", "NUDE", "NULL", "NUMB", "OATH", "OBEY", "OBOE", "ODIN", + "OHIO", "OILY", "OINT", "OKAY", "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", + "OMEN", "OMIT", "ONCE", "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", + "OSLO", "OTIS", "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", + "OWLY", "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", + "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH", + "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK", "REED", + "REEF", "REEK", "REEL", "REID", "REIN", "RENA", "REND", "RENT", "REST", + "RICE", "RICH", "RICK", "RIDE", "RIFT", "RILL", "RIME", "RING", "RINK", + "RISE", "RISK", "RITE", "ROAD", "ROAM", "ROAR", "ROBE", "ROCK", "RODE", + "ROIL", "ROLL", "ROME", "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", + "ROSE", "ROSS", "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", + "RUBY", "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", + "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", "SAID", + "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE", "SANG", "SANK", + "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", "SCAT", "SCOT", "SEAL", + "SEAM", "SEAR", "SEAT", "SEED", "SEEK", "SEEM", "SEEN", "SEES", "SELF", + "SELL", "SEND", "SENT", "SETS", "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", + "SHED", "SHIM", "SHIN", "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", + "SICK", "SIDE", "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", + "SINE", "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", + "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", "SLED", + "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", "SLOW", "SLUG", + "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", "SNUG", + "SOAK", "SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL", "SOLD", "SOME", + "SONG", "SOON", "SOOT", "SORE", "SORT", "SOUL", "SOUR", "SOWN", "STAB", + "STAG", "STAN", "STAR", "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", + "STUN", "SUCH", "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", + "SURF", "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", + "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", "TASK", + "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET", + "TELL", "TEND", "TENT", "TERM", "TERN", "TESS", "TEST", "THAN", "THAT", + "THEE", "THEM", "THEN", "THEY", "THIN", "THIS", "THUD", "THUG", "TICK", + "TIDE", "TIDY", "TIED", "TIER", "TILE", "TILL", "TILT", "TIME", "TINA", + "TINE", "TINT", "TINY", "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", + "TONE", "TONG", "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", + "TOUR", "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", + "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK", + "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", "TWIG", "TWIN", + "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", "USES", "UTAH", "VAIL", + "VAIN", "VALE", "VARY", "VASE", "VAST", "VEAL", "VEDA", "VEIL", "VEIN", + "VEND", "VENT", "VERB", "VERY", "VETO", "VICE", "VIEW", "VINE", "VISE", + "VOID", "VOLT", "VOTE", "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", + "WALE", "WALK", "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", + "WARM", "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", + "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", "WELD", + "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", "WHAT", "WHEE", + "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", "WILD", "WILL", "WIND", + "WINE", "WING", "WINK", "WINO", "WIRE", "WISE", "WISH", "WITH", "WOLF", + "WONT", "WOOD", "WOOL", "WORD", "WORE", "WORK", "WORM", "WORN", "WOVE", + "WRIT", "WYNN", "YALE", "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", + "YEAH", "YEAR", "YELL", "YOGA", "YOKE" +}; + + + +/*----- ‚Uƒ[ƒhƒpƒXƒ[ƒh‚ðì¬‚·‚é ------------------------------------------ +* +* Parameter +* int seq : ƒV[ƒPƒ“ƒX”ԍ† +* char *seed : ƒV[ƒh +* char *pass : ƒpƒXƒtƒŒ[ƒY +* int type : ƒ^ƒCƒv (MDx) +* char *buf : ‚Uƒ[ƒhƒpƒXƒ[ƒh‚ð•Ô‚·ƒoƒbƒtƒ@ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int Make6WordPass(int seq, char *seed, char *pass, int type, char *buf) +{ + char key[8]; + int i; + int Sts; + + Sts = FAIL; + if(keycrunch(key, seed, pass, type) != FAIL) + { + for(i = 0; i < seq; i++) + secure_hash(key, type); + btoe(key, buf); + Sts = SUCCESS; + } + return(Sts); +} + + + +static int keycrunch(char *result, char *seed, char *passwd, int Type) +{ + char *buf; + MD4_CTX md4; + MD5_CTX md5; + ulong results[5]; + unsigned int buflen; + + buflen = strlen(seed) + strlen(passwd); + if((buf = malloc(buflen + 1)) == NULL) + return(FAIL); + strcpy(buf, seed); + strcat(buf, passwd); + + /* Crunch the key through MD[45] */ + if(Type == MD4) + { + MD4Init(&md4); + MD4Update(&md4, (uchar *)buf, buflen); + MD4Final((uchar *)results, &md4); + results[0] ^= results[2]; + results[1] ^= results[3]; + } + else if(Type == MD5) + { + MD5Init(&md5); + MD5Update(&md5, (uchar *)buf, buflen); + MD5Final((uchar *)results, &md5); + results[0] ^= results[2]; + results[1] ^= results[3]; + } + else + { + sha_memory((uchar *)buf, buflen, results); + results [0] ^= results [2]; + results [1] ^= results [3]; + results [0] ^= results [4]; + } + free(buf); + + /* Only works on byte-addressed little-endian machines!! */ + memcpy(result, (char *)results, 8); + + return(SUCCESS); +} + + + +static void secure_hash(char *x, int Type) +{ + MD4_CTX md4; + MD5_CTX md5; + ulong results[5]; + + if(Type == MD4) + { + MD4Init(&md4); + MD4Update(&md4,(uchar *)x, 8); + MD4Final((uchar *)results, &md4); + results[0] ^= results[2]; + results[1] ^= results[3]; + } + else if(Type == MD5) + { + MD5Init(&md5); + MD5Update(&md5,(uchar *)x, 8); + MD5Final((uchar *)results, &md5); + results[0] ^= results[2]; + results[1] ^= results[3]; + } + else + { + sha_memory((uchar *)x, 8, results); + results [0] ^= results [2]; + results [1] ^= results [3]; + results [0] ^= results [4]; + } + + /* Only works on byte-addressed little-endian machines!! */ + memcpy(x, (char *)results, 8); + + return; +} + + + +static char *btoe(char *c, char *buf) +{ + char cp[9]; + int p, i; + + memcpy(cp, c, 8); + /* compute parity */ + for(p = 0, i = 0; i < 64; i += 2) + p += extract(cp, i, 2); + cp[8] = (char)p << 6; + + buf[0] = '\0'; + strncat(buf, Wp[extract(cp, 0, 11)], 4); + strcat (buf," "); + strncat(buf, Wp[extract(cp, 11, 11)], 4); + strcat (buf," "); + strncat(buf, Wp[extract(cp, 22, 11)], 4); + strcat (buf," "); + strncat(buf, Wp[extract(cp, 33, 11)], 4); + strcat (buf," "); + strncat(buf, Wp[extract(cp, 44, 11)], 4); + strcat (buf," "); + strncat(buf, Wp[extract(cp, 55, 11)], 4); + + return (buf); +} + + + +static ulong extract(char *s, int start, int length) +{ + ulong x; + unsigned char cl; + unsigned char cc; + unsigned char cr; + + cl = s[start / 8]; + cc = s[start / 8 + 1]; + cr = s[start / 8 + 2]; + x = ((ulong) (cl << 8 | cc) << 8 | cr); + x = x >> (24 - (length + (start % 8))); + x = (x & (0xffff >> (16 - length))); + + return (x); +} + + diff --git a/socket.c b/socket.c new file mode 100644 index 0000000..7ec5b1c --- /dev/null +++ b/socket.c @@ -0,0 +1,1037 @@ +/*============================================================================= +* +* ƒ\ƒPƒbƒg +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#define USE_THIS 1 +#define DBG_MSG 0 + + + + +#define FD_CONNECT_BIT 0x0001 +#define FD_CLOSE_BIT 0x0002 +#define FD_ACCEPT_BIT 0x0004 +#define FD_READ_BIT 0x0008 +#define FD_WRITE_BIT 0x0010 + + + + + +typedef struct { + SOCKET Socket; + int FdConnect; + int FdClose; + int FdAccept; + int FdRead; + int FdWrite; + int Error; +} ASYNCSIGNAL; + + +typedef struct { + HANDLE Async; + int Done; + int ErrorDb; +} ASYNCSIGNALDATABASE; + + +#define MAX_SIGNAL_ENTRY 10 +#define MAX_SIGNAL_ENTRY_DBASE 5 + + + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static int AskAsyncDone(SOCKET s, int *Error, int Mask); +static int AskAsyncDoneDbase(HANDLE Async, int *Error); +static int RegistAsyncTable(SOCKET s); +static int RegistAsyncTableDbase(HANDLE Async); +static int UnRegistAsyncTable(SOCKET s); +static int UnRegistAsyncTableDbase(HANDLE Async); + + +/*===== ŠO•”ŽQÆ =====*/ + +extern int TimeOut; + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static const char SocketWndClass[] = "FFFTPSocketWnd"; +static HWND hWndSocket; + +static ASYNCSIGNAL Signal[MAX_SIGNAL_ENTRY]; +static ASYNCSIGNALDATABASE SignalDbase[MAX_SIGNAL_ENTRY_DBASE]; + +//static HANDLE hAsyncTblAccMutex; + + + + + +/*----- +* +* Parameter +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int MakeSocketWin(HWND hWnd, HINSTANCE hInst) +{ + int i; + int Sts; + WNDCLASSEX wClass; + + wClass.cbSize = sizeof(WNDCLASSEX); + wClass.style = 0; + wClass.lpfnWndProc = SocketWndProc; + wClass.cbClsExtra = 0; + wClass.cbWndExtra = 0; + wClass.hInstance = hInst; + wClass.hIcon = NULL; + wClass.hCursor = NULL; + wClass.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_INFOBK)); + wClass.lpszMenuName = NULL; + wClass.lpszClassName = SocketWndClass; + wClass.hIconSm = NULL; + RegisterClassEx(&wClass); + + Sts = FAIL; + hWndSocket = CreateWindowEx(0, SocketWndClass, NULL, + WS_BORDER | WS_POPUP, + 0, 0, 0, 0, + hWnd, NULL, hInst, NULL); + + if(hWndSocket != NULL) + { +// hAsyncTblAccMutex = CreateMutex(NULL, FALSE, NULL); + + for(i = 0; i < MAX_SIGNAL_ENTRY; i++) + Signal[i].Socket = INVALID_SOCKET; + for(i = 0; i < MAX_SIGNAL_ENTRY_DBASE; i++) + SignalDbase[i].Async = 0; + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteSocketWin(void) +{ +// CloseHandle(hAsyncTblAccMutex); + + if(hWndSocket != NULL) + DestroyWindow(hWndSocket); + return; +} + + +/*----- +* +* Parameter +* HWND hWnd : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int Pos; + + switch(message) + { + case WM_ASYNC_SOCKET : + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == (SOCKET)wParam) + { + Signal[Pos].Error = WSAGETSELECTERROR(lParam); +#if DBG_MSG + if(WSAGETSELECTERROR(lParam) != 0) + DoPrintf("####### Signal: error (%d)", WSAGETSELECTERROR(lParam)); +#endif + + switch(WSAGETSELECTEVENT(lParam)) + { + case FD_CONNECT : + Signal[Pos].FdConnect = 1; +#if DBG_MSG + DoPrintf("####### Signal: connect (S=%x)", Signal[Pos].Socket); +#endif + break; + + case FD_CLOSE : + Signal[Pos].FdClose = 1; +#if DBG_MSG + DoPrintf("####### Signal: close (S=%x)", Signal[Pos].Socket); +#endif +//SetTaskMsg("####### Signal: close (%d) (S=%x)", Pos, Signal[Pos].Socket); + break; + + case FD_ACCEPT : + Signal[Pos].FdAccept = 1; +#if DBG_MSG + DoPrintf("####### Signal: accept (S=%x)", Signal[Pos].Socket); +#endif + break; + + case FD_READ : + Signal[Pos].FdRead = 1; +#if DBG_MSG + DoPrintf("####### Signal: read (S=%x)", Signal[Pos].Socket); +#endif + break; + + case FD_WRITE : + Signal[Pos].FdWrite = 1; +#if DBG_MSG + DoPrintf("####### Signal: write (S=%x)", Signal[Pos].Socket); +#endif + break; + } + break; + } + } + break; + + case WM_ASYNC_DBASE : + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++) + { + if(SignalDbase[Pos].Async == (HANDLE)wParam) + { + if(HIWORD(lParam) != 0) + { + SignalDbase[Pos].ErrorDb = 1; +#if DBG_MSG + DoPrintf("##### SignalDatabase: error"); +#endif + } + SignalDbase[Pos].Done = 1; +#if DBG_MSG + DoPrintf("##### SignalDatabase: Done"); +#endif + break; + } + } + break; + + default : + return(DefWindowProc(hWnd, message, wParam, lParam)); + } + return(0); +} + + + + +/*----- +* +* Parameter +* +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +static int AskAsyncDone(SOCKET s, int *Error, int Mask) +{ + int Sts; + int Pos; + + Sts = NO; + *Error = 0; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + *Error = Signal[Pos].Error; + if(Signal[Pos].Error != 0) + Sts = YES; + if((Mask & FD_CONNECT_BIT) && (Signal[Pos].FdConnect != 0)) + { + Sts = YES; +#if DBG_MSG + DoPrintf("### Ask: connect (Sts=%d, Error=%d)", Sts, *Error); +#endif + } + if((Mask & FD_CLOSE_BIT) && (Signal[Pos].FdClose != 0)) +// if(Mask & FD_CLOSE_BIT) + { + Sts = YES; +#if DBG_MSG + DoPrintf("### Ask: close (Sts=%d, Error=%d)", Sts, *Error); +#endif + } + if((Mask & FD_ACCEPT_BIT) && (Signal[Pos].FdAccept != 0)) + { + Signal[Pos].FdAccept = 0; + Sts = YES; +#if DBG_MSG + DoPrintf("### Ask: accept (Sts=%d, Error=%d)", Sts, *Error); +#endif + } + if((Mask & FD_READ_BIT) && (Signal[Pos].FdRead != 0)) + { + Signal[Pos].FdRead = 0; + Sts = YES; +#if DBG_MSG + DoPrintf("### Ask: read (Sts=%d, Error=%d)", Sts, *Error); +#endif + } + if((Mask & FD_WRITE_BIT) && (Signal[Pos].FdWrite != 0)) + { + Signal[Pos].FdWrite = 0; + Sts = YES; +#if DBG_MSG + DoPrintf("### Ask: write (Sts=%d, Error=%d)", Sts, *Error); +#endif + } + break; + } + } + + if(Pos == MAX_SIGNAL_ENTRY) + { + if(Mask & FD_CLOSE_BIT) + { + Sts = YES; + } + else + { + MessageBox(GetMainHwnd(), "AskAsyncDone called with unregisterd socket.", "FFFTP inner error", MB_OK); + exit(1); + } + } + return(Sts); +} + + +/*----- +* +* Parameter +* +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +static int AskAsyncDoneDbase(HANDLE Async, int *Error) +{ + int Sts; + int Pos; + + Sts = NO; + *Error = 0; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++) + { + if(SignalDbase[Pos].Async == Async) + { + if(SignalDbase[Pos].Done != 0) + { + *Error = SignalDbase[Pos].ErrorDb; + Sts = YES; +#if DBG_MSG + DoPrintf("### Ask: Dbase (Sts=%d, Error=%d)", Sts, *Error); +#endif + } + break; + } + } + + if(Pos == MAX_SIGNAL_ENTRY_DBASE) + { + MessageBox(GetMainHwnd(), "AskAsyncDoneDbase called with unregisterd handle.", "FFFTP inner error", MB_OK); + exit(1); + } + return(Sts); +} + + + +/*----- +* +* Parameter +* +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +static int RegistAsyncTable(SOCKET s) +{ + int Sts; + int Pos; + + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK); + break; + } + } + + if(Pos == MAX_SIGNAL_ENTRY) + { + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == INVALID_SOCKET) + { + +//SetTaskMsg("############### Regist socket (%d)", Pos); + + Signal[Pos].Socket = s; + Signal[Pos].Error = 0; + Signal[Pos].FdConnect = 0; + Signal[Pos].FdClose = 0; + Signal[Pos].FdAccept = 0; + Signal[Pos].FdRead = 0; + Signal[Pos].FdWrite = 0; + Sts = YES; + break; + } + } + + if(Pos == MAX_SIGNAL_ENTRY) + { + MessageBox(GetMainHwnd(), "No more async regist space.", "FFFTP inner error", MB_OK); + exit(1); + } + } + + return(Sts); +} + + +/*----- +* +* Parameter +* +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +static int RegistAsyncTableDbase(HANDLE Async) +{ + int Sts; + int Pos; + + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++) + { + if(SignalDbase[Pos].Async == Async) + { + MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK); + break; + } + } + + if(Pos == MAX_SIGNAL_ENTRY_DBASE) + { + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(SignalDbase[Pos].Async == 0) + { + +//SetTaskMsg("############### Regist dbase (%d)", Pos); + + SignalDbase[Pos].Async = Async; + SignalDbase[Pos].Done = 0; + SignalDbase[Pos].ErrorDb = 0; + Sts = YES; + break; + } + } + + if(Pos == MAX_SIGNAL_ENTRY_DBASE) + { + MessageBox(GetMainHwnd(), "No more async dbase regist space.", "FFFTP inner error", MB_OK); + exit(1); + } + } + + return(Sts); +} + + +/*----- +* +* Parameter +* +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +static int UnRegistAsyncTable(SOCKET s) +{ + int Sts; + int Pos; + + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++) + { + if(Signal[Pos].Socket == s) + { + +//SetTaskMsg("############### UnRegist socket (%d)", Pos); + + Signal[Pos].Socket = INVALID_SOCKET; + Sts = YES; + break; + } + } + return(Sts); +} + + +/*----- +* +* Parameter +* +* +* Return Value +* +*----------------------------------------------------------------------------*/ + +static int UnRegistAsyncTableDbase(HANDLE Async) +{ + int Sts; + int Pos; + + Sts = NO; + for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++) + { + if(SignalDbase[Pos].Async == Async) + { + +//SetTaskMsg("############### UnRegist dbase (%d)", Pos); + + SignalDbase[Pos].Async = 0; + Sts = YES; + break; + } + } + return(Sts); +} + + + + + + + + +struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork) +{ +#if USE_THIS + struct hostent *Ret; + HANDLE hAsync; + int Error; + +#if DBG_MSG + DoPrintf("# Start gethostbyname"); +#endif + Ret = NULL; + *CancelCheckWork = NO; + + hAsync = WSAAsyncGetHostByName(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); + if(hAsync != NULL) + { + RegistAsyncTableDbase(hAsync); + while((*CancelCheckWork == NO) && (AskAsyncDoneDbase(hAsync, &Error) != YES)) + { + Sleep(1); + if(BackgrndMessageProc() == YES) + *CancelCheckWork = YES; + } + + if(*CancelCheckWork == YES) + { + WSACancelAsyncRequest(hAsync); + } + else if(Error == 0) + { + Ret = (struct hostent *)Buf; + } + UnRegistAsyncTableDbase(hAsync); + } + return(Ret); +#else + return(gethostbyname(Name)); +#endif +} + + + + + +SOCKET do_socket(int af, int type, int protocol) +{ + SOCKET Ret; + + Ret = socket(af, type, protocol); + if(Ret != INVALID_SOCKET) + { + RegistAsyncTable(Ret); + } +#if DBG_MSG + DoPrintf("# do_socket (S=%x)", Ret); +#endif + return(Ret); +} + + + +int do_closesocket(SOCKET s) +{ +#if USE_THIS + int Ret; + int Error; + int CancelCheckWork; + +#if DBG_MSG + DoPrintf("# Start close (S=%x)", s); +#endif + CancelCheckWork = NO; + + Ret = closesocket(s); + if(Ret == SOCKET_ERROR) + { + Error = 0; + while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CLOSE_BIT) != YES)) + { + Sleep(1); + if(BackgrndMessageProc() == YES) + CancelCheckWork = YES; + } + + if((CancelCheckWork == NO) && (Error == 0)) + Ret = 0; + } + + WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, 0); + if(BackgrndMessageProc() == YES) + CancelCheckWork = YES; + UnRegistAsyncTable(s); + +#if DBG_MSG + DoPrintf("# Exit close"); +#endif + return(Ret); +#else + return(closesocket(s)); +#endif +} + + + + + + +int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCheckWork) +{ +#if USE_THIS + int Ret; + int Error; + +#if DBG_MSG + DoPrintf("# Start connect (S=%x)", s); +#endif + *CancelCheckWork = NO; + +#if DBG_MSG + DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE"); +#endif + Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE); + if(Ret != SOCKET_ERROR) + { + Ret = connect(s, name, namelen); + if(Ret == SOCKET_ERROR) + { + do + { + Error = 0; + while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_CONNECT_BIT) != YES)) + { + Sleep(1); + if(BackgrndMessageProc() == YES) + *CancelCheckWork = YES; + } + + if(*CancelCheckWork == YES) + break; + if(Error == 0) + Ret = 0; + else + { +// Error = WSAGetLastError(); + DoPrintf("#### Connect: Error=%d", Error); + } + } + while((Ret != 0) && (Error == WSAEWOULDBLOCK)); + } + } + else + DoPrintf("#### Connect: AsyncSelect error (%d)", WSAGetLastError()); + +#if DBG_MSG + DoPrintf("# Exit connect (%d)", Ret); +#endif + return(Ret); +#else + return(connect(s, name, namelen)); +#endif +} + + + + + +int do_listen(SOCKET s, int backlog) +{ + int Ret; + + Ret = 1; +#if DBG_MSG + DoPrintf("# Start listen (S=%x)", s); + DoPrintf("## Async set: FD_CLOSE|FD_ACCEPT"); +#endif + + Ret = WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CLOSE | FD_ACCEPT); + if(Ret != SOCKET_ERROR) + Ret = listen(s, backlog); + +#if DBG_MSG + DoPrintf("# Exit listen (%d)", Ret); +#endif + return(Ret); +} + + + +SOCKET do_accept(SOCKET s, struct sockaddr *addr, int *addrlen) +{ +#if USE_THIS + SOCKET Ret2; + int CancelCheckWork; + int Error; + +#if DBG_MSG + DoPrintf("# Start accept (S=%x)", s); +#endif + CancelCheckWork = NO; + Ret2 = INVALID_SOCKET; + Error = 0; + + while((CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_ACCEPT_BIT) != YES)) + { + if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) + { + Error = 1; + break; + } + Sleep(1); + if(BackgrndMessageProc() == YES) + CancelCheckWork = YES; + } + + if((CancelCheckWork == NO) && (Error == 0)) + { + do + { + Ret2 = accept(s, addr, addrlen); + if(Ret2 != INVALID_SOCKET) + { +#if DBG_MSG + DoPrintf("## do_sccept (S=%x)", Ret2); + DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE"); +#endif + RegistAsyncTable(Ret2); + if(WSAAsyncSelect(Ret2, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE) == SOCKET_ERROR) + { + do_closesocket(Ret2); + Ret2 = INVALID_SOCKET; + } + break; + } + Error = WSAGetLastError(); + Sleep(1); + if(BackgrndMessageProc() == YES) + break; + } + while(Error == WSAEWOULDBLOCK); + } + +#if DBG_MSG + DoPrintf("# Exit accept"); +#endif + return(Ret2); +#else + return(accept(s, addr, addrlen)); +#endif +} + + + + +/*----- recv‘Š“–‚̊֐” -------------------------------------------------------- +* +* Parameter +* SOCKET s : ƒ\ƒPƒbƒg +* char *buf : ƒf[ƒ^‚ð“ǂݍž‚Þƒoƒbƒtƒ@ +* int len : ’·‚³ +* int flags : recv‚É—^‚¦‚éƒtƒ‰ƒO +* int *TimeOutErr : ƒ^ƒCƒ€ƒAƒEƒg‚µ‚½‚©‚Ç‚¤‚©‚ð•Ô‚·ƒ[ƒN +* +* Return Value +* int : recv‚Ì–ß‚è’l‚Æ“¯‚¶ +* +* Note +* ƒ^ƒCƒ€ƒAƒEƒg‚ÌŽž‚Í TimeOut=YESARet=SOCKET_ERROR ‚É‚È‚é +*----------------------------------------------------------------------------*/ +int do_recv(SOCKET s, char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork) +{ +#if USE_THIS + int Ret; + time_t StartTime; + time_t ElapseTime; + int Error; + +#if DBG_MSG + DoPrintf("# Start recv (S=%x)", s); +#endif + *TimeOutErr = NO; + *CancelCheckWork = NO; + Ret = SOCKET_ERROR; + Error = 0; + + if(TimeOut != 0) + time(&StartTime); + + while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_READ_BIT) != YES)) + { + if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) + { + Ret = 0; + break; + } + Sleep(1); + if(BackgrndMessageProc() == YES) + *CancelCheckWork = YES; + else if(TimeOut != 0) + { + time(&ElapseTime); + ElapseTime -= StartTime; + if(ElapseTime >= TimeOut) + { + DoPrintf("do_recv timed out"); + *TimeOutErr = YES; + *CancelCheckWork = YES; + } + } + } + + if(/*(Ret != 0) && */(Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO)) + { + do + { +#if DBG_MSG + DoPrintf("## recv()"); +#endif + + Ret = recv(s, buf, len, flags); + if(Ret != SOCKET_ERROR) + break; + Error = WSAGetLastError(); + Sleep(1); + if(BackgrndMessageProc() == YES) + break; + } + while(Error == WSAEWOULDBLOCK); + } + + if(BackgrndMessageProc() == YES) + Ret = SOCKET_ERROR; + +#if DBG_MSG + DoPrintf("# Exit recv (%d)", Ret); +#endif + return(Ret); +#else + return(recv(s, buf, len, flags)); +#endif +} + + + +int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int *CancelCheckWork) +{ +#if USE_THIS + int Ret; + time_t StartTime; + time_t ElapseTime; + int Error; + +#if DBG_MSG + DoPrintf("# Start send (S=%x)", s); +#endif + *TimeOutErr = NO; + *CancelCheckWork = NO; + Ret = SOCKET_ERROR; + Error = 0; + + if(TimeOut != 0) + time(&StartTime); + +#if DBG_MSG + DoPrintf("## Async set: FD_CONNECT|FD_CLOSE|FD_ACCEPT|FD_READ|FD_WRITE"); +#endif + WSAAsyncSelect(s, hWndSocket, WM_ASYNC_SOCKET, FD_CONNECT | FD_CLOSE | FD_ACCEPT | FD_READ | FD_WRITE); + if(BackgrndMessageProc() == YES) + *CancelCheckWork = YES; + + while((*CancelCheckWork == NO) && (AskAsyncDone(s, &Error, FD_WRITE_BIT) != YES)) + { + if(AskAsyncDone(s, &Error, FD_CLOSE_BIT) == YES) + { + Error = 1; + break; + } + + Sleep(1); + if(BackgrndMessageProc() == YES) + *CancelCheckWork = YES; + else if(TimeOut != 0) + { + time(&ElapseTime); + ElapseTime -= StartTime; + if(ElapseTime >= TimeOut) + { + DoPrintf("do_write timed out"); + *TimeOutErr = YES; + *CancelCheckWork = YES; + } + } + } + + if((Error == 0) && (*CancelCheckWork == NO) && (*TimeOutErr == NO)) + { + do + { +#if DBG_MSG + DoPrintf("## send()"); +#endif + + Ret = send(s, buf, len, flags); + if(Ret != SOCKET_ERROR) + { +#if DBG_MSG + DoPrintf("## send() OK"); +#endif + break; + } + Error = WSAGetLastError(); + Sleep(1); + if(BackgrndMessageProc() == YES) + break; + } + while(Error == WSAEWOULDBLOCK); + } + + if(BackgrndMessageProc() == YES) + Ret = SOCKET_ERROR; + +#if DBG_MSG + DoPrintf("# Exit send (%d)", Ret); +#endif + return(Ret); +#else + return(send(s, buf, len, flags)); +#endif +} + + +/*----- +* +* Parameter +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int CheckClosedAndReconnect(void) +{ + int Error; + int Sts; + +//SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + + Sts = SUCCESS; + if(AskAsyncDone(AskCmdCtrlSkt(), &Error, FD_CLOSE_BIT) == YES) + { + Sts = ReConnectCmdSkt(); + } + return(Sts); +} + + + diff --git a/statuswin.c b/statuswin.c new file mode 100644 index 0000000..6467fc6 --- /dev/null +++ b/statuswin.c @@ -0,0 +1,226 @@ +/*============================================================================= +* +* ƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HWND hWndSbar = NULL; +static int SbarColWidth[5] = { 70, 230, 410, 570, -1 }; + + + +/*----- ƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE‚ðì¬‚·‚é ---------------------------------------- +* +* Parameter +* HWND hWnd : eƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HINSTANCE hInst : ƒCƒ“ƒXƒ^ƒ“ƒXƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int MakeStatusBarWindow(HWND hWnd, HINSTANCE hInst) +{ + int Sts; + + Sts = FAIL; + hWndSbar = CreateWindowEx(0, + STATUSCLASSNAME, NULL, + WS_CHILD | SBS_SIZEGRIP | WS_CLIPSIBLINGS | SBT_NOBORDERS, + 0, 0, 0, 0, + hWnd, (HMENU)1500, hInst, NULL); + + if(hWndSbar != NULL) + { + SendMessage(hWndSbar, SB_SETPARTS, sizeof(SbarColWidth)/sizeof(int), (LPARAM)SbarColWidth); + ShowWindow(hWndSbar, SW_SHOW); + Sts = SUCCESS; + } + return(Sts); +} + + +/*----- ƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE‚ðíœ -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteStatusBarWindow(void) +{ + if(hWndSbar != NULL) + DestroyWindow(hWndSbar); + return; +} + + +/*----- ƒXƒe[ƒ^ƒXƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetSbarWnd(void) +{ + return(hWndSbar); +} + + +/*----- ƒJƒŒƒ“ƒgƒEƒCƒ“ƒhƒE‚ð•\Ž¦ ---------------------------------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† (WIN_xxx : -1=‚È‚µ) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispCurrentWindow(int Win) +{ + if(Win == WIN_LOCAL) + SendMessage(GetSbarWnd(), SB_SETTEXT, 0 | 0, (LPARAM)MSGJPN245); + else if(Win == WIN_REMOTE) + SendMessage(GetSbarWnd(), SB_SETTEXT, 0 | 0, (LPARAM)MSGJPN246); + else + SendMessage(GetSbarWnd(), SB_SETTEXT, 0 | 0, (LPARAM)""); + return; +} + + +/*----- ‘I‘ð‚³‚ê‚Ä‚¢‚éƒtƒ@ƒCƒ‹”‚ƃTƒCƒY‚ð•\Ž¦ -------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispSelectedSpace(void) +{ + char Buf1[50]; + char Buf2[50]; + int Win; + + Win = WIN_LOCAL; + if(GetFocus() == GetRemoteHwnd()) + Win = WIN_REMOTE; + + MakeSizeString(GetSelectedTotalSize(Win), Buf1); + sprintf(Buf2, MSGJPN247, GetSelectedCount(Win), Buf1); + SendMessage(GetSbarWnd(), SB_SETTEXT, 1 | 0, (LPARAM)Buf2); + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚Ì‹ó‚«—e—Ê‚ð•\Ž¦ -------------------------------------------- +* +* Parameter +* char *Path : ƒpƒX–¼ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispLocalFreeSpace(char *Path) +{ + char Buf[40]; + + sprintf(Buf, MSGJPN248, AskLocalFreeSpace(Path)); + SendMessage(GetSbarWnd(), SB_SETTEXT, 2 | 0, (LPARAM)Buf); + return; +} + + +/*----- “]‘—‚·‚éƒtƒ@ƒCƒ‹‚̐”‚ð•\Ž¦ -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispTransferFiles(void) +{ + char Buf[50]; + + sprintf(Buf, MSGJPN249, AskTransferFileNum()); + SendMessage(GetSbarWnd(), SB_SETTEXT, 3 | 0, (LPARAM)Buf); + return; +} + + +/*----- ŽóM’†‚̃oƒCƒg”‚ð•\Ž¦ ------------------------------------------------ +* +* Parameter +* LONGLONG Size : ƒoƒCƒg” (-1=•\Ž¦‚ðÁ‚·) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispDownloadSize(LONGLONG Size) +{ + char Buf[50]; + char Tmp[50]; + + strcpy(Buf, ""); + if(Size >= 0) + { + MakeSizeString((double)Size, Tmp); + sprintf(Buf, MSGJPN250, Tmp); + } + SendMessage(GetSbarWnd(), SB_SETTEXT, 4 | 0, (LPARAM)Buf); + return; +} + + diff --git a/taskwin.c b/taskwin.c new file mode 100644 index 0000000..59a9af6 --- /dev/null +++ b/taskwin.c @@ -0,0 +1,358 @@ +/*============================================================================= +* +* ƒ^ƒXƒNƒEƒCƒ“ƒhƒE +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#define TASK_BUFSIZE (16*1024) + + + + +/*===== ŠO•”ŽQÆ =====*/ + +extern int ClientWidth; +extern int SepaWidth; +extern int ListHeight; + +/* Ý’è’l */ +extern int TaskHeight; +extern HFONT ListFont; +extern int DebugConsole; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HWND hWndTask = NULL; +static HANDLE DispLogSemaphore; +static HANDLE DispLogSemaphore2; + + + +/*----- ƒ^ƒXƒNƒEƒCƒ“ƒhƒE‚ðì¬‚·‚é -------------------------------------------- +* +* Parameter +* HWND hWnd : eƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HINSTANCE hInst : ƒCƒ“ƒXƒ^ƒ“ƒXƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int MakeTaskWindow(HWND hWnd, HINSTANCE hInst) +{ + int Sts; + + Sts = FAIL; + hWndTask = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE, + "EDIT", NULL, + WS_CHILD | WS_BORDER | ES_AUTOVSCROLL | WS_VSCROLL | ES_MULTILINE | ES_READONLY | WS_CLIPSIBLINGS, + 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, + hWnd, (HMENU)1500, hInst, NULL); + + if(hWndTask != NULL) + { + SendMessage(hWndTask, EM_LIMITTEXT, TASK_BUFSIZE, 0); + + if(ListFont != NULL) + SendMessage(hWndTask, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0)); + + ShowWindow(hWndTask, SW_SHOW); + Sts = SUCCESS; + + DispLogSemaphore = CreateSemaphore(NULL, 1, 1, NULL); + DispLogSemaphore2 = CreateSemaphore(NULL, 1, 1, NULL); + + } + return(Sts); +} + + +/*----- ƒ^ƒXƒNƒEƒCƒ“ƒhƒE‚ðíœ ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteTaskWindow(void) +{ + CloseHandle(DispLogSemaphore); + CloseHandle(DispLogSemaphore2); + if(hWndTask != NULL) + DestroyWindow(hWndTask); + return; +} + + +/*----- ƒ^ƒXƒNƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetTaskWnd(void) +{ + return(hWndTask); +} + + +/*----- ƒ^ƒXƒNƒƒbƒZ[ƒW‚ð•\Ž¦‚·‚é -------------------------------------------- +* +* Parameter +* char *szFormat : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ +* ... : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetTaskMsg(char *szFormat, ...) +{ + int Pos; + va_list vaArgs; + char *szBuf; +// DWORD Tmp; + +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "111\n", 4, &Tmp, NULL); + while(WaitForSingleObject(DispLogSemaphore, 1) == WAIT_TIMEOUT) + BackgrndMessageProc(); +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "222\n", 4, &Tmp, NULL); + + if(hWndTask != NULL) + { + if((szBuf = malloc(10*1024+3)) != NULL) + { + va_start(vaArgs, szFormat); + if(wvsprintf(szBuf, szFormat, vaArgs) != EOF) + { +//#pragma aaa +// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL); +// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL); + + strcat(szBuf, "\r\n"); + Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0); + + /* ƒeƒLƒXƒgƒTƒCƒY‚̃Šƒ~ƒbƒg’l‚ðƒ`ƒFƒbƒN */ + if((Pos + strlen(szBuf)) >= TASK_BUFSIZE) + { + /* ƒŠƒ~ƒbƒg‚ð‰z‚¦‚»‚¤‚È‚çAæ“ª•”•ª‚ðØ‚èŽÌ‚Ä‚é */ + Pos = SendMessage(GetTaskWnd(), EM_LINEFROMCHAR, TASK_BUFSIZE/10, 0) + 1; + Pos = SendMessage(GetTaskWnd(), EM_LINEINDEX, Pos, 0); + SendMessage(GetTaskWnd(), EM_SETSEL, 0, Pos); + SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)""); + + Pos = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0); + } + + SendMessage(GetTaskWnd(), EM_SETSEL, Pos, Pos); + SendMessage(GetTaskWnd(), EM_REPLACESEL, FALSE, (LPARAM)szBuf); + } + va_end(vaArgs); + free(szBuf); + } + } + +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "333\n", 4, &Tmp, NULL); + ReleaseSemaphore(DispLogSemaphore, 1, NULL); +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "444\n", 4, &Tmp, NULL); + + return; +} + + +/*----- ƒ^ƒXƒNƒƒbƒZ[ƒW‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚é ---------------------------------- +* +* Parameter +* char *Fname : ƒtƒ@ƒCƒ‹–¼ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int SaveTaskMsg(char *Fname) +{ + FILE *Strm; + int Size; + char *Buf; + int Sts; + + + Sts = FAIL; + Size = SendMessage(GetTaskWnd(), WM_GETTEXTLENGTH, 0, 0); + if((Buf = malloc(Size)) != NULL) + { + if((Strm = fopen(Fname, "wb")) != NULL) + { + SendMessage(GetTaskWnd(), WM_GETTEXT, Size, (LPARAM)Buf); + if(fwrite(Buf, strlen(Buf), 1, Strm) == 1) + Sts = SUCCESS; + fclose(Strm); + + if(Sts == FAIL) + _unlink(Fname); + } + free(Buf); + } + return(Sts); +} + + +/*----- ƒ^ƒXƒN“à—e‚ðƒrƒ…[ƒ‚Å•\Ž¦ -------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispTaskMsg(void) +{ + char Buf[FMAX_PATH+1]; + + strcpy(Buf, AskTmpFilePath()); + SetYenTail(Buf); + strcat(Buf, "_ffftp.tsk"); + + if(SaveTaskMsg(Buf) == SUCCESS) + { + AddTempFileList(Buf); + ExecViewer(Buf, 0); + } + return; +} + + +/*----- ƒfƒoƒbƒOƒRƒ“ƒ\[ƒ‹‚ɃƒbƒZ[ƒW‚ð•\Ž¦‚·‚é ------------------------------ +* +* Parameter +* char *szFormat : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ +* ... : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoPrintf(char *szFormat, ...) +{ + va_list vaArgs; + char *szBuf; +// DWORD Tmp; + +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "11111\n", 6, &Tmp, NULL); + while(WaitForSingleObject(DispLogSemaphore2, 1) == WAIT_TIMEOUT) + BackgrndMessageProc(); +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "22222\n", 6, &Tmp, NULL); + + if(DebugConsole == YES) + { + if((szBuf = malloc(10*1024)) != NULL) + { + va_start(vaArgs, szFormat); + if(wvsprintf(szBuf, szFormat, vaArgs) != EOF) + { + SetTaskMsg("## %s", szBuf); + +//#pragma aaa +// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL); +// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL); + } + va_end(vaArgs); + free(szBuf); + } + } + +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "33333\n", 6, &Tmp, NULL); + ReleaseSemaphore(DispLogSemaphore2, 1, NULL); +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "44444\n", 6, &Tmp, NULL); + + return; +} + + +/*----- ƒfƒoƒbƒOƒRƒ“ƒ\[ƒ‹‚ɃƒbƒZ[ƒW‚ð•\Ž¦‚·‚é ------------------------------ +* +* Parameter +* char *szFormat : ƒtƒH[ƒ}ƒbƒg•¶Žš—ñ +* ... : ƒpƒ‰ƒ[ƒ^ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DoPrintf2(char *szFormat, ...) +{ + va_list vaArgs; + char *szBuf; + DWORD Tmp; + +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "11111111\n", 9, &Tmp, NULL); + while(WaitForSingleObject(DispLogSemaphore2, 1) == WAIT_TIMEOUT) + BackgrndMessageProc(); +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "22222222\n", 9, &Tmp, NULL); + + if((szBuf = malloc(10*1024)) != NULL) + { + va_start(vaArgs, szFormat); + if(wvsprintf(szBuf, szFormat, vaArgs) != EOF) + { + WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf, strlen(szBuf), &Tmp, NULL); + WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "\n", strlen("\n"), &Tmp, NULL); + } + va_end(vaArgs); + free(szBuf); + } + +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "33333333\n", 9, &Tmp, NULL); + ReleaseSemaphore(DispLogSemaphore2, 1, NULL); +//WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), "44444444\n", 9, &Tmp, NULL); + + return; +} + + diff --git a/tool.c b/tool.c new file mode 100644 index 0000000..2f5fced --- /dev/null +++ b/tool.c @@ -0,0 +1,155 @@ +/*============================================================================= +* +* ƒc[ƒ‹ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + +#include +#include "helpid.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static BOOL CALLBACK OtpCalcWinProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); + + +/*===== ŠO•”ŽQÆ =====*/ + +extern HWND hHelpWin; + + +/*----- ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒhŒvŽZ ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void OtpCalcTool(void) +{ + DialogBox(GetFtpInst(), MAKEINTRESOURCE(otp_calc_dlg), GetMainHwnd(), OtpCalcWinProc); + return; +} + + +/*----- ƒƒ“ƒ^ƒCƒ€ƒpƒXƒ[ƒhŒvŽZƒEƒCƒ“ƒhƒE‚̃R[ƒ‹ƒoƒbƒN ---------------------- +* +* Parameter +* HWND hDlg : ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* UINT message : ƒƒbƒZ[ƒW”ԍ† +* WPARAM wParam : ƒƒbƒZ[ƒW‚Ì WPARAM ˆø” +* LPARAM lParam : ƒƒbƒZ[ƒW‚Ì LPARAM ˆø” +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static BOOL CALLBACK OtpCalcWinProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + char Tmp[41]; + char *Pos; + int Seq; + int Type; + char Seed[MAX_SEED_LEN+1]; + char Pass[PASSWORD_LEN+1]; + + static const RADIOBUTTON AlgoButton[] = { + { OTPCALC_MD4, MD4 }, + { OTPCALC_MD5, MD5 }, + { OTPCALC_SHA1, SHA1 } + }; + #define ALGOBUTTONS (sizeof(AlgoButton)/sizeof(RADIOBUTTON)) + + switch (message) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, OTPCALC_KEY, EM_LIMITTEXT, 40, 0); + SendDlgItemMessage(hDlg, OTPCALC_PASS, EM_LIMITTEXT, PASSWORD_LEN, 0); + SetRadioButtonByValue(hDlg, MD4, AlgoButton, ALGOBUTTONS); + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, OTPCALC_KEY, WM_GETTEXT, 41, (LPARAM)Tmp); + SendDlgItemMessage(hDlg, OTPCALC_PASS, WM_GETTEXT, PASSWORD_LEN+1, (LPARAM)Pass); + Type = AskRadioButtonValue(hDlg, AlgoButton, ALGOBUTTONS); + + Pos = Tmp; + while(*Pos == ' ') + Pos++; + + if(IsDigit(*Pos)) + { + Seq = atoi(Pos); + /* Seed */ + if((Pos = GetNextField(Pos)) != NULL) + { + if(GetOneField(Pos, Seed, MAX_SEED_LEN) == SUCCESS) + { + Make6WordPass(Seq, Seed, Pass, Type, Tmp); + } + else + strcpy(Tmp, MSGJPN251); + } + else + strcpy(Tmp, MSGJPN252); + } + else + strcpy(Tmp, MSGJPN253); + + SendDlgItemMessage(hDlg, OTPCALC_RES, WM_SETTEXT, 0, (LPARAM)Tmp); + break; + + case IDCANCEL : + EndDialog(hDlg, NO); + break; + + case IDHELP : + hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000037); + break; + } + return(TRUE); + } + return(FALSE); +} + + + diff --git a/toolmenu.c b/toolmenu.c new file mode 100644 index 0000000..2cc48a7 --- /dev/null +++ b/toolmenu.c @@ -0,0 +1,1754 @@ +/*============================================================================= +* +* ƒc[ƒ‹ƒo[‚ƃƒjƒ…[ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "resource.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static void AddOpenMenu(HMENU hMenu, UINT Flg); +static LRESULT CALLBACK HistEditBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + +/* 2007/09/21 sunasunamix ‚±‚±‚©‚ç *********************/ +static LRESULT CALLBACK CountermeasureTbarMainProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam); +static LRESULT CALLBACK CountermeasureTbarLocalProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam); +static LRESULT CALLBACK CountermeasureTbarRemoteProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam); +/********************************************* ‚±‚±‚Ü‚Å */ + + +/*===== ŠO•”ŽQÆ =====*/ + +extern int SepaWidth; +extern int RemoteWidth; + +extern int CancelFlg; + +/* Ý’è’l */ +extern int DotFile; +extern char AsciiExt[ASCII_EXT_LEN+1]; +extern int TransMode; +extern int ListType; +extern int LocalWidth; +extern char ViewerName[VIEWERS][FMAX_PATH+1]; +extern int TransMode; +extern int SortSave; + +/*===== ƒ[ƒJƒ‹‚ȃ[ƒN =====*/ + +static HWND hWndTbarMain = NULL; +static HWND hWndTbarLocal = NULL; +static HWND hWndTbarRemote = NULL; +static HWND hWndDirLocal = NULL; +static HWND hWndDirRemote = NULL; +static HWND hWndDirLocalEdit = NULL; +static HWND hWndDirRemoteEdit = NULL; + +static WNDPROC HistEditBoxProcPtr; + +static HFONT DlgFont = NULL; + +static int TmpTransMode; +static int TmpHostKanjiCode; +static int TmpHostKanaCnv; + +static int TmpLocalFileSort; +static int TmpLocalDirSort; +static int TmpRemoteFileSort; +static int TmpRemoteDirSort; + +static int SyncMove = NO; + +static int HideUI = NO; + + +/* 2007/09/21 sunasunamix ‚±‚±‚©‚ç *********************/ +static WNDPROC pOldTbarMainProc = NULL; +static WNDPROC pOldTbarLocalProc = NULL; +static WNDPROC pOldTbarRemoteProc = NULL; +/********************************************* ‚±‚±‚Ü‚Å */ + + +/* ˆÈ‘OAƒRƒ“ƒ{ƒ{ƒbƒNƒX‚ɃJƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚ð‰¯‚¦‚³‚¹‚Ä‚¢‚½—¬‚ê‚Å */ +/* ‚±‚̃tƒ@ƒCƒ‹‚ŃJƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚ð‰¯‚¦‚³‚¹‚é */ +static char LocalCurDir[FMAX_PATH+1]; +static char RemoteCurDir[FMAX_PATH+1]; + + +/* ƒƒCƒ“‚̃c[ƒ‹ƒo[ */ +static TBBUTTON TbarDataMain[] = { + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 0, MENU_CONNECT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 16, MENU_QUICK, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 1, MENU_DISCONNECT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 2, MENU_DOWNLOAD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 3, MENU_UPLOAD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 24, MENU_MIRROR_UPLOAD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 4, MENU_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 5, MENU_RENAME, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 6, MENU_MKDIR, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 7, MENU_TEXT, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 8, MENU_BINARY, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 17, MENU_AUTO, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 20, MENU_KNJ_EUC, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 21, MENU_KNJ_JIS, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 22, MENU_KNJ_NONE, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 23, MENU_KANACNV, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 15, MENU_REFRESH, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 18, MENU_LIST, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 19, MENU_REPORT, TBSTATE_ENABLED, TBSTYLE_CHECKGROUP, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 25, MENU_SYNC, TBSTATE_ENABLED, TBSTYLE_CHECK, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 26, MENU_ABORT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 } +}; + +/* ƒ[ƒJƒ‹‘¤‚̃c[ƒ‹ƒo[ */ +static TBBUTTON TbarDataLocal[] = { + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 0, MENU_LOCAL_UPDIR, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 1, MENU_LOCAL_CHDIR, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 } +}; + +/* ƒzƒXƒg‘¤‚̃c[ƒ‹ƒo[ */ +static TBBUTTON TbarDataRemote[] = { + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 }, + { 0, MENU_REMOTE_UPDIR, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 1, MENU_REMOTE_CHDIR, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0 }, + { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0 } +}; + +/* ‘Sƒ{ƒ^ƒ“^ƒƒjƒ…[€–Ú */ +static const int HideMenus[] = { + MENU_CONNECT, MENU_QUICK, MENU_DISCONNECT, + MENU_SET_CONNECT, MENU_IMPORT_WS, MENU_EXIT, + MENU_DOWNLOAD, MENU_UPLOAD, MENU_DOWNLOAD_AS, MENU_MIRROR_UPLOAD, + MENU_UPLOAD_AS, MENU_DOWNLOAD_NAME, MENU_MIRROR_UPLOAD, + MENU_FILESIZE, MENU_DELETE, MENU_RENAME, + MENU_CHMOD, MENU_MKDIR, MENU_SOMECMD, + MENU_SYNC, + MENU_BMARK_ADD, MENU_BMARK_ADD_LOCAL, MENU_BMARK_ADD_BOTH, + MENU_BMARK_EDIT, + MENU_FILTER, MENU_FIND, MENU_FINDNEXT, MENU_SELECT, + MENU_SELECT_ALL, MENU_LIST, MENU_REPORT, + MENU_SORT, MENU_DOTFILE, + MENU_DIRINFO, MENU_TASKINFO, MENU_REFRESH, + MENU_OPTION, + MENU_OTPCALC, + MENU_HELP, MENU_HELP_TROUBLE, MENU_ABOUT, + MENU_REGINIT, + MENU_TEXT, MENU_BINARY, MENU_AUTO, + MENU_KNJ_EUC, MENU_KNJ_JIS, MENU_KNJ_NONE, + MENU_KANACNV, + MENU_LOCAL_UPDIR, MENU_LOCAL_CHDIR, + MENU_REMOTE_UPDIR, MENU_REMOTE_CHDIR, + MENU_HIST_1, MENU_HIST_2, MENU_HIST_3, MENU_HIST_4, + MENU_HIST_5, MENU_HIST_6, MENU_HIST_7, MENU_HIST_8, + MENU_HIST_9, MENU_HIST_10, MENU_HIST_11, MENU_HIST_12, + MENU_HIST_13, MENU_HIST_14, MENU_HIST_15, MENU_HIST_16, + MENU_HIST_17, MENU_HIST_18, MENU_HIST_19, MENU_HIST_20 +}; + + + +/*----- ƒc[ƒ‹ƒo[‚ðì¬‚·‚é -------------------------------------------------- +* +* Parameter +* HWND hWnd : eƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +* HINSTANCE hInst : ƒCƒ“ƒXƒ^ƒ“ƒXƒnƒ“ƒhƒ‹ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +int MakeToolBarWindow(HWND hWnd, HINSTANCE hInst) +{ + int Sts; + RECT Rect1; + char Tmp[FMAX_PATH+1]; + char *Pos; + int Tmp2; + DWORD NoDrives; + + /*===== ƒƒCƒ“‚̃c[ƒ‹ƒo[ =====*/ + + hWndTbarMain = CreateToolbarEx( + hWnd, + WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_TOP, + 1, + 27, + hInst, + main_toolbar_bmp, + TbarDataMain, + sizeof(TbarDataMain)/sizeof(TBBUTTON), + 16,16, + 16,16, + sizeof(TBBUTTON)); + + if(hWndTbarMain != NULL) + { + /* 2007/09/21 sunasunamix ‚±‚±‚©‚ç *********************/ + pOldTbarMainProc = (WNDPROC)SetWindowLong(hWndTbarMain, GWL_WNDPROC, (DWORD)CountermeasureTbarMainProc); + /********************************************* ‚±‚±‚Ü‚Å */ + + GetClientRect(hWnd, &Rect1); + MoveWindow(hWndTbarMain, 0, 0, Rect1.right, TOOLWIN_HEIGHT, FALSE); + } + + /*===== ƒ[ƒJƒ‹‚̃c[ƒ‹ƒo[ =====*/ + + hWndTbarLocal = CreateToolbarEx( + hWnd, + WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_NORESIZE, + 2, + 2, + hInst, + remote_toolbar_bmp, + TbarDataLocal, + sizeof(TbarDataLocal)/sizeof(TBBUTTON), + 16,16, + 16,16, + sizeof(TBBUTTON)); + + if(hWndTbarLocal != NULL) + { + /* 2007/09/21 sunasunamix ‚±‚±‚©‚ç *********************/ + pOldTbarLocalProc = (WNDPROC)SetWindowLong(hWndTbarLocal, GWL_WNDPROC, (DWORD)CountermeasureTbarLocalProc); + /********************************************* ‚±‚±‚Ü‚Å */ + + MoveWindow(hWndTbarLocal, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, FALSE); + + /*===== ƒ[ƒJƒ‹‚̃fƒBƒŒƒNƒgƒŠ–¼ƒEƒCƒ“ƒhƒE =====*/ + + SendMessage(hWndTbarLocal, TB_GETITEMRECT, 3, (LPARAM)&Rect1); +#ifndef ENGLISH + DlgFont = CreateFont(Rect1.bottom-Rect1.top-8, 0, 0, 0, 0, FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,MSGJPN254); +#else + DlgFont = CreateFont(Rect1.bottom-Rect1.top-8, 0, 0, 0, 0, FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,MSGJPN254); +#endif + + hWndDirLocal = CreateWindowEx(WS_EX_CLIENTEDGE, + "COMBOBOX", "", + WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | CBS_DROPDOWN | CBS_SORT | CBS_AUTOHSCROLL, + Rect1.right, Rect1.top, LocalWidth - Rect1.right, 200, + hWndTbarLocal, (HMENU)COMBO_LOCAL, hInst, NULL); + + if(hWndDirLocal != NULL) + { + /* ƒGƒfƒBƒbƒgƒRƒ“ƒgƒ[ƒ‹‚ð’T‚· */ + hWndDirLocalEdit = GetWindow(hWndDirLocal, GW_CHILD); + if(hWndDirLocalEdit != NULL) + HistEditBoxProcPtr = (WNDPROC)SetWindowLong(hWndDirLocalEdit, GWL_WNDPROC, (LONG)HistEditBoxWndProc); + + SendMessage(hWndDirLocal, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE, 0)); + SendMessage(hWndDirLocal, CB_LIMITTEXT, FMAX_PATH, 0); + + /* ƒhƒ‰ƒCƒu–¼‚ðƒZƒbƒg‚µ‚Ä‚¨‚­ */ + GetLogicalDriveStrings(FMAX_PATH, Tmp); + NoDrives = LoadHideDriveListRegistory(); + Pos = Tmp; + while(*Pos != NUL) + { + Tmp2 = toupper(*Pos) - 'A'; + if((NoDrives & (0x00000001 << Tmp2)) == 0) + SetLocalDirHist(Pos); + Pos = strchr(Pos, NUL) + 1; + } + SendMessage(hWndDirLocal, CB_SETCURSEL, 0, 0); + } + } + + /*===== ƒzƒXƒg‚̃c[ƒ‹ƒo[ =====*/ + + hWndTbarRemote = CreateToolbarEx( + hWnd, + WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_NORESIZE, + 3, + 2, + hInst, + remote_toolbar_bmp, + TbarDataRemote, + sizeof(TbarDataRemote)/sizeof(TBBUTTON), + 16,16, + 16,16, + sizeof(TBBUTTON)); + + if(hWndTbarRemote != NULL) + { + /* 2007/09/21 sunasunamix ‚±‚±‚©‚ç *********************/ + pOldTbarRemoteProc = (WNDPROC)SetWindowLong(hWndTbarRemote, GWL_WNDPROC, (DWORD)CountermeasureTbarRemoteProc); + /********************************************* ‚±‚±‚Ü‚Å */ + + MoveWindow(hWndTbarRemote, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, FALSE); + + /*===== ƒzƒXƒg‚̃fƒBƒŒƒNƒgƒŠ–¼ƒEƒCƒ“ƒhƒE =====*/ + + SendMessage(hWndTbarRemote, TB_GETITEMRECT, 3, (LPARAM)&Rect1); + hWndDirRemote = CreateWindowEx(WS_EX_CLIENTEDGE, + "COMBOBOX", "", + WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | CBS_DROPDOWN | CBS_AUTOHSCROLL, + Rect1.right, Rect1.top, RemoteWidth - Rect1.right, 200, + hWndTbarRemote, (HMENU)COMBO_REMOTE, hInst, NULL); + + if(hWndDirRemote != NULL) + { + /* ƒGƒfƒBƒbƒgƒRƒ“ƒgƒ[ƒ‹‚ð’T‚· */ + hWndDirRemoteEdit = GetWindow(hWndDirRemote, GW_CHILD); + if(hWndDirRemoteEdit != NULL) + HistEditBoxProcPtr = (WNDPROC)SetWindowLong(hWndDirRemoteEdit, GWL_WNDPROC, (LONG)HistEditBoxWndProc); + + SendMessage(hWndDirRemote, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE, 0)); + SendMessage(hWndDirRemote, CB_LIMITTEXT, FMAX_PATH, 0); + SendMessage(hWndDirRemote, CB_SETCURSEL, 0, 0); + } + } + + Sts = SUCCESS; + if((hWndTbarMain == NULL) || + (hWndTbarLocal == NULL) || + (hWndTbarRemote == NULL) || + (hWndDirLocal == NULL) || + (hWndDirRemote == NULL)) + { + Sts = FAIL; + } + return(Sts); +} + + + + + +static LRESULT CALLBACK HistEditBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + char Tmp[FMAX_PATH+1]; + + switch (message) + { + case WM_CHAR : + if(wParam == 0x0D) /* ƒŠƒ^[ƒ“ƒL[‚ª‰Ÿ‚³‚ꂽ */ + { + if(hWnd == hWndDirLocalEdit) + { + SendMessage(hWndDirLocalEdit, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Tmp); + DoLocalCWD(Tmp); + GetLocalDirForWnd(); + } + else + { + SendMessage(hWndDirRemoteEdit, WM_GETTEXT, FMAX_PATH+1, (LPARAM)Tmp); + if(CheckClosedAndReconnect() == SUCCESS) + { + if(DoCWD(Tmp, YES, NO, YES) < FTP_RETRY) + GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); + } + } + } + else if(wParam == 0x09) /* TABƒL[‚ª‰Ÿ‚³‚ꂽ */ + { + if(hWnd == hWndDirLocalEdit) + { + SetFocus(GetLocalHwnd()); + } + else + { + SetFocus(GetRemoteHwnd()); + } + } + else + return(CallWindowProc(HistEditBoxProcPtr, hWnd, message, wParam, lParam)); + break; + + default : + return(CallWindowProc(HistEditBoxProcPtr, hWnd, message, wParam, lParam)); + } + return(0L); +} + + + + +/*----- ƒc[ƒ‹ƒo[‚ðíœ ------------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DeleteToolBarWindow(void) +{ +// if(DlgFont != NULL) +// DeleteObject(DlgFont); + + if(hWndTbarMain != NULL) + DestroyWindow(hWndTbarMain); + if(hWndTbarLocal != NULL) + DestroyWindow(hWndTbarLocal); + if(hWndTbarRemote != NULL) + DestroyWindow(hWndTbarRemote); + if(hWndDirLocal != NULL) + DestroyWindow(hWndDirLocal); + if(hWndDirRemote != NULL) + DestroyWindow(hWndDirRemote); + return; +} + + +/*----- ƒƒCƒ“‚̃c[ƒ‹ƒo[‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· -------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetMainTbarWnd(void) +{ + return(hWndTbarMain); +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃qƒXƒgƒŠƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· -------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetLocalHistHwnd(void) +{ + return(hWndDirLocal); +} + + +/*----- ƒzƒXƒg‘¤‚̃qƒXƒgƒŠƒEƒCƒ“ƒhƒE‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetRemoteHistHwnd(void) +{ + return(hWndDirRemote); +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃qƒXƒgƒŠƒGƒfƒBƒbƒg‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· -------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetLocalHistEditHwnd(void) +{ + return(hWndDirLocalEdit); +} + + +/*----- ƒzƒXƒg‘¤‚̃qƒXƒgƒŠƒGƒfƒBƒbƒg‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetRemoteHistEditHwnd(void) +{ + return(hWndDirRemoteEdit); +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃c[ƒ‹ƒo[‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ---------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetLocalTbarWnd(void) +{ + return(hWndTbarLocal); +} + + +/*----- ƒzƒXƒg‘¤‚̃c[ƒ‹ƒo[‚̃EƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹‚ð•Ô‚· ------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* HWND ƒEƒCƒ“ƒhƒEƒnƒ“ƒhƒ‹ +*----------------------------------------------------------------------------*/ + +HWND GetRemoteTbarWnd(void) +{ + return(hWndTbarRemote); +} + + +/*----- HideUI ‚̏ó‘Ô‚ð•Ô‚· --------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int HideUI ‚̏ó‘Ô +*----------------------------------------------------------------------------*/ + +int GetHideUI(void) +{ + return(HideUI); +} + + +/*----- ƒc[ƒ‹ƒ{ƒ^ƒ“^ƒƒjƒ…[‚̃nƒCƒhˆ— ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void MakeButtonsFocus(void) +{ + HWND hWndFocus; + HWND hWndMain; + int Count; + int Win; + + if(HideUI == NO) + { + hWndMain = GetMainHwnd(); + hWndFocus = GetFocus(); + Win = WIN_LOCAL; + if(hWndFocus == GetRemoteHwnd()) + Win = WIN_REMOTE; + + Count = GetSelectedCount(Win); + + if(AskConnecting() == YES) + { + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_ADD, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_ADD_LOCAL, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_ADD_BOTH, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_EDIT, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_DIRINFO, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_MIRROR_UPLOAD, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_MIRROR_DOWNLOAD, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_NAME, MF_ENABLED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_MIRROR_UPLOAD, MAKELONG(TRUE, 0)); + } + else + { + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_ADD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_ADD_LOCAL, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_ADD_BOTH, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_BMARK_EDIT, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DIRINFO, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_MIRROR_UPLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_MIRROR_DOWNLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_NAME, MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_MIRROR_UPLOAD, MAKELONG(FALSE, 0)); + } + + if(hWndFocus == GetLocalHwnd()) + { + if((AskConnecting() == YES) && (Count > 0)) + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_UPLOAD, MAKELONG(TRUE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD_AS, MF_ENABLED); + } + else + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_UPLOAD, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD_AS, MF_GRAYED); + } + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DOWNLOAD, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_SOMECMD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS_FILE, MF_GRAYED); + } + + if(hWndFocus == GetRemoteHwnd()) + { + if(AskConnecting() == YES) + { + EnableMenuItem(GetMenu(hWndMain), MENU_SOMECMD, MF_ENABLED); + } + else + { + EnableMenuItem(GetMenu(hWndMain), MENU_SOMECMD, MF_GRAYED); + } + + if((AskConnecting() == YES) && (Count > 0)) + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DOWNLOAD, MAKELONG(TRUE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS_FILE, MF_ENABLED); + } + else + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DOWNLOAD, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS_FILE, MF_GRAYED); + } + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_UPLOAD, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD_AS, MF_GRAYED); + } + + if((hWndFocus == GetLocalHwnd()) || (hWndFocus == GetRemoteHwnd())) + { + if(Count > 0) + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DELETE, MAKELONG(TRUE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_DELETE, MF_ENABLED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_RENAME, MAKELONG(TRUE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_RENAME, MF_ENABLED); + + EnableMenuItem(GetMenu(hWndMain), MENU_CHMOD, MF_ENABLED); + + } + else + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DELETE, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_DELETE, MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_RENAME, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_RENAME, MF_GRAYED); + + EnableMenuItem(GetMenu(hWndMain), MENU_CHMOD, MF_GRAYED); + } + + if((hWndFocus == GetLocalHwnd()) || (AskConnecting() == YES)) + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_MKDIR, MAKELONG(TRUE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_MKDIR, MF_ENABLED); + EnableMenuItem(GetMenu(hWndMain), MENU_FILESIZE, MF_ENABLED); + } + else + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_MKDIR, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_MKDIR, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_FILESIZE, MF_GRAYED); + } + } + else + { + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_UPLOAD, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_UPLOAD_AS, MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DOWNLOAD, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_DOWNLOAD_AS_FILE, MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_DELETE, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_DELETE, MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_RENAME, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_RENAME, MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_MKDIR, MAKELONG(FALSE, 0)); + EnableMenuItem(GetMenu(hWndMain), MENU_MKDIR, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_CHMOD, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_FILESIZE, MF_GRAYED); + EnableMenuItem(GetMenu(hWndMain), MENU_SOMECMD, MF_GRAYED); + } + } + return; +} + + +/*----- ƒ†[ƒU‚Ì‘€ì‚ð‹ÖŽ~‚·‚é ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DisableUserOpe(void) +{ + int i; + + HideUI = YES; + + for(i = 0; i < sizeof(HideMenus) / sizeof(int); i++) + { + EnableMenuItem(GetMenu(GetMainHwnd()), HideMenus[i], MF_GRAYED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, HideMenus[i], MAKELONG(FALSE, 0)); + SendMessage(hWndTbarLocal, TB_ENABLEBUTTON, HideMenus[i], MAKELONG(FALSE, 0)); + SendMessage(hWndTbarRemote, TB_ENABLEBUTTON, HideMenus[i], MAKELONG(FALSE, 0)); + } + + EnableWindow(hWndDirLocal, FALSE); + EnableWindow(hWndDirRemote, FALSE); + + return; +} + + +/*----- ƒ†[ƒU‚Ì‘€ì‚ð‹–‰Â‚·‚é ------------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void EnableUserOpe(void) +{ + int i; + + if(HideUI == YES) + { + for(i = 0; i < sizeof(HideMenus) / sizeof(int); i++) + { + EnableMenuItem(GetMenu(GetMainHwnd()), HideMenus[i], MF_ENABLED); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, HideMenus[i], MAKELONG(TRUE, 0)); + SendMessage(hWndTbarLocal, TB_ENABLEBUTTON, HideMenus[i], MAKELONG(TRUE, 0)); + SendMessage(hWndTbarRemote, TB_ENABLEBUTTON, HideMenus[i], MAKELONG(TRUE, 0)); + } + EnableWindow(hWndDirLocal, TRUE); + EnableWindow(hWndDirRemote, TRUE); + + HideUI = NO; + + MakeButtonsFocus(); + } + return; +} + + +/*----- ƒ†[ƒU‚Ì‘€ì‚ª‹ÖŽ~‚³‚ê‚Ä‚¢‚é‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* YES=‹ÖŽ~‚³‚ê‚Ä‚¢‚é/NO +*----------------------------------------------------------------------------*/ + +int AskUserOpeDisabled(void) +{ + return(HideUI); +} + + +/*=================================================== +* “]‘—ƒ‚[ƒh +*===================================================*/ + +/*----- “]‘—ƒ‚[ƒh‚ðÝ’è‚·‚é -------------------------------------------------- +* +* Parameter +* int Mode : “]‘—ƒ‚[ƒh (TYPE_xx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetTransferTypeImm(int Mode) +{ + TmpTransMode = Mode; + HideHostKanjiButton(); + return; +} + + +/*----- ƒƒjƒ…[‚É‚æ‚è“]‘—ƒ‚[ƒh‚ðÝ’è‚·‚é ------------------------------------ +* +* Parameter +* int Type : “]‘—ƒ‚[ƒh (MENU_xxxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetTransferType(int Type) +{ + switch(Type) + { + case MENU_TEXT : + TmpTransMode = TYPE_A; + break; + + case MENU_BINARY : + TmpTransMode = TYPE_I; + break; + + default : + TmpTransMode = TYPE_X; + break; + } + HideHostKanjiButton(); + return; +} + + +/*----- “]‘—ƒ‚[ƒh‚É‚µ‚½‚ª‚Á‚ă{ƒ^ƒ“‚ð•\Ž¦‚·‚é -------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispTransferType(void) +{ + switch(TmpTransMode) + { + case TYPE_A : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_TEXT, MAKELONG(TRUE, 0)); + break; + + case TYPE_I : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_BINARY, MAKELONG(TRUE, 0)); + break; + + default : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_AUTO, MAKELONG(TRUE, 0)); + break; + } + return; +} + + +/*----- Ý’èã‚Ì“]‘—ƒ‚[ƒh‚ð•Ô‚· ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int “]‘—ƒ‚[ƒh (TYPE_xx) +*----------------------------------------------------------------------------*/ + +int AskTransferType(void) +{ + return(TmpTransMode); +} + + +/*----- ŽÀÛ‚Ì“]‘—ƒ‚[ƒh‚ð•Ô‚· ------------------------------------------------ +* +* Parameter +* char Fname : ƒtƒ@ƒCƒ‹–¼ +* int Type : Ý’èã‚Ì“]‘—ƒ‚[ƒh (TYPE_xx) +* +* Return Value +* int “]‘—ƒ‚[ƒh (TYPE_xx) +*----------------------------------------------------------------------------*/ + +int AskTransferTypeAssoc(char *Fname, int Type) +{ + int Ret; + char *Pos; + char *Name; + + Ret = Type; + if(Ret == TYPE_X) + { + Ret = TYPE_I; + if(StrMultiLen(AsciiExt) > 0) + { + Name = GetFileName(Fname); + Pos = AsciiExt; + while(*Pos != NUL) + { + if(CheckFname(Name, Pos) == SUCCESS) + { + Ret = TYPE_A; + break; + } + Pos += strlen(Pos) + 1; + } + } + } + return(Ret); +} + + +/*----- “]‘—ƒ‚[ƒh‚ð•Û‘¶‚·‚é -------------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +* +* Note +* Œ»Ý‚Ì“]‘—ƒ‚[ƒh‚ªƒŒƒWƒXƒgƒŠ‚É•Û‘¶‚³‚ê‚é +*----------------------------------------------------------------------------*/ + +void SaveTransferType(void) +{ + TransMode = TmpTransMode; + return; +} + + +/*=================================================== +* Š¿Žšƒ‚[ƒh +*===================================================*/ + +/*----- ƒzƒXƒg‚ÌŠ¿Žšƒ‚[ƒh‚ðƒZƒbƒg‚·‚é ---------------------------------------- +* +* Parameter +* int Mode : Š¿Žšƒ‚[ƒh (KANJI_xxxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetHostKanjiCodeImm(int Mode) +{ + TmpHostKanjiCode = Mode; + DispHostKanjiCode(); + HideHostKanjiButton(); + return; +} + + +/*----- ƒƒjƒ…[‚É‚æ‚èƒzƒXƒg‚ÌŠ¿Žšƒ‚[ƒh‚ðÝ’è‚·‚é ----------------------------- +* +* Parameter +* int Type : Š¿Žšƒ‚[ƒh (MENU_xxxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetHostKanjiCode(int Type) +{ + switch(Type) + { + case MENU_KNJ_EUC : + TmpHostKanjiCode = KANJI_EUC; + break; + + case MENU_KNJ_JIS : + TmpHostKanjiCode = KANJI_JIS; + break; + + default : + TmpHostKanjiCode = KANJI_NOCNV; + break; + } + DispHostKanjiCode(); + HideHostKanjiButton(); + return; +} + + +/*----- ƒzƒXƒg‚ÌŠ¿Žšƒ‚[ƒh‚É‚µ‚½‚ª‚Á‚ă{ƒ^ƒ“‚ð•\Ž¦‚·‚é ------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispHostKanjiCode(void) +{ + switch(TmpHostKanjiCode) + { + case KANJI_EUC : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_KNJ_EUC, MAKELONG(TRUE, 0)); + break; + + case KANJI_JIS : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_KNJ_JIS, MAKELONG(TRUE, 0)); + break; + + default : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_KNJ_NONE, MAKELONG(TRUE, 0)); + break; + } + return; +} + + +/*----- ƒzƒXƒg‚ÌŠ¿Žšƒ‚[ƒh‚ð•Ô‚· ---------------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int Š¿Žšƒ‚[ƒh (KANJI_xxxx) +*----------------------------------------------------------------------------*/ + +int AskHostKanjiCode(void) +{ + return(TmpHostKanjiCode); +} + + +/*----- Š¿Žšƒ‚[ƒhƒ{ƒ^ƒ“‚̃nƒCƒhˆ—‚ðs‚¤ ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void HideHostKanjiButton(void) +{ + switch(TmpTransMode) + { + case TYPE_I : + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KNJ_EUC, MAKELONG(FALSE, 0)); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KNJ_JIS, MAKELONG(FALSE, 0)); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KNJ_NONE, MAKELONG(FALSE, 0)); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KANACNV, MAKELONG(FALSE, 0)); + break; + + default : + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KNJ_EUC, MAKELONG(TRUE, 0)); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KNJ_JIS, MAKELONG(TRUE, 0)); + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KNJ_NONE, MAKELONG(TRUE, 0)); + if(TmpHostKanjiCode != KANJI_NOCNV) + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KANACNV, MAKELONG(TRUE, 0)); + else + SendMessage(hWndTbarMain, TB_ENABLEBUTTON, MENU_KANACNV, MAKELONG(FALSE, 0)); + break; + } + return; +} + + +/*=================================================== +* ”¼Šp•ÏŠ·ƒ‚[ƒh +*===================================================*/ + +/*----- ƒzƒXƒg‚Ì”¼Šp•ÏŠ·ƒ‚[ƒh‚ðÝ’è‚·‚é -------------------------------------- +* +* Parameter +* int Mode : ”¼Šp•ÏŠ·ƒ‚[ƒh(YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetHostKanaCnvImm(int Mode) +{ + TmpHostKanaCnv = Mode; + DispHostKanaCnv(); + return; +} + + +/*----- ƒzƒXƒg‚Ì”¼Šp•ÏŠ·ƒ‚[ƒh‚𔽓]‚·‚é -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetHostKanaCnv(void) +{ + TmpHostKanaCnv ^= 1; + DispHostKanaCnv(); + return; +} + + +/*----- ƒzƒXƒg‚Ì”¼Šp•ÏŠ·ƒ‚[ƒh‚É‚µ‚½‚ª‚Á‚ă{ƒ^ƒ“‚ð•\Ž¦‚·‚é -------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispHostKanaCnv(void) +{ + if(TmpHostKanaCnv != 0) + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_KANACNV, MAKELONG(TRUE, 0)); + else + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_KANACNV, MAKELONG(FALSE, 0)); + return; +} + + +/*----- ƒzƒXƒg‚Ì”¼Šp•ÏŠ·ƒ‚[ƒh‚ð•Ô‚· ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ”¼Šp•ÏŠ·ƒ‚[ƒh +*----------------------------------------------------------------------------*/ + +int AskHostKanaCnv(void) +{ + return(TmpHostKanaCnv); +} + + +/*=================================================== +* ƒ\[ƒg•û–@ +*===================================================*/ + +/*----- ƒ\[ƒg•û–@‚ðƒZƒbƒg‚·‚é ------------------------------------------------ +* +* Parameter +* int LFsort : ƒ[ƒJƒ‹‘¤‚̃tƒ@ƒCƒ‹‚̃\[ƒg•û–@ (SORT_xxx) +* int LDsort : ƒ[ƒJƒ‹‘¤‚̃fƒBƒŒƒNƒgƒŠ‚̃\[ƒg•û–@ (SORT_xxx) +* int RFsort : ƒzƒXƒg‘¤‚̃tƒ@ƒCƒ‹‚̃\[ƒg•û–@ (SORT_xxx) +* int RDsort : ƒzƒXƒg‘¤‚̃fƒBƒŒƒNƒgƒŠ‚̃\[ƒg•û–@ (SORT_xxx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetSortTypeImm(int LFsort, int LDsort, int RFsort, int RDsort) +{ + TmpLocalFileSort = LFsort; + TmpLocalDirSort = LDsort; + TmpRemoteFileSort = RFsort; + TmpRemoteDirSort = RDsort; + return; +} + + +/*----- ƒŠƒXƒgƒrƒ…[‚̃^ƒuƒNƒŠƒbƒN‚É‚æ‚éƒ\[ƒg•û–@‚̃Zƒbƒg -------------------- +* +* Parameter +* int Win : ƒEƒCƒ“ƒhƒE”ԍ† +* int Tab : ƒJƒ‰ƒ€”ԍ† +* +* Return Value +* int ƒ\[ƒg•û–@ (SORT_xxx) +*----------------------------------------------------------------------------*/ + +void SetSortTypeByColumn(int Win, int Tab) +{ + if(Win == WIN_LOCAL) + { + if((TmpLocalFileSort & SORT_MASK_ORD) == Tab) + TmpLocalFileSort ^= SORT_GET_ORD; + else + TmpLocalFileSort = Tab; + + if((Tab == SORT_NAME) || (Tab == SORT_DATE)) + TmpLocalDirSort = TmpLocalFileSort; + else + TmpLocalDirSort = SORT_NAME; + } + else + { + if(Tab != 4) + { + if((TmpRemoteFileSort & SORT_MASK_ORD) == Tab) + TmpRemoteFileSort ^= SORT_GET_ORD; + else + TmpRemoteFileSort = Tab; + + if((Tab == SORT_NAME) || (Tab == SORT_DATE)) + TmpRemoteDirSort = TmpRemoteFileSort; + else + TmpRemoteDirSort = SORT_NAME; + } + } + return; +} + + +/*----- ƒ\[ƒg•û–@‚ð•Ô‚· ------------------------------------------------------ +* +* Parameter +* int Name : ‚Ç‚Ì•”•ª‚© (ITEM_xxx) +* +* Return Value +* int ƒ\[ƒg•û–@ (SORT_xxx) +*----------------------------------------------------------------------------*/ + +int AskSortType(int Name) +{ + int Ret; + + switch(Name) + { + case ITEM_LFILE : + Ret = TmpLocalFileSort; + break; + + case ITEM_LDIR : + Ret = TmpLocalDirSort; + break; + + case ITEM_RFILE : + Ret = TmpRemoteFileSort; + break; + + case ITEM_RDIR : + Ret = TmpRemoteDirSort; + break; + } + return(Ret); +} + + +/*----- ƒzƒXƒg‚²‚ƂɃ\[ƒg‚ð•Û‘¶‚·‚é‚©‚Ç‚¤‚©‚ðƒZƒbƒg‚·‚é----------------------- +* +* Parameter +* int Sw : ƒXƒCƒbƒ` (YES/NO) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetSaveSortToHost(int Sw) +{ + SortSave = Sw; + return; +} + + +/*----- ƒzƒXƒg‚²‚ƂɃ\[ƒg‚ð•Û‘¶‚·‚é‚©‚Ç‚¤‚©‚ð•Ô‚· ---------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ƒXƒCƒbƒ` (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskSaveSortToHost(void) +{ + return(SortSave); +} + + + +/*=================================================== +* ƒŠƒXƒgƒ‚[ƒh +*===================================================*/ + +/*----- ƒŠƒXƒgƒ‚[ƒh‚É‚µ‚½‚ª‚Á‚ă{ƒ^ƒ“‚ð•\Ž¦‚·‚é ------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispListType(void) +{ + HWND hWndMain; + + hWndMain = GetMainHwnd(); + switch(ListType) + { + case LVS_LIST : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_LIST, MAKELONG(TRUE, 0)); + CheckMenuItem(GetMenu(hWndMain), MENU_LIST, MF_CHECKED); + CheckMenuItem(GetMenu(hWndMain), MENU_REPORT, MF_UNCHECKED); + break; + + default : + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_REPORT, MAKELONG(TRUE, 0)); + CheckMenuItem(GetMenu(hWndMain), MENU_REPORT, MF_CHECKED); + CheckMenuItem(GetMenu(hWndMain), MENU_LIST, MF_UNCHECKED); + break; + } + return; +} + + +/*=================================================== +* ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®ƒ‚[ƒh +*===================================================*/ + +/*----- “]‘—ƒ‚[ƒh‚ðÝ’è‚·‚é -------------------------------------------------- +* +* Parameter +* int Mode : “]‘—ƒ‚[ƒh (TYPE_xx) +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetSyncMoveMode(int Mode) +{ + SyncMove = Mode; + DispSyncMoveMode(); + return; +} + + +/*----- ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®ƒ‚[ƒh‚ðØ‚è‘Ö‚¦‚é ------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void ToggleSyncMoveMode(void) +{ + SyncMove ^= 1; + DispSyncMoveMode(); + return; +} + + +/*----- ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®‚ðs‚¤‚©‚Ç‚¤‚©‚ð‚É‚æ‚Á‚ăƒjƒ…[^ƒ{ƒ^ƒ“‚ð•\Ž¦ -------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispSyncMoveMode(void) +{ + if(SyncMove != 0) + { + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_SYNC, MAKELONG(TRUE, 0)); + CheckMenuItem(GetMenu(GetMainHwnd()), MENU_SYNC, MF_CHECKED); + } + else + { + SendMessage(hWndTbarMain, TB_CHECKBUTTON, MENU_SYNC, MAKELONG(FALSE, 0)); + CheckMenuItem(GetMenu(GetMainHwnd()), MENU_SYNC, MF_UNCHECKED); + } + return; +} + + +/*----- ƒtƒHƒ‹ƒ_“¯ŽžˆÚ“®ƒ‚[ƒh‚ð•Ô‚· ------------------------------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* int ”¼Šp•ÏŠ·ƒ‚[ƒh +*----------------------------------------------------------------------------*/ + +int AskSyncMoveMode(void) +{ + return(SyncMove); +} + + +/*=================================================== +* ƒfƒBƒŒƒNƒgƒŠƒqƒXƒgƒŠ +*===================================================*/ + +/*----- ƒzƒXƒg‘¤‚̃qƒXƒgƒŠˆê——ƒEƒCƒ“ƒhƒE‚É“o˜^ -------------------------------- +* +* Parameter +* char *Path : ƒpƒX +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetRemoteDirHist(char *Path) +{ + int i; + + if((i = SendMessage(hWndDirRemote, CB_FINDSTRINGEXACT, 0, (LPARAM)Path)) != CB_ERR) + SendMessage(hWndDirRemote, CB_DELETESTRING, i, 0); + + SendMessage(hWndDirRemote, CB_ADDSTRING, 0, (LPARAM)Path); + i = SendMessage(hWndDirRemote, CB_GETCOUNT, 0, 0); + SendMessage(hWndDirRemote, CB_SETCURSEL, i-1, 0); + + strcpy(RemoteCurDir, Path); + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̃qƒXƒgƒŠˆê——ƒEƒCƒ“ƒhƒE‚É“o˜^ ------------------------------- +* +* Parameter +* char *Path : ƒpƒX +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetLocalDirHist(char *Path) +{ + int i; + + if((i = SendMessage(hWndDirLocal, CB_FINDSTRINGEXACT, 0, (LPARAM)Path)) == CB_ERR) + SendMessage(hWndDirLocal, CB_ADDSTRING, 0, (LPARAM)Path); + i = SendMessage(hWndDirLocal, CB_FINDSTRINGEXACT, 0, (LPARAM)Path); + SendMessage(hWndDirLocal, CB_SETCURSEL, i, 0); + + strcpy(LocalCurDir, Path); + return; +} + + +/*----- ƒ[ƒJƒ‹‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ð•Ô‚· ---------------------------------- +* +* Parameter +* char *Buf : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AskLocalCurDir(char *Buf, int Max) +{ + memset(Buf, 0, Max); + strncpy(Buf, LocalCurDir, Max-1); + return; +} + + +/*----- ƒzƒXƒg‚̃JƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ð•Ô‚· ------------------------------------ +* +* Parameter +* char *Buf : ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ–¼‚ð•Ô‚·ƒoƒbƒtƒ@ +* int Max : ƒoƒbƒtƒ@‚̃TƒCƒY +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void AskRemoteCurDir(char *Buf, int Max) +{ + memset(Buf, 0, Max); + strncpy(Buf, RemoteCurDir, Max-1); + return; +} + + +/*----- ƒJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðÝ’è‚·‚é ---------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SetCurrentDirAsDirHist(void) +{ + SetCurrentDirectory(LocalCurDir); + return; +} + + +/*=================================================== +* ƒƒjƒ…[ +*===================================================*/ + +/*----- ƒhƒbƒgƒtƒ@ƒCƒ‹‚ð•\Ž¦‚·‚é‚©‚Ç‚¤‚©‚ðƒƒjƒ…[‚É•\Ž¦‚·‚é ------------------ +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void DispDotFileMode(void) +{ + CheckMenuItem(GetMenu(GetMainHwnd()), MENU_DOTFILE, MF_UNCHECKED); + if(DotFile == YES) + CheckMenuItem(GetMenu(GetMainHwnd()), MENU_DOTFILE, MF_CHECKED); + return; +} + + +/*----- ƒ[ƒJƒ‹‘¤‚̉Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ð•\Ž¦ ------------------------------------------------ +* +* Parameter +* int Pos : ƒƒjƒ…[‚̈ʒu +* 0=ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚̈ʒu +* 1=ƒEƒCƒ“ƒhƒE‚̍¶ã +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void LocalRbuttonMenu(int Pos) +{ + HMENU hMenu; + POINT point; + RECT Rect; + UINT Flg1; + UINT Flg2; + UINT Flg3; + int Count; + + if(HideUI == NO) + { + Flg1 = 0; + if(AskConnecting() == NO) + Flg1 = MF_GRAYED; + + Count = GetSelectedCount(WIN_LOCAL); + Flg2 = 0; + if(Count == 0) + Flg2 = MF_GRAYED; + + Flg3 = 0; + if(Count != 1) + Flg3 = MF_GRAYED; + + hMenu = CreatePopupMenu(); + AddOpenMenu(hMenu, Flg3); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_UPLOAD, MSGJPN255); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_UPLOAD_AS, MSGJPN256); + AppendMenu(hMenu, MF_STRING | Flg1, MENU_UPLOAD_ALL, MSGJPN257); + AppendMenu(hMenu, MF_STRING | Flg2, MENU_DELETE, MSGJPN258); + AppendMenu(hMenu, MF_STRING | Flg2, MENU_RENAME, MSGJPN259); + AppendMenu(hMenu, MF_STRING , MENU_MKDIR, MSGJPN260); + AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); + AppendMenu(hMenu, MF_STRING , MENU_FILESIZE, MSGJPN261); + AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); + AppendMenu(hMenu, MF_STRING, REFRESH_LOCAL, MSGJPN262); + + if(Pos == 0) + GetCursorPos(&point); + else + { + GetWindowRect(GetLocalHwnd(), &Rect); + point.x = Rect.left + 20; + point.y = Rect.top + 20; + } + TrackPopupMenu(hMenu, TPM_LEFTBUTTON | TPM_RIGHTBUTTON, point.x, point.y, 0, GetMainHwnd(), NULL); + + DestroyMenu(hMenu); + } + return; +} + + +/*----- ƒzƒXƒg‘¤‚̉Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ð•\Ž¦ -------------------------------------- +* +* Parameter +* int Pos : ƒƒjƒ…[‚̈ʒu +* 0=ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚̈ʒu +* 1=ƒEƒCƒ“ƒhƒE‚̍¶ã +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void RemoteRbuttonMenu(int Pos) +{ + HMENU hMenu; + POINT point; + RECT Rect; + UINT Flg1; + UINT Flg2; + UINT Flg3; + int Count; + + if(HideUI == NO) + { + Flg1 = 0; + if(AskConnecting() == NO) + Flg1 = MF_GRAYED; + + Count = GetSelectedCount(WIN_REMOTE); + Flg2 = 0; + if(Count == 0) + Flg2 = MF_GRAYED; + + Flg3 = 0; + if(Count != 1) + Flg3 = MF_GRAYED; + + hMenu = CreatePopupMenu(); + AddOpenMenu(hMenu, Flg1 | Flg3); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DOWNLOAD, MSGJPN263); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DOWNLOAD_AS, MSGJPN264); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DOWNLOAD_AS_FILE, MSGJPN265); + AppendMenu(hMenu, MF_STRING | Flg1, MENU_DOWNLOAD_ALL, MSGJPN266); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DELETE, MSGJPN267); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_RENAME, MSGJPN268); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_CHMOD, MSGJPN269); + AppendMenu(hMenu, MF_STRING | Flg1, MENU_MKDIR, MSGJPN270); + AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_URL_COPY, MSGJPN271); + AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); + AppendMenu(hMenu, MF_STRING | Flg1, MENU_FILESIZE, MSGJPN272); + AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); + AppendMenu(hMenu, MF_STRING | Flg1, REFRESH_REMOTE, MSGJPN273); + + if(Pos == 0) + GetCursorPos(&point); + else + { + GetWindowRect(GetRemoteHwnd(), &Rect); + point.x = Rect.left + 20; + point.y = Rect.top + 20; + } + if(TrackPopupMenu(hMenu, TPM_LEFTBUTTON | TPM_RIGHTBUTTON, point.x, point.y, 0, GetMainHwnd(), NULL) == 0) + Count = GetLastError(); + + DestroyMenu(hMenu); + } + return; +} + + +/*----- ‰Eƒ{ƒ^ƒ“ƒƒjƒ…[‚ɁuŠJ‚­v‚ð’ljÁ ------------------------------------- +* +* Parameter +* HMENU hMenu : ƒƒjƒ…[ƒnƒ“ƒhƒ‹ +* UINT Flg : ƒtƒ‰ƒO +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +static void AddOpenMenu(HMENU hMenu, UINT Flg) +{ + static const UINT MenuID[VIEWERS] = { MENU_OPEN1, MENU_OPEN2, MENU_OPEN3 }; + char Tmp[FMAX_PATH+1]; + int i; + + AppendMenu(hMenu, MF_STRING | Flg, MENU_DCLICK, MSGJPN274); + for(i = 0; i < VIEWERS; i++) + { + if(strlen(ViewerName[i]) != 0) + { + sprintf(Tmp, MSGJPN275, GetToolName(ViewerName[i]), i+1); + AppendMenu(hMenu, MF_STRING | Flg, MenuID[i], Tmp); + } + } + AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); + return; +} + +/* 2007/09/21 sunasunamix ‚±‚±‚©‚ç *********************/ + +/*----- CreateToolbarEx ‚̃}ƒEƒXƒNƒŠƒbƒNŠÖ˜A‚𖳎‹‚·‚é(TbarMain—p) ----------- +* (ƒTƒuƒNƒ‰ƒX‰»‚ðs‚¤‚½‚߂̃EƒCƒ“ƒhƒEƒvƒƒV[ƒWƒƒ) +*----------------------------------------------------------------------------*/ +static LRESULT CALLBACK CountermeasureTbarMainProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam) +{ + switch (uMessage) { + case WM_DESTROY : + SetWindowLong(hWnd,GWL_WNDPROC,(DWORD)pOldTbarMainProc); + break; + case WM_RBUTTONDBLCLK : + case WM_RBUTTONDOWN : + case WM_RBUTTONUP : + return TRUE; + } + return CallWindowProc(pOldTbarMainProc, hWnd, uMessage, wParam, lParam); +} + +/*----- CreateToolbarEx ‚̃}ƒEƒXƒNƒŠƒbƒNŠÖ˜A‚𖳎‹‚·‚é(TbarLocal—p) ---------- +* (ƒTƒuƒNƒ‰ƒX‰»‚ðs‚¤‚½‚߂̃EƒCƒ“ƒhƒEƒvƒƒV[ƒWƒƒ) +*----------------------------------------------------------------------------*/ +static LRESULT CALLBACK CountermeasureTbarLocalProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam) +{ + switch (uMessage) { + case WM_DESTROY : + SetWindowLong(hWnd,GWL_WNDPROC,(DWORD)pOldTbarLocalProc); + break; + case WM_RBUTTONDBLCLK : + case WM_RBUTTONDOWN : + case WM_RBUTTONUP : + return TRUE; + } + return CallWindowProc(pOldTbarLocalProc, hWnd, uMessage, wParam, lParam); +} + +/*----- CreateToolbarEx ‚̃}ƒEƒXƒNƒŠƒbƒNŠÖ˜A‚𖳎‹‚·‚é(TbarRemote—p) --------- +* (ƒTƒuƒNƒ‰ƒX‰»‚ðs‚¤‚½‚߂̃EƒCƒ“ƒhƒEƒvƒƒV[ƒWƒƒ) +*----------------------------------------------------------------------------*/ +static LRESULT CALLBACK CountermeasureTbarRemoteProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam) +{ + switch (uMessage) { + case WM_DESTROY : + SetWindowLong(hWnd,GWL_WNDPROC,(DWORD)pOldTbarRemoteProc); + break; + case WM_RBUTTONDBLCLK : + case WM_RBUTTONDOWN : + case WM_RBUTTONUP : + return TRUE; + } + return CallWindowProc(pOldTbarRemoteProc, hWnd, uMessage, wParam, lParam); +} +/********************************************* ‚±‚±‚Ü‚Å */ diff --git a/updatebell.c b/updatebell.c new file mode 100644 index 0000000..1422aca --- /dev/null +++ b/updatebell.c @@ -0,0 +1,90 @@ +/*============================================================================= +* XV•—‘ö‘Ήž +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + + + +#define MAIL_ADDRESS "sota@mwa.biglobe.ne.jp" +#define SOFTWARE "FFFTP" +#define MYNAME "‘]“c" +#define MYURL "http://www2.biglobe.ne.jp/~sota/" +#define INFOFILE "http://www2.biglobe.ne.jp/~sota/product/update.inf" + + +/*----- XV•—‘ö‚̃[ƒJƒ‹î•ñ‚ð‘‚«ž‚Þ -------------------------------------- +* +* Parameter +* ‚È‚µ +* +* Return Value +* ‚È‚µ +*----------------------------------------------------------------------------*/ + +void SaveUpdateBellInfo(void) +{ + HKEY hKey1; + HKEY hKey2; + HKEY hKey3; + DWORD Dispos; + int Tmp; + + if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Upcheck", 0, KEY_CREATE_SUB_KEY, &hKey1) == ERROR_SUCCESS) + { + if(RegCreateKeyEx(hKey1, MAIL_ADDRESS, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY|KEY_SET_VALUE, NULL, &hKey2, &Dispos) == ERROR_SUCCESS) + { + RegSetValueEx(hKey2, "Author", 0, REG_SZ, MYNAME, strlen(MYNAME)+1); + RegSetValueEx(hKey2, "InfoURL", 0, REG_SZ, INFOFILE, strlen(INFOFILE)+1); + RegSetValueEx(hKey2, "DisplayHost", 0, REG_SZ, MYURL, strlen(MYURL)+1); + + if(RegCreateKeyEx(hKey2, SOFTWARE, 0, "", REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY|KEY_SET_VALUE, NULL, &hKey3, &Dispos) == ERROR_SUCCESS) + { + Tmp = PROGRAM_VERSION_NUM; + RegSetValueEx(hKey3, "Build", 0, REG_DWORD, (CONST BYTE *)&Tmp, sizeof(Tmp)); + RegSetValueEx(hKey3, "DistinctName", 0, REG_SZ, SOFTWARE, strlen(SOFTWARE)+1); + + RegCloseKey(hKey3); + } + RegCloseKey(hKey2); + } + RegCloseKey(hKey1); + } + return; +} + + diff --git a/wildcard.c b/wildcard.c new file mode 100644 index 0000000..20acbe6 --- /dev/null +++ b/wildcard.c @@ -0,0 +1,172 @@ +/*============================================================================= +* +* ƒƒCƒ‹ƒhƒJ[ƒhŒŸõ +* +=============================================================================== +/ Copyright (C) 1997-2007 Sota. All rights reserved. +/ +/ Redistribution and use in source and binary forms, with or without +/ modification, are permitted provided that the following conditions +/ are met: +/ +/ 1. Redistributions of source code must retain the above copyright +/ notice, this list of conditions and the following disclaimer. +/ 2. Redistributions in binary form must reproduce the above copyright +/ notice, this list of conditions and the following disclaimer in the +/ documentation and/or other materials provided with the distribution. +/ +/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/============================================================================*/ + +#define STRICT +#include +#include +#include +#include + +#include "common.h" +#include "jreusr.h" + + +/*===== ƒvƒƒgƒ^ƒCƒv =====*/ + +static int CheckNameMatch(char *str, char *regexp); + + + +/*----- ƒƒCƒ‹ƒhƒJ[ƒh‚Ƀ}ƒbƒ`‚·‚é‚©‚Ç‚¤‚©‚ð•Ô‚· ------------------------------ +* +* Parameter +* char *str : •¶Žš—ñ +* char *regexp : ƒƒCƒ‹ƒhƒJ[ƒhŒŸõŽ® +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +* +* Note +* VAX VMS‚ÌŽž‚Í ; ˆÈ~‚Í–³Ž‹‚·‚é +*----------------------------------------------------------------------------*/ + +int CheckFname(char *str, char *regexp) +{ + int Sts; + char p1[FMAX_PATH+1]; + char p2[FMAX_PATH+1]; + char *p; + + strcpy(p1, regexp); + strcpy(p2, str); + + /* VAX VMS‚ÌŽž‚Ì‚½‚߂̏ˆ— */ + if(AskHostType() == HTYPE_VMS) + { + if((p = strchr(p2, ';')) != NULL) + *p = NUL; + } + + /* *? ‚Æ‚© ** ‚Æ‚©‚ðíœ */ + for(p = p1; *p != NUL; p++) + { + while((*p == '*') && ((*(p+1) == '?') || (*(p+1) == '*'))) + memmove(p+1, p+2, strlen(p+2)+1); + } + + if((strcmp(p1, "*.*") == 0) || (strcmp(p1, "????????.???") == 0)) + strcpy(p1, "*"); + + Sts = SUCCESS; + if(strcmp(p1, "*") != 0) + { + if(strcmp(p1, "*.") == 0) + { + p = strchr(p2, '.'); + if((p != NULL) && (*(p+1) != NUL)) + Sts = FAIL; + } + else + Sts = CheckNameMatch(p2, p1); + } + return(Sts); +} + + +/*----- ƒƒCƒ‹ƒhƒJ[ƒhŒŸõƒTƒuƒ‹[ƒ`ƒ“ ---------------------------------------- +* +* Parameter +* char *str : •¶Žš—ñ +* char *regexp : ƒƒCƒ‹ƒhƒJ[ƒhŒŸõŽ® +* +* Return Value +* int ƒXƒe[ƒ^ƒX +* SUCCESS/FAIL +*----------------------------------------------------------------------------*/ + +static int CheckNameMatch(char *str, char *regexp) +{ + char *p; + + for(p = regexp; (*p != NUL) && (*str != NUL); ) + { + switch(*p) + { + case '?': + str++; + p++; + break; + + case '*': + /* Look for a character matching the one after the '*' */ + p++; + if(*p == NUL) + return SUCCESS; /* Automatic match */ + while(*str != NUL) + { + while((*str != NUL) && (toupper(*p)!=toupper(*str))) + str++; + if(CheckNameMatch(str, p)) + return SUCCESS; + if(*str == NUL) + return FAIL; + else + str++; + } + return FAIL; + + default: + if(toupper(*str) != toupper(*p)) + return FAIL; + str++; + p++; + break; + } + } + + if((*p == NUL) && (*str == NUL)) + return SUCCESS; + + if ((*p != NUL) && (str[0] == '.') && (str[1] == 0)) + return(SUCCESS); + + if ((*str == NUL) && (*p == '?')) + { + while (*p == '?') + p++; + return(*p == NUL); + } + + if((*str == NUL) && (*p == '*') && (p[1] == '\0')) + return SUCCESS; + + return FAIL; +} + -- 2.11.0

ƒpƒXƒ[ƒh‚ÌŽæ‚舵‚¢‚ɂ‚¢‚Ä

+

Š¿Žš‚̃tƒ@ƒCƒ‹–¼‚ɂ‚¢‚Ä

+

 

+