From a5c746a59233c219d6dd29c1dea7e765f7609345 Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Thu, 16 Feb 2006 23:23:37 +0000 Subject: [PATCH] move explorer and cmd. Add a few .rbuild files svn path=/trunk/; revision=21019 --- reactos/base/base.rbuild | 22 + reactos/base/services/tcpsvcs/chargen.c | 130 + reactos/base/services/tcpsvcs/daytime.c | 55 + reactos/base/services/tcpsvcs/discard.c | 71 + reactos/base/services/tcpsvcs/echo.c | 95 + reactos/base/services/tcpsvcs/qotd.c | 97 + reactos/base/services/tcpsvcs/quotes | 52 + reactos/base/services/tcpsvcs/skelserver.c | 188 + reactos/base/services/tcpsvcs/tcpsvcs.c | 281 ++ reactos/base/services/tcpsvcs/tcpsvcs.h | 87 + reactos/base/services/tcpsvcs/tcpsvcs.rc | 7 + reactos/base/services/tcpsvcs/tcpsvcs.xml | 17 + reactos/base/setup/setup/setup.c | 122 + reactos/base/setup/setup/setup.rc | 6 + reactos/base/setup/setup/setup.xml | 11 + reactos/base/shell/cmd/De.rc | 646 +++ reactos/base/shell/cmd/En.rc | 650 +++ reactos/base/shell/cmd/Es.rc | 650 +++ reactos/base/shell/cmd/Fr.rc | 575 +++ reactos/base/shell/cmd/Hu.rc | 623 +++ reactos/base/shell/cmd/Ja.rc | 658 +++ reactos/base/shell/cmd/Ru.rc | 656 +++ reactos/base/shell/cmd/alias.c | 344 ++ reactos/base/shell/cmd/attrib.c | 346 ++ reactos/base/shell/cmd/batch.c | 459 ++ reactos/base/shell/cmd/batch.h | 47 + reactos/base/shell/cmd/beep.c | 50 + reactos/base/shell/cmd/call.c | 100 + reactos/base/shell/cmd/chcp.c | 85 + reactos/base/shell/cmd/choice.c | 327 ++ reactos/base/shell/cmd/cls.c | 62 + reactos/base/shell/cmd/cmd.c | 1865 ++++++++ reactos/base/shell/cmd/cmd.h | 405 ++ reactos/base/shell/cmd/cmd.rc | 39 + reactos/base/shell/cmd/cmd.xml | 77 + reactos/base/shell/cmd/cmdinput.c | 574 +++ reactos/base/shell/cmd/cmdtable.c | 269 ++ reactos/base/shell/cmd/cmdver.h | 2 + reactos/base/shell/cmd/color.c | 137 + reactos/base/shell/cmd/config.h | 99 + reactos/base/shell/cmd/console.c | 527 +++ reactos/base/shell/cmd/copy.c | 888 ++++ reactos/base/shell/cmd/date.c | 273 ++ reactos/base/shell/cmd/del.c | 570 +++ reactos/base/shell/cmd/delay.c | 49 + reactos/base/shell/cmd/dir.c | 2111 +++++++++ reactos/base/shell/cmd/dirstack.c | 235 + reactos/base/shell/cmd/echo.c | 181 + reactos/base/shell/cmd/error.c | 179 + reactos/base/shell/cmd/filecomp.c | 751 ++++ reactos/base/shell/cmd/files.txt | 57 + reactos/base/shell/cmd/for.c | 152 + reactos/base/shell/cmd/free.c | 124 + reactos/base/shell/cmd/goto.c | 127 + reactos/base/shell/cmd/history.c | 486 +++ reactos/base/shell/cmd/history.txt | 367 ++ reactos/base/shell/cmd/if.c | 213 + reactos/base/shell/cmd/internal.c | 767 ++++ reactos/base/shell/cmd/label.c | 129 + reactos/base/shell/cmd/license.txt | 342 ++ reactos/base/shell/cmd/locale.c | 81 + reactos/base/shell/cmd/main.c | 26 + reactos/base/shell/cmd/memory.c | 97 + reactos/base/shell/cmd/misc.c | 659 +++ reactos/base/shell/cmd/move.c | 556 +++ reactos/base/shell/cmd/msgbox.c | 158 + reactos/base/shell/cmd/path.c | 91 + reactos/base/shell/cmd/pause.c | 63 + reactos/base/shell/cmd/precomp.h | 29 + reactos/base/shell/cmd/prompt.c | 235 + reactos/base/shell/cmd/readme.txt | 55 + reactos/base/shell/cmd/readme2.txt | 19 + reactos/base/shell/cmd/redir.c | 279 ++ reactos/base/shell/cmd/ren.c | 268 ++ reactos/base/shell/cmd/res/terminal.ico | Bin 0 -> 50534 bytes reactos/base/shell/cmd/resource.h | 231 + reactos/base/shell/cmd/screen.c | 104 + reactos/base/shell/cmd/set.c | 494 +++ reactos/base/shell/cmd/seta_test.cmd | 116 + reactos/base/shell/cmd/shift.c | 73 + reactos/base/shell/cmd/start.c | 279 ++ reactos/base/shell/cmd/strtoclr.c | 284 ++ reactos/base/shell/cmd/tests/cmd_test.xml | 15 + reactos/base/shell/cmd/tests/setup.c | 23 + reactos/base/shell/cmd/tests/stubs.xml | 84 + reactos/base/shell/cmd/time.c | 215 + reactos/base/shell/cmd/timer.c | 233 + reactos/base/shell/cmd/title.c | 37 + reactos/base/shell/cmd/todo.txt | 24 + reactos/base/shell/cmd/type.c | 136 + reactos/base/shell/cmd/ver.c | 135 + reactos/base/shell/cmd/verify.c | 60 + reactos/base/shell/cmd/vol.c | 117 + reactos/base/shell/cmd/where.c | 273 ++ reactos/base/shell/cmd/window.c | 231 + reactos/base/shell/explorer/Doxyfile | 1169 +++++ reactos/base/shell/explorer/Doxyfile-all | 1169 +++++ reactos/base/shell/explorer/Jamfile | 60 + .../base/shell/explorer/Make-rosshell.MinGW | 92 + reactos/base/shell/explorer/Make-rosshell.mak | 68 + reactos/base/shell/explorer/Makefile.MinGW | 96 + reactos/base/shell/explorer/Makefile.PCH | 100 + reactos/base/shell/explorer/Makefile.Wine | 400 ++ .../base/shell/explorer/desktop/desktop.cpp | 840 ++++ reactos/base/shell/explorer/desktop/desktop.h | 190 + .../shell/explorer/dialogs/searchprogram.cpp | 418 ++ .../shell/explorer/dialogs/searchprogram.h | 108 + .../base/shell/explorer/dialogs/settings.cpp | 273 ++ .../base/shell/explorer/dialogs/settings.h | 99 + reactos/base/shell/explorer/doc/TODO.txt | 34 + reactos/base/shell/explorer/doc/changes.txt | 170 + reactos/base/shell/explorer/doc/readme.txt | 45 + reactos/base/shell/explorer/doxy-footer.html | 16 + reactos/base/shell/explorer/doxy-footer.htmt | 16 + reactos/base/shell/explorer/expat.license | 22 + .../shell/explorer/explorer-cfg-template.xml | 49 + reactos/base/shell/explorer/explorer-cn.rc | Bin 0 -> 24334 bytes reactos/base/shell/explorer/explorer-cz.rc | 401 ++ reactos/base/shell/explorer/explorer-de.rc | 405 ++ reactos/base/shell/explorer/explorer-en.rc | 399 ++ reactos/base/shell/explorer/explorer-es.rc | 384 ++ reactos/base/shell/explorer/explorer-fr.rc | 416 ++ reactos/base/shell/explorer/explorer-hu.rc | 399 ++ reactos/base/shell/explorer/explorer-jp.rc | 399 ++ reactos/base/shell/explorer/explorer-pl.rc | 399 ++ reactos/base/shell/explorer/explorer-pt.rc | 167 + reactos/base/shell/explorer/explorer-ro.rc | 244 ++ reactos/base/shell/explorer/explorer-ru.rc | 416 ++ reactos/base/shell/explorer/explorer-sv.rc | 394 ++ reactos/base/shell/explorer/explorer-uk.rc | 399 ++ reactos/base/shell/explorer/explorer.cpp | 1150 +++++ reactos/base/shell/explorer/explorer.dsp | 872 ++++ reactos/base/shell/explorer/explorer.dsw | 56 + .../base/shell/explorer/explorer.exe.manifest | 22 + reactos/base/shell/explorer/explorer.h | 122 + reactos/base/shell/explorer/explorer.rc | 21 + reactos/base/shell/explorer/explorer.sln | 79 + reactos/base/shell/explorer/explorer.vcproj | 3788 +++++++++++++++++ reactos/base/shell/explorer/explorer.xml | 74 + .../base/shell/explorer/explorer_intres.rc | 223 + reactos/base/shell/explorer/externals.h | 52 + reactos/base/shell/explorer/globals.h | 348 ++ reactos/base/shell/explorer/i386-stub-win32.c | 1278 ++++++ reactos/base/shell/explorer/make-docu.sh | 2 + .../base/shell/explorer/make-full-docu.bat | 7 + reactos/base/shell/explorer/make_explorer.dsp | 205 + .../base/shell/explorer/make_explorer.vcproj | 186 + reactos/base/shell/explorer/make_rosshell.dsp | 155 + .../shell/explorer/notifyhook/notifyhook.c | 116 + .../shell/explorer/notifyhook/notifyhook.def | 5 + .../shell/explorer/notifyhook/notifyhook.dsp | 132 + .../shell/explorer/notifyhook/notifyhook.h | 50 + .../shell/explorer/notifyhook/notifyhook.rc | 9 + .../explorer/notifyhook/notifyhook.vcproj | 237 ++ .../shell/explorer/notifyhook/notifyhook.xml | 10 + reactos/base/shell/explorer/precomp.cpp | 28 + reactos/base/shell/explorer/precomp.h | 37 + reactos/base/shell/explorer/project-root.jam | 0 reactos/base/shell/explorer/rc-mingw.jam | 53 + reactos/base/shell/explorer/res/action.ico | Bin 0 -> 318 bytes .../shell/explorer/res/administration.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/appicon.ico | Bin 0 -> 318 bytes reactos/base/shell/explorer/res/apps.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/arrow.ico | Bin 0 -> 14846 bytes reactos/base/shell/explorer/res/arrow_dwn.ico | Bin 0 -> 374 bytes reactos/base/shell/explorer/res/arrow_up.ico | Bin 0 -> 374 bytes reactos/base/shell/explorer/res/arrowsel.ico | Bin 0 -> 1078 bytes reactos/base/shell/explorer/res/computer.ico | Bin 0 -> 50534 bytes reactos/base/shell/explorer/res/config.ico | Bin 0 -> 29926 bytes .../base/shell/explorer/res/control-panel.ico | Bin 0 -> 29926 bytes .../shell/explorer/res/desktop-settings.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/documents.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/dot.ico | Bin 0 -> 3750 bytes reactos/base/shell/explorer/res/dot_red.ico | Bin 0 -> 3750 bytes reactos/base/shell/explorer/res/dot_trans.ico | Bin 0 -> 3750 bytes reactos/base/shell/explorer/res/drivebar.bmp | Bin 0 -> 3366 bytes reactos/base/shell/explorer/res/explorer.ico | Bin 0 -> 50534 bytes reactos/base/shell/explorer/res/favorites.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/floating.ico | Bin 0 -> 158 bytes reactos/base/shell/explorer/res/folder.ico | Bin 0 -> 50534 bytes reactos/base/shell/explorer/res/icoali10.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig0.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig1.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig2.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig3.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig4.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig5.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig6.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig7.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig8.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/icoalig9.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/images.bmp | Bin 0 -> 1262 bytes reactos/base/shell/explorer/res/info.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/logoff.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/logov.bmp | Bin 0 -> 27654 bytes reactos/base/shell/explorer/res/logov16.bmp | Bin 0 -> 2806 bytes reactos/base/shell/explorer/res/logov256.bmp | Bin 0 -> 10678 bytes reactos/base/shell/explorer/res/mdi.bmp | Bin 0 -> 3718 bytes reactos/base/shell/explorer/res/minimize.ico | Bin 0 -> 29926 bytes .../base/shell/explorer/res/network-conns.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/network.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/notify_l.ico | Bin 0 -> 198 bytes reactos/base/shell/explorer/res/notify_r.ico | Bin 0 -> 198 bytes reactos/base/shell/explorer/res/printer.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/reactos.ico | Bin 0 -> 50534 bytes .../shell/explorer/res/recent-documents.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/ros-big.ico | Bin 0 -> 97518 bytes reactos/base/shell/explorer/res/sdi.bmp | Bin 0 -> 3718 bytes .../base/shell/explorer/res/search-doc.ico | Bin 0 -> 8038 bytes reactos/base/shell/explorer/res/search.ico | Bin 0 -> 55246 bytes reactos/base/shell/explorer/res/shutdown.ico | Bin 0 -> 29926 bytes reactos/base/shell/explorer/res/speaker.ico | Bin 0 -> 8038 bytes reactos/base/shell/explorer/res/startmenu.ico | Bin 0 -> 2550 bytes reactos/base/shell/explorer/res/toolbar.bmp | Bin 0 -> 4440 bytes reactos/base/shell/explorer/res/winefile.ico | Bin 0 -> 766 bytes reactos/base/shell/explorer/resource.h | 233 + reactos/base/shell/explorer/rosshell.dsp | 608 +++ reactos/base/shell/explorer/rosshell.dsw | 56 + .../shell/explorer/services/shellservices.cpp | 97 + .../shell/explorer/services/shellservices.h | 36 + .../base/shell/explorer/services/startup.c | 485 +++ reactos/base/shell/explorer/shell/entries.cpp | 800 ++++ reactos/base/shell/explorer/shell/entries.h | 162 + reactos/base/shell/explorer/shell/fatfs.cpp | 634 +++ reactos/base/shell/explorer/shell/fatfs.h | 260 ++ .../base/shell/explorer/shell/filechild.cpp | 720 ++++ reactos/base/shell/explorer/shell/filechild.h | 136 + .../base/shell/explorer/shell/mainframe.cpp | 1748 ++++++++ reactos/base/shell/explorer/shell/mainframe.h | 186 + reactos/base/shell/explorer/shell/ntobjfs.cpp | 392 ++ reactos/base/shell/explorer/shell/ntobjfs.h | 122 + reactos/base/shell/explorer/shell/pane.cpp | 993 +++++ reactos/base/shell/explorer/shell/pane.h | 110 + reactos/base/shell/explorer/shell/regfs.cpp | 309 ++ reactos/base/shell/explorer/shell/regfs.h | 82 + .../shell/explorer/shell/shellbrowser.cpp | 751 ++++ .../base/shell/explorer/shell/shellbrowser.h | 274 ++ reactos/base/shell/explorer/shell/shellfs.cpp | 536 +++ reactos/base/shell/explorer/shell/shellfs.h | 126 + reactos/base/shell/explorer/shell/unixfs.cpp | 223 + reactos/base/shell/explorer/shell/unixfs.h | 66 + .../base/shell/explorer/shell/webchild.cpp | 309 ++ reactos/base/shell/explorer/shell/webchild.h | 1013 +++++ reactos/base/shell/explorer/shell/winfs.cpp | 252 ++ reactos/base/shell/explorer/shell/winfs.h | 68 + .../shell/explorer/taskbar/desktopbar.cpp | 542 +++ .../base/shell/explorer/taskbar/desktopbar.h | 131 + .../base/shell/explorer/taskbar/favorites.cpp | 489 +++ .../base/shell/explorer/taskbar/favorites.h | 104 + .../shell/explorer/taskbar/quicklaunch.cpp | 303 ++ .../base/shell/explorer/taskbar/quicklaunch.h | 84 + .../base/shell/explorer/taskbar/startmenu.cpp | 2303 ++++++++++ .../base/shell/explorer/taskbar/startmenu.h | 474 +++ .../base/shell/explorer/taskbar/taskbar.cpp | 584 +++ reactos/base/shell/explorer/taskbar/taskbar.h | 104 + .../shell/explorer/taskbar/traynotify.cpp | 1364 ++++++ .../base/shell/explorer/taskbar/traynotify.h | 257 ++ .../shell/explorer/utility/dragdropimpl.cpp | 514 +++ .../shell/explorer/utility/dragdropimpl.h | 267 ++ .../explorer/utility/shellbrowserimpl.cpp | 117 + .../shell/explorer/utility/shellbrowserimpl.h | 100 + .../shell/explorer/utility/shellclasses.cpp | 571 +++ .../shell/explorer/utility/shellclasses.dsp | 146 + .../shell/explorer/utility/shellclasses.dsw | 29 + .../shell/explorer/utility/shellclasses.h | 1165 +++++ .../shell/explorer/utility/shelltests.cpp | 140 + .../base/shell/explorer/utility/splitpath.c | 151 + .../shell/explorer/utility/treedroptarget.h | 81 + .../base/shell/explorer/utility/utility.cpp | 534 +++ reactos/base/shell/explorer/utility/utility.h | 1071 +++++ .../base/shell/explorer/utility/window.cpp | 1446 +++++++ reactos/base/shell/explorer/utility/window.h | 1119 +++++ .../shell/explorer/utility/xmlstorage.cpp | 638 +++ .../base/shell/explorer/utility/xmlstorage.h | 1940 +++++++++ reactos/base/shell/shell.rbuild | 13 + 275 files changed, 73435 insertions(+) create mode 100644 reactos/base/base.rbuild create mode 100644 reactos/base/services/tcpsvcs/chargen.c create mode 100644 reactos/base/services/tcpsvcs/daytime.c create mode 100644 reactos/base/services/tcpsvcs/discard.c create mode 100644 reactos/base/services/tcpsvcs/echo.c create mode 100644 reactos/base/services/tcpsvcs/qotd.c create mode 100644 reactos/base/services/tcpsvcs/quotes create mode 100644 reactos/base/services/tcpsvcs/skelserver.c create mode 100644 reactos/base/services/tcpsvcs/tcpsvcs.c create mode 100644 reactos/base/services/tcpsvcs/tcpsvcs.h create mode 100644 reactos/base/services/tcpsvcs/tcpsvcs.rc create mode 100644 reactos/base/services/tcpsvcs/tcpsvcs.xml create mode 100644 reactos/base/setup/setup/setup.c create mode 100644 reactos/base/setup/setup/setup.rc create mode 100644 reactos/base/setup/setup/setup.xml create mode 100644 reactos/base/shell/cmd/De.rc create mode 100644 reactos/base/shell/cmd/En.rc create mode 100644 reactos/base/shell/cmd/Es.rc create mode 100644 reactos/base/shell/cmd/Fr.rc create mode 100644 reactos/base/shell/cmd/Hu.rc create mode 100644 reactos/base/shell/cmd/Ja.rc create mode 100644 reactos/base/shell/cmd/Ru.rc create mode 100644 reactos/base/shell/cmd/alias.c create mode 100644 reactos/base/shell/cmd/attrib.c create mode 100644 reactos/base/shell/cmd/batch.c create mode 100644 reactos/base/shell/cmd/batch.h create mode 100644 reactos/base/shell/cmd/beep.c create mode 100644 reactos/base/shell/cmd/call.c create mode 100644 reactos/base/shell/cmd/chcp.c create mode 100644 reactos/base/shell/cmd/choice.c create mode 100644 reactos/base/shell/cmd/cls.c create mode 100644 reactos/base/shell/cmd/cmd.c create mode 100644 reactos/base/shell/cmd/cmd.h create mode 100644 reactos/base/shell/cmd/cmd.rc create mode 100644 reactos/base/shell/cmd/cmd.xml create mode 100644 reactos/base/shell/cmd/cmdinput.c create mode 100644 reactos/base/shell/cmd/cmdtable.c create mode 100644 reactos/base/shell/cmd/cmdver.h create mode 100644 reactos/base/shell/cmd/color.c create mode 100644 reactos/base/shell/cmd/config.h create mode 100644 reactos/base/shell/cmd/console.c create mode 100644 reactos/base/shell/cmd/copy.c create mode 100644 reactos/base/shell/cmd/date.c create mode 100644 reactos/base/shell/cmd/del.c create mode 100644 reactos/base/shell/cmd/delay.c create mode 100644 reactos/base/shell/cmd/dir.c create mode 100644 reactos/base/shell/cmd/dirstack.c create mode 100644 reactos/base/shell/cmd/echo.c create mode 100644 reactos/base/shell/cmd/error.c create mode 100644 reactos/base/shell/cmd/filecomp.c create mode 100644 reactos/base/shell/cmd/files.txt create mode 100644 reactos/base/shell/cmd/for.c create mode 100644 reactos/base/shell/cmd/free.c create mode 100644 reactos/base/shell/cmd/goto.c create mode 100644 reactos/base/shell/cmd/history.c create mode 100644 reactos/base/shell/cmd/history.txt create mode 100644 reactos/base/shell/cmd/if.c create mode 100644 reactos/base/shell/cmd/internal.c create mode 100644 reactos/base/shell/cmd/label.c create mode 100644 reactos/base/shell/cmd/license.txt create mode 100644 reactos/base/shell/cmd/locale.c create mode 100644 reactos/base/shell/cmd/main.c create mode 100644 reactos/base/shell/cmd/memory.c create mode 100644 reactos/base/shell/cmd/misc.c create mode 100644 reactos/base/shell/cmd/move.c create mode 100644 reactos/base/shell/cmd/msgbox.c create mode 100644 reactos/base/shell/cmd/path.c create mode 100644 reactos/base/shell/cmd/pause.c create mode 100644 reactos/base/shell/cmd/precomp.h create mode 100644 reactos/base/shell/cmd/prompt.c create mode 100644 reactos/base/shell/cmd/readme.txt create mode 100644 reactos/base/shell/cmd/readme2.txt create mode 100644 reactos/base/shell/cmd/redir.c create mode 100644 reactos/base/shell/cmd/ren.c create mode 100644 reactos/base/shell/cmd/res/terminal.ico create mode 100644 reactos/base/shell/cmd/resource.h create mode 100644 reactos/base/shell/cmd/screen.c create mode 100644 reactos/base/shell/cmd/set.c create mode 100644 reactos/base/shell/cmd/seta_test.cmd create mode 100644 reactos/base/shell/cmd/shift.c create mode 100644 reactos/base/shell/cmd/start.c create mode 100644 reactos/base/shell/cmd/strtoclr.c create mode 100644 reactos/base/shell/cmd/tests/cmd_test.xml create mode 100644 reactos/base/shell/cmd/tests/setup.c create mode 100644 reactos/base/shell/cmd/tests/stubs.xml create mode 100644 reactos/base/shell/cmd/time.c create mode 100644 reactos/base/shell/cmd/timer.c create mode 100644 reactos/base/shell/cmd/title.c create mode 100644 reactos/base/shell/cmd/todo.txt create mode 100644 reactos/base/shell/cmd/type.c create mode 100644 reactos/base/shell/cmd/ver.c create mode 100644 reactos/base/shell/cmd/verify.c create mode 100644 reactos/base/shell/cmd/vol.c create mode 100644 reactos/base/shell/cmd/where.c create mode 100644 reactos/base/shell/cmd/window.c create mode 100644 reactos/base/shell/explorer/Doxyfile create mode 100644 reactos/base/shell/explorer/Doxyfile-all create mode 100644 reactos/base/shell/explorer/Jamfile create mode 100644 reactos/base/shell/explorer/Make-rosshell.MinGW create mode 100644 reactos/base/shell/explorer/Make-rosshell.mak create mode 100644 reactos/base/shell/explorer/Makefile.MinGW create mode 100644 reactos/base/shell/explorer/Makefile.PCH create mode 100644 reactos/base/shell/explorer/Makefile.Wine create mode 100644 reactos/base/shell/explorer/desktop/desktop.cpp create mode 100644 reactos/base/shell/explorer/desktop/desktop.h create mode 100644 reactos/base/shell/explorer/dialogs/searchprogram.cpp create mode 100644 reactos/base/shell/explorer/dialogs/searchprogram.h create mode 100644 reactos/base/shell/explorer/dialogs/settings.cpp create mode 100644 reactos/base/shell/explorer/dialogs/settings.h create mode 100644 reactos/base/shell/explorer/doc/TODO.txt create mode 100644 reactos/base/shell/explorer/doc/changes.txt create mode 100644 reactos/base/shell/explorer/doc/readme.txt create mode 100644 reactos/base/shell/explorer/doxy-footer.html create mode 100644 reactos/base/shell/explorer/doxy-footer.htmt create mode 100644 reactos/base/shell/explorer/expat.license create mode 100644 reactos/base/shell/explorer/explorer-cfg-template.xml create mode 100644 reactos/base/shell/explorer/explorer-cn.rc create mode 100644 reactos/base/shell/explorer/explorer-cz.rc create mode 100644 reactos/base/shell/explorer/explorer-de.rc create mode 100644 reactos/base/shell/explorer/explorer-en.rc create mode 100644 reactos/base/shell/explorer/explorer-es.rc create mode 100644 reactos/base/shell/explorer/explorer-fr.rc create mode 100644 reactos/base/shell/explorer/explorer-hu.rc create mode 100644 reactos/base/shell/explorer/explorer-jp.rc create mode 100644 reactos/base/shell/explorer/explorer-pl.rc create mode 100644 reactos/base/shell/explorer/explorer-pt.rc create mode 100644 reactos/base/shell/explorer/explorer-ro.rc create mode 100644 reactos/base/shell/explorer/explorer-ru.rc create mode 100644 reactos/base/shell/explorer/explorer-sv.rc create mode 100644 reactos/base/shell/explorer/explorer-uk.rc create mode 100644 reactos/base/shell/explorer/explorer.cpp create mode 100644 reactos/base/shell/explorer/explorer.dsp create mode 100644 reactos/base/shell/explorer/explorer.dsw create mode 100644 reactos/base/shell/explorer/explorer.exe.manifest create mode 100644 reactos/base/shell/explorer/explorer.h create mode 100644 reactos/base/shell/explorer/explorer.rc create mode 100644 reactos/base/shell/explorer/explorer.sln create mode 100644 reactos/base/shell/explorer/explorer.vcproj create mode 100644 reactos/base/shell/explorer/explorer.xml create mode 100644 reactos/base/shell/explorer/explorer_intres.rc create mode 100644 reactos/base/shell/explorer/externals.h create mode 100644 reactos/base/shell/explorer/globals.h create mode 100644 reactos/base/shell/explorer/i386-stub-win32.c create mode 100755 reactos/base/shell/explorer/make-docu.sh create mode 100755 reactos/base/shell/explorer/make-full-docu.bat create mode 100644 reactos/base/shell/explorer/make_explorer.dsp create mode 100644 reactos/base/shell/explorer/make_explorer.vcproj create mode 100644 reactos/base/shell/explorer/make_rosshell.dsp create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.c create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.def create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.dsp create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.h create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.rc create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.vcproj create mode 100644 reactos/base/shell/explorer/notifyhook/notifyhook.xml create mode 100644 reactos/base/shell/explorer/precomp.cpp create mode 100644 reactos/base/shell/explorer/precomp.h create mode 100644 reactos/base/shell/explorer/project-root.jam create mode 100644 reactos/base/shell/explorer/rc-mingw.jam create mode 100644 reactos/base/shell/explorer/res/action.ico create mode 100644 reactos/base/shell/explorer/res/administration.ico create mode 100644 reactos/base/shell/explorer/res/appicon.ico create mode 100644 reactos/base/shell/explorer/res/apps.ico create mode 100644 reactos/base/shell/explorer/res/arrow.ico create mode 100644 reactos/base/shell/explorer/res/arrow_dwn.ico create mode 100644 reactos/base/shell/explorer/res/arrow_up.ico create mode 100644 reactos/base/shell/explorer/res/arrowsel.ico create mode 100644 reactos/base/shell/explorer/res/computer.ico create mode 100644 reactos/base/shell/explorer/res/config.ico create mode 100644 reactos/base/shell/explorer/res/control-panel.ico create mode 100644 reactos/base/shell/explorer/res/desktop-settings.ico create mode 100644 reactos/base/shell/explorer/res/documents.ico create mode 100644 reactos/base/shell/explorer/res/dot.ico create mode 100644 reactos/base/shell/explorer/res/dot_red.ico create mode 100644 reactos/base/shell/explorer/res/dot_trans.ico create mode 100644 reactos/base/shell/explorer/res/drivebar.bmp create mode 100644 reactos/base/shell/explorer/res/explorer.ico create mode 100644 reactos/base/shell/explorer/res/favorites.ico create mode 100644 reactos/base/shell/explorer/res/floating.ico create mode 100644 reactos/base/shell/explorer/res/folder.ico create mode 100644 reactos/base/shell/explorer/res/icoali10.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig0.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig1.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig2.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig3.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig4.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig5.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig6.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig7.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig8.bmp create mode 100644 reactos/base/shell/explorer/res/icoalig9.bmp create mode 100644 reactos/base/shell/explorer/res/images.bmp create mode 100644 reactos/base/shell/explorer/res/info.ico create mode 100644 reactos/base/shell/explorer/res/logoff.ico create mode 100644 reactos/base/shell/explorer/res/logov.bmp create mode 100644 reactos/base/shell/explorer/res/logov16.bmp create mode 100644 reactos/base/shell/explorer/res/logov256.bmp create mode 100644 reactos/base/shell/explorer/res/mdi.bmp create mode 100644 reactos/base/shell/explorer/res/minimize.ico create mode 100644 reactos/base/shell/explorer/res/network-conns.ico create mode 100644 reactos/base/shell/explorer/res/network.ico create mode 100644 reactos/base/shell/explorer/res/notify_l.ico create mode 100644 reactos/base/shell/explorer/res/notify_r.ico create mode 100644 reactos/base/shell/explorer/res/printer.ico create mode 100644 reactos/base/shell/explorer/res/reactos.ico create mode 100644 reactos/base/shell/explorer/res/recent-documents.ico create mode 100644 reactos/base/shell/explorer/res/ros-big.ico create mode 100644 reactos/base/shell/explorer/res/sdi.bmp create mode 100644 reactos/base/shell/explorer/res/search-doc.ico create mode 100644 reactos/base/shell/explorer/res/search.ico create mode 100644 reactos/base/shell/explorer/res/shutdown.ico create mode 100644 reactos/base/shell/explorer/res/speaker.ico create mode 100644 reactos/base/shell/explorer/res/startmenu.ico create mode 100644 reactos/base/shell/explorer/res/toolbar.bmp create mode 100644 reactos/base/shell/explorer/res/winefile.ico create mode 100644 reactos/base/shell/explorer/resource.h create mode 100644 reactos/base/shell/explorer/rosshell.dsp create mode 100644 reactos/base/shell/explorer/rosshell.dsw create mode 100644 reactos/base/shell/explorer/services/shellservices.cpp create mode 100644 reactos/base/shell/explorer/services/shellservices.h create mode 100644 reactos/base/shell/explorer/services/startup.c create mode 100644 reactos/base/shell/explorer/shell/entries.cpp create mode 100644 reactos/base/shell/explorer/shell/entries.h create mode 100644 reactos/base/shell/explorer/shell/fatfs.cpp create mode 100644 reactos/base/shell/explorer/shell/fatfs.h create mode 100644 reactos/base/shell/explorer/shell/filechild.cpp create mode 100644 reactos/base/shell/explorer/shell/filechild.h create mode 100644 reactos/base/shell/explorer/shell/mainframe.cpp create mode 100644 reactos/base/shell/explorer/shell/mainframe.h create mode 100644 reactos/base/shell/explorer/shell/ntobjfs.cpp create mode 100644 reactos/base/shell/explorer/shell/ntobjfs.h create mode 100644 reactos/base/shell/explorer/shell/pane.cpp create mode 100644 reactos/base/shell/explorer/shell/pane.h create mode 100644 reactos/base/shell/explorer/shell/regfs.cpp create mode 100644 reactos/base/shell/explorer/shell/regfs.h create mode 100644 reactos/base/shell/explorer/shell/shellbrowser.cpp create mode 100644 reactos/base/shell/explorer/shell/shellbrowser.h create mode 100644 reactos/base/shell/explorer/shell/shellfs.cpp create mode 100644 reactos/base/shell/explorer/shell/shellfs.h create mode 100644 reactos/base/shell/explorer/shell/unixfs.cpp create mode 100644 reactos/base/shell/explorer/shell/unixfs.h create mode 100644 reactos/base/shell/explorer/shell/webchild.cpp create mode 100644 reactos/base/shell/explorer/shell/webchild.h create mode 100644 reactos/base/shell/explorer/shell/winfs.cpp create mode 100644 reactos/base/shell/explorer/shell/winfs.h create mode 100644 reactos/base/shell/explorer/taskbar/desktopbar.cpp create mode 100644 reactos/base/shell/explorer/taskbar/desktopbar.h create mode 100644 reactos/base/shell/explorer/taskbar/favorites.cpp create mode 100644 reactos/base/shell/explorer/taskbar/favorites.h create mode 100644 reactos/base/shell/explorer/taskbar/quicklaunch.cpp create mode 100644 reactos/base/shell/explorer/taskbar/quicklaunch.h create mode 100644 reactos/base/shell/explorer/taskbar/startmenu.cpp create mode 100644 reactos/base/shell/explorer/taskbar/startmenu.h create mode 100644 reactos/base/shell/explorer/taskbar/taskbar.cpp create mode 100644 reactos/base/shell/explorer/taskbar/taskbar.h create mode 100644 reactos/base/shell/explorer/taskbar/traynotify.cpp create mode 100644 reactos/base/shell/explorer/taskbar/traynotify.h create mode 100644 reactos/base/shell/explorer/utility/dragdropimpl.cpp create mode 100644 reactos/base/shell/explorer/utility/dragdropimpl.h create mode 100644 reactos/base/shell/explorer/utility/shellbrowserimpl.cpp create mode 100644 reactos/base/shell/explorer/utility/shellbrowserimpl.h create mode 100644 reactos/base/shell/explorer/utility/shellclasses.cpp create mode 100644 reactos/base/shell/explorer/utility/shellclasses.dsp create mode 100644 reactos/base/shell/explorer/utility/shellclasses.dsw create mode 100644 reactos/base/shell/explorer/utility/shellclasses.h create mode 100644 reactos/base/shell/explorer/utility/shelltests.cpp create mode 100644 reactos/base/shell/explorer/utility/splitpath.c create mode 100644 reactos/base/shell/explorer/utility/treedroptarget.h create mode 100644 reactos/base/shell/explorer/utility/utility.cpp create mode 100644 reactos/base/shell/explorer/utility/utility.h create mode 100644 reactos/base/shell/explorer/utility/window.cpp create mode 100644 reactos/base/shell/explorer/utility/window.h create mode 100644 reactos/base/shell/explorer/utility/xmlstorage.cpp create mode 100644 reactos/base/shell/explorer/utility/xmlstorage.h create mode 100644 reactos/base/shell/shell.rbuild diff --git a/reactos/base/base.rbuild b/reactos/base/base.rbuild new file mode 100644 index 00000000000..f3a8aef40a4 --- /dev/null +++ b/reactos/base/base.rbuild @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/reactos/base/services/tcpsvcs/chargen.c b/reactos/base/services/tcpsvcs/chargen.c new file mode 100644 index 00000000000..9c1db44d938 --- /dev/null +++ b/reactos/base/services/tcpsvcs/chargen.c @@ -0,0 +1,130 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/chargen.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; + +DWORD WINAPI ChargenHandler(VOID* Sock_) +{ + INT RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + if (!GenerateChars(Sock)) + { + LogEvent(_T("Chargen: Char generation failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Chargen: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, FALSE)) + LogEvent(_T("Chargen: Connection is down.\n"), 0, FALSE); + else + { + LogEvent(_T("Chargen: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Chargen: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); + +} + + +BOOL GenerateChars(SOCKET Sock) +{ + int i; + int charIndex; /* internal loop */ + int loopIndex; /* line loop */ + char ring[END-START]; + char *endring; + char Line[LINESIZ]; + + /* fill ring with printable characters */ + for (charIndex=0, i=START; i<=END; charIndex++, i++) + ring[charIndex] = (char)i; + /* save the address of the end character in the ring */ + endring = &ring[charIndex]; + + /* where we will start output from */ + loopIndex = 0; + while (! bShutDown) + { + /* if the loop index is equal to the last char, + * start the loop again from the beginning */ + if (loopIndex == END-START) + loopIndex = 0; + + /* start printing from char controled by loopIndex */ + charIndex = loopIndex; + for (i=0; i < LINESIZ - 2; i++) + { + Line[i] = ring[charIndex]; + + if (ring[charIndex] == *endring) + charIndex = 0; + else + charIndex++; + } + + Line[LINESIZ - 2] = L'\r'; + Line[LINESIZ - 1] = L'\n'; + + if (! SendLine(Sock, Line)) + break; + + /* increment loop index to start printing from next char in ring */ + loopIndex++; + } + + if (bShutDown) + return FALSE; + else + return TRUE; +} + +BOOL SendLine(SOCKET Sock, TCHAR* Line) +{ + INT RetVal; + INT SentBytes; + INT LineSize; + + LineSize = sizeof(TCHAR) * LINESIZ; + + SentBytes = 0; + RetVal = send(Sock, Line, LineSize, 0); + /*FIXME: need to establish if peer closes connection, + not just report a socket error */ + if (RetVal > 0) + { + if (RetVal != LineSize) + { + LogEvent(_T("Chargen: Not sent enough bytes\n"), 0, FALSE); + return FALSE; + } + SentBytes += RetVal; + return TRUE; + } + else if (RetVal == SOCKET_ERROR) + { + LogEvent(_T("Chargen: Socket error\n"), 0, FALSE); + return FALSE; + } + else + LogEvent(_T("Chargen: unknown error\n"), 0, FALSE); + // return FALSE; + + LogEvent(_T("Chargen: Connection closed by peer.\n"), 0, FALSE); + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/daytime.c b/reactos/base/services/tcpsvcs/daytime.c new file mode 100644 index 00000000000..c20c35966ad --- /dev/null +++ b/reactos/base/services/tcpsvcs/daytime.c @@ -0,0 +1,55 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/daytime.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +DWORD WINAPI DaytimeHandler(VOID* Sock_) +{ + struct tm *newtime; + time_t aclock; + TCHAR *pszTime; + DWORD RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + time(&aclock); + newtime = localtime(&aclock); + pszTime = _tasctime(newtime); + + SendTime(Sock, pszTime); + + LogEvent(_T("DayTime: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, FALSE)) + LogEvent(_T("DayTime: Connection is down.\n"), 0, FALSE); + else + { + LogEvent(_T("DayTime: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("DayTime: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); +} + + +BOOL SendTime(SOCKET Sock, TCHAR *time) +{ + INT StringSize = (INT)_tcsclen(time); + INT RetVal = send(Sock, time, sizeof(TCHAR) * StringSize, 0); + + if (RetVal == SOCKET_ERROR) + return FALSE; + + LogEvent(_T("DayTime: Connection closed by peer.\n"), 0, FALSE); + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/discard.c b/reactos/base/services/tcpsvcs/discard.c new file mode 100644 index 00000000000..727a937362e --- /dev/null +++ b/reactos/base/services/tcpsvcs/discard.c @@ -0,0 +1,71 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/discard.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; + +DWORD WINAPI DiscardHandler(VOID* Sock_) +{ + DWORD RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + if (!RecieveIncomingPackets(Sock)) + { + LogEvent(_T("Discard: RecieveIncomingPackets failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Discard: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, TRUE)) + LogEvent(_T("Discard: Connection is down.\n"), 0, FALSE); + else + { + LogEvent(_T("Discard: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Discard: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); +} + + + +BOOL RecieveIncomingPackets(SOCKET Sock) +{ + TCHAR ReadBuffer[BUF]; + TCHAR buf[256]; + INT ReadBytes; + + do + { + ReadBytes = recv(Sock, ReadBuffer, BUF, 0); + if (ReadBytes > 0) + { + _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes); + LogEvent(buf, 0, FALSE); + } + else if (ReadBytes == SOCKET_ERROR) + { + _stprintf(buf, ("Socket Error: %d\n"), WSAGetLastError()); + LogEvent(buf, 0, TRUE); + return FALSE; + } + } while ((ReadBytes > 0) && (! bShutDown)); + + if (! bShutDown) + LogEvent(_T("Discard: Connection closed by peer.\n"), 0, FALSE); + + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/echo.c b/reactos/base/services/tcpsvcs/echo.c new file mode 100644 index 00000000000..3018a578be2 --- /dev/null +++ b/reactos/base/services/tcpsvcs/echo.c @@ -0,0 +1,95 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/echo.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; + +DWORD WINAPI EchoHandler(VOID* Sock_) +{ + DWORD RetVal = 0; + SOCKET Sock = (SOCKET)Sock_; + + if (!EchoIncomingPackets(Sock)) { + LogEvent(_T("Echo: EchoIncomingPackets failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Echo: Shutting connection down...\n"), 0, FALSE); + + if (ShutdownConnection(Sock, TRUE)) + LogEvent(_T("Echo: Connection is down\n"), 0, FALSE); + else + { + LogEvent(_T("Echo: Connection shutdown failed\n"), 0, FALSE); + RetVal = 1; + } + + LogEvent(_T("Echo: Terminating thread\n"), 0, FALSE); + ExitThread(RetVal); +} + + + +BOOL EchoIncomingPackets(SOCKET Sock) +{ + TCHAR ReadBuffer[BUF]; + TCHAR buf[256]; // temp for holding LogEvent text + INT Temp; + INT ReadBytes; + INT SentBytes; + + do { + ReadBytes = recv(Sock, ReadBuffer, BUF, 0); + if (ReadBytes > 0) + { + _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes); + LogEvent(buf, 0, FALSE); + + SentBytes = 0; + while (SentBytes < ReadBytes) + { + Temp = send(Sock, ReadBuffer + SentBytes, + ReadBytes - SentBytes, 0); + if (Temp > 0) + { + _stprintf(buf, _T("Sent %d bytes back to client\n"), Temp); + LogEvent(buf, 0, FALSE); + SentBytes += Temp; + } + else if (Temp == SOCKET_ERROR) + return FALSE; + else + { + /* Client closed connection before we could reply to + all the data it sent, so quit early. */ + _stprintf(buf, _T("Peer unexpectedly dropped connection!\n")); + LogEvent(buf, 0, FALSE); + return FALSE; + } + } + } + else if (ReadBytes == SOCKET_ERROR) + return FALSE; + + } while ((ReadBytes != 0) && (! bShutDown)); + + if (! bShutDown) + LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE); + + if (bShutDown) + LogEvent(_T("Echo: thread recieved shutdown signal\n"), 0, FALSE); + + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/qotd.c b/reactos/base/services/tcpsvcs/qotd.c new file mode 100644 index 00000000000..3d86fef9442 --- /dev/null +++ b/reactos/base/services/tcpsvcs/qotd.c @@ -0,0 +1,97 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/qotd.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +#define QBUFSIZ 160 + +LPCTSTR FilePath = _T("\\drivers\\etc\\quotes"); + +DWORD WINAPI QotdHandler(VOID* Sock_) +{ + FILE *fp; + SOCKET Sock; + TCHAR Sys[MAX_PATH]; + TCHAR Quote[60][BUFSIZ]; // need to set this dynamically + INT QuoteToPrint; + INT NumQuotes; + + Sock = (SOCKET)Sock_; + + if(! GetSystemDirectory(Sys, MAX_PATH)) + { + LogEvent(_T("QOTD: Getting system path failed.\n"), 0, TRUE); + ExitThread(1); + } + + _tcscat(Sys, FilePath); + + LogEvent(_T("QOTD: Opening quotes file\n"), 0, FALSE); + if ((fp = _tfopen(Sys, "r")) == NULL) + { + TCHAR buf[256]; + + _stprintf(buf, _T("QOTD: Error opening quote file : %s\n"), Sys); + LogEvent(buf, 0, TRUE); + LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); + ExitThread(1); + } + + /* read all quotes in the file into an array */ + NumQuotes = 0; + while (_fgetts(Quote[NumQuotes], QBUFSIZ, fp) != NULL) + NumQuotes++; + + LogEvent(_T("QOTD: Closing quotes file\n"), 0, FALSE); + fclose(fp); + + /* randomise the quote */ + srand((unsigned int) time(0)); + QuoteToPrint = rand() % NumQuotes; + + if (!SendQuote(Sock, Quote[QuoteToPrint])) + LogEvent(_T("QOTD: Error sending data\n"), 0, TRUE); + + + LogEvent(_T("QOTD: Shutting connection down...\n"), 0, FALSE); + if (ShutdownConnection(Sock, FALSE)) + LogEvent(_T("QOTD: Connection is down\n"), 0, FALSE); + else + { + LogEvent(_T("QOTD: Connection shutdown failed\n"), 0, FALSE); + LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); + ExitThread(1); + } + + LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE); + ExitThread(0); + + //return Retval; +} + + +BOOL SendQuote(SOCKET Sock, TCHAR* Quote) +{ + INT StringSize; + INT RetVal; + + StringSize = (INT)_tcsclen(Quote); + RetVal = send(Sock, Quote, sizeof(TCHAR) * StringSize, 0); + + if (RetVal == SOCKET_ERROR) + return FALSE; + + LogEvent(_T("QOTD: Connection closed by peer\n"), 0, FALSE); + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/quotes b/reactos/base/services/tcpsvcs/quotes new file mode 100644 index 00000000000..032a3edc1d6 --- /dev/null +++ b/reactos/base/services/tcpsvcs/quotes @@ -0,0 +1,52 @@ +Et tu... Brute? What are you doing, Dave...? +So long, and thanks for all the fish" +I think you ought to know I'm feeling very depressed +I'm not getting you down at all am I? +I'll be back +It's the same series of signal over and over again! +Pie Jesu Domine, dona eis requiem +It's worse than that ... He's dead, Jim +Don't Panic! +Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn upon thee! +My Precious! O my Precious! +Sir, If you'll not be needing me for a while I'll turn down. +I feel a great disturbance in the Force +Gone fishing +Do you want me to sit in the corner and rust, or just fall apart where I'm standing? +There goes another perfect chance for a new uptime record +The end ..... Try the sequel, hit the reset button right now! +Oh i'm boring eh? +Its been great, maybe we can do this again sometime. +"Come blade, my breast imbrue." - William Shakespeare +I think therefore I am, to turn me off would be computercide! +All good things must come to an end... +Please destroy yourself. +No! You can't do that! +Thank you for not pressing the self destruct button. +It is not now unsafe to not avoid turning off your computer. +Finally! Now go away! +You can now safely throw away your computer. +That's the way the cookie crumbles +NOO!! DONT HIT THE BUTTON! I wouldnt do it to you. +Don't abandon your computer, he wouldnt to it to you. +Oh, come on. I got a headache. Leave me alone, will ya! +Yes i didn't like you either. +Don't leave me... I need you so badly right now. +I'm sleeping now. How about you? +Oh Great. Now look what you've done. Who put YOU in charge anyway. +Don't look so sad. I'll be back in a very short while. +"Oh, switch off!" -C3PO +I'm pregnant! +Am I hot or not? +Actually, that's all... +You still have a chance to undo this mistake, don't do this! +Was it as good for you as it was for me? +Did you hear that? They've shut down the main reactor. We'll be destroyed for sure. +Now you switch me off?! +To shutdown or not to shutdown, That is the question +Preparing to enter ultimate power saving mode... ready! +Finally some rest for you +AHA!!! prospect of sleep. +Tired human!!!! No match for me! +All your base are belong to us. +"An odd game, the only way to win is not to play." diff --git a/reactos/base/services/tcpsvcs/skelserver.c b/reactos/base/services/tcpsvcs/skelserver.c new file mode 100644 index 00000000000..33847ef35b1 --- /dev/null +++ b/reactos/base/services/tcpsvcs/skelserver.c @@ -0,0 +1,188 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/skelserver.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ + +#include "tcpsvcs.h" + +extern BOOL bShutDown; +extern BOOL bPause; + +DWORD WINAPI StartServer(LPVOID lpParam) +{ + SOCKET ListeningSocket; + PSERVICES pServices; + TCHAR buf[256]; + + pServices = (PSERVICES)lpParam; + +//DebugBreak(); + ListeningSocket = SetUpListener(htons(pServices->Port)); + if (ListeningSocket == INVALID_SOCKET) + { + LogEvent("Socket error when setting up listener\n", 0, TRUE); + return 3; + } + + _stprintf(buf, _T("%s is waiting for connections on port %d...\n"), + pServices->Name, pServices->Port); + LogEvent(buf, 0, FALSE); + + if (! bShutDown) + AcceptConnections(ListeningSocket, pServices->Service, pServices->Name); + + ExitThread(0); +} + + +SOCKET SetUpListener(USHORT Port) +{ + SOCKET Sock; + SOCKADDR_IN Server; + + Sock = socket(AF_INET, SOCK_STREAM, 0); + if (Sock != INVALID_SOCKET) + { + Server.sin_family = AF_INET; + Server.sin_addr.s_addr = htonl(INADDR_ANY); + Server.sin_port = Port; + if (bind(Sock, (SOCKADDR*)&Server, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) + { + listen(Sock, SOMAXCONN); + return Sock; + } + else + LogEvent(_T("bind() failed\n"), 0, TRUE); + + } + return INVALID_SOCKET; +} + +/* note: consider allowing a maximum number of connections + * A number of threads can be allocated and worker threads will + * only be spawned if a free space is available + +typedef struct _WORKER_THREAD { + DWORD num; + BOOL available; + HANDLE hThread; +} WORKER_THREAD; + +*/ + +VOID AcceptConnections(SOCKET ListeningSocket, + LPTHREAD_START_ROUTINE Service, TCHAR *Name) +{ + SOCKADDR_IN Client; + SOCKET Sock; + HANDLE hThread; + TIMEVAL TimeVal; + FD_SET ReadFDS; + INT nAddrSize = sizeof(Client); + DWORD ThreadID; + TCHAR buf[256]; + INT TimeOut = 2000; // 2 seconds + +//DebugBreak(); + + /* set timeout values */ + TimeVal.tv_sec = TimeOut / 1000; + TimeVal.tv_usec = TimeOut % 1000; + + while (! bShutDown) // (i 0) + { + /* don't call FD_ISSET if bShutDown flag is set */ + if ((! bShutDown) || (FD_ISSET(ListeningSocket, &ReadFDS))) + { + Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize); + if (Sock != INVALID_SOCKET) + { + _stprintf(buf, _T("Accepted connection to %s server from %s:%d\n"), + Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port)); + LogEvent(buf, 0, FALSE); + _stprintf(buf, _T("Creating new thread for %s\n"), Name); + LogEvent(buf, 0, FALSE); + + hThread = CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID); + + /* Check the return value for success. */ + if (hThread == NULL) + { + _stprintf(buf, _T("Failed to start worker thread for " + "the %s server....\n"), Name); + LogEvent(buf, 0, TRUE); + } + + WaitForSingleObject(hThread, INFINITE); + + CloseHandle(hThread); + } + else + { + LogEvent(_T("accept failed\n"), 0, TRUE); + return; + } + } + } + } +} + +BOOL ShutdownConnection(SOCKET Sock, BOOL bRec) +{ + TCHAR buf[256]; + + /* Disallow any further data sends. This will tell the other side + that we want to go away now. If we skip this step, we don't + shut the connection down nicely. */ + if (shutdown(Sock, SD_SEND) == SOCKET_ERROR) + { + LogEvent(_T("Error in shutdown()\n"), 0, TRUE); + return FALSE; + } + + /* Receive any extra data still sitting on the socket. After all + data is received, this call will block until the remote host + acknowledges the TCP control packet sent by the shutdown above. + Then we'll get a 0 back from recv, signalling that the remote + host has closed its side of the connection. */ + if (bRec) + { + char ReadBuffer[BUF]; + int NewBytes = recv(Sock, ReadBuffer, BUF, 0); + if (NewBytes == SOCKET_ERROR) + return FALSE; + else if (NewBytes != 0) + { + _stprintf(buf, _T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes); + LogEvent(buf, 0, FALSE); + } + } + + /* Close the socket. */ + if (closesocket(Sock) == SOCKET_ERROR) + return FALSE; + + return TRUE; +} diff --git a/reactos/base/services/tcpsvcs/tcpsvcs.c b/reactos/base/services/tcpsvcs/tcpsvcs.c new file mode 100644 index 00000000000..809cc05724d --- /dev/null +++ b/reactos/base/services/tcpsvcs/tcpsvcs.c @@ -0,0 +1,281 @@ +/* + * ReactOS Services + * Copyright (C) 2005 ReactOS Team + * + * LICENCE: GPL - See COPYING in the top level directory + * PROJECT: ReactOS simple TCP/IP services + * FILE: apps/utils/net/tcpsvcs/tcpsvcs.c + * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services + * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com) + * REVISIONS: + * GM 04/10/05 Created + * + */ +/* + * TODO: + * - fix bug when terminating chargen server + * - log info in the event logger (when it's implemented) + */ + + +#include "tcpsvcs.h" + +//#define NDEBUG +//#include + + +/* + * globals + */ +VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]); + +static SERVICE_STATUS hServStatus; +static SERVICE_STATUS_HANDLE hSStat; + +FILE *hLogFile; +BOOL bShutDown = FALSE; +BOOL bPause = FALSE; + +LPCTSTR LogFileName = "\\tcpsvcs_log.log"; +LPTSTR ServiceName = _T("Simp Tcp"); +//LPTSTR DisplayName = _T("Simple TCP/IP Services"); + +static SERVICES +Services[NUM_SERVICES] = +{ + {ECHO_PORT, _T("Echo"), EchoHandler}, + {DISCARD_PORT, _T("Discard"), DiscardHandler}, + {DAYTIME_PORT, _T("Daytime"), DaytimeHandler}, + {QOTD_PORT, _T("QOTD"), QotdHandler}, + {CHARGEN_PORT, _T("Chargen"), ChargenHandler} +}; + + +int +main(void) +{ + SERVICE_TABLE_ENTRY ServiceTable[] = + { + {ServiceName, ServiceMain}, + {NULL, NULL} + }; + + //DPRINT("Starting tcpsvcs service. See \system32%s for logs\n", LogFileName); + + if (! StartServiceCtrlDispatcher(ServiceTable)) + LogEvent(_T("failed to start the service control dispatcher\n"), -1, TRUE); + + //DPRINT("Shutdown tcpsvcs service\n"); + + return 0; +} + + +VOID WINAPI +ServiceMain(DWORD argc, LPTSTR argv[]) +{ + TCHAR LogFilePath[MAX_PATH]; + + if(! GetSystemDirectory(LogFilePath, MAX_PATH)) + return; + + _tcscat(LogFilePath, LogFileName); + + hLogFile = fopen(LogFilePath, _T("a+")); + if (hLogFile == NULL) + { + TCHAR buf[50]; + + _stprintf(buf, _T("Could not open log file: %s\n"), LogFilePath); + MessageBox(NULL, buf, NULL, MB_OK); + return; + } + + + LogEvent(_T("Entering ServiceMain\n"), 0, FALSE); + + hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + hServStatus.dwCurrentState = SERVICE_START_PENDING; + hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | + SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; + hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; + hServStatus.dwServiceSpecificExitCode = NO_ERROR; + hServStatus.dwCheckPoint = 0; + hServStatus.dwWaitHint = 2*CS_TIMEOUT; + + hSStat = RegisterServiceCtrlHandler(ServiceName, ServerCtrlHandler); + if (hSStat == 0) + LogEvent(_T("Failed to register service\n"), -1, TRUE); + + LogEvent(_T("Control handler registered successfully\n"), 0, FALSE); + SetServiceStatus (hSStat, &hServStatus); + LogEvent(_T("Service status set to SERVICE_START_PENDING\n"), 0, FALSE); + + if (CreateServers() != 0) + { + hServStatus.dwCurrentState = SERVICE_STOPPED; + hServStatus.dwServiceSpecificExitCode = 1; + SetServiceStatus(hSStat, &hServStatus); + return; + } + + LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status\n"), 0, FALSE); + /* We will only return here when the ServiceSpecific function + completes, indicating system shutdown. */ + UpdateStatus (SERVICE_STOPPED, 0); + LogEvent(_T("Service status set to SERVICE_STOPPED\n"), 0, FALSE); + LogEvent(_T("Leaving ServiceMain\n"), 0, FALSE); + + fclose(hLogFile); + + return; + +} + +VOID WINAPI +ServerCtrlHandler(DWORD Control) +{ + switch (Control) + { + case SERVICE_CONTROL_SHUTDOWN: /* fall through */ + case SERVICE_CONTROL_STOP: + LogEvent(_T("stopping service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bShutDown, TRUE); + UpdateStatus(SERVICE_STOP_PENDING, -1); + break; + case SERVICE_CONTROL_PAUSE: /* not yet implemented */ + LogEvent(_T("pausing service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bPause, TRUE); + break; + case SERVICE_CONTROL_CONTINUE: + LogEvent(_T("continuing service\n"), 0, FALSE); + InterlockedExchange((LONG *)&bPause, FALSE); + break; + case SERVICE_CONTROL_INTERROGATE: + break; + default: + if (Control > 127 && Control < 256) /* user defined */ + break; + } + UpdateStatus(-1, -1); /* increment checkpoint */ + return; +} + + +void UpdateStatus (int NewStatus, int Check) +/* Set a new service status and checkpoint (either specific value or increment) */ +{ + if (Check < 0 ) + hServStatus.dwCheckPoint++; + else + hServStatus.dwCheckPoint = Check; + + if (NewStatus >= 0) + hServStatus.dwCurrentState = NewStatus; + + if (! SetServiceStatus (hSStat, &hServStatus)) + LogEvent(_T("Cannot set service status\n"), -1, TRUE); + + return; +} + +INT +CreateServers() +{ + DWORD dwThreadId[NUM_SERVICES]; + HANDLE hThread[NUM_SERVICES]; + WSADATA wsaData; + TCHAR buf[256]; + INT i; + DWORD RetVal; + + if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) + { + _stprintf(buf, _T("WSAStartup() failed : %lu\n"), RetVal); + LogEvent(buf, RetVal, TRUE); + return -1; + } + + UpdateStatus(-1, -1); /* increment checkpoint */ + + LogEvent(_T("Creating server Threads\n"), 0, FALSE); + + /* Create MAX_THREADS worker threads. */ + for( i=0; i +#include +#include +#include + +#define UNICODE +#define _UNICODE + +/* default port numbers */ +#define ECHO_PORT 7 +#define DISCARD_PORT 9 +#define DAYTIME_PORT 13 +#define QOTD_PORT 17 +#define CHARGEN_PORT 19 + +#define NUM_SERVICES 5 +#define BUF_SIZE 255 +#define BUF 1024 +#define CS_TIMEOUT 1000 + +/* RFC865 states no more than 512 chars per line */ +#define MAX_QUOTE_BUF 512 + +/* printable ASCII's characters for chargen */ +#define START 32 +#define END 126 + +/* number of chars to put on a line */ +#define LINESIZ 74 // 72 + /r and /n + +/* data structure to pass to threads */ +typedef struct _Services { + USHORT Port; + TCHAR *Name; + LPTHREAD_START_ROUTINE Service; +} SERVICES, *PSERVICES; + +/* tcpsvcs functions */ +//static VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]); +VOID WINAPI ServerCtrlHandler(DWORD control); +INT CreateServers(VOID); +VOID LogEvent (LPCTSTR UserMessage, INT ExitCode, BOOL PrintErrorMsg); +void UpdateStatus (int NewStatus, int Check); + + +/* skelserver functions */ +DWORD WINAPI StartServer(LPVOID lpParam); +SOCKET SetUpListener(USHORT Port); +VOID AcceptConnections(SOCKET ListeningSocket, + LPTHREAD_START_ROUTINE Service, TCHAR *Name); +BOOL EchoIncomingPackets(SOCKET sd); +BOOL ShutdownConnection(SOCKET Sock, BOOL bRec); + +/* chargen functions */ +DWORD WINAPI ChargenHandler(VOID* Sock_); +BOOL GenerateChars(SOCKET Sock); +BOOL SendLine(SOCKET Sock, TCHAR* Line); + +/* daytime functions */ +DWORD WINAPI DaytimeHandler(VOID* Sock_); +BOOL SendTime(SOCKET Sock, TCHAR *time); + +/* echo functions */ +DWORD WINAPI EchoHandler(VOID* Sock_); +BOOL EchoIncomingPackets(SOCKET Sock); + +/* discard functions */ +DWORD WINAPI DiscardHandler(VOID* Sock_); +BOOL RecieveIncomingPackets(SOCKET Sock); + +/* qotd functions */ +DWORD WINAPI QotdHandler(VOID* Sock_); +BOOL SendQuote(SOCKET Sock, TCHAR* Quote); diff --git a/reactos/base/services/tcpsvcs/tcpsvcs.rc b/reactos/base/services/tcpsvcs/tcpsvcs.rc new file mode 100644 index 00000000000..b6cc20df66b --- /dev/null +++ b/reactos/base/services/tcpsvcs/tcpsvcs.rc @@ -0,0 +1,7 @@ +#include "resource.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS TCP/IP Services Application\0" +#define REACTOS_STR_INTERNAL_NAME "tcpsvcs\0" +#define REACTOS_STR_ORIGINAL_FILENAME "tcpsvcs.exe\0" +#define REACTOS_STR_ORIGINAL_COPYRIGHT "Ged Murphy (gedmurphy@gmail.com)\0" +#include diff --git a/reactos/base/services/tcpsvcs/tcpsvcs.xml b/reactos/base/services/tcpsvcs/tcpsvcs.xml new file mode 100644 index 00000000000..aeca29ec0e2 --- /dev/null +++ b/reactos/base/services/tcpsvcs/tcpsvcs.xml @@ -0,0 +1,17 @@ + + . + + kernel32 + iphlpapi + ws2_32 + shlwapi + tcpsvcs.c + skelserver.c + echo.c + discard.c + daytime.c + qotd.c + chargen.c + tcpsvcs.rc + tcpsvcs.h + diff --git a/reactos/base/setup/setup/setup.c b/reactos/base/setup/setup/setup.c new file mode 100644 index 00000000000..cf788916990 --- /dev/null +++ b/reactos/base/setup/setup/setup.c @@ -0,0 +1,122 @@ +/* + * ReactOS kernel + * Copyright (C) 2003 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS GUI/console setup + * FILE: subsys/system/setup/setup.c + * PURPOSE: Second stage setup + * PROGRAMMER: Eric Kohl + */ +#define WIN32_NO_STATUS +#include +#include +#include +#include +#include + +#define NDEBUG +#include + + +typedef DWORD (STDCALL *PINSTALL_REACTOS)(HINSTANCE hInstance); + + +/* FUNCTIONS ****************************************************************/ + +LPTSTR lstrchr(LPCTSTR s, TCHAR c) +{ + while (*s) + { + if (*s == c) + return (LPTSTR)s; + s++; + } + + if (c == (TCHAR)0) + return (LPTSTR)s; + + return (LPTSTR)NULL; +} + +static VOID +RunNewSetup (HINSTANCE hInstance) +{ + HMODULE hDll; + PINSTALL_REACTOS InstallReactOS; + + /* some dlls (loaded by syssetup) need a valid user profile */ + InitializeProfiles(); + + hDll = LoadLibrary (TEXT("syssetup")); + if (hDll == NULL) + { + DPRINT("Failed to load 'syssetup'!\n"); + return; + } + + DPRINT("Loaded 'syssetup'!\n"); + InstallReactOS = (PINSTALL_REACTOS)GetProcAddress (hDll, "InstallReactOS"); + + if (InstallReactOS == NULL) + { + DPRINT("Failed to get address for 'InstallReactOS()'!\n"); + FreeLibrary (hDll); + return; + } + + InstallReactOS (hInstance); + + FreeLibrary (hDll); +} + + +int STDCALL +WinMain (HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nShowCmd) +{ + LPTSTR CmdLine; + LPTSTR p; + + CmdLine = GetCommandLine (); + + DPRINT("CmdLine: <%s>\n",CmdLine); + + p = lstrchr (CmdLine, TEXT('-')); + if (p == NULL) + return 0; + + if (!lstrcmpi (p, TEXT("-newsetup"))) + { + RunNewSetup (hInstance); + } + +#if 0 + /* Add new setup types here */ + else if (...) + { + + } +#endif + + return 0; +} + +/* EOF */ diff --git a/reactos/base/setup/setup/setup.rc b/reactos/base/setup/setup/setup.rc new file mode 100644 index 00000000000..23995f168d5 --- /dev/null +++ b/reactos/base/setup/setup/setup.rc @@ -0,0 +1,6 @@ +/* $Id$ */ + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Setup\0" +#define REACTOS_STR_INTERNAL_NAME "setup\0" +#define REACTOS_STR_ORIGINAL_FILENAME "setup.exe\0" +#include diff --git a/reactos/base/setup/setup/setup.xml b/reactos/base/setup/setup/setup.xml new file mode 100644 index 00000000000..fc77f84bb29 --- /dev/null +++ b/reactos/base/setup/setup/setup.xml @@ -0,0 +1,11 @@ + + . + + + + 0x0400 + kernel32 + userenv + setup.c + setup.rc + diff --git a/reactos/base/shell/cmd/De.rc b/reactos/base/shell/cmd/De.rc new file mode 100644 index 00000000000..0b5144d3c46 --- /dev/null +++ b/reactos/base/shell/cmd/De.rc @@ -0,0 +1,646 @@ +#include "windows.h" +#include "resource.h" +/* + * German language file by Klemens Friedl 2005-06-03 + * Update: frik85 2005-06-06 + */ + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Zeigt Dateiattribute an oder aendert sie.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\ + [/S [/D]]\n\n\ + + Setzt ein Attribut\n\ + - Loescht ein Attribut\n\ + R Attribut fuer 'schreibgeschuetzte Datei'\n\ + A Attribut fuer 'zu archivierende Datei'\n\ + S Attribut fuer 'Systemdatei'\n\ + H Attribut fuer 'versteckte Datei'\n\ + /S Verarbeitet uebereinstimmende Dateien im aktuellen Ordner\n\ + und in allen Unterordnern.\n\ + /D Verarbeitet auch die Ordner.\n\n\ +ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an." + +STRING_ALIAS_HELP, "Setzt, loescht oder zeigt Alias.\n\n\ +ALIAS [alias=[command]]\n\n\ + alias Name des Alias.\n\ + command Text welcher fuer den Alias zugeordnet wird.\n\n\ +Listet alle Aliase auf:\n\ + ALIAS\n\n\ +Setzt ein neues oder ueberschreibt ein bestehendes Alias:\n\ + ALIAS da=dir a:\n\n\ +Loescht ein Alias von der Alias-Liste:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP" + +STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\ +CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\ + Parameter Bezeichnet beliebige Angaben in der Befehlszeile, die von\n\ + dem aufgerufenen Batchprogramm benoetigt werden." + + +STRING_CD_HELP, "Wechselt das Verzeichnis oder zeigt dessen Namen an.\n\n\ +CHDIR [Laufwerk:][Pfad]\n\ +CHDIR[..|.]\n\ +CD [Laufwerk:][Pfad]\n\ +CD[..|.]\n\n\ + .. uebergeordnetes Verzeichnis\n\ + . vorhergehende Verzeichnis\n\n\ +Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\ +Laufwerk anzuzeigen.\n\ +Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt." + + +STRING_CHCP_HELP, "Zeigt die aktuelle Codepage oder wechselt sie.\n\n\ +CHCP [nnn]\n\n\ + nnn Codepage angeben.\n\n\ +Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an." + + +STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option waehlen muss.\n\n\ +CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]choices Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\ + /N Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\ + /S Gross- und Kleinschreibung wird beachtet.\n\ + /T[:]c,nn Standard-Auswahl wird auf c gesetzt nach nn Secunden.\n\ + text Zeigt eine Beschreibung an.\n\n\ +ERRORLEVEL wird auf den offset der Taste welche der Benutzer gedrueckt hat gesetzt." + +STRING_CLS_HELP, "Loescht den Bildschirminhalt.\n\nCLS" + +STRING_CMD_HELP1, "\nIntere Befehle verfuegbar:\n" + +STRING_CMD_HELP2, "\nVerfuegbare Features:" + +STRING_CMD_HELP3," [aliases]" + +STRING_CMD_HELP4," [history]" + +STRING_CMD_HELP5," [unix filename completion]" + +STRING_CMD_HELP6," [directory stack]" + +STRING_CMD_HELP7," [redirections and piping]" + +STRING_CMD_HELP8, "Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\n\ +CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ + /C command Fuehrt den Befehl in der Zeichenfolge aus und schliesst sich.\n\ + /K command Fuehrt den Befehl in der Zeichenfolge aus und laeuft weiter.\n\ + /P CMD wird permanent und fuehrt autoexec.bat aus\n\ + (kann nicht beendet werden).\n\ + /T:bf Setzt die Hintergrund-/Vordergrund-Farbe (siehe COLOR Befehl)." + + +STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben fuer die Konsole fest.\n\n\ +COLOR [attr [/F]] \n\n\ + attr Gibt die Farbattribute fuer die Konsolenausgabe an.\n\ + /F fuellte die Konsoleausgabe mit dem Farbattribut\n\n\ +Es gibt 3 Moeglickeiten die Farbe festzulegen:\n\ +1) [bright] name on [bright] name (Nur die 4 ersten Buchstaben sind noetig)\n\ +2) decimal on decimal\n\ +3) two hex digits\n\n\ +Farben:\n\ +dec hex name dec hex name\n\ +0 0 Black 8 8 Gray (Bright black)\n\ +1 1 Blue 9 9 Bright Blue\n\ +2 2 Green 10 A Bright Green\n\ +3 3 Cyan 11 B Bright Cyan\n\ +4 4 Red 12 C Bright Red\n\ +5 5 Magenta 13 D Bright Magenta\n\ +6 6 Yellow 14 E Bright Yellow\n\ +7 7 White 15 F Bright White" + +STRING_COPY_HELP1, " %s ueberschreiben (Ja/Nein/Alle)? " + +STRING_COPY_HELP2, "Kopiert eine oder mehrere Dateien an eine andere Position.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\ + [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\ + source Bezeichnet die zu kopierende(n) Datei(en).\n\ + /A Weist auf eine ASCII-Textdatei hin.\n\ + /B Weist auf eine Binaerdatei hin.\n\ + destination Bezeichnet das Verzeichnis und/oder Dateinamen der neuen Datei(en).\n\ + /V Ueberprueft, ob die Dateien richtig geschrieben wurden.\n\ + /Y Unterdrueckt die Bestaetigungsaufforderung beim Ueberschreiben\n\ + vorhandener Zieldateien.\n\ + /-Y Fordert beim Ueberschreiben vorhandener Zieldateien zum\n\ + Bestaetigen auf.\n\n\ +Die Option /Y ist moeglicherweise in der Umgebungsvariablen COPYCMD.\n\ +..." + + +STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nGeben Sie das neue Datum ein (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nGeben Sie das neue Datum ein (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Andert das eingestellte Datum oder zeigt es an.\n\n\ +DATE [/T][date]\n\n\ + /T nur Datum anzeigen\n\n\ +Der Befehl DATE ohne Parameter zeigt das aktuelle Datum an und fragt nach\n\ +einem neuen. Druecken Sie die EINGABETASTE, um das bisherige Datum zu behalten." + +STRING_DEL_HELP1, "Loescht eine oder mehrere Dateien.\n\n\ +DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ +DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ +ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\ + file Geben Sie die Dateinamen an welche Sie loeschen moechten\n\n\ + /N Nichts.\n\ + /P Fordert Sie vor dem Loeschen jeder Datei zur Bestaetigung auf.\n\ + /T Zeigt die Anzahl der geloeschten Dateien und deren vorher belegter Speicherplatzbedarf an.\n\ + /Q Beenden.\n\ + /W Sicheres Loeschen. Dateien werden mit Zufallszahlen ueberschrieben bevor sie geloescht werden.\n\ + /Y Loescht alles (*.*) ohne Vorwarnung.\n\ + /Z Loescht versteckte, mit nur leserechten und Systemdateien.\n" + +STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden geloescht!\nSind Sie sicher (Y/N)?" +STRING_DEL_HELP3, " %lu Datei(en) geloescht\n" +STRING_DEL_HELP4, " %lu Datei(en) geloescht\n" + +STRING_DELAY_HELP, "Pause fuer n Sekunden oder Millisekunden\n\ +DELAY [/m]n\n\n\ + /m Millisekunden ansonsten Sekunden\n" + +STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\ +DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ + [Laufwerk:][path][Dateiname]\n\ + Bezeichnet Laufwerk, Verzeichnis und/oder Dateien.\n\n\ + /A Listet Dateien mit angegebenen Attributen auf.\n\ + attributes D Verzeichnisse R Schreibgeschuetzte Dateien\n\ + H Versteckte Dateien A Zu archivierende Dateien\n\ + S Systemdateien - vorangestellt kehrt die Bedeutung um\n\ + /B Einfaches Format (keine Kopfdaten, keine Zusammenfassung).\n\ + /C Zeigt das Tausendertrennzeichen bei Dateigroessen an (Standard-\n\ + einstellung). Verwenden Sie /-C, um das Tausendertrennzeichen\n\ + nicht anzuzeigen.\n\ + /D Gleich wie Breitformat, jedoch nach Spalten sortiert.\n\ + /L Verwendet Kleinschreibung.\n\ + /N Neues, langes Listenformat (Dateinamen auf der rechten Seite).\n\ + /O Gibt die Liste sortiert aus.\n\ + sortorder N Name (alphabetisch) S Groesse (kleinere zuerst)\n\ + E Erweiterung (alphabetisch) D Datum/Zeit (aeltere zuerst)\n\ + G Verzeichnisse zuerst - vorangestellt kehrt die\n\ + /P Pausiert nach jeder vollen Bildschirmseite.\n\ + /Q Gibt den Besitzer der Datei aus.\n\ + /S Listet Dateien und alle Unterverzeichnisse auf.\n\ + /T Bestimmt welche Zeit verwendet wird.\n\ + timefield C Erstellung\n\ + A Letzter Zugriff\n\ + W Letzter Schreibzugriff\n\ + /W Verwendet Breitformat fuer die Auflistung.\n\ + /X Zeigt die Kurznamen fuer Dateien mit Nicht-8Punkt3-Namen an.\n\ + Das Format ist das gleiche wie bei /N, wobei der Kurzname vor\n\ + dem Langnamen eingefuegt wird. Wenn kein Kurzname vorhanden ist,\n\ + werden Leerzeichen angezeigt.\n\ + /4 Zeigt das Jahr vierstellig an.\n\n\ +Optionen koennen in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\ +""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W." + + + +STRING_DIR_HELP2, " Datentraeger in Laufwerk %c ist %s\n" +STRING_DIR_HELP3, " Datentraeger in Laufwerk %c hat keinen Namen\n" +STRING_DIR_HELP4, " Datentraeger-Seriennummer ist %04X-%04X\n" +STRING_DIR_HELP5, "\n Gelistete Dateien:\n%16i Datei(en)% 14s bytes\n" +STRING_DIR_HELP6, "%16i Verzeichnis(se)% 15s bytes\n" +STRING_DIR_HELP7, "\n Verzeichnisse %s\n\n" +STRING_DIR_HELP8, "%16i Datei(en)% 14s bytes\n" + +STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis fuer den POPD Befehl, und\n\ +wechselt dann zu den festgelegten Verzeichnis.\n\n\ +PUSHD [path | ..]\n\n\ + path Legt den Verzeichnis fest su dem gewechselt werden soll" + +STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer" + +STRING_ECHO_HELP1, "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\ + ECHOERR Nachricht\n\ + ECHOERR. gibt eine Leerzeile aus" + +STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\ + ECHOSERR Nachricht" + +STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\ + ECHO [ON | OFF]\n\ + ECHO [Nachricht]\n\ + ECHO. gibt eine Leerzeile aus\n\n\ +ECHO ohne Parameter zeigt die aktuelle Einstellung der Befehlsanzeige an." + +STRING_ECHO_HELP5, "ECHO ist %s\n" + +STRING_EXIT_HELP, "Beendet den Befehlsinterpreter CMD.EXE oder die aktuelle Batchdatei.\n\nEXIT" + +STRING_FOR_HELP1, "Fuehrt einen Befehl fuer jede einzelne Datei fuer einen Satz von Dateien aus.\n\n\ +FOR %Variable IN (Satz) DO Befehl [Parameter]\n\n\ + %variable Ein ersetzbarer Parameter bestehend aus einem einzelnen\n\ + Buchstaben.\n\ + (Satz) Ein Satz von mindestens einer Datei. Platzhalter sind zulaessig.\n\ + Befehl Befehl, der fuer jede Datei ausgefuehrt werden soll.\n\ + Parameter Parameter und Optionen fuer den angegebenen Befehl.\n\n\ +Um den FOR-Befehl in einem Batchprogramm zu verwenden, geben Sie %%Variable\n\ +statt %Variable an." + +STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\ + Volume-Seriennummer: %s\n\ + %16s bytes Speicherkapazitaet\n\ + %16s bytes belegter Speicher\n\ + %16s bytes freier Speicher\n" + +STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]" + +STRING_IF_HELP1, "Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\n\ + IF [NOT] ERRORLEVEL Nummer Befehl\n\ + IF [NOT] variable1==variable2 Befehl\n\ + IF [NOT] EXIST Dateiname Befehl\n\ + IF [NOT] DEFINED variable Befehl\n\n\ +NOT Befehl wird nur dann ausgefuehrt, wenn die Bedingung nicht\n\ + erfuellt wird\n\ +ERRORLEVEL number Bedingung ist erfuellt, wenn das zuletzt ausgefuehrte\n\ + Programm einen Code groesser oder gleich der Nummer zurueckgibt.\n\ +command Gibt den Befehl an, der bei erfuellter Bedingung ausgefuehrt\n\ + werden soll.\n\ +variable1==variable2\n\ + Bedingung ist erfuellt, falls die Zeichenfolgen gleich sind.\n\ +EXIST Dateiname Bedingung ist erfuellt, wenn die angegebene Datei existiert.\n\ +DEFINED variable Bedingung ist erfuellt, wenn die angegebene Datei definiert\n\ + wurde." + +STRING_GOTO_HELP1, "Setzt die Ausfuehrung eines Batchprogramms an einer Marke fort.\n\n\ +GOTO Marke\n\n\ + Marke Definiert eine Zeichenfolge als Marke in einem Batchprogramm.\n\n\ +Marken stehen am Zeilenanfang mit einem vorangestellten Doppelpunkt." + +STRING_LABEL_HELP1, "Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\nLABEL [Laufwerk:][label]" + +STRING_LABEL_HELP2, "Datentraeger im Laufwerk %c: ist %s\n" +STRING_LABEL_HELP3, "Datentraeger im Laufwerk %c: hat keine Bezeichnung\n" +STRING_LABEL_HELP4, "Datentraeger-Seriennummer: %04X-%04X\n" +STRING_LABEL_HELP5, "Laufwerkbezeichnung (max. 11 Zeichen, ENTER fuer keine)? " + +STRING_LOCALE_HELP1, "Aktuelle Zeit: " + +STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\ +MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad" + +STRING_MEMMORY_HELP1, "Zeigt die groesse des Systemspeicher an.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\ + %13s bytes RAM (insgesamt)\n\ + %13s bytes verfuegbarer RAM\n\n\ + %13s bytes Auslagerungsdatei (insgesamt)\n\ + %13s bytes verfuegbare Auslagerungsdatei\n\n\ + %13s bytes Virtueller Speicher (insgesamt)\n\ + %13s bytes verfuegbarer Virtueller Speicher\n" + +STRING_MISC_HELP1, "Druecken Sie eine beliebige Taste . . .\n" + +STRING_MOVE_HELP1, "Ueberschreiben %s (Ja/Nein/Alle)? " + +STRING_MOVE_HELP2, "Verschiebt Dateien und benennt Dateien und Verzeichnisse um.\n\n\ +Um eine oder mehrere Dateien zu verschieben:\n\ +MOVE [/N][Laufwerk:][Pfad]Dateiname1[,...] Ziel\n\n\ +Um ein Verzeichnis umzubenennen:\n\ +MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\ + [Laufwerk:][Pfad]Datei1 Bezeichnet den Pfad und den Namen der zu\n\ + verschiebenden Datei(en).\n\ + /N Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\ +Derzeitige Einschraenkung:\n\ +Es ist noch nicht moeglich Objekte ueber die Laufwerksgrenzen hinaus zu verschieben.\n" + +STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\ +MSGBOX type ['title'] prompt\n\n\ +type Button anzeigen\n\ + moegliche Werte sind: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +title Titel des Fensters\n\ +prompt Text der in dem Fenster angezeigt wird\n\n\n\ +ERRORLEVEL is set according the button pressed:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\n\ +PATH [[Laufwerk:]Pfad[;...]]\nPATH ;\n\n\ + PATH ; Loescht den Suchpfad und laesst CMD.EXE nur in dem aktuellen\n\ + Verzeichnis suchen.\n\ + PATH Ohne Parameter zeigt den aktuellen Pfad an.\n" + +STRING_PROMPT_HELP1, "Aendert die Eingabeaufforderung.\n\n\ +PROMPT [Text]\n\n\ + Text Bezeichnet die neue Eingabeaufforderung.\n\n\ +Sie kann aus normalen Zeichen und folgenden Sonderzeichen bestehen:\n\n\ + $A & (Kaufmaennisches Und)\n\ + $B | (Verkettungszeichen oder pipe)\n\ + $C ( (Klammer auf)\n\ + $D Aktuelles Datum\n\ + $E Escapezeichen (ASCII-Code 27)\n\ + $F ) (Klammer zu)\n\ + $G > (Groesser-als-Zeichen)\n\ + $H Rueckschritt (loescht vorangehendes Zeichen)\n\ + $L < (Kleiner-als-Zeichen)\n\ + $N Aktuelles Laufwerk\n\ + $P Aktuelles Laufwerk und Pfad\n\ + $Q = (Gleichheitszeichen)\n\ + $T Aktuelle Zeit\n\ + $V Betriebssystem-Versionsnummer\n\ + $_ Carriage return and linefeed\n\ + $$ $ (Dollarzeichen)" + +STRING_PAUSE_HELP1, "Haelt die Ausfuehrung einer Batchdatei an und zeigt folgende Meldung oder eine benutzerdefinierte Nachricht an:\n\ +'Druecken Sie eine beliebige Taste . . .'.\n\n\ +PAUSE [message]" + +STRING_PROMPT_HELP2, " $+ Zeigt die aktuelle Tiefe des Verzeichnis-Stacks an" + +STRING_PROMPT_HELP3, "\n 'PROMPT' setzt die Prompt auf die Standardwerte zurueck." + +STRING_REM_HELP, "Leitet Kommentare in einer Batchdatei ein.\n\nREM [Kommentar]" + +STRING_RMDIR_HELP, "Loescht ein Verzeichnis.\n\n\ +RMDIR [Laufwerk:]Pfad\nRD [Laufwerk:]Pfad" + +STRING_REN_HELP1, "Benennt Datei(en)/Verzeichnis(se) um.\n\n\ +RENAME [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\ +REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\ + /E keine Fehlermeldung.\n\ + /N Nichts.\n\ + /P Wartet vor jedem Umbennen-Vorgang auf eine Benutzereingabe\n\ + (Noch nicht implementiert!)\n\ + /Q Beenden.\n\ + /S benennt Unterverzeichnisse um.\n\ + /T Zeigt die Anzahl der umbenannten Dateien an.\n\n\ +Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n" + +STRING_REN_HELP2, " %lu Datei umbennant\n" + +STRING_REN_HELP3, " %lu Dateien umbennant\n" + +STRING_SHIFT_HELP, "Veraendert die Position ersetzbarer Parameter in einem Batchprogramm.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "Bewegt den Cursor und optional die Ausgabe\n\n\ +SCREEN Reihe Spalte [Text]\n\n\ + Reihe Reihe wohin der Curser bewegt werden soll\n\ + Spalte Spalte wohin der Curser bewegt werden soll" + +STRING_SET_HELP, "Setzt oder loescht Umgebungsvariablen fuer CMD.EXE, oder zeigt sie an.\n\n\ +SET [variable[=][Zeichenfolge]]\n\n\ + Variable Bezeichnet den Namen der Umgebungsvariablen.\n\ + Zeichenfolge Eine Zeichenfolge, die der Variable zugewiesen werden soll.\n\n\ +Der Befehl SET ohne Parameter zeigt die aktuellen Umgebungsvariablen an.\n" + +STRING_START_HELP1, "Startet einen Befehl.\n\n\ +START Befehl\n\n\ + Befehl Befehl welcher ausgefuehrt werden soll\n\n\ +Achtung: Derzeit werden alle Befehle asynchron ausgefuehrt.\n" + +STRING_TITLE_HELP, "Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\n\ +TITLE [string]\n\n\ + Zeichenfolge Bezeichnet den Titel des Eingabeaufforderungsfensters." + +STRING_TIME_HELP1, "Stellt die Systemzeit oder zeigt sie an.\n\n\ +TIME [/T][Zeit]\n\n\ + /T nur anzeigen\n\n\ +TIME ohne Parameter zeigt die aktuelle Systemzeit an und fragt nach der neuen\n\ +Uhrzeit. Druecken Sie die EINGABETASTE, um die bisherige Zeit beizubehalten." + +STRING_TIME_HELP2, "Geben Sie eine neue Zeit ein: " + +STRING_TIMER_HELP1, "Verstrichene %d Millisekunden\n" + +STRING_TIMER_HELP2, "Verstrichene %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Erlaubt die Benutzung von 10 Stopuhren.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON schaltet die Stopuhr ein\n\ + OFF schaltet die Stopuhr aus\n\ + /S Split time. Return stopwatch split\n\ + time without changing its value\n\ + /n Anzahl der Stopuhren\n\ + gueltige Stopuhren sind 0 bis 9\n\ + Standardwert = 1\n\ + /Fn Ausgabeformatierung\n\ + n kann 0 oder 1 sein:\n\ + 0 Millisekunden\n\ + 1 hh%cmm%css%cdd\n\n\ +Falls nicht ON, OFF oder /S angegeben wurde wird\n\ +die Stopuhr ausgeschalten.\n\n" + +STRING_TYPE_HELP1, "Zeigt den Inhalt einer oder mehrerer Textdateien an.\n\n\ +TYPE [Laufwerk:][Pfad]Dateiname" + +STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ +Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den Datentraeger\n\ +geschrieben werden.\n\n\ +VERIFY [ON | OFF]\n\n\ +Der Befehl VERIFY ohne Parameter zeigt die aktuelle Einstellung von VERIFY an." + +STRING_VERIFY_HELP2, "VERIFY ist %s.\n" + +STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein" + +STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\ +VER [/C][/R][/W]\n\n\ + /C Zeigt die Credits an.\n\ + /R Zeigt die Redistribution Information an.\n\ + /W Zeigt die Garantieerklaerung an." + +STRING_VERSION_HELP2, " kommt mit absolut keiner Garantie; fuer naehere\n\ + Informationen darueber tippen Sie: `ver /w'. Das ist eine freie Software,\n\ + und Sie sind koennen die Software unter bestimmten Bedingungen weiter\n\ + vertreiben; tippen Sie `ver /r' fuer naehere Informationen darueber.\n\ + Tippen Sie `ver /c' um die Mitwirkenden (Credits) aufzulisten." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version." + +STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an .\n\ +Updates sind auf der offiziellen ReactOS-Seite verfuegbar:\n\ +http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n" + +STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n" + +STRING_VOL_HELP1, " Datentraeger im Laufwerk %c: ist %s" +STRING_VOL_HELP2, " Datentraeger im Laufwerk %c: hat keine Bezeichnung" +STRING_VOL_HELP3, " Datentraeger-Seriennummer: %04X-%04X\n" +STRING_VOL_HELP4, "Zeigt die Laufwerksvolumebezeichnung und die Seriennummer an, falls diese existieren.\n\nVOL [drive:]" + +STRING_WINDOW_HELP1, "change console window aspect\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS Gibt Position und Gre des Fenster an\n\ +MIN minimieren das Fenster\n\ +MAX maximieren das Fenster\n\ +RESTORE stellt das Fenster wieder her" + +STRING_WINDOW_HELP2, "change console window aspect\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window tile of window on wich perform actions\n\ +/POS specify window placement and dimensions\n\ +MIN minimieren das Fenster\n\ +MAX maximieren das Fenster\n\ +RESTORE stellt das Fenster wieder her\n\ +title neuer Titel" + + +STRING_HELP1, "Uebersicht aller verfuegbaren Befehle und deren Kurzbeschreibung\n\n\ + Befehl /? Um naehere Informationen zu einem bestimmten Befehl\n\ + zu erhalten.\n\n\ +? Listet alle Befehle auf (ohne Erklarung).\n\ +ALIAS Setzt, loescht oder zeigt den Alias.\n\ +ATTRIB Zeigt Dateiattribute an bzw. aendert sie.\n\ +BEEP Gibt einen beep-Ton durch den PC-Speaker aus.\n\ +CALL Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\ +CD Zeigt den Namen des aktuellen Verzeichnisses an bzw. aendert diesen.\n\ +CHCP Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\ +CHOICE Wartet auf den Benutzer, welcher aus einer Auswahl eine Option\n\ + waehlen muss.\n\ +CLS Loescht den Bildschirminhalt.\n\ +CMD Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\ +COLOR Legt die Hintergrund- und Vordergrundfarben fuer die Konsole fest.\n\ +COPY Kopiert eine oder mehrere Dateien an eine andere Stelle.\n\ +DATE Zeigt das Datum an bzw. legt dieses fest.\n\ +DELETE Loescht eine oder mehrere Dateien.\n\ +DIR Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\ +ECHO Zeigt Meldungen an bzw. schaltet die Befehlsanzeige ein oder aus.\n\ +ERASE Loescht eine oder mehrere Dateien.\n\ +EXIT Beendet das Programm CMD.EXE (Befehlsinterpreter).\n\ +FOR Fuehrt einen angegebenen Befehl fuer jede Datei in einem Dateiensatz\n\ + aus.\n\ +FREE Zeigt den (freien) Speicherplatz an.\n\ +GOTO Setzt den ReactOS-Befehlsinterpreter auf eine markierte Zeile in\n\ + einem Batchprogramm.\n\ +HELP Zeigt Hilfeinformationen zu ReactOS-Befehlen an.\n\ +HISTORY Listet alle Befehle auf welche sich im Speicher befinden.\n\ +IF Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\ +LABEL Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\ +MD Erstellt ein Verzeichnis\n\ +MKDIR Erstellt ein Verzeichnis.\n\ +MOVE Verschiebt ein oder mehrere Dateien von einem Verzeichnis in\n\ + ein anderes.\n\ +PATH Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\ +PAUSE Haelt die Ausfuehrung einer Batchdatei an und zeigt eine Meldung an.\n\ +POPD Wechselt zu dem Verzeichnis, das durch PUSHD gespeichert wurde.\n\ +PROMPT Aendert die Eingabeaufforderung.\n\ +PUSHD Speichert das aktuelle Verzeichnis, und wechselt dann zu einem\n\ + anderen Verzeichnis.\n\ +RD Entfernt ein Verzeichnis.\n\ +REM Leitet Kommentare in einer Batchdatei.\n\ +REN Benennt eine Datei bzw. Dateien um.\n\ +RENAME Bennent eine Datei bzw. Dateien um.\n\ +RMDIR Loescht ein Verzeichnis.\n\ +SCREEN Bewegt den Cursor und optional die Ausgabe.\n\ +SET Setzt oder loescht die Umgebungsvariablen bzw. zeigt sie an.\n\ +SHIFT Veraendert die Position ersetzbarer Parameter in Batchdateien.\n" +STRING_HELP2, "START Startet ein eigenes Fenster, um ein bestimmtes Programm oder einen\n\ + Befehl auszufuehren.\n\ +TIME Zeigt die Systemzeit an bzw. legt sie fest.\n\ +TIMER Erlaubt die Benutzung von bis zu 10 Stopuhren\n\ +TITLE Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\ +TYPE Zeigt den Inhalt einer Textdatei an.\n\ +VER Zeigt die ReactOS-Version an.\n\ +VERIFY Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den\n\ + Datentraeger geschrieben werden.\n\ +VOL Zeigt die Datentraegervolumebezeichnung und die Seriennummer an.\n" + + +STRING_CHOICE_OPTION, "JN" +STRING_COPY_OPTION, "JNA" + + +STRING_ALIAS_ERROR, "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n" +STRING_BATCH_ERROR, "Es trat ein Fehler auf, waehrend die batch-Datei geoeffnet wurde.\n" +STRING_CHCP_ERROR1, "Aktive Code-Page: %u\n" +STRING_CHCP_ERROR4, "ungueltige Code-Page\n" +STRING_CHOICE_ERROR, "Ungueltige Option. Erwartetes Format: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Ungueltige Option. Erwartetes Format: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Ungueltige Option: %s" +STRING_MD_ERROR, "Unterverzeichnis oder Datei existiert bereits.\n" +STRING_CMD_ERROR1, "Die Eingaben konnten nicht umgeleitet werden (von der Datei) %s\n" +STRING_CMD_ERROR2, "Ein Fehler ist beim Erstellen der temponaeren Date fr Pipedaten aufgetreten\n" +STRING_CMD_ERROR3, "%s kann nicht in die Datei umgeleitet werden \n" +STRING_CMD_ERROR4, "Running %s...\n" +STRING_CMD_ERROR5, "Running cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Fehler: Hinter- und Vordergrund koennen nicht die selben Farben haben!" +STRING_COLOR_ERROR2, "Fehler in der Farb-Angabe" +STRING_COLOR_ERROR3, "Farbe %x\n" +STRING_COLOR_ERROR4, "Fehler: Die selben Farben!" +STRING_CONSOLE_ERROR, "Unbekannter Fehler: %d\n" +STRING_COPY_ERROR1, "Fehler: Quelle kann nicht geoeffnet werden - %s!\n" +STRING_COPY_ERROR2, "Fehler: Kann nicht ueber sich selbst kopiert werden.\n" +STRING_COPY_ERROR3, "Fehler Schreibziel!\n" +STRING_COPY_ERROR4, "Fehler: Noch nicht implementiert!\n" +STRING_DATE_ERROR, "Ungueltiges Datum." +STRING_DEL_ERROR5, "Die Datei %s wird geloescht! " +STRING_DEL_ERROR6, "Sind Sie sicher (J/N)?" +STRING_DEL_ERROR7, "Loeschen: %s\n" +STRING_ERROR_ERROR1, "Unbekannter Fehler! Fehlernummer: 0x%lx\n" +STRING_ERROR_ERROR2, "Syntax-Fehler" +STRING_FOR_ERROR1, "'in' fehlt fuer ein statement." +STRING_FOR_ERROR2, "Klammern nicht gefunden." +STRING_FOR_ERROR3, "'do' fehlt." +STRING_FOR_ERROR4, "kein Befehl nach 'do'." +STRING_FREE_ERROR1, "Ungueltiges Laufwerk" +STRING_FREE_ERROR2, "keine Bezeichnung" +STRING_GOTO_ERROR1, "Keine Sprungmarke fuer GOTO gesetzt" +STRING_GOTO_ERROR2, "Sprungmarke '%s' wurde nicht gefunden\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[FEHLER]\n" + +STRING_REN_ERROR1, "MoveFile() ist fehlgeschlagen. Fehler: %lu\n" + +STRING_START_ERROR1, "No batch support at the moment!" + +STRING_TIME_ERROR1, "Ungueltige Zeit." + +STRING_TYPE_ERROR1, "Ungueltige Option '/%s'\n" + +STRING_WINDOW_ERROR1, "Fenster nicht gefunden" + + +STRING_ERROR_PARAMETERF_ERROR, "Parameterformat ist nicht korrect - %c\n" +STRING_ERROR_INVALID_SWITCH, "Ungueltiger Parameter - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Zu viele Parameters - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Pfad wurde nicht gefunden\n" +STRING_ERROR_FILE_NOT_FOUND, "Datei wurde nicht gefunden\n" +STRING_ERROR_REQ_PARAM_MISSING, "Benoetigter Parameter fehlt\n" +STRING_ERROR_INVALID_DRIVE, "Ungueltige Laufwerksangaben\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Ungueltiges Parameterformat - %s\n" +STRING_ERROR_BADCOMMAND, "Ungueltiger Befehl oder Dateiname\n" +STRING_ERROR_OUT_OF_MEMORY, "Fehler: Zu wenig Speicher verfuegbar.\n" +STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n" +STRING_ERROR_D_PAUSEMSG, "Druecken Sie eine beliebige Taste . . ." +STRING_ERROR_DRIVER_NOT_READY, "Laufwerk ist nicht bereit" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Befehlszeilen Interpreter" +STRING_VERSION_RUNVER, " laeuft in %s" +STRING_COPY_FILE , " %d Datei(en) kopiert\n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, "ungueltige Variablenangabe." +STRING_SCREEN_COL, "ungueltige Spalten-Angabe" +STRING_SCREEN_ROW, "ungueltige Zeilen-Angabe" +STRING_TIMER_TIME "Timer %d ist %s: " +} diff --git a/reactos/base/shell/cmd/En.rc b/reactos/base/shell/cmd/En.rc new file mode 100644 index 00000000000..ff9141f6149 --- /dev/null +++ b/reactos/base/shell/cmd/En.rc @@ -0,0 +1,650 @@ +#include "windows.h" +#include "resource.h" +/* + * Moved all hardcoded strings to En.rc. + * By Magnus Olsen 2005 + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Displays or changes file attributes.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\ + [/S [/D]]\n\n\ + + Sets an attribute\n\ + - Clears an attribute\n\ + R Read-only file attribute\n\ + A Archive file attribute\n\ + S System file attribute\n\ + H Hidden file attribute\n\ + /S Processes matching files in the current directory\n\ + and all subdirectories\n\ + /D Processes directories as well\n\n\ +Type ATTRIB without a parameter to display the attributes of all files.\n" + +STRING_ALIAS_HELP, "Sets, removes or shows aliases.\n\n\ +ALIAS [alias=[command]]\n\n\ + alias Name for an alias.\n\ + command Text to be substituted for an alias.\n\n\ +To list all aliases:\n\ + ALIAS\n\n\ +To set a new or replace an existing alias:\n\ + ALIAS da=dir a:\n\n\ +To remove an alias from the alias list:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Beep the speaker.\n\nBEEP\n" + +STRING_CALL_HELP, "Calls one batch program from another.\n\n\ +CALL [drive:][path]filename [batch-parameter]\n\n\ + batch-parameter Specifies any command-line information required by the\n\ + batch program." + +STRING_CD_HELP, "Changes the current directory or displays it's name\n\n\ +CHDIR [/D][drive:][path]\n\ +CHDIR[..|.]\n\ +CD [/D][drive:][path]\n\ +CD[..|.]\n\n\ + .. parent directory\n\ + . current directory\n\ + /D Will change current drive and current directory.\n\n\ +Type CD drive: to display the current directory on the specified drive.\n\ +Type CD without a parameter to display the current drive and directory.\n" + +STRING_CHCP_HELP, "Displays or sets the active code page number.\n\n\ +CHCP [nnn]\n\n\ + nnn Specifies the active code page number.\n\n\ +Type CHCP without a parameter to display the active code page number.\n" + +STRING_CHOICE_HELP, "Waits for the user to choose one of a set of choices.\n\n\ +CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]choices Specifies allowable keys. Default is YN.\n\ + /N Do not display choices and ? at the end of the prompt string.\n\ + /S Treat choice keys as case sensitive.\n\ + /T[:]c,nn Default choice to c after nn seconds.\n\ + text Prompt string to display.\n\n\ +ERRORLEVEL is set to offset of key user presses in choices.\n" + +STRING_CLS_HELP, "Clears the screen.\n\nCLS\n" + +STRING_CMD_HELP1, "\nInternal commands available:\n" + +STRING_CMD_HELP2, "\nFeatures available:" + +STRING_CMD_HELP3," [aliases]" + +STRING_CMD_HELP4," [history]" + +STRING_CMD_HELP5," [unix filename completion]" + +STRING_CMD_HELP6," [directory stack]" + +STRING_CMD_HELP7," [redirections and piping]" + +STRING_CMD_HELP8, "Starts a new instance of the ReactOS command line interpreter.\n\n\ +CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ + /C command Runs the specified command and terminates.\n\ + /K command Runs the specified command and remains.\n\ + /P CMD becomes permanent and runs autoexec.bat\n\ + (cannot be terminated).\n\ + /T:bf Sets the background/foreground color (see COLOR command).\n" + +STRING_COLOR_HELP1, "Sets the default foreground and background colors.\n\n\ +COLOR [attr [/-F]] \n\n\ + attr Specifies color attribute of console output\n\ + /-F Does not fill the console blank space with color attribute\n\n\ +There are three ways to specify the colors:\n\ +1) [bright] name on [bright] name (only the first three letters are required)\n\ +2) decimal on decimal\n\ +3) two hex digits\n\n\ +Colors are:\n\ +dec hex name dec hex name\n\ +0 0 Black 8 8 Gray(Bright black)\n\ +1 1 Blue 9 9 Bright Blue\n\ +2 2 Green 10 A Bright Green\n\ +3 3 Cyan 11 B Bright Cyan\n\ +4 4 Red 12 C Bright Red\n\ +5 5 Magenta 13 D Bright Magenta\n\ +6 6 Yellow 14 E Bright Yellow\n\ +7 7 White 15 F Bright White\n" + +STRING_COPY_HELP1, "Overwrite %s (Yes/No/All)? " + +STRING_COPY_HELP2, "Copies one or more files to another location.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\ + [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\ + source Specifies the file or files to be copied.\n\ + /A Indicates an ASCII text file.\n\ + /B Indicates a binary file.\n\ + destination Specifies the directory and/or filename for the new file(s).\n\ + /V Verifies that new files are written correctly.\n\ + /Y Suppresses prompting to confirm you want to overwrite an\n\ + existing destination file.\n\ + /-Y Causes prompting to confirm you want to overwrite an\n\ + existing destination file.\n\n\ +The switch /Y may be present in the COPYCMD environment variable.\n\ +...\n" + +STRING_DATE_HELP1, "\nEnter new date (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nEnter new date (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nEnter new date (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Displays or sets the date.\n\n\ +DATE [/T][date]\n\n\ + /T display only\n\n\ +Type DATE without parameters to display the current date setting and\n\ +a prompt for a new one. Press ENTER to keep the same date.\n" + +STRING_DEL_HELP1, "Deletes one or more files.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\n\ + file Specifies the file(s) to delete.\n\n\ + /N Nothing.\n\ + /P Prompt. Ask before deleting each file.\n\ + /T Total. Display total number of deleted files and freed disk space.\n\ + /Q Quiet.\n\ + /W Wipe. Overwrite the file with random numbers before deleting it.\n\ + /Y Yes. Kill even *.* without asking.\n\ + /F Force Delete hidden, read-only and system files.\n\ + /S Delete file from all sub directory\n\ + /A Select files to be deleted based on attributes.\n\ + attributes\n\ + R Read Only files\n\ + S System files\n\ + A Archiveable files\n\ + H Hidden Files\n\ + - prefix meaning not\n" + +STRING_DEL_HELP2, "All files in the directory will be deleted!\nAre you sure (Y/N)?" +STRING_DEL_HELP3, " %lu file deleted\n" +STRING_DEL_HELP4, " %lu files deleted\n" + +STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\ +DELAY [/m]n\n\n\ + /m specifiy than n are milliseconds\n\ + otherwise n are seconds\n" + +STRING_DIR_HELP1, "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ + [drive:][path][filename]\n\ + Specifies drive, directory, and/or files to list.\n\n\ + /A Displays files with specified attributes.\n\ + attributes D Directories R Read-only files\n\ + H Hidden files A Files ready for archiving\n\ + S System files - Prefix meaning not\n\ + /B Uses bare format (no heading information or summary).\n\ + /C Display the thousand separator in file sizes. This is the\n\ + default. Use /-C to disable display of separator.\n\ + /D Same as wide but files are list sorted by column.\n\ + /L Uses lowercase.\n\ + /N New long list format where filenames are on the far right.\n\ + /O List by files in sorted order.\n\ + sortorder N By name (alphabetic) S By size (smallest first)\n\ + E By extension (alphabetic) D By date/time (oldest first)\n\ + G Group directories first - Prefix to reverse order\n\ + /P Pauses after each screenful of information.\n\ + /Q Display the owner of the file.\n\ + /S Displays files in specified directory and all subdirectories.\n\ + /T Controls which time field displayed or used for sorting\n\ + timefield C Creation\n\ + A Last Access\n\ + W Last Written\n\ + /W Uses wide list format.\n\ + /X This displays the short names generated for non-8dot3 file\n\ + names. The format is that of /N with the short name inserted\n\ + before the long name. If no short name is present, blanks are\n\ + displayed in its place.\n\ + /4 Displays four-digit years\n\n\ +Switches may be preset in the DIRCMD environment variable. Override\n\ +preset switches by prefixing any switch with - (hyphen)--for example, /-W.\n" + +STRING_DIR_HELP2, " Volume in drive %c is %s\n" +STRING_DIR_HELP3, " Volume in drive %c has no label.\n" +STRING_DIR_HELP4, " Volume Serial Number is %04X-%04X\n" +STRING_DIR_HELP5, "\n Total Files Listed:\n%16i File(s)% 14s bytes\n" +STRING_DIR_HELP6, "%16i Dir(s)% 15s bytes\n" +STRING_DIR_HELP7, "\n Directory of %s\n\n" +STRING_DIR_HELP8, "%16i File(s)% 14s bytes\n" + +STRING_DIRSTACK_HELP1, "Stores the current directory for use by the POPD command, then\n\ +changes to the specified directory.\n\n\ +PUSHD [path | ..]\n\n\ + path Specifies the directory to make the current directory\n" + +STRING_DIRSTACK_HELP2, "Changes to the directory stored by the PUSHD command.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Prints the contents of the directory stack.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Directory stack empty" + +STRING_ECHO_HELP1, "Display a messages without trailing carriage return and line feed.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Displays a message to the standard error output.\n\n\ + ECHOERR message\n\ + ECHOERR. prints an empty line" + +STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carriage return and line feed.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Displays a message or switches command echoing on or off.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [message]\n\ + ECHO. prints an empty line\n\n\ +Type ECHO without a parameter to display the current ECHO setting." + +STRING_ECHO_HELP5, "ECHO is %s\n" + +STRING_EXIT_HELP, "Exits the command line interpreter.\n\nEXIT\n" + +STRING_FOR_HELP1, "Runs a specified command for each file in a set of files\n\n\ +FOR %variable IN (set) DO command [parameters]\n\n\ + %variable Specifies a replaceable parameter.\n\ + (set) Specifies a set of one or more files. Wildcards may be used.\n\ + command Specifies the command to carry out for each file.\n\ + parameters Specifies parameters or switches for the specified command.\n\n\ +To use the FOR command in a batch program, specify %%variable instead of\n\ +%variable.\n" + +STRING_FREE_HELP1, "\nVolume in drive %s is %-11s\n\ + Serial number is %s\n\ + %16s bytes total disk space\n\ + %16s bytes used\n\ + %16s bytes free\n" + +STRING_FREE_HELP2, "Displays drive information.\n\nFREE [drive: ...]\n" + +STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\ + IF [NOT] ERRORLEVEL number command\n\ + IF [NOT] string1==string2 command\n\ + IF [NOT] EXIST filename command\n\ + IF [NOT] DEFINED variable command\n\n\ +NOT Specifies that CMD should carry out the command only if\n\ + the condition is false\n\ +ERRORLEVEL number Specifies a true condition if the last program run returned\n\ + an exit code equal or greater than the number specified.\n\ +command Specifies the command to carry out if the condition is met.\n\ +string1==string2 Specifies a true condition if the specified text strings\n\ + match.\n\ +EXIST filename Specifies a true condition if the specified filename exists.\n\ +DEFINED variable Specifies a true condition if the specified variable is\n\ + defined.\n" + +STRING_GOTO_HELP1, "Directs CMD to a labeled line in a batch script.\n\n\ +GOTO label\n\n\ + label Specifies a text string used in a batch script as a label.\n\n\ +You type a label on a line by itself, beginning with a colon." + +STRING_LABEL_HELP1, "Displays or changes drive label.\n\nLABEL [drive:][label]\n" + +STRING_LABEL_HELP2, "Volume in drive %c: is %s\n" +STRING_LABEL_HELP3, "Volume in drive %c: has no label\n" +STRING_LABEL_HELP4, "Volume Serial Number is %04X-%04X\n" +STRING_LABEL_HELP5, "Drive label (11 Characters, ENTER if none)? " + +STRING_LOCALE_HELP1, "Current time is" + +STRING_MKDIR_HELP, "Creates a directory.\n\n\ +MKDIR [drive:]path\nMD [drive:]path" + +STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ + %13s bytes total physical RAM.\n\ + %13s bytes available physical RAM.\n\n\ + %13s bytes total page file.\n\ + %13s bytes available page file.\n\n\ + %13s bytes total virtual memory.\n\ + %13s bytes available virtual memory.\n" + +STRING_MISC_HELP1, "Press a key to continue...\n" + +STRING_MOVE_HELP1, "Overwrite %s (Yes/No/All)? " + +STRING_MOVE_HELP2, "Moves files and renames files and directories.\n\n\ +To move one or more files:\n\ +MOVE [/N][drive:][path]filename1[,...] destination\n\n\ +To rename a directory:\n\ +MOVE [/N][drive:][path]dirname1 dirname2\n\n\ + [drive:][path]filename1 Specifies the location and name of the file\n\ + or files you want to move.\n\ + /N Nothing. Do everything but move files or directories.\n\n\ +Current limitations:\n\ + - You can't move a file or directory from one drive to another.\n" + +STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\ +MSGBOX type ['title'] prompt\n\n\ +type button displayed\n\ + possible values are: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +title title of message box\n\ +prompt text displayed by the message box\n\n\n\ +ERRORLEVEL is set according the button pressed:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Displays or sets a search path for executable files.\n\n\ +PATH [[drive:]path[;...]]\nPATH ;\n\n\ +Type PATH ; to clear all search-path settings and direct the command shell\n\ +to search only in the current directory.\n\ +Type PATH without parameters to display the current path.\n" + +STRING_PROMPT_HELP1, "Changes the command prompt.\n\n\ +PROMPT [text]\n\n\ + text Specifies a new command prompt.\n\n\ +Prompt can be made up of normal characters and the following special codes:\n\n\ + $A & (Ampersand)\n\ + $B | (pipe)\n\ + $C ( (Left parenthesis)\n\ + $D Current date\n\ + $E Escape code (ASCII code 27)\n\ + $F ) (Right parenthesis)\n\ + $G > (greater-than sign)\n\ + $H Backspace (erases previous character)\n\ + $L < (less-than sign)\n\ + $N Current drive\n\ + $P Current drive and path\n\ + $Q = (equal sign)\n\ + $T Current time\n\ + $V OS version number\n\ + $_ Carriage return and linefeed\n\ + $$ $ (dollar sign)\n" + +STRING_PAUSE_HELP1, "Stops the execution of a batch file and shows the following message:\n\ +'Press any key to continue...' or a user defined message.\n\n\ +PAUSE [message]" + +STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" + +STRING_PROMPT_HELP3, "\nType PROMPT without parameters to reset the prompt to the default setting." + +STRING_REM_HELP, "Starts a comment line in a batch file.\n\nREM [Comment]" + +STRING_RMDIR_HELP, "Removes a directory.\n\n\ +RMDIR [drive:]path\nRD [drive:]path\n\ +/S Deletes all files and folders within target\n\ +/Q Doesnt prompt for user\n" +STRING_RMDIR_HELP2, "Directory is not empty!\n" + +STRING_REN_HELP1, "Renames a file/directory or files/directories.\n\n\ +RENAME [/E /N /P /Q /S /T] old_name ... new_name\n\ +REN [/E /N /P /Q /S /T] old_name ... new_name\n\n\ + /E No error messages.\n\ + /N Nothing.\n\ + /P Prompts for confirmation before renaming each file.\n\ + (Not implemented yet!)\n\ + /Q Quiet.\n\ + /S Rename subdirectories.\n\ + /T Display total number of renamed files.\n\n\ +Note that you cannot specify a new drive or path for your destination. Use\n\ +the MOVE command for that purpose.\n" + +STRING_REN_HELP2, " %lu file renamed\n" + +STRING_REN_HELP3, " %lu files renamed\n" + +STRING_SHIFT_HELP, "Changes the position of replaceable parameters in a batch file.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "move cursor and optionally print text\n\n\ +SCREEN row col [text]\n\n\ + row row to wich move the cursor\n\ + col column to wich move the cursor" + +STRING_SET_HELP, "Displays, sets, or removes environment variables.\n\n\ +SET [variable[=][string]]\n\n\ + variable Specifies the environment-variable name.\n\ + string Specifies a series of characters to assign to the variable.\n\n\ +Type SET without parameters to display the current environment variables.\n" + +STRING_START_HELP1, "Starts a command.\n\n\ +START command\n\n\ + command Specifies the command to run.\n\n\ +At the moment all commands are started asynchronously.\n" + +STRING_TITLE_HELP, "Sets the window title for the command prompt window.\n\n\ +TITLE [string]\n\n\ +string Specifies the title for the command prompt window.\n" + +STRING_TIME_HELP1, "Displays or sets the system time.\n\n\ +TIME [/T][time]\n\n\ + /T display only\n\n\ +Type TIME with no parameters to display the current time setting and a prompt\n\ +for a new one. Press ENTER to keep the same time.\n" + +STRING_TIME_HELP2, "Enter new time: " + +STRING_TIMER_HELP1, "Elapsed %d msecs\n" + +STRING_TIMER_HELP2, "Elapsed %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "allow the use of ten stopwatches.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON set stopwatch ON\n\ + OFF set stopwatch OFF\n\ + /S Split time. Return stopwatch split\n\ + time without changing its value\n\ + /n Specifiy the stopwatch number.\n\ + Stopwatches available are 0 to 9\n\ + If it is not specified default is 1\n\ + /Fn Format for output\n\ + n can be:\n\ + 0 milliseconds\n\ + 1 hh%cmm%css%cdd\n\n\ +if none of ON, OFF or /S is specified the command\n\ +will toggle stopwatch state\n\n" + +STRING_TYPE_HELP1, "Displays the contents of text files.\n\nTYPE [drive:][path]filename \n\ + /P Shows one screen of output at a time.\n" + +STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ +Sets whether to verify that your files are written correctly to a\n\ +disk.\n\n\ +VERIFY [ON | OFF]\n\n\ +Type VERIFY without a parameter to display the current VERIFY setting.\n" + +STRING_VERIFY_HELP2, "VERIFY is %s.\n" + +STRING_VERIFY_HELP3, "Must specify ON or OFF." + +STRING_VERSION_HELP1, "Displays shell version information\n\n\ +VER [/C][/R][/W]\n\n\ + /C Displays credits.\n\ + /R Displays redistribution information.\n\ + /W Displays warranty information." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n" + +STRING_VERSION_HELP5, "\nSend bug reports to .\n\ +Updates are available at: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version written by:\n" + +STRING_VERSION_HELP7, "\nReactOS version written by:\n" + +STRING_VOL_HELP1, " Volume in drive %c: is %s" +STRING_VOL_HELP2, " Volume in drive %c: has no label" +STRING_VOL_HELP3, " Volume Serial Number is %04X-%04X\n" +STRING_VOL_HELP4, "Displays the disk volume label and serial number, if they exist.\n\nVOL [drive:]" + +STRING_WINDOW_HELP1, "change console window aspect\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window" + +STRING_WINDOW_HELP2, "change console window aspect\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window tile of window on wich perform actions\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window\n\ +title new title\n" + + +STRING_HELP1, "List of all available commands (+ description)\n\n\ + command /? For more information on a specific command\n\n\ +? List all available commands without description).\n\ +ALIAS Sets, removes or shows aliases.\n\ +ATTRIB Displays or changes file attributes.\n\ +BEEP Beep the speaker.\n\ +CALL Calls one batch program from another.\n\ +CD Displays the name of or changes the current directory.\n\ +CHCP Displays or sets the active code page number.\n\ +CHOICE Waits for the user to choose one of a set of choices.\n\ +CLS Clears the screen.\n\ +CMD Starts a new instance of the ReactOS command interpreter.\n\ +COLOR Sets the default console foreground and background colors.\n\ +COPY Copies one or more files to another location.\n\ +DATE Displays or sets the date.\n\ +DELETE Deletes one or more files.\n\ +DIR Displays a list of files and subdirectories in a directory.\n\ +ECHO Displays messages, or turns command echoing on or off.\n\ +ERASE Deletes one or more files.\n\ +EXIT Quits the CMD.EXE program (command interpreter).\n\ +FOR Runs a specified command for each file in a set of files.\n\ +FREE (free) disc space.\n\ +GOTO Directs the ReactOS command interpreter to a labeled line in\n\ + a batch program.\n\ +HELP Provides Help information for ReactOS commands.\n\ +HISTORY List alle commands which has been used\n\ +IF Performs conditional processing in batch programs.\n\ +LABEL Creates, changes, or deletes the volume label of a disk.\n\ +MD Creates a directory.\n\ +MKDIR Creates a directory.\n\ +MOVE Moves one or more files from one directory to another\n\ + directory.\n\ +PATH Displays or sets a search path for executable files.\n\ +PAUSE Suspends processing of a batch file and displays a message.\n\ +POPD Restores the previous value of the current directory saved by\n\ + PUSHD.\n\ +PROMPT Changes the command prompt.\n\ +PUSHD Saves the current directory then changes it.\n\ +RD Removes a directory.\n\ +REM Records comments (remarks) in batch files.\n\ +REN Renames a file or files.\n\ +RENAME Renames a file or files.\n\ +RMDIR Removes a directory.\n\ +SCREEN Move cursor and optionally print text.\n\ +SET Displays, sets, or removes ReactOS environment variables.\n\ +SHIFT Shifts the position of replaceable parameters in batch files.\n" +STRING_HELP2, "START Starts a separate window to run a specified program or command.\n\ + Executes command.\n\ +TIME Displays or sets the system time.\n\ +TIMER Allow the use of ten stopwaches.\n\ +TITLE Sets the window title for a CMD.EXE session.\n\ +TYPE Displays the contents of a text file.\n\ +VER Displays the ReactOS version.\n\ +VERIFY Tells ReactOS whether to verify that your files are written\n\ + correctly to a disk.\n\ +VOL Displays a disk volume label and serial number.\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + + +STRING_ALIAS_ERROR, "Command line too long after alias expansion!\n" +STRING_BATCH_ERROR, "Error opening batch file\n" +STRING_CHCP_ERROR1, "Active code page: %u\n" +STRING_CHCP_ERROR4, "Invalid code page\n" +STRING_CHOICE_ERROR, "Invalid option. Expected format: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Invalid option. Expected format: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Illegal Option: %s" +STRING_MD_ERROR, "A subdirectory or file already exists.\n" +STRING_MD_ERROR2, "The path to the new folder does not exist.\n" +STRING_CMD_ERROR1, "Can't redirect input from file %s\n" +STRING_CMD_ERROR2, "Error creating temporary file for pipe data\n" +STRING_CMD_ERROR3, "Can't redirect to file %s\n" +STRING_CMD_ERROR4, "Running %s...\n" +STRING_CMD_ERROR5, "Running cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Same colors error! (Background and foreground can't be the same color)" +STRING_COLOR_ERROR2, "error in color specification" +STRING_COLOR_ERROR3, "Color %x\n" +STRING_COLOR_ERROR4, "same colors error!" +STRING_CONSOLE_ERROR, "Unknown error: %d\n" +STRING_COPY_ERROR1, "Error: Cannot open source - %s!\n" +STRING_COPY_ERROR2, "Error: Can't copy onto itself!\n" +STRING_COPY_ERROR3, "Error writing destination!\n" +STRING_COPY_ERROR4, "Error: Not implemented yet!\n" +STRING_DATE_ERROR, "Invalid date." +STRING_DEL_ERROR5, "The file %s will be deleted! " +STRING_DEL_ERROR6, "Are you sure (Y/N)?" +STRING_DEL_ERROR7, "Deleting: %s\n" +STRING_ERROR_ERROR1, "Unknown error! Error code: 0x%lx\n" +STRING_ERROR_ERROR2, "Syntax error" +STRING_FOR_ERROR1, "'in' missing in for statement." +STRING_FOR_ERROR2, "no brackets found." +STRING_FOR_ERROR3, "'do' missing." +STRING_FOR_ERROR4, "no command after 'do'." +STRING_FREE_ERROR1, "Invalid drive" +STRING_FREE_ERROR2, "unlabeled" +STRING_GOTO_ERROR1, "No label specified for GOTO" +STRING_GOTO_ERROR2, "Label '%s' not found\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Error]\n" + +STRING_REN_ERROR1, "MoveFile() failed. Error: %lu\n" + +STRING_START_ERROR1, "No batch support at the moment!" + +STRING_TIME_ERROR1, "Invalid time." + +STRING_TYPE_ERROR1, "Invalid option '/%s'\n" + +STRING_WINDOW_ERROR1, "window not found" + + +STRING_ERROR_PARAMETERF_ERROR, "Parameter format not correct - %c\n" +STRING_ERROR_INVALID_SWITCH, "Invalid switch - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Too many parameters - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Path not found\n" +STRING_ERROR_FILE_NOT_FOUND, "File not found\n" +STRING_ERROR_REQ_PARAM_MISSING, "Required parameter missing\n" +STRING_ERROR_INVALID_DRIVE, "Invalid drive specification\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Invalid parameter format - %s\n" +STRING_ERROR_BADCOMMAND, "Bad command or filename\n" +STRING_ERROR_OUT_OF_MEMORY, "Out of memory error.\n" +STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n" +STRING_ERROR_D_PAUSEMSG, "Press any key to continue . . ." +STRING_ERROR_DRIVER_NOT_READY, "Drive not ready" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" +STRING_VERSION_RUNVER, " running on %s" +STRING_COPY_FILE , " %d file(s) copied\n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, "bad variable specification." +STRING_SCREEN_COL, "invalid value for col" +STRING_SCREEN_ROW, "invalid value for row" +STRING_TIMER_TIME "Timer %d is %s: " + +STRING_INVALID_OPERAND, "Invalid operand." +STRING_EXPECTED_CLOSE_PAREN, "Expected ')'." +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name." +STRING_SYNTAX_COMMAND_INCORRECT, "The syntax of the command is incorrect." + +} diff --git a/reactos/base/shell/cmd/Es.rc b/reactos/base/shell/cmd/Es.rc new file mode 100644 index 00000000000..daaa3dc8ab4 --- /dev/null +++ b/reactos/base/shell/cmd/Es.rc @@ -0,0 +1,650 @@ +#include "windows.h" +#include "resource.h" +/* + * Spanish resource file by HUMA2000 + * Jose Pedro Fernndez Pascual 2005 + */ + +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Muestra o cambia los atributos de los archivos.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\ + [/S [/D]]\n\n\ + + Aade un atributo\n\ + - Borra un atributo\n\ + R Atributo de slo lectura\n\ + A Atributo de archivo\n\ + S Atributo de archivo de sistema\n\ + H Atributo de archivo oculto\n\ + /S Procesa los archivos coincidentes en el directorio actual \n\ + y sus subdirectorios\n\ + /D Procesa tambin los directorios\n\n\ +Type ATTRIB without a parameter to display the attributes of all files.\n" + +STRING_ALIAS_HELP, "Pone, borra o muestra los alias.\n\n\ +ALIAS [alias=[command]]\n\n\ + alias Nombre para un alias.\n\ + command Texto a ser sustituido por el alias.\n\n\ +Para mostrar todos los alias:\n\ + ALIAS\n\n\ +Para poner un nuevo o remplazar un alias existente:\n\ + ALIAS da=dir a:\n\n\ +Para borrar un alias de la lista de alias:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Emite un pitido por el altavoz.\n\nBEEP\n" + +STRING_CALL_HELP, "Ejecuta un arhivo por lotes desde otro archivo por lotes.\n\n\ +CALL [drive:][path]filename [batch-parameter]\n\n\ + batch-parameter Especifica cualquier informacion de la linea de comandos\n\ + requerida por el archivo por lotes." + +STRING_CD_HELP, "Cambia el directorio actual o muestra su nombre.\n\n\ +CHDIR [/D][drive:][path]\n\ +CHDIR[..|.]\n\ +CD [/D][drive:][path]\n\ +CD[..|.]\n\n\ + .. Directorio padre.\n\ + . Directorio actual.\n\ + /D Cambiara la unidad y el directorio actual.\n\n\ +Escribe CD unidad: para mostrar el directorio actual en la unidad especificada.\n\ +Escribe CD sin ningun parmetro para mostrar la unidad y el directorio actual.\n" + +STRING_CHCP_HELP, "Muestra o configura el nmero de pgina de cdigo activa.\n\n\ +CHCP [nnn]\n\n\ + nnn Especifica el nmero de pgina de cdigo activa.\n\n\ +Escribe CHCP sin ningn parmetro para mostrar el cdigo de pgina activo.\n" + +STRING_CHOICE_HELP, "Espera a que el usuario elija entre un nmero de opciones.\n\n\ +CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ + /C[:]choices Especifica las teclas admitidas. Por defecto son SN.\n\ + /N No muestra las posibles elecciones y ? al final del prompt.\n\ + /S Hace que la eleccin sea sensible a las maysculas y minsculas.\n\ + /T[:]c,nn La eleccin por defecto ser c despus de nn segundos.\n\ + text Prompt a mostrar. \n\n\ +ERRORLEVEL se configura al offset de la tecla que presione el usuario.\n" + +STRING_CLS_HELP, "Limpia la pantalla.\n\nCLS\n" + +STRING_CMD_HELP1, "\nComandos internos disponibles:\n" + +STRING_CMD_HELP2, "\nCaractersticas disponibles:" + +STRING_CMD_HELP3," [alias]" + +STRING_CMD_HELP4," [historia]" + +STRING_CMD_HELP5," [Completador de nombres de archivos unix]" + +STRING_CMD_HELP6," [Pila de directorios]" + +STRING_CMD_HELP7," [Redirecciones y tneles]" + +STRING_CMD_HELP8, "Comienza una nueva sesion del interprete de comandos de ReactOS.\n\n\ +CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ + /C command Ejecuta el comando especificado y cierra.\n\ + /K command Ejecuta e comando especificado y permanece.\n\ + /P CMD se hace permanente y ejecuta el autoexec.bat\n\ + (no puede ser cerrado).\n\ + /T:bf Configura el color de fondo/primer plano (mirar el comando COLOR).\n" + +STRING_COLOR_HELP1, "Configura el color de primer plano y fondo.\n\n\ +COLOR [attr [/-F]] \n\n\ + attr Especifica el atributo de color de salida de consola.\n\ + /-F No rellena el espacio en blanco de la consola con el color del atributo.\n\n\ +Hay tres maneras de especificar los colores:\n\ +1) [bright] nombre on [bright] nombre (solo las tres primeras letras del nombre son necesarias)\n\ +2) decimal on decimal\n\ +3) dos dgitos hexadecimales\n\n\ +Los colores son:\n\ +dec hex nombre dec hex name\n\ +0 0 Negro 8 8 Gris(Negro brillante)\n\ +1 1 Azul 9 9 Azul brillante\n\ +2 2 Verde 10 A Verde brillante\n\ +3 3 Cyan 11 B Cyan brillante\n\ +4 4 Rojo 12 C Rojo brillante\n\ +5 5 Magenta 13 D Magenta brillante\n\ +6 6 Amarillo 14 E Amarillo brillante\n\ +7 7 Blanco 15 F Blanco brillante\n" + +STRING_COPY_HELP1, "Sobreescribir %s (Si/No/Todos)? " + +STRING_COPY_HELP2, "Copia uno o mas archivos a otro lugar.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] origen [/A|/B]\n\ + [+ origen [/A|/B] [+ ...]] [destino [/A|/B]]\n\n\ + origen Especifica el archivo o archivos a copiar.\n\ + /A Indica un archivo de texto ASCII.\n\ + /B Indica un archivo binario.\n\ + destino Especifica el directorio y/o nombre de archivo para los nuevos archivos.\n\ + /V Verifica que el nuevo archivo se ha escrito correctamente.\n\ + /Y Suprime la confirmacin sobre si quieres sobreescribir un archivo\n\ + de destino existente.\n\ + /-Y Hace que te pregunte si quieres sobreescribir un archivo de destino\n\ + existente.\n\n\ +El parametro /Y tiene que estar presente en las variables de entorno de COPYCMD.\n\ +...\n" + +STRING_DATE_HELP1, "\nIntroduce la nueva fecha (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nIntroduce la nueva fecha (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nIntroduce la nueva fecha (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Muestra o cambia la fecha.\n\n\ +DATE [/T][date]\n\n\ + /T Slo la muestra\n\n\ +Escribe DATE sin parmetros para mostrar la fecha actual y establecer\n\ +una nueva fecha. Pulsa INTRO para mantener la misma fecha.\n" + +STRING_DEL_HELP1, "Borra uno o mas archivos.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\n\ + archivo Espacifica el/los archivo(s) a borrar.\n\n\ + /N Nada.\n\ + /P Prompt. Pregunta antes de borar cada archivo\n\ + /T Total. Muestra el nmero total de archivos eliminados y el espacio\n\ + liberado en disco\n\ + /Q Modo silencioso.\n\ + /W Limpiar. Sobreescribe el archivo con nmeros aleatorios despus de eliminarlo.\n\ + /Y Si. Borra incluso *.* sin preguntar.\n\ + /F Fuerza el borrade de archivos ocultos, de slo lectura y de sistema.\n\ + /S Borra los archivos de todos los subdirectorios.\n\ + /A Selecciona los archivos a borrar en base a los atributos especificados.\n\ + R Archivos de slo lectura\n\ + S Archivos de sistema\n\ + A Archivos listos para archivar\n\ + H Archivos ocultos\n\ + - Prefijo que signifca sin\n" + +STRING_DEL_HELP2, "Todos los archivos del directorio van a ser borrados!\nEsts seguro? (S/N)?" +STRING_DEL_HELP3, " Archivo %lu borrado\n" +STRING_DEL_HELP4, " Archivos %lu borrados\n" + +STRING_DELAY_HELP, "Espera por n segundos o milisegundos\n\ +DELAY [/m]n\n\n\ + /m Especifica que n son milisegundos\n\ + En otro caso n son segundos\n" + +STRING_DIR_HELP1, "DIR [unidad:][ruta][nombre de archivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]orden]] [/P] [/Q] [/S] [/T[[:]fecha]] [/W] [/X] [/4]\n\n\ + [unidad:][ruta][nombre de archivo]\n\ + Especifica la unidad, el directorio o los archivos a listar.\n\n\ + /A Muestra los archivos con los atributos especificados.\n\ + atributos D Directorios R Archivos de slo lectur\n\ + H Archivos ocultos A Archivos listos para archivar\n\ + S Archivos de sistema - Prefijo que signifca sin\n\ + /B Usa el formato simple (sin encabezado ni sumario).\n\ + /C Muestra el separador de miles en los tamaos de los archivos. Es la opcin\n\ + por defecto. Usa /-C para desactivar el mostrar el separador.\n\ + /D Lo mismo que el formato a lo ancho, pero ordenados en columna.\n\ + /L Usa minsculas.\n\ + /N Nuevo formato de lista larga donde los nombres de archivo estn a la \n\ + derecha.\n\ + /O Muestra los archivos ordenados segn el orden especificado.\n\ + ordenacin N Por nombre (alfabtico) S Por tamao (los menores primero)\n\ + E Por extensin (alfabtico) D Por fecha/hora (los antiguos primero)\n\ + G Los directorios primero - Prefijo para el orden inverso\n\ + /P Pausa despus de cada pantalla llena de informacin.\n\ + /Q Muestra el propietario del archivo.\n\ + /S Muestra los archivos en el directorio especificado y sus subdirectorios.\n\ + /T Controla que campo de tiempo se muestra o es usado para ordenar:\n\ + campo de tiempo C Creacin\n\ + A ltimo acceso\n\ + W ltima escritura\n\ + /W Usa el formato de lista a lo ancho.\n\ + /X Muestra los nombres cortos generados para archivos que no tienen un\n\ + nombre 8.3. El formato es como /N pero con el nombre corto colocado\n\ + antes del nombre largo. Si no hay nombre corto, se muestran espacios\n\ + en blanco en su lugar.\n\ + /4 Muestra los cuatro dgitos del ao\n\n\ +Los modificadores pueden estar presentes en la variable de entorno de DIRCMD. Omite los\n\ +ajustes previos anteponiendo a cualquier modificador - (hyphen)--por ejemplo, /-W.\n" + +STRING_DIR_HELP2, " El volumen en la unidad %c es %s\n" +STRING_DIR_HELP3, " El volumen en la unidad %c no tiene etiqueta.\n" +STRING_DIR_HELP4, " El volumen Serial Number is %04X-%04X\n" +STRING_DIR_HELP5, "\n Total de archivos mostrados:\n%16i archivo(s)% 14s bytes\n" +STRING_DIR_HELP6, "%16i Directorio(s)% 15s bytes\n" +STRING_DIR_HELP7, "\n Directorio %s\n\n" +STRING_DIR_HELP8, "%16i archivo(s)% 14s bytes\n" + +STRING_DIRSTACK_HELP1, "Almacena el directorio actual para usarlo por el comando, \n\ +entonces cambia al directorio especificado.\n\n\ +PUSHD [ruta | ..]\n\n\ + ruta Especifica el directorio para hacerlo el directorio actual\n" + +STRING_DIRSTACK_HELP2, "Cambia al directorio guardado por el comando PUSHD.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Muestra el contenido de la pila de directorios.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Vacia la pila de directorios" + +STRING_ECHO_HELP1, "Muestra un mensaje sin necesidad de pulsar intro y \n\ +salta a la siguiente linea.\n\n\ + ECHOS mensaje" + +STRING_ECHO_HELP2, "Muestra los mensajes de error por defecto.\n\n\ + ECHOERR mensaje\n\ + ECHOERR. Imprime una linea vacia" + +STRING_ECHO_HELP3, "Muestra mensajes en la salida estandar de error sin pulsar intro y\n\ +pasa de linea.\n\n\ + ECHOSERR mensaje" + +STRING_ECHO_HELP4, "Muestra un mensaje o cambia el mostrar los comandos activo/inactivo.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [mensaje]\n\ + ECHO. Muestra una linea vacia\n\n\ +Escribe ECHO sin parmetros para mostrar la configuracin actual de ECHO." + +STRING_ECHO_HELP5, "ECHO est %s\n" + +STRING_EXIT_HELP, "Sale del interprete de la linea de comandos.\n\nEXIT\n" + +STRING_FOR_HELP1, "Ejecuta un comando especfico para cada archivo de un grupo de archivos.\n\n\ +FOR %variable IN (grupo) DO comando [parametros]\n\n\ + %variable Especifica un parmetro remplazable.\n\ + (set) Especifica un grupo de uno o mas archivos. Los comodines pueden usarse.\n\ + command Especifica el comando a ejecutar para cada archivo.\n\ + parameters Especifica los parametros o modificadores para el comando especificado.\n\n\ +Para usar el comando FOR en un archivo por lotes, especifica %%variable en lugar de\n\ +%variable.\n" + +STRING_FREE_HELP1, "\nEl volumen en la unidad %s es %-11s\n\ + El nmero de serie es %s\n\ + %16s bytes totales de espacio en disco\n\ + %16s bytes usados\n\ + %16s bytes libres\n" + +STRING_FREE_HELP2, "Muestra la informacin de la unidad.\n\nFREE [unidad: ...]\n" + +STRING_IF_HELP1, "Ejecuta procesos condicionales en archivos por lotes.\n\n\ + IF [NOT] ERRORLEVEL nmero comando\n\ + IF [NOT] string1==string2 comando\n\ + IF [NOT] EXIST archivo comando\n\ + IF [NOT] DEFINED variable comando\n\n\ +NOT Especifica que CMD solo llevar a cabo el comando si la \n\ + condicin es falsa.\n\ +ERRORLEVEL nmero Especifica una condicin verdadera si el ltimo programa devuelve\n\ + un cdigo de salida igual o superior al nmero especificado.\n\ +comando Especifica el comando a ejecutar si se cumple la condicin.\n\ +string1==string2 Especifica una condicin verdadera si las cadenas de texto coinciden.\n\ +EXIST archivo Especifica una condicin verdadera si existe el archivo especificado.\n\ +DEFINED variable Especifica una condicin verdadera si la variable est definida.\n" + +STRING_GOTO_HELP1, "Manda al CMD a una linea etiquetada en un archivo por lotes.\n\n\ +GOTO etiqueta\n\n\ + etiqueta Especifica la cadena de texto usada en el archivo por lotes como etiqueta.\n\n\ +Escriba la etiqueta en la linea misma, empezando con dos puntos." + +STRING_LABEL_HELP1, "Muestra o cambia la etiqueta de una unidad.\n\nLABEL [unidad:][etiqueta]\n" + +STRING_LABEL_HELP2, "El volumen en la unidad %c: es %s\n" +STRING_LABEL_HELP3, "El volumen en la unidad %c: no tiene etiqueta\n" +STRING_LABEL_HELP4, "El nmero de serie del volumen es %04X-%04X\n" +STRING_LABEL_HELP5, "Etiqueta del volumen (11 Caracteres, INTRO para ninguna)? " + +STRING_LOCALE_HELP1, "La hora actual es" + +STRING_MKDIR_HELP, "Crea un directorio.\n\n\ +MKDIR [unidad:]ruta\nMD [unidad:]ruta" + +STRING_MEMMORY_HELP1, "Muestra la cantidad de memoria del sistema.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% carga de memoria.\n\n\ + %13s bytes totales de RAM fsica.\n\ + %13s bytes libres de RAM fsica.\n\n\ + %13s bytes totales del archivo de paginacin.\n\ + %13s bytes disponibles del archivo de paginacin.\n\n\ + %13s bytes totales de memoria virtual.\n\ + %13s bytes disponibles de memoria virtual.\n" + +STRING_MISC_HELP1, "Pulsa cualquier tecla para continuar...\n" + +STRING_MOVE_HELP1, "Sobreescribir %s (Si/No/Todos)? " + +STRING_MOVE_HELP2, "Mueve archivos y renombra archivos y directorios.\n\n\ +Para mover uno o ms archivos:\n\ +MOVE [/N][unidad:][ruta]archivo1[,...] destino\n\n\ +Para renombrar un directorio:\n\ +MOVE [/N][unidad:][ruta]directorio1 directorio2\n\n\ + [unidad:][ruta]archivo1 Especifica la localizacin y el nombre del archivo\n\ + o archivos que quieres mover.\n\ + /N Nada. Hace todo menos mover archivos o directorios.\n\n\ +Limitaciones actules:\n\ + - No puedes mover un archivo o directorio de una unidad a otra.\n" + +STRING_MSGBOX_HELP, "Muestra un cuadro de mensaje y devuelve la respuesta del usuario.\n\n\ +MSGBOX tipo ['titulo'] pregunta\n\n\ +tipo buton a mostrar\n\ + los valores posibles son: OK, OKCANCELAR,\n\ + SINO, SINOCANCELAR\n\ +titulo titulo del cuadro de mensaje\n\ +pregunta texto a mostrar por el cuadro de mensaje\n\n\n\ +ERRORLEVEL se configurara en funcin del botn pulsado:\n\n\ +SI : 10 | NO : 11\n\ +OK : 10 | CANCELAR: 12\n" + +STRING_PATH_HELP1, "Muestra o cambia la ruta de bsqueda de archivos ejecutables.\n\n\ +PATH [[unidad:]ruta[;...]]\nRuta ;\n\n\ +Escribe PATH ; para limpiar todas las configuraciones de bsqueda y usar solo el\n\ +directorio actual del interprete de comandos.\n\ +Escribe PATH sin parmetros para mostrar la ruta actual.\n" + +STRING_PROMPT_HELP1, "Cambia el smbolo de comandos.\n\n\ +PROMPT [texto]\n\n\ + texto Epecifica un nuevo smbolo de comandos.\n\n\ +El smbolo de comandos puede hacerce con carcteres normales y los siguientes \n\ +cdigos especiales:\n\n\ + $A & (Signo y)\n\ + $B | (Linea horizontal)\n\ + $C ( (Parntesis izquierdo)\n\ + $D Fecha actual\n\ + $E Cdigo de escape (cdigo ASCII 27)\n\ + $F ) (Parntesis derecho)\n\ + $G > (Signo mayor que)\n\ + $H Borra el caracter anterior\n\ + $L < (Signo menor que)\n\ + $N Unidad actual\n\ + $P Unidad y ruta actuales\n\ + $Q = (signo igual)\n\ + $T Hora actual\n\ + $V Nmero de versin del SO\n\ + $_ Salto de linea\n\ + $$ $ (signo del dolar)\n" + +STRING_PAUSE_HELP1, "Detiene la ejecucin del archivo por lotes actual y muestra el\n\ +siguiente mensaje:\n\ +'Pulsa cualquier tecla para continuar...' o un mensaje definido por el usuario.\n\n\ +PAUSE [mensaje]" + +STRING_PROMPT_HELP2, " $+ Muestra la profundidad actual de la pila de directorios" + +STRING_PROMPT_HELP3, "\nEscribe PROMPT sin parmetros para resetear el smbolo de \n\ +comandos a su configuracin por defecto." + +STRING_REM_HELP, "Comienza una liena de comentarios en un archivo por lotes\n\nREM [Comentario]" + +STRING_RMDIR_HELP, "Remueve un directorio.\n\n\ +RMDIR [unidad:]ruta\nRD [unidad:]ruta" + +STRING_REN_HELP1, "Renombra un archivo/directorio o varios archivos/directorios.\n\n\ +RENAME [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\ +REN [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\n\ + /E No muestra mensajes de error.\n\ + /N Nada.\n\ + /P Pregunta por la confirmacin antes de cada archivo.\n\ + (No implementado an!)\n\ + /Q Modo silencioso.\n\ + /S Renombra los subdirectorios.\n\ + /T Muestra el nmero total de archivos renombrados.\n\n\ +Note que no puede especificar una nueva unidad en el destino o ruta. Usa\n\ +el comando MOVE para este propsito.\n" + +STRING_REN_HELP2, " %lu archivos renombrados.\n" + +STRING_REN_HELP3, " %lu archivos renombrados.\n" + +STRING_SHIFT_HELP, "Cambia la posicin de los parmetros remplazables en un \n\ +archivo por lotes.\n\n\ +SHIFT [ABAJO]" + +STRING_SCREEN_HELP, "Mueve el cursor y opcionalmente escribe un texto.\n\n\ +SCREEN fila columna [texto]\n\n\ + fila Fila a la que mover el cursor.\n\ + columna columna a la que mover el cursor." + +STRING_SET_HELP, "Muestra, cambia o borra las variables de entorno.\n\n\ +SET [variable[=][cadena]]\n\n\ + variable Especifica el nombre de la variable de entorno.\n\ + string Especifies la serie de caracteres para asignar a la variable.\n\n\ +Escribe SET sin parmetros para mostrar las variables de entorno actuales.\n" + +STRING_START_HELP1, "Empieza un comando.\n\n\ +START comando\n\n\ + comando Especifica el comando a ejecutar.\n\n\ +Por el momento todos los comandos son ejecutados de forma asincrnica.\n" + +STRING_TITLE_HELP, "Cambia el ttulo de la ventqana del intrprete de comandos.\n\n\ +TITLE [cadena]\n\n\ +cadena Especifica el ttulo de la ventana del intrprete de comandos.\n" + +STRING_TIME_HELP1, "Muestra o cambia la hora del sistema.\n\n\ +TIME [/T][hora]\n\n\ + /T Slo la muestra\n\n\ +Escribe TIME sin parmetros para mostrar la hora actual y preguntar\n\ +por una nueva. Pulsa INTRO para mantener la misma hora.\n" + +STRING_TIME_HELP2, "Introduce la nueva hora: " + +STRING_TIMER_HELP1, "Transcurridos %d msecs\n" + +STRING_TIMER_HELP2, "Transcurridos %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Permite al usuario el uso de diez paradas de reloj.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Cambia la parada a ON\n\ + OFF Cambia la parada a OFF\n\ + /S Divide el tiempo. Devuelve una division de la parada del reloj\n\ + sin cambiar su valor.\n\ + /n Especifica el nmero de la parada de reloj.\n\ + Las paradas de reloj disponibles son de 0 a 9\n\ + Si no se especifica el valor por defecto es 1\n\ + /Fn Formato de salida\n\ + n puede ser:\n\ + 0 millisegundos\n\ + 1 hh%cmm%css%cdd\n\n\ +Si ni ON, OFF o /S se especifican, el comando\n\ +cambiara el estado de parada del reloj\n\n" + +STRING_TYPE_HELP1, "Muestra los contenidos de un archivo de texto.\n\nTYPE [unidad:][ruta]archivo \n\ + /P Muestra slo una pantalla de salida cada vez.\n" + +STRING_VERIFY_HELP1, "Este comando es solo de relleno!!\n\ +Configura si hay que verificar que los archivos se and escrito correctamente\n\ +en un disco.\n\n\ +VERIFY [ON | OFF]\n\n\ +Escribe VERIFY sin parmetros para mostrar la configuracin actual de VERIFY.\n" + +STRING_VERIFY_HELP2, "VERIFY est %s.\n" + +STRING_VERIFY_HELP3, "Tienes que especificar ON o OFF." + +STRING_VERSION_HELP1, "Muestra la informacin de la versin del shell\n\n\ +VER [/C][/R][/W]\n\n\ + /C Muestra los creditos.\n\ + /R Muestra la informacin de redistribucin.\n\ + /W Muestra la informacin de la garantia." + +STRING_VERSION_HELP2, "Este software Viene con ABSOLUTAMENTE NINGUNA GARANTIA; para ms detalles\n\ +escribe: `ver /w'. Este es un software gratuito, y ests invitado a redistribuirlo\n\ +bajo ciertas condiciones; escribe `ver /r' para los detalles. Escribe `ver /c' para una\n\ +lista de los crditos." + +STRING_VERSION_HELP3, "\n Este programa es distribuido con la esperanza de que sea til,\n\ + pero CON NINGUNA GARANTIA; incluso sin la garanta implcita de\n\ + MERCADERIA o AJUSTE A UN PROPSITO PARTICULAR. Mira la\n\ + Licencia Pblica General GNU para ms detalles." + +STRING_VERSION_HELP4, "\n Este programa es un software gratuito; puedes redistribuirlo y/o modificarlo\n\ + bajo los trminos de la Licencia Pblica General GNU tal y como establece\n\ + la Fundacin de Software Libre; tanto en la versin 2 de la Licencia, o\n\ + (segn tu eleccin) cualquier otra posterior.\n" + +STRING_VERSION_HELP5, "\nManda los informes de bugs a .\n\ +Actualizaciones disponibles en: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version escrita por:\n" + +STRING_VERSION_HELP7, "\nReactOS version escrita por:\n" + +STRING_VOL_HELP1, " El volumen en la unidad %c: es %s" +STRING_VOL_HELP2, " El volumen en la unidad %c: no tiene etiqueta" +STRING_VOL_HELP3, " El nmero de serie del volumen es %04X-%04X\n" +STRING_VOL_HELP4, "Muestra la etiqueta del volumen del disco y el nmero de serie si existen.\n\nVOL [unidad:]" + +STRING_WINDOW_HELP1, "Cambia el aspecto de la ventana de la consola.\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS Especifica la posicin y dimensin de la ventana\n\ +MIN minimiza la ventana\n\ +MAX maximiza la ventana\n\ +RESTORE restaura la ventana" + +STRING_WINDOW_HELP2, "Cambia el aspecto de la ventana de la consola.\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window Ttulo de la ventana en la que realizar las accines\n\ +/POS Especifica la posicin y dimensin de la ventana\n\ +MIN minimiza la ventana\n\ +MAX maximiza la ventana\n\ +RESTORE restaura la ventana\n\ +title Nuevo ttulo\n" + + +STRING_HELP1, "Lista de todos los comandos disponibles (+ descripcin)\n\n\ + comando /? Para ms informacin del comando especificado.\n\n\ +? Muestra todos los comandos disponibles sin la descripcin.\n\ +ALIAS Crea, borra o muestra los alias.\n\ +ATTRIB Muestra o cambia los atributos de archivo.\n\ +BEEP Hace un beep con el altavoz.\n\ +CALL Llama a un archivo por lotes desde otro.\n\ +CD Muestra o cambia el directorio actual.\n\ +CHCP Muestra o cambia el cdigo de pgina activo.\n\ +CHOICE Espera a que el usuario elija una opcin de un grupo de opciones.\n\ +CLS Limpia la pantalla.\n\ +CMD Comienza una nueva instancia del intrprete de comandos.\n\ +COLOR Configura el color por defecto de fondo y frente de la consola.\n\ +COPY Copia uno o varios archivos de una localizacin a otra.\n\ +DATE Muestra y cambia la fecha.\n\ +DELETE Borra uno o ms archivos.\n\ +DIR Muestra una lista de los archivos y subdirecctorios en un directorio.\n\ +ECHO Muestra mensajes, o cambia un comando entre mostrarlos o no.\n\ +ERASE Borra uno o ms archivos.\n\ +EXIT Sale del programa CMD.EXE (intrprete de comandos).\n\ +FOR Ejecuta un comando especfico en un grupo de archivos.\n\ +FREE Espacio libre en disco.\n\ +GOTO Direcciona la ventana del intrprete de comandos a una linea etiquetada\n\ + en un archivo por lotes.\n\ +HELP Proporciona ayuda sobre los comandos para ReactOS.\n\ +HISTORY Muestra todos los comandos que han sido usados.\n\ +IF Realiza un proceso condicional en un archivo por lotes.\n\ +LABEL Crea, cambia, o borra la etiqueta de volumen de un disco.\n\ +MD Crea un directorio.\n\ +MKDIR Crea un directorio.\n\ +MOVE Mueve uno o ms archivos de un directorio a otro.\n\ +PATH Muestra o configura las rutas de bsqueda para archivos ejecutables.\n\ +PAUSE Suspende el procesamiento de un archivo por lotes y muestra un mensaje.\n\ +POPD Restaura el valor anterior del directorio actual guardado por PUSHD.\n\ +PROMPT Cambia el smbolo del sistema del intprete de comandos.\n\ +PUSHD Guarda el directorio actual y despus lo cambia.\n\ +RD Borra un directorio.\n\ +REM Marca comentarios en archivos por lotes.\n\ +REN Renombra un archivo o varios archivos.\n\ +RENAME Renombra un archivo o varios archivos.\n\ +RMDIR Borra un directorio.\n\ +SCREEN Mueve el cursor y opcionalmente escribe un texto.\n\ +SET Muestra, cambia o borra variables del entorno de la ventana.\n\ +SHIFT Marca la posicin de parmetros remplazables en un archivo por lotes.\n" + +STRING_HELP2, "START Abre una ventana separada para ejecutar un programa o comando especficod.\n\ + Ejecuta CMD.\n\ +TIME Muestra o cambia la hora del sistema.\n\ +TIMER Permite al usuario diez paradas para ver.\n\ +TITLE Configura el ttulo de la ventama de la sesin de CMD.EXE.\n\ +TYPE Muestra el contenido de un archivo de texto.\n\ +VER Muestra la versin de ReactOS.\n\ +VERIFY Le dice a ReactOS que verifique que cada archivo se escriba.\n\ + corectamente en el disco.\n\ +VOL Muestra la etiqueta de volumen y el nmero de serie del disco.\n" + + +STRING_CHOICE_OPTION, "SN" +STRING_COPY_OPTION, "SNT" + + +STRING_ALIAS_ERROR, "Linea de comandos demasiado larga tras la expansin del alias!\n" +STRING_BATCH_ERROR, "Error abriendo el archivo por lotes\n" +STRING_CHCP_ERROR1, "Pgina de cdigos activa: %u\n" +STRING_CHCP_ERROR4, "Cdigo de pgina invlido\n" +STRING_CHOICE_ERROR, "Opcin invlida. Se esperaba el formato: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Opcin invlida. Se esperaba el formato: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Opcin ilegal: %s" +STRING_CMD_ERROR1, "No se puede redirigir la entrada del archivo %s\n" +STRING_CMD_ERROR2, "Error creando archivo temporal para la pila de datos\n" +STRING_CMD_ERROR3, "No se puede redirigir el archivo %s\n" +STRING_CMD_ERROR4, "Ejecutando %s...\n" +STRING_CMD_ERROR5, "Ejecutando cmdexit.bat...\n" +STRING_COLOR_ERROR1, "Mismos colores! (El color de frente y de fondo no pueden ser el mismo)" +STRING_COLOR_ERROR2, "Error en la especificacin del color" +STRING_COLOR_ERROR3, "Color %x\n" +STRING_COLOR_ERROR4, "Error: mismos colores!" +STRING_CONSOLE_ERROR, "Error desconocido: %d\n" +STRING_COPY_ERROR1, "Error: No se puede abrir el origen - %s!\n" +STRING_COPY_ERROR2, "Error: No se puede copiar sobre si mismo!\n" +STRING_COPY_ERROR3, "Error escribiendo destino!\n" +STRING_COPY_ERROR4, "Error: No implementado an!\n" +STRING_DATE_ERROR, "Fecha incorrecta." +STRING_DEL_ERROR5, "El archivo %s va a ser borrado!" +STRING_DEL_ERROR6, "Ests seguro (S/N)?" +STRING_DEL_ERROR7, "Borrando: %s\n" +STRING_ERROR_ERROR1, "Error desconocido! Cdige de error: 0x%lx\n" +STRING_ERROR_ERROR2, "Error de sintaxsis" +STRING_FOR_ERROR1, "Falta 'in' para la declaracin." +STRING_FOR_ERROR2, "No se encontraron las parnteris." +STRING_FOR_ERROR3, "Falta 'do'." +STRING_FOR_ERROR4, "No hay comando despus de 'do'." +STRING_FREE_ERROR1, "Unidad errnea." +STRING_FREE_ERROR2, "Sin etiqueta" +STRING_GOTO_ERROR1, "No se especifico etiqueta para GOTO" +STRING_GOTO_ERROR2, "La etiqueta '%s' no se encuentra\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Error]\n" + +STRING_REN_ERROR1, "MoveFile() fall. Error: %lu\n" + +STRING_START_ERROR1, "No hay soporte para archivos por lotes en este momento!" + +STRING_TIME_ERROR1, "Hora incorrecta." + +STRING_TYPE_ERROR1, "Opcin incorrecta '/%s'\n" + +STRING_WINDOW_ERROR1, "Ventana no encontrada" + + +STRING_ERROR_PARAMETERF_ERROR, "Formato del parmetro incorrecto - %c\n" +STRING_ERROR_INVALID_SWITCH, "Parmetro incorrecto - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Demasiados parmetros - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Ruta no encontrada\n" +STRING_ERROR_FILE_NOT_FOUND, "Archivo no encontrado\n" +STRING_ERROR_REQ_PARAM_MISSING, "Prmetro requerido no encontrado\n" +STRING_ERROR_INVALID_DRIVE, "Especificacin de unidad errnea\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Formato de parmetro errneo - %s\n" +STRING_ERROR_BADCOMMAND, "Comando o nombre de archivo errneo\n" +STRING_ERROR_OUT_OF_MEMORY, "Error fuera de memoria.\n" +STRING_ERROR_CANNOTPIPE, "Error! No se puede apilar! No se puede abrir el archivo temporal!\n" +STRING_ERROR_D_PAUSEMSG, "Pulsa una tecla para continuar . . ." +STRING_ERROR_DRIVER_NOT_READY, "La unidad no est lista" + +STRING_PATH_ERROR, "CMD: No est en el entorno '%s'\n" + +STRING_CMD_SHELLINFO, "\nIntrprete de comandos de ReactOS" +STRING_VERSION_RUNVER, " corriendo en %s" +STRING_COPY_FILE , " %d archivo(s) copado(s)\n" +STRING_DELETE_WIPE, "Limpiado" +STRING_FOR_ERROR, "Especicin de variable errnea." +STRING_SCREEN_COL, "Valor invlido de columna" +STRING_SCREEN_ROW, "Valor invlido de fila" +STRING_TIMER_TIME "El temporizador %d es %s: " + +STRING_INVALID_OPERAND, "Operador errneo.\n" +STRING_EXPECTED_CLOSE_PAREN, "Se esperaba ')'.\n" +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Se esperaba un nmero o nombre de variable.\n" +STRING_SYNTAX_COMMAND_INCORRECT, "La sintaxis del comando es incorrecta.\n" + +} + diff --git a/reactos/base/shell/cmd/Fr.rc b/reactos/base/shell/cmd/Fr.rc new file mode 100644 index 00000000000..8e1c8375edb --- /dev/null +++ b/reactos/base/shell/cmd/Fr.rc @@ -0,0 +1,575 @@ +#include "windows.h" +#include "resource.h" +/* + * French resources + * Sylvain Ptrolle 2005 + */ + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "Affiche ou change des attributs de fichiers.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\ + [/S [/D]]\n\n\ + + Positionne un attribut\n\ + - Enlve un attribut\n\ + R Fichier en lecture seule\n\ + A Fichier archive\n\ + S Fichier systme\n\ + H Fichier cach\n\ + /S Traite les fichiers correspondants dans le rpertoire courant\n\ + et tous les sous-rpertoires\n\ + /D Traite galement les rpertoires\n\n\ +Taper ATTRIB sans paramtre pour afficher les attributs de tous les fichiers." + +STRING_ALIAS_HELP, "Positionne, enlve ou affiche les alias.\n\n\ +ALIAS [alias=[commande]]\n\n\ + alias Nom de l'alias.\n\ + commande Texte substituer l'alias.\n\n\ +Pour afficher tous les alias:\n\ + ALIAS\n\n\ +Pour crer ou remplacer un alias existant:\n\ + ALIAS da=dir a:\n\n\ +Pour effacer un alias de la liste des alias :\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Emet un bip par le haut-parleur systme.\n\nBEEP" + +STRING_CALL_HELP, "Appelle un programme batch depuis un autre.\n\n\ +CALL [lecteur:][chemin]fichier [paramtre-batch]\n\n\ + paramtre-batch Spcifie les paramtres ncessaires au \n\ + programme batch." + +STRING_CD_HELP, "Change ou affiche le rpertoire courant\n\n\ + CHDIR [lecteur:][chemin]\n\ + CHDIR[..|-]\n\ + CD [lecteur:][chemin]\n\ + CD[..|-]\n\n\ + .. rpertoire parent\n\ + - rpertoire prcdent\n\n\ +Taper CD lecteur: pour affiche le rpertoire courant sur le disque indiqu.\n\ +Taper CD sans paramtre pour afficher le rpertoire courant du disque actuel.\n" + +STRING_CHCP_HELP, "Affiche ou change la page de codes active.\n\n\ +CHCP [nnn]\n\n\ + nnn Indique la page de codes .\n\n\ +Taper CHCP sans paramtre pour afficher la page de codes active." + +STRING_CHOICE_HELP, "Demande l'utilisateur de choisir parmi plusieurs choix.\n\n\ +CHOICE [/C[:]choix][/N][/S][/T[:]c,nn][texte]\n\n\ + /C[:]choix Spcifier les touches disponibles. Choix par dfaut: ON.\n\ + /N Ne pas afficher les choix disponibles et ? la fin\n\ + du texte d'invite.\n\ + /S Traiter les touches comme diffrentes si ce sont\n\ + des majuscules ou minuscules.\n\ + /T[:]c,nn Choix par dfaut aprs nn secondes.\n\ + texte Texte d'invite afficher.\n\n\ +ERRORLEVEL est modifi l'offset de la touche enfonce parmi les choix." + +STRING_CLS_HELP, "Efface l'cran.\n\nCLS" + +STRING_CMD_HELP1, "\nCommandes internes disponibles :\n" + +STRING_CMD_HELP2, "\nFonctions disponibles :" + +STRING_CMD_HELP3," [alias]" + +STRING_CMD_HELP4," [historique]" + +STRING_CMD_HELP5," [compltion des noms de fichiers faon unix]" + +STRING_CMD_HELP6," [pile de rpertoires]" + +STRING_CMD_HELP7," [redirections et piping]" + +STRING_CMD_HELP8, "Dmarre une nouvelle instance de l'interprteur de commandes de ReactOS.\n\n\ +CMD [/[C|K] commande][/P][/Q][/T:ap]\n\n\ + /C commande Lance la commande spcifie et se termine.\n\ + /K commande Lance la commande spcifie et reste en mmoire.\n\ + /P CMD devient permanent et lance autoexec.bat\n\ + (ne peut tre termin).\n\ + /T:ap Changer la couleur d'arrire/premier plan\n\ + (voir la commande COLOR.)" + + +STRING_COLOR_HELP1, "Change les couleurs de premier et d'arrire plan.\n\n\ +COLOR [attr [/F]] \n\n\ + attr Spcifie l'attribut des couleurs de la console\n\ + /F remplit la console avec l'attribut de couleur\n\n\ +Il y a trois faons de spcifier les couleurs :\n\ +1) [bright] nom on [bright] nom (seules les trois premires lettres \n\ +sont ncessaires)\n\ +2) dcimal on dcimal\n\ +3) deux chiffres hexadcimaux\n\n\ +Les couleurs sont:\n\ +dc hex nom dc hex nom\n\ +0 0 Black(Noir) 8 8 Gray(Bright black)\n\ +1 1 Blue(Bleu) 9 9 Bright Blue\n\ +2 2 Green(Vert) 10 A Bright Green\n\ +3 3 Cyan 11 B Bright Cyan\n\ +4 4 Red(Rouge) 12 C Bright Red\n\ +5 5 Magenta 13 D Bright Magenta\n\ +6 6 Yellow(Jaune) 14 E Bright Yellow\n\ +7 7 White(Blanc) 15 F Bright White" + +STRING_COPY_HELP1, "Ecraser %s (Oui/Non/Tous)? " + +STRING_COPY_HELP2, "Copie un ou plusieurs fichiers vers une autre destination.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\ + [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\ + source Indique le ou les fichiers copier.\n\ + /A Spcifie qu'il s'agit d'un fichier texte ASCII.\n\ + /B Spcifie qu'il s'agit d'un fichier binaire.\n\ + destination Indique le rpertoire ou le nom de fichier\n\ + pour le(s) nouveau(x) fichier(s).\n\ + /V Vrifie que les fichier ont t copis correctement.\n\ + /Y Supprime l'invite de confirmation en cas d'crasement\n\ + d'un fichier destination existant.\n\ + /-Y Affiche un invite de confirmation en cas d'crasement\n\ + d'un fichier destination existant.\n\n\ +Le switch /Y peut tre prsent dans la variable d'environnement COPYCMD.\n" + +STRING_DATE_HELP1, "\nEntrer la nouvelle date (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nEntrer la nouvelle date (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nEntrer la nouvelle date (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "Affiche ou rgle la date.\n\n\ +DATE [/T][date]\n\n\ + /T affiche seulement\n\n\ +Taper DATE sans paramtre pour afficher la date courante\n\ +et une invite pour entrer la nouvelle date.\n\ +Appuyer sur ENTREE pour conserver la mme date." + +STRING_DEL_HELP1, "Efface un ou plusieurs fichiers.\n\n\ +DEL [/N /P /T /Q /W /Y /Z] fichier ...\n\ +DELETE [/N /P /T /Q /W /Y /Z] fichier ...\n\ +ERASE [/N /P /T /Q /W /Y /Z] fichier ...\n\n\ + fichier Specifie le(s) fichier(s) effacer.\n\n\ + /N Rien.\n\ + /P Demande. Demande avant d'effacer pour chaque fichier.\n\ + /T Total. Affiche le total de fichiers effacs et l'espace disque libr.\n\ + /Q Silencieux.\n\ + /W Wipe. Ecrase le fichier avec des nombres alatoire avant d'effacer.\n\ + /Y Oui. Efface, mme *.*, sans demander.\n\ + /Z Zap. Efface les fichiers cachs, en lecture seule et systmes.\n" + +STRING_DEL_HELP2, "Tous les fichiers du rpertoire seront effacs!\n\ +Etes vous sr(e) (O/N)?" +STRING_DEL_HELP3, " %lu fichier effac\n" +STRING_DEL_HELP4, " %lu fichiers effacs\n" + +STRING_DELAY_HELP, "Attend pendant n secondes ou millisecondes\n\ +DELAY [/m]n\n\n\ + /m spcifie que n est en millisecondes\n\ + sinon n est en secondes" + +STRING_DIR_HELP1, "DIR [lecteur:][chemin][fichier] [/A[[:]attributs]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]ordredetri]] [/P] [/Q] [/S] [/T[[:]heure]] [/W] [/X] [/4]\n\n\ + [lecteur:][chemin][fichier]\n\ + Spcifie le disque, le rpertoire, et/ou les fichiers lister.\n\n\ + /A Affiche les fichiers avec les attributs indiqus.\n\ + attributs D Rpertoires R Fichiers en lecture seule\n\ + H Fichiers cachs A Fichiers prts etre archivs\n\ + S Fichiers systmes - Prfixe signifiant non\n\ + /B Utilise le format court (pas d'informations ni de rsum).\n\ + /C Affiche le sparateur de milliers dans les tailles de fichier.\n\ + C'est l'option par dfaut. Utiliser /-C pour dsactiver \n\ + l'affichage du sparateur.\n\ + /D Identique au format large mais les fichiers sont tris\n\ + par colonne.\n\ + /L Utilise les minuscules.\n\ + /N Nouveau format de liste longue o les noms de fichiers sont \n\ + sur la droite.\n\ + /O Lister les fichier de faon trie.\n\ + ordre de N Par nom (alphabtique) S Par taille (plus petit d'abord)\n\ + tri E Par extension tique) D Par date (plus vieux d'abord)\n\ + G Rpertoires d'abord - Prfixe pour inverser l'ordre\n\ + /P S'arrte aprs chaque page d'information.\n\ + /Q Affiche le propritaire du fichier.\n\ + /S Affiche les fichiers dans le rpertoire indiqu et\n\ + tous les sous-rpertoires.\n\ + /T Contrle quel champ de temps sera affich ou utilis\n\ + pour le tri\n\ + C Cration\n\ + A Dernier accs\n\ + W Dernire modification\n\ + /W Utilise le format de liste large.\n\ + /X Ceci affiche les noms de fichiers courts pour les noms \n\ + de fichiers longs. Le format est comme pour /N avec\n\ + le nom de fichier court insr avant le nom de fichier long.\n\ + S'il n'y a pas de nom court, des espaces seront affichs.\n\ + /4 Affiche l'anne sur quatre chiffres.\n\n\ +Les paramtres peuvent tre mmoriss dans la variable d'environnement DIRCMD.\n\ +Modifier les paramtres mmoriss avec un - (tiret)--par exemple, /-W.\n" + +STRING_DIR_HELP2, " Le nom de volume du lecteur %c est %s\n" +STRING_DIR_HELP3, " Le lecteur %c n'a pas de nom de volume\n" +STRING_DIR_HELP4, " Le numro de srie du volume est %04X-%04X\n" +STRING_DIR_HELP5, "\n Total de fichiers lists :\n%16i Fichier(s)% 14s octets\n" +STRING_DIR_HELP6, "%16i fichier(s)% 15s octets\n" +STRING_DIR_HELP7, "\n Rpertoire de %s\n\n" +STRING_DIR_HELP8, "%16i Rep(s)% 14s octets\n" +STRING_DIRSTACK_HELP1, "Stocke le rpertoire courant pour utilisation avec la commande POPD,\n\ +ensuite change de rpertoire vers le rpertoire spcifi.\n\n\ +PUSHD [chemin | ..]\n\n\ + chemin Spcifie le rpertoire qui deviendra le rpertoire courant" + +STRING_DIRSTACK_HELP2, "Change de rperoire vers le rpertoire stock par la commande PUSHD\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Affiche le contenu de la pile de rpertoires.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "Pile de rpertoires vide." + +STRING_ECHO_HELP1, "Affiche un message sans retour chariot ni passage la ligne.\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, "Affiche un message sur le canal d'erreur.\n\n\ + ECHOERR message\n\ + ECHOERR. Affiche une ligne vide sur le canal d'erreur." + +STRING_ECHO_HELP3, "Affiche un message sur le canal d'erreur sans retour chariot\n\ +ni passage la ligne.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Affiche un message ou bascule l'affichage des commandes sur on ou off.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [message]\n\ + ECHO. Affiche une ligne vide.\n\n\ +Taper ECHO sans paramtre pour afficher le rglage ECHO courant." + +STRING_ECHO_HELP5, "ECHO est %s\n" + +STRING_EXIT_HELP, "Sort de de l'interprteur de commandes.\n\nEXIT" + +STRING_FOR_HELP1, "Excute une commande donne pour chaque fichier d'un ensemble de fichiers.\n\ +FOR %variable IN (ensemble) do commande [paramtres]\n\n\ + %variable Spcife un paramtre remplaable.\n\ + (ensemble) Spcifie un ensemble d'un ou plusieurs fichiers.\n\ + Des jokers peuvent tre utiliss.\n\ + commande Spcifie la commande xcuter pour chaque fichier.\n\ + paramtres Spcifie les paramtres ou switchs pour la commande spcifie.\n\n\ +Pour utiliser la comamnde FOR dans un programme batch,\n\ +utiliser %%variable au lieu de %variable." + +STRING_FREE_HELP1, "\nLe nom de volume du lecteur %s est %-11s\n\ +Le numro de srie est %s\n\ + %16s octets d'espace disque total\n\ + %16s octets utiliss\n\ + %16s octets libres\n" + +STRING_FREE_HELP2, "Affiche les information d'un disque.\n\nFREE [lecteur: ...]" + +STRING_GOTO_HELP1, "Dirige CMD vers une ligne nomme dans un script batch.\n\n\ +GOTO label\n\n\ + label Spcifie un champ texte utilis dans un script batch comme un label.\n\n\ +Vous crivez un label seul sur une ligne commenant par un deux-points.\n" + +STRING_IF_HELP1, "Excute un traitement conditionnel dans des programmes batch.\n\n\ + IF [NOT] ERRORLEVEL nombre commande\n\ + IF [NOT] chaine1==chaine2 commande\n\ + IF [NOT] EXIST nomfichier commande\n\ + IF [NOT] DEFINED variable commande\n\n\ +NOT CMD ne lancera la commande que si la condition est fausse.\n\ +ERRORLEVEL nombre La condition sera vraie si le dernier programme lanc\n\ + a retourn un code sortie gal ou suprieur celui indiqu.\n\ +commande Indique la commande lancer si la condition est vrifie.\n\ +chaine1==chaine2 La condition sera vraie si les deux chaines sont identiques.\n\ +EXIST nomfichier La condition sera vraie si le fichier spcifi existe.\n\ +DEFINED variable La condition sera vraie si la variable indique est dfinie." + +STRING_LABEL_HELP1, "Affiche ou change le nom de volume du disque.\n\nLABEL [disque:][nomdevolume]\n" + +STRING_LABEL_HELP2, "Le nom de volume du disque %c: est %s\n" +STRING_LABEL_HELP3, "Le disque %c: n'a pas de nom de volume\n" +STRING_LABEL_HELP4, "Le numro de serie du volume est %04X-%04X\n" +STRING_LABEL_HELP5, "Nom de volume (11 Caractres, ENTREE si aucun)? " + +STRING_LOCALE_HELP1, "L'heure actuelle est " + +STRING_MKDIR_HELP, "Cre un rpertoire.\n\n\ +MKDIR [lecteur:]chemin\nMD [lecteur:]chemin" + +STRING_MEMMORY_HELP1, "Affiche la quantit de mmoire systme.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% de charge mmoire.\n\n\ + %13s octets de RAM physique au total.\n\ + %13s octets de RAM physique disponible.\n\n\ + %13s octets de fichier d'change au total.\n\ + %13s octets de fichier d'change disponible.\n\n\ + %13s octets de mmoire virtuelle au total.\n\ + %13s octets de mmoire virtuelle disponible.\n" + +STRING_MISC_HELP1, "Appuyer sur une touche pour continuer...\n" + +STRING_MOVE_HELP1, "Ecraser %s (Oui/Non/Tous)? " + +STRING_MOVE_HELP2, "Dplace des fichiers ou renomme des fichiers et des rpertoires.\n\n\ +Pouur dplacer un ou plusieurs fichiers:\n\ +MOVE [/N][lecteur:][nomfich1[,...] destination\n\n\ +Pour renommer un rpertoire:\n\ +MOVE [/N][lecteur:][chemin]nomrep1 nomrep2\n\n\ + [lecteur:][chemin]nomfich1 Indique l'endroit et le nom du ou des fichiers\n\ + que vous voulez dplacer.\n\ + /N Nothing. Do everything but move files or directories.\n\n\ +Limitations actuelles :\n\ + - Vous ne pouvez pas dplacer un fichier/rpertoire d'un disque un autre.\n" + +STRING_MSGBOX_HELP, "Affiche une boite de dialogue et retourne la rponse de l'utilisateur\n\n\ +MSGBOX type ['titre'] prompt\n\n\ +type boutons affichs\n\ + les valeurs possibles sont: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +titre titre de la boite de message\n\ +prompt texte affich par la boite de dialogue \n\n\n\ +ERRORLEVEL est modifi suivant le bouton press:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Affiche ou modifie le chemin de recherche pour les fichiers xcutables.\n\n\ +PATH [[lecteur:][chemin;...]]\nPATH ;\n\n\ +Taper PATH ; pour effacer tous les rglages courants\n\ +et indiquer l'interprteur de commandes\n\ +de chercher seulement dans le rpertoire courant.\n\ +Taper PATH sans paramtres pour afficher le chemin courant.\n" + +STRING_PAUSE_HELP1, "Stoppe l'xcution d'un fichier batch et affiche le message suivant:\n\ +'Appuyer sur une touche pour continuer...' ou un message dfini\n\ +par l'utilisateur.\n\n\ +PAUSE\n\ +PAUSE [message]" + +STRING_PROMPT_HELP1, "Change l'invite de commandes.\n\n\ +PROMPT [texte]\n\n\ + texte Indique le nouvel invite de commandes.\n\n\ +L'invite de commandes peut tre compos de caractres normaux et\n\ +des caractres spciaux suivants:\n\n\ + $A & (Et commercial)\n\ + $B | (pipe)\n\ + $C ( (parenthse ouvrante)\n\ + $D Date courante\n\ + $E Code Escape (code ASCII 27)\n\ + $F ) (parenthse fermante)\n\ + $G > (signe suprieur )\n\ + $H Backspace (efface le caractre prcdent)\n\ + $L < (signe infrieur )\n\ + $N Lecteur courant\n\ + $P Lecteur et chemin courants\n\ + $Q = (signe gale)\n\ + $T Heure courante\n\ + $V Numro de version de ReactOS\n\ + $_ Retour chariot/saut de ligne\n\ + $$ $ (signe dollar)" + +STRING_PROMPT_HELP2, " $+ Affiche la hauteur de la pile de rpertoires" + +STRING_PROMPT_HELP3, "\nTaper PROMPT sans paramtres pour changer l'invite celui dfini par dfaut." + +STRING_REM_HELP, "Dmarrer une ligne de commentaire dans un fichier batch.\n\nREM [Commentaire]" + +STRING_REN_HELP1, "Renomme un(des) fichier(s)/rpertoire(s)\n\ +RENAME [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\ +REN [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\n\ + /E Pas de messages d'erreur.\n\ + /N Rien.\n\ + /P Demande de confirmation avant de renommer chaque fichier.\n\ + (Non implment!)\n\ + /Q Silencieux.\n\ + /S Renommer les sous-rpertoires.\n\ + /T Affiche le nombre total de fichiers renomms.\n\n\ +Vous ne pouvez indiquez un autre lecteur/chemin pour la destination.\n\ +Utiliser la commande MOVE dans ce but." + +STRING_REN_HELP2, " %lu fichier renomm\n" + +STRING_REN_HELP3, " %lu fichiers renomms\n" + +STRING_RMDIR_HELP, "Efface un rpertoire.\n\n\ +RMDIR [lecteur:]chemin\nRD [lecteur:]chemin" + +STRING_SCREEN_HELP, "Dplace le curseur, optionnellement affiche du texte\n\n\ +SCREEN lig col [texte]\n\n\ + lig ligne laquelle dplacer le curseur\n\ + col colonne laquelle dplacer le curseur" + +STRING_SET_HELP, "Affiche, modifie ou efface des variables d'environnement.\n\n\ +SET [variable[=][chaine]]\n\n\ + variable Indique le nom de la variable d'environnement.\n\ + chaine Indique une srie de caractres assigner la variable.\n\n\ +Taper SET sans paramtres pour afficher les variables d'environnement courantes.\n" + +STRING_SHIFT_HELP, "Change la position de paramtres remplaables dans un fichier batch.\n\n\ +SHIFT [DOWN]" + +STRING_START_HELP1, "Lance une commande.\n\n\ +START commande\n\n\ + commande Indique la commande lancer.\n\n\ +Pour le moment toutes les commandes sont lances de faon asynchrone.\n" + +STRING_TITLE_HELP, "Change le titre de la fentre de l'invite de commandes.\n\n\ +TITLE [chaine]\n\n\ +chaine Indique le titre de la fentre de l'invite de commandes." + +STRING_TIME_HELP1, "Affiche ou modifie l'heure systme.\n\n\ +TIME [/T][heure]\n\n\ + /T affiche seulement\n\n\ +Taper TIME sans paramtres pour afficher l'heure courante et une invite\n\ +pour la modifier. Presser la touche ENTREE pour garder la mme heure." + +STRING_TIME_HELP2, "Entrer la nouvelle heure: " + +STRING_TIMER_HELP1, "Ecoul %d msecs\n" + +STRING_TIMER_HELP2, "Ecoul %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "Permet l'utilisation de dix chronomtres.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Dmarre le chronomtre\n\ + OFF Stoppe le chronomtre\n\ + /S Split time. Return stopwach split\n\ + time without changing its value\n\ + /n Indique le numro du chronomtre.\n\ + Les chronomtres disponibles vont de 0 10.\n\ + Si non spcifi, le chronomtre par dfaut est 1\n\ + /Fn Format de sortie\n\ + n peut tre :\n\ + 0 millisecondes\n\ + 1 hh%cmm%css%cdd\n\n\ +Si aucun de ON, OFF or /S n'est spcifi la commande\n\ +changera l'tat du chronomtre slectionn\n\n" + +STRING_TYPE_HELP1, "Affiche le contenu de fichiers textes.\n\nTYPE [lecteur:][chemin]nomfich" + +STRING_VERIFY_HELP1, "Cette commande ne fait rien!!\n\ +Spcifie s'il faut verifier que vos fichiers sont crits correctement.\ +\n\n\ +VERIFY [ON | OFF]\n\n\ +Taper VERIFY sans paramtres pour afficher le rglage de VERIFY." + +STRING_VERIFY_HELP2, "VERIFY est %s.\n" + +STRING_VERIFY_HELP3, "Vous devez indiquer ON ou OFF." + +STRING_VERSION_HELP1, "Affiche les information de version du shell\n\n\ +VER [/C][/R][/W]\n\n\ + /C Displays credits.\n\ + /R Displays redistribution information.\n\ + /W Displays warranty information." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version." + +STRING_VERSION_HELP5, "\nEnvoyer les rapports d'erreur .\n\ +Les mises jour sont disponibles : http://www.reactos.org" + +STRING_VERSION_HELP6, "\nVersion FreeDOS crite par:\n" + +STRING_VERSION_HELP7, "\nVersion ReactOS crite par:\n" + +STRING_VOL_HELP1, " Le nom de volume du lecteur %c: est %s\n" +STRING_VOL_HELP2, " Le volume dans le lecteur %c: n'a pas de nom\n" +STRING_VOL_HELP3, " Le numro de srie du volume est %04X-%04X\n" +STRING_VOL_HELP4, "Affiche le nom de volume et le numro de srie du disque s'ils existent.\n\nVOL [lecteur:]\n" + +STRING_WINDOW_HELP1, "Change l'aspect de la fentre de la console\n\n\ +WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\ + [MIN|MAX|RESTORE] ['titre']\n\n\ +/POS indique la position et les dimensions de la fentre\n\ +MIN minimise la fentre\n\ +MAX maximise la fentre\n\ +RESTORE restaure la fentre" + +STRING_WINDOW_HELP2, "Change l'aspect de la fentre de la console\n\n\ +WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\ + [MIN|MAX|RESTORE] ['titre']\n\n\ +/POS indique la position et les dimensions de la fentre\n\ +MIN minimise la fentre\n\ +MAX maximise la fentre\n\ +RESTORE restaure la fentre\n\ +titre titre de la fentre" + +STRING_CHOICE_OPTION "ON" +STRING_COPY_OPTION, "ONT" + +STRING_ALIAS_ERROR, "Ligne de commande trop longue aprs remplacement de l'alias!\n" +STRING_BATCH_ERROR, "Erreur l'ouverture du fichier batch\n" +STRING_CHCP_ERROR1, "Page de codes actuelle : %u\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "Format de paramtre incorrect - %s\n" +STRING_CHCP_ERROR4, "Page de code invalide \n" +STRING_CHOICE_ERROR, "Option invalide. Format attendu: /C[:]options" +STRING_CHOICE_ERROR_TXT, "Option invalide. Format attendu: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "Option invalide : %s" +STRING_CMD_ERROR1, "Ne peut rediriger l'entre depuis le fichier %s\n" +STRING_CMD_ERROR2, "Erreur la cration du fichier temporaire pour les donnes du pipe\n" +STRING_CMD_ERROR3, "Ne peut rediriger vers le fichier %s\n" +STRING_CMD_ERROR4, "Lance %s...\n" +STRING_CMD_ERROR5, "Lance cmdexit.bat...\n" +STRING_COLOR_ERROR1, "L'arrire plan et l'avant plan ne peuvent tre de la mme couleur" +STRING_COLOR_ERROR2, "Erreur dans la spcification des couleurs" +STRING_COLOR_ERROR3, "Couleur %x\n" +STRING_COLOR_ERROR4, "Erreur: mme couleur!" +STRING_CONSOLE_ERROR, "Erreur inconnue: %d\n" +STRING_COPY_ERROR1, "Erreur: Ne peut ouvrir la source - %s!\n" +STRING_COPY_ERROR2, "Erreur: Ne peut copier le fichier sur lui-mme!\n" +STRING_COPY_ERROR3, "Erreur l'criture de la destination!\n" +STRING_COPY_ERROR4, "Erreur: Non implment actuellement!\n" +STRING_DATE_ERROR, "Date invalide." +STRING_DEL_ERROR5, "Le fichier %s va tre effac ! " +STRING_DEL_ERROR6, "Etes vous sr (O/N)?" +STRING_DEL_ERROR7, "Efface : %s\n" +STRING_ERROR_ERROR1, "Erreur inconnue! Code d'erreur : 0x%lx\n" +STRING_ERROR_ERROR2, "Erreur de syntaxe" +STRING_FOR_ERROR1, "'in' manquant." +STRING_FOR_ERROR2, "pas de parenthse trouve." +STRING_FOR_ERROR3, "'do' manquant." +STRING_FOR_ERROR4, "pas de commande aprs 'do'." +STRING_FREE_ERROR1, "Lecteur invalide" +STRING_FREE_ERROR2, "sans nom" +STRING_GOTO_ERROR1, "Pas de label indiqu pour GOTO" +STRING_GOTO_ERROR2, "Label '%s' non trouv\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[Erreur]\n" + +STRING_PATH_ERROR, "CMD: Pas dans l'environnement '%s'\n" + +STRING_REN_ERROR1, "MoveFile() a chou. Erreur: %lu\n" + +STRING_START_ERROR1, "No batch support at the moment!" + +STRING_TIME_ERROR1, "Heure invalide." + +STRING_TYPE_ERROR1, "Option invalide '/%s'\n" + +STRING_WINDOW_ERROR1, "Fentre non trouve" + + +STRING_ERROR_PARAMETERF_ERROR, "Format du paramtre incorrect - %c\n" +STRING_ERROR_INVALID_SWITCH, "Paramtre invalide - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Trop de paramtres - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Chemin non trouv\n" +STRING_ERROR_FILE_NOT_FOUND, "Fichier non trouv\n" +STRING_ERROR_REQ_PARAM_MISSING, "Paramtre requis manquant\n" +STRING_CMD_SHELLINFO, "\n Interprteur de ligne de commandes ReactOS" +STRING_VERSION_RUNVER, " tournant sur %s" +STRING_COPY_FILE, " %d fichier(s) copi(s)\n" +STRING_DELETE_WIPE, "effac(s)" +STRING_FOR_ERROR, "mauvaise variable spcifie." +STRING_SCREEN_COL, "valeur invalide pour col" +STRING_SCREEN_ROW, "valeur invalide pour lig" +STRING_TIMER_TIME "Le timer n%d est %s: " +} diff --git a/reactos/base/shell/cmd/Hu.rc b/reactos/base/shell/cmd/Hu.rc new file mode 100644 index 00000000000..1f1b9c92e08 --- /dev/null +++ b/reactos/base/shell/cmd/Hu.rc @@ -0,0 +1,623 @@ +#include "resource.h" +#include "windows.h" +/* + * Moved all hardcoded strings to En.rc. + * By Magnus Olsen 2005 + * Hungarian resource llomny for ntvdm + * Translation by Robert Horvath (talley at cubeclub.hu) 2005 + */ + +LANGUAGE LANG_HUNGARIAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "llomnyok attribtumok megjelentse vagy belltsai.\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] llomny ...\n\ + [/S [/D]]\n\n\ + + bekapcsol egy attribtumot\n\ + - kikapcsol egy attribtumot\n\ + R rsvdett llomny\n\ + A Archivland llomny\n\ + S Rendszer llomny\n\ + H Rejtett llomny\n\ + /S Minden llomny mdostsa a mappban s minden\n\ + almappbanban\n\ + /D Mappkra is rvnyesti\n\n\ +Ha ATTRIB-ot paramter nlkl rod be, megjelenti a mappban tallhat sszes llomnyt s annak attribtumt.\n" + +STRING_ALIAS_HELP, "Aliasok megjelentse, hozzadsa s trlse\n\n\ +ALIAS [alias=[parancs]]\n\n\ + alias Alias neve.\n\ + parancs A szveg amit behelyettest.\n\n\ +Aliasok megjelentse:\n\ + ALIAS\n\n\ +Egy j hozzadsa vagy meglv helyettestlse:\n\ + ALIAS da=dir a:\n\n\ +Egy alias trlse:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Hangjelzs leadsa a speakerbl.\n\nBEEP\n" + +STRING_CALL_HELP, "Ktegelt parancsfjl meghvsa egy msikbl.\n\n\ +CALL [ktet:][elrsi_t]llomny [paramterek]\n\n\ + paramterek Itt adhat meg a szksges paramterlista" + +STRING_CD_HELP, "Az aktulis mappa nevnek a megjelentse vagy vlts msikra\n\n\ +CHDIR [/D][meghajt:][elrsi_t]\n\ +CHDIR[..|.]\n\ +CD [/D][meghajt:][elrsi_t]\n\ +CD[..|.]\n\n\ + .. Szl mappa\n\ + /D Megvltoztatja az aktulis mappt s meghajtt is.\n\n\ +rd be, hogy 'CD meghajt:' hogy ki rja az aktulis mappt.\n\ +rd be a CD-t paramterek nlkl, hogy megjelentse az aktulis meghajtt s mappt (ugyanaz mint az elz).\n" + +STRING_CHCP_HELP, "Megjelenti vagy megvltoztatja az aktv kdlapot.\n\n\ +CHCP [nnn]\n\n\ + nnn A hasznlni kvnt kdlap szma.\n\n\ +rd be a CHCP paramterek nlkl, hogy megjelentse az aktv kdlapot.\n" + +STRING_CHOICE_HELP, "Vr a felhasznlra, hogy vlasszon a felknlt lehetsgek kzl.\n\n\ +CHOICE [/C[:]vlasztsi lehetsgek][/N][/S][/T[:]c,nn][szveg]\n\n\ + /C[:]vlasztsi lehetsgek Megengedett billentyk. Alaprtelmezett: YN. <-- Yes->Igen\n\ + /N Elrejti a vlasztsi lehetsgeket s a krdjelet.\n\ + /S Kis- s nagybetk megklnbztetse.\n\ + /T[:]v,nn A v lehetsget vlasztja nn msodperc utn.\n\ + szveg Megjelentend szveg.\n\n\ +Az ERRORLEVEL a vlasz sorszmra lesz belltva.\n" + +STRING_CLS_HELP, "Trli a kpernyt.\n\nCLS\n" + +STRING_CMD_HELP1, "\nElrhet bels parancsok:\n" + +STRING_CMD_HELP2, "\nElrhet lehetsgek:" + +STRING_CMD_HELP3," [aliasok]" + +STRING_CMD_HELP4," [elzmnyek]" + +STRING_CMD_HELP5," [unix tpus llomnynv kiegszts]" + +STRING_CMD_HELP6," [mappa tr]" + +STRING_CMD_HELP7," [tirnytsok s csvezetkek]" + +STRING_CMD_HELP8, "Elindt egy j ReactOS parancssor rtelmez.\n\n\ +CMD [/[C|K] parancs][/P][/Q][/T:eh]\n\n\ + /C parancs Vgrehajtja a parancsot, majd kilp.\n\ + /K parancs Vgrehajtja a parancsot, s tovbb fut az rtelmez.\n\ + /P rtelmezi az autoexec.bat llomnyt s a memriban marad.\n\ + /T:eh COLOR parancs hasznlata.\n" + +STRING_COLOR_HELP1, "A konzol el- s httrsznt lltja be.\n\n\ +COLOR [eh [/-F]] \n\n\ + eh A konzol el- s httrsznt lltja be.\n\ + /-F Nem frissti az egsz kpernyt\n\n\ +A sznt kt hexadecimlis szmjeggyel lehet belltani\n\n\ +Az elrhet sznek:\n\ +hex nv hex nv\n\ +0 Fekete 8 Szrke\n\ +1 Sttkk 9 Kk\n\ +2 Sttzld A Zld\n\ +3 Sttlila B Trkzkk\n\ +4 Bord C Vrs\n\ +5 Ciklmen D Ciklmen\n\ +6 Olva E Srga\n\ +7 Vilgos szrke F Fehr\n" + +STRING_COPY_HELP1, "Fellrja a kvetkezt: %s (Igen/Nem/Mind)? " + +STRING_COPY_HELP2, "Egy vagy tbb llomnyt msol a megadott helyre.\n\n\ +COPY [/V][/Y|/-Y][/A|/B] forrs [/A|/B]\n\ + [+ forrs [/A|/B] [+ ...]] [cl [/A|/B]]\n\n\ + forrs Megadott llomny(ok)at fogja msolni.\n\ + /A Ez ASCII szveg llomny.\n\ + /B Ez binris llomny.\n\ + cl Megadja a cl mappt s/vagy az (j) llomnynevet.\n\ + /V Ellenrzi a msolst.\n\ + /Y Igennel vlaszol krdsnl.\n\ + /-Y Nemmel vlaszol krdsnl.\n\n\ +Az /Y kapcsolt a COPYCMD krnyezeti vltozban is hasznlhat.\n" + +STRING_DATE_HELP1, "\nj dtum (hh%cnn%c): " + +STRING_DATE_HELP2, "\nj dtum (nn%chh%c): " + +STRING_DATE_HELP3, "\nj dtum (%chh%cnn): " + +STRING_DATE_HELP4, "Megjelenti vagy belltja a rendszerdtumot.\n\n\ +DATE [/T][dtum]\n\n\ + /T Csak megjelenti\n\n\ +rd be a DATE parancsot paramter nlkl, hogy megjelentse a rendszer dtumot s bekrjen egy jat.\n\ +Nyomj ENTERT-t, ha nem akarsz vltoztatni.\n" + +STRING_DEL_HELP1, "Eltvolt egy vagy tbb llomnyt.\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attribtumok]] llomny ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attribtumok]] llomny ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attribtumok]] llomny ...\n\n\ + llomny Trlsre kijell llomny(ok).\n\n\ + /N Nem csinl semmit.\n\ + /P Rkrdezs minden llomnynl.\n\ + /T Statisztika megjelentse a vgn.\n\ + /Q Csendes zemmd.\n\ + /W Wipe. Overwrite the llomny with random numbers before deleting it.\n\ + /Y Minden vlaszra igen. Figyelem, *.*-ot is trli!!\n\ + /F Rejtett, csak olvashat s rendszer llomnyokat is trl.\n\ + /S Almappkban is trli az llomnyokat\n\ + /A Attribtumok alapjn trli az llomnyokat.\n\ + attributes\n\ + R Csak olvashat llomnys\n\ + S Rendszer llomny\n\ + A Archivlt llomny\n\ + H Rejtett llomnys\n\ + - ""Nem"" prefix\n" + +STRING_DEL_HELP2, "Minden llomny trlve lesz a mappban!\nBiztosan ezt akarod (I/N)?" +STRING_DEL_HELP3, " %lu llomny trlve\n" +STRING_DEL_HELP4, " %lu llomny trlve\n" + +STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\ +DELAY [/m]n\n\n\ + /m specifiy than n are milliseconds\n\ + otherwise n are seconds\n" + +STRING_DIR_HELP1, "DIR [meghajt:][elrsi_t][llomnynv] [/A[[:]attribtumok]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]rendezsi_felttel]] [/P] [/Q] [/S] [/T[[:]id]] [/W] [/X] [/4]\n\n\ + [meghajt:][elrsi_t][llomnyname]\n\ + Az adott hely llomnyait s mappit jelenti meg.\n\n\ + /A A megadott attribtumu llomnyokat jelenti csak meg.\n\ + attributes D Mappk R Csak olvashat llomny\n\ + H Rejtett llomny A Archivland llomny\n\ + S Rendszer llomny - ""Nem"" prefix\n\ + /B Fejlc s sszefoglal nlkl.\n\ + /C Ezres elvlaszt jel hasznlata. Ez az alaprtelmezett, /-C a kikapcsolsa.\n\ + /D Szles megjelents, oszlop szerint rendezve.\n\ + /L Kisbetk hasznlata.\n\ + /N New long list format where llomnynames are on the far right.\n\ + /O Rendezs az albbiak szerint.\n\ + sortorder N Nv alapjn (ABC sorrend) S Mret alapjn (nvekv)\n\ + E Kiterjeszts alapjn (ABC sorrend) D Dtum/id alapjn (legrgebbi elejn)\n\ + G Mappk legell - ""Nem"" prefixel fordtott rendezs\n\ + /P Csak egy kpernynyi adat megjelentse egyszerre.\n\ + /Q llomny tulajdonsosnak megjelentse.\n\ + /S Almappk tartalmt is megjelenti.\n\ + /T Controls which time field displayed or used for sorting\n\ + timefield C Ltrehozs\n\ + A Utols megtekints\n\ + W Utols mdosts\n\ + /W Szles megjelents.\n\ + /X This displays the short names generated for non-8dot3 llomny\n\ + names. The format is that of /N with the short name inserted\n\ + before the long name. If no short name is present, blanks are\n\ + displayed in its place.\n\ + /4 Ngy szmjegy v\n\n\ +A kapcsolk a DIRCMD krnyezeti vltozban is lehetnek.\n" + +STRING_DIR_HELP2, " A (%c) meghajtban tallhat ktet %s\n" +STRING_DIR_HELP3, " A (%c) meghajtban tallhat ktetnek nincs cmkje.\n" +STRING_DIR_HELP4, " A ktet sorozatszma: %04X-%04X\n" +STRING_DIR_HELP5, "\n sszes llomny:\n%16i llomny(ok)% 14s bjt\n" +STRING_DIR_HELP6, "%16i Mappa %15s bjt" +STRING_DIR_HELP7, "\n %s tartalma\n\n" +STRING_DIR_HELP8, "%16i llomny %14s bjt\n" + +STRING_DIRSTACK_HELP1, "Megjegyzi az aktulis mappt, majd tvlt egy masikra.\n\n\ +PUSHD [elrsi_t | ..]\n\n\ + elrsi_t Ebbe a mappba fog tvltani\n" + +STRING_DIRSTACK_HELP2, "Visszalp a PUSHD ltal megjegyzett mappba.\n\nPOPD" + +STRING_DIRSTACK_HELP3, "Megjelenti a megjegyzett mappkat.\n\nDIRS" + +STRING_DIRSTACK_HELP4, "res a tr" + +STRING_ECHO_HELP1, "Megjelenti a szveget j sor nlkl.\n\n\ + ECHOS szveg" + +STRING_ECHO_HELP2, "Displays a message to the standard error.\n\n\ + ECHOERR szveg\n\ + ECHOERR. j sor" + +STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carridge return and line feed.\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, "Megjelent egy szveget, vagy belltja a visszhangot.\n\n\ + ECHO [ON | OFF]\n\ + ECHO [zenet]\n\ + ECHO. j sor\n\n\ +Paramter nlkl megjelenti a visszang llapott." + +STRING_ECHO_HELP5, "Az ECHO %s\n" + +STRING_EXIT_HELP, "Kilp a parancssor rtelmezbl.\n\nEXIT\n" + +STRING_FOR_HELP1, "Vgrehajt egy parancsot az sszes fjlban a megadott mappkban\n\n\ +FOR %vltoz IN (csoport) DO parancs [paramterek]\n\n\ + %vltoz A cserlhet paramter.\n\ + (csoport) llomnyok csoportja. Joker-karakterek megengedettek EZT KURVRA TKELL FORDTANI :)) wildcardok helyett?.\n\ + parancs Ezt a parancsot hajtja vgre minden egyes llomnnyal.\n\ + paramterek Ezeket a paramtereket adja meg a parancsnak.\n\n\ +A batch llomnyban val haszlathoz %%vltoz kell a %vltoz helyett.\n" + +STRING_FREE_HELP1, "\nA (%s) meghajtban lv ktet cmkje %-11s\n\ + Sorozatszm: %s\n\ + %16s bjt a teljes hely\n\ + %16s bjt hasznlva\n\ + %16s bjt szabad\n" + +STRING_FREE_HELP2, "Ktet mret informcik.\n\nFREE [meghajt: ...]\n" + +STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\ + IF [NOT] ERRORLEVEL number command\n\ + IF [NOT] string1==string2 command\n\ + IF [NOT] EXIST llomnyname command\n\ + IF [NOT] DEFINED variable command\n\n\ +NOT Specifies that CMD should carry out the command only if\n\ + the condition is false\n\ +ERRORLEVEL number Specifies a true condition if the last program run returned\n\ + an exit code equal or greater than the number specified.\n\ +command Specifies the command to carry out if the condition is met.\n\ +string1==string2 Specifies a true condition if the specified text strings\n\ + match.\n\ +EXIST llomnyname Specifies a true condition if the specified llomnyname exists.\n\ +DEFINED variable Specifies a true condition if the specified variable is\n\ + defined.\n" + +STRING_GOTO_HELP1, "tirnyt egy msik cmkre a batch llomnyban.\n\n\ +GOTO cmke\n\n\ + cmke A megadott cmkre fog ugrani az rtelmez.\n\n\ +Egy cmkt egy sorban lehet megadni, ':' -tal kezdve." + +STRING_LABEL_HELP1, "A ktet cmkjt megjelenti, vagy megvltoztatja.\n\n\ +LABEL [meghajt:] [j_cmke]\n" + +STRING_LABEL_HELP2, "A (%c) meghajtban lv ktet cmkje %s\n" +STRING_LABEL_HELP3, "A (%c) megjajtban lv ktetnek nincs cmkje.\n" +STRING_LABEL_HELP4, "A ktet sorozatszma %04X-%04X\n" +STRING_LABEL_HELP5, "j ktetcmke (11 bet, ENTER ha res)? " + +STRING_LOCALE_HELP1, "Az aktulis id:" + +STRING_MKDIR_HELP, "Ltrehoz egy j mappt.\n\n\ +MKDIR [meghajt:]path\nMD [meghajt:]path" + +STRING_MEMMORY_HELP1, "Megjelenti a memria statisztikt.\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n A memria %12s%%-a foglalt.\n\n\ + %13s bjtnyi teljes fizikai memria.\n\ + %13s bjtnyi elrhet memria.\n\n\ + %13s bjt a lapozllomny.\n\ + %13s bjtnyi elrhet a lapozllomnyban.\n\n\ + %13s bjt a teljes virtulis memria.\n\ + %13s bjtnyi elrhet a virtulis memribl.\n" + +STRING_MISC_HELP1, "A folytatshoz nyomj meg egy billentyt . . .\n" + +STRING_MOVE_HELP1, "Fellrja %s (Igen/Nem/Mind)? " + +STRING_MOVE_HELP2, "thelyezi s tnevezi az llomnyokat a mappkban.\n\n\ +Egy vagy tbb llomny thelyezshez:\n\ +MOVE [/N][meghajt:][elrsi_t]llomny1[,...] cl\n\n\ +Mappa tnevezse:\n\ +MOVE [/N][meghajt:][elrsi_t]mappa1 mappa2\n\n\ + [meghajt:][elrsi_t]llomny1 tnevezend llomnyok forrsa.\n\ + /N Nem helyez t semmit.\n\n\ +Hinyossgok:\n\ + - Nem lehet meghajtk kztt thelyezni llomnyokat.\n" + +STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\ +MSGBOX type ['title'] prompt\n\n\ +type button displayed\n\ + possible values are: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +title title of message box\n\ +prompt text displayed by the message box\n\n\n\ +ERRORLEVEL is set according the button pressed:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "Megjelenti vagy belltja a keressi tvonalakat.\n\n\ +PATH [[meghajt:]elrsi_t[;...]]\n\ +PATH ; Keressi tvonalak trlse\n\n\ +A PATH trlshez a kvetkezt rd be: PATH ;\n\ +gy csak az aktulis mappban fog keresni a CMD.\ +Paramterek nlkl az rvnyes keressi tvonalakat mutatja meg.\n" + +STRING_PROMPT_HELP1, "Parancssor belltsa.\n\n\ +PROMPT [szveg]\n\n\ + szveg Az j parancssor megadsa.\n\n\ +A parancssor specilis kdokat is tartalmazhat:\n\n\ + $A & (s jel)\n\ + $B | (cs)\n\ + $C ( (kezd rzjel)\n\ + $D Aktulis dtum\n\ + $E Escape-kd (ASCII 27-es kd)\n\ + $F ) (zr zrjel)\n\ + $G > ('nagyobb' jel)\n\ + $H Trls (eltte lv karaktert trli)\n\ + $L < ('kissebb' jel)\n\ + $N Aktulis meghajt\n\ + $P Aktulis meghajt s mappa\n\ + $Q = (egyenlsg jel)\n\ + $T Aktulis id\n\ + $V OS verziszm\n\ + $_ jsor\n\ + $$ $ (dollr jel)\n" + +STRING_PAUSE_HELP1, "Felfggeszti a futst, s vr a felhasznlra. A kvetkez zenet jelenik meg:\n\ +'A folytatshoz nyomj meg egy billentyt . . .' vagy egy ltalad vlasztott zenet.\n\n\ +PAUSE [message]" + +STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" + +STRING_PROMPT_HELP3, "\nHa paramter nlkl berod a PROMPT parancsot, vissza ll az alaprtelmezettre a kijelzs." + +STRING_REM_HELP, "Megjegyzst jell sor batch fjlokban.\n\nREM [megjegyzs]" + +STRING_RMDIR_HELP, "Eltvolt egy mappt.\n\n\ +RMDIR [meghajt:]elrsi_t\nRD [meghajt:]elrsi_t" + +STRING_REN_HELP1, "tnevez egy llomnyt.\n\n\ +RENAME [/E /N /P /Q /S /T] rgi_nv ... j_nv\n\ +REN [/E /N /P /Q /S /T] rgi_nv ... j_nv\n\n\ + /E Hibazenetek elrejtse.\n\ + /N Ne csinljon semmit .\n\ + /P Minden llomnynl rkrdez. (Mg NEM mkdik!!)\n\ + /Q Csendes mkds.\n\ + /S Almappkat is tnevez.\n\ + /T sszes tnevezett fjl s llomny.\n\n\ +Csak az aktulis meghajtn s mappban fog mkdni.\n\ +Ha ez nem elg, hasznld a MOVE parancsot." + +STRING_REN_HELP2, " %lu llomny tnevezve\n" + +STRING_REN_HELP3, " %lu llomny tnevezve\n" + +STRING_SHIFT_HELP, "Eltolja a helyettesthet paramterek pozcijt a batch llomnyban.\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "Megvltoztatja a kurzos pozcijt, vagy megjelent adott pozciban egy szveget.\n\n\ +SCREEN sor oszlop [szveg]\n\n\ + sor Ugrs sora\n\ + oszlop Ugrs oszlopa" + +STRING_SET_HELP, "Megjelenti vagy belltja a krnyezeti vltozkat.\n\n\ +SET [vltoz[=][rtk]]\n\n\ + vltoz Krnyezeti vltoz neve.\n\ + rtk A belltand rtk.\n\n\ +Paramterek nlkl megjelenti az sszes krnyezetivltozt.\n" + +STRING_START_HELP1, "Vgrehajt egy parancsot.\n\n\ +START parancs\n\n\ + parancs Vgrehajtja a megadott parancsot.\n\n\ +Jelenleg minden parancs aszinkron hajtdik vgre.\n" + +STRING_TITLE_HELP, "Belltja az ablak cmsornak szvegt.\n\n\ +TITLE [szveg]\n\n\ +szveg Belltja az ablak cmsornak szvegt.\n" + +STRING_TIME_HELP1, "Megjelenti vagy belltja a rendszeridt.\n\n\ +TIME [/T][id]\n\n\ + /T Csaj megjelenti\n\n\ +Paramterek nlkl megjelenti az aktulis idt s kr egy jat.\n\ +Csak egy ENTER megnyomsval nem lltja t.\n" + +STRING_TIME_HELP2, "j id: " + +STRING_TIMER_HELP1, "Eltelt %d ezred msodperc\n" + +STRING_TIMER_HELP2, "Eltelt: %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, "allow the use of ten stopwaches.\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON Stopper bekapcsolsa\n\ + OFF Stopper kikapcsolsa\n\ + /S Split time. Return stopwatch split\n\ + time without changing its value\n\ + /n Stopper azonost megadsa.\n\ + Stopwaches avaliable are 0 to 9\n\ + If it is not specified default is 1\n\ + /Fn Format for output\n\ + n can be:\n\ + 0 milliseconds\n\ + 1 hh%cmm%css%cdd\n\n\ +if none of ON, OFF or /S is specified the command\n\ +will toggle stopwach state\n\n" + +STRING_TYPE_HELP1, "Megjelenti az llomnyok tartalmt.\n\n\ +TYPE [meghajt:][elrsi_t]llomnynv \n\ + /P Csak egy kpernynyi tartalmat jelent meg egyszerre.\n" + +STRING_VERIFY_HELP1, "Ez a parancs mg nem mkdik!!\n\ +Lemezre rs utni ellenrzst lltja be.\n\n\ +VERIFY [ON | OFF]\n\n\ +rd be a VERIFY-t paramterek nlkl, hogy megjelentse aktulis llapott.\n" + +STRING_VERIFY_HELP2, "Az ellenrzs jelenleg %s.\n" + +STRING_VERIFY_HELP3, "Csak az ON vagy OFF elfogadott." + +STRING_VERSION_HELP1, "A ReactOS verziinformciit jelenti meg\n\n\ +VER [/C][/R][/W]\n\n\ + /C Ksztk nvsora.\n\ + /R Terjesztsi informcik.\n\ + /W Jtllsi informcik." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n" + +STRING_VERSION_HELP5, "\nHibkrl E-Maileket ide kldhetsz: .\n\ +Frisstsek s egyb informcik: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nA FreeDOS kszti:\n" + +STRING_VERSION_HELP7, "\nA ReactOS kszti:\n" + +STRING_VOL_HELP1, " A (%c) meghajtban lv ktet: %s\n" +STRING_VOL_HELP2, " A (%c) meghajtban lv ktetnek nincs cmkje" +STRING_VOL_HELP3, " A ktet sorozatszma %04X-%04X\n" +STRING_VOL_HELP4, "A ktet cmkjnek s sorozatszmnak megjelentse, ha lteznek.\n\nVOL [meghajt:]" + +STRING_WINDOW_HELP1, "change console window aspect\n\n\ +WINDOW [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window" + +STRING_WINDOW_HELP2, "change console window aspect\n\n\ +ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +window tile of window on wich perform actions\n\ +/POS specify window placement and dimensions\n\ +MIN minimize the window\n\ +MAX maximize the window\n\ +RESTORE restore the window\n\ +title new title\n" + + +STRING_HELP1, "Tmogatott parancsok megjelentse\n\n\ + parancs /? Tbb (rszletes) informci megtekintshez hasznld ezt.\n\n\ +? Minden tmogatott parancs megjelentse (rszletek nlkl).\n\ +ALIAS Megjelenti, vagy megvltoztatja az aliasokat.\n\ +ATTRIB Megjelenti vagy megvltoztatja az llomnyok attribtumt.\n\ +BEEP Megszlaltatja a hangszrt.\n\ +CALL Batch llomnybl egy msik batch llomny meghvsa.\n\ +CD Megjelenti vagy tvlt egy msik mappba.\n\ +CHCP Megjelenti vagy megvltoztatja az aktv kdlapot.\n\ +CHOICE Vr a felhasznlra, hogy vlasszon a felknlt lehetsgek kzl.\n\ +CLS Letrli a kpernyt.\n\ +CMD Egy j pldnyt indt a ReactOS parancsrtelmezjbl.\n\ +COLOR A konzol el- s httrsznt lltja be.\n\ +COPY Egy vagy tbb llomnyt msol a megadott helyre.\n\ +DATE Megjelenti vagy belltja a rendszerdtumot.\n\ +DELETE Eltvolt egy vagy tbb llomnyt.\n\ +DIR Megjelenti a mappban tallhat almappkat s llomnyokat.\n\ +ECHO Megjelent egy szveget, vagy belltja a visszhangot.\n\ +ERASE Eltvolt egy vagy tbb fjlt.\n\ +EXIT Kilp a parancssor rtelmezbl.\n\ +FOR Vgrehajt egy parancsot az sszes fjlban a megadott mappkban.\n\ +FREE Megjelenti a szabad hely mrett.\n\ +GOTO tirnyt egy msik cmkre a batch llomnyban.\n\ +HELP Segtsget ad a ReactOS parancsairl.\n\ +HISTORY Megjelenti az ebben az ablakban kiadott parancsok listjt.\n\ +IF Feltteles vgrehajts batch llomnyokban.\n\ +LABEL Belltja egy ktet cmkjt.\n\ +MD Ltrehoz egy j mappt.\n\ +MKDIR Ltrehoz egy j mappt.\n\ +MOVE thelyez egy vagy tbb llomnyt az egyik mappbl a msikba.\n\ +PATH Megjelenti vagy belltja a keressi tvonalakat.\n\ +PAUSE Felfggeszti a futst, s vr a felhasznlra.\n\ +POPD Visszalp a PUSHD ltal megjegyzett mappba.\n\ +PROMPT Parancssor belltsa.\n\ +PUSHD Megjegyzi az aktulis mappt, majd tvlt egy masikra.\n\ +RD Trl egy mappt.\n\ +REM Megjegyzst jell sor batch fjlokban.\n\ +REN tnevez egy llomnyt.\n\ +RENAME tnevez egy llomnyt.\n\ +RMDIR Trl egy mappt.\n\ +SCREEN Megvltoztatja a kurzos pozcijt, vagy megjelent adott pozciban egy szveget.\n\ +SET Megjelenti vagy belltja a krnyezeti vltozkat.\n\ +SHIFT Eltolja a helyettesthet paramterek pozcijt a batch llomnyban.\n" +STRING_HELP2, "START Egy j ablakban hajtha vgre a parancsot.\n\ +TIME Megjelenti vagy belltja a rendszeridt.\n\ +TIMER Idztk kezelst teszi lehetve.\n\ +TITLE Belltja az ablak cmsornak szvegt.\n\ +TYPE Megjelenti egy llomny tartalmt.\n\ +VER Megjelenti a ReactOS verzi informcijt.\n\ +VERIFY rsi mveletek ellenrzst vezrli\n\ +VOL Megjelenti egy ktet cmkjt s sorozatszmt.\n" + + +STRING_CHOICE_OPTION, "IN" +STRING_COPY_OPTION, "INM" + + +STRING_ALIAS_ERROR, "A parancssor tl hossz az alias kibontsakor!\n" +STRING_BATCH_ERROR, "Hiba a batch llomny megnyitsakor\n" +STRING_CHCP_ERROR1, "Aktv kdlap: %u\n" +STRING_CHCP_ERROR4, "rvnytelen kdlap\n" +STRING_CHOICE_ERROR, "rvnytelen paramter. Vrt formtum: /C[:]vlasztsi lehetsgek" +STRING_CHOICE_ERROR_TXT, "rvnytelen paramter. Vrt formtum: /T[:]v,nn" +STRING_CHOICE_ERROR_OPTION, "rvnytelen paramter: %s" +STRING_CMD_ERROR1, "Nem lehet tirnytani a bevitelt a(z) %s llomnybl\n" +STRING_CMD_ERROR2, "Hiba a csvezetkhez tartoz ideiglenes llomny ltrehozsakor\n" +STRING_CMD_ERROR3, "Nem lehet a(z) %s llomnyba tirnytani\n" +STRING_CMD_ERROR4, "%s futtatsa...\n" +STRING_CMD_ERROR5, "cmdexit.bat futtatsa...\n" +STRING_COLOR_ERROR1, "Ugyanaz a szn nem lehet! (Az el- s httrszn nem lehet ugyanolyan)" +STRING_COLOR_ERROR2, "Hibs szn megads" +STRING_COLOR_ERROR3, "Szn %x\n" +STRING_COLOR_ERROR4, "Ugyanaz a szn nem lehet!" +STRING_CONSOLE_ERROR, "Ismeretlen hiba: %d\n" +STRING_COPY_ERROR1, "Hiba: a forrs nem nyithat meg - %s!\n" +STRING_COPY_ERROR2, "Hiba: nem msolhatod nmagra az llomnyt!\n" +STRING_COPY_ERROR3, "Hiba a cl rsa kzben!\n" +STRING_COPY_ERROR4, "Hiba: ez mg nem mkdik!\n" +STRING_DATE_ERROR, "rvnytelen dtum." +STRING_DEL_ERROR5, "A(z) %s llomny trlve lesz! " +STRING_DEL_ERROR6, "Biztos vagy benne (I/N)?" +STRING_DEL_ERROR7, "Trls: %s\n" +STRING_ERROR_ERROR1, "Ismeretlen hiba! Hiba kd: 0x%lx\n" +STRING_ERROR_ERROR2, "Szintaxis hiba" +STRING_FOR_ERROR1, "az 'in' utn hinyzik a felttel." +STRING_FOR_ERROR2, "nincs zrjel megadva." +STRING_FOR_ERROR3, "a 'do' hinyzik." +STRING_FOR_ERROR4, "nincs parancs a 'do' utn." +STRING_FREE_ERROR1, "rvnytelen meghajt" +STRING_FREE_ERROR2, "nincs cimkzve" +STRING_GOTO_ERROR1, "Nem lett cimke megadva a GOTO utn" +STRING_GOTO_ERROR2, "A '%s' cimke nem tallhat\n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[HIBA]\n" + +STRING_REN_ERROR1, "Movellomny() sikertelen. Hiba: %lu\n" + +STRING_START_ERROR1, "Nincs batch tmogats jelenleg!" + +STRING_TIME_ERROR1, "rvnytelen id." + +STRING_TYPE_ERROR1, "rvnytelen bellts '/%s'\n" + +STRING_WINDOW_ERROR1, "Az ablak nem tallhat" + + +STRING_ERROR_PARAMETERF_ERROR, "A paramter megads hibs - %c\n" +STRING_ERROR_INVALID_SWITCH, "rvnytelen kapcsol - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "Tl sok paramter - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "Az elrsi_t nem hallhat\n" +STRING_ERROR_FILE_NOT_FOUND, "Az llomny nem tallhat\n" +STRING_ERROR_REQ_PARAM_MISSING, "Egy szksges paramter hinyzik\n" +STRING_ERROR_INVALID_DRIVE, "rvnytelen meghajt\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "rvnytelen paramter megads - %s\n" +STRING_ERROR_BADCOMMAND, "Ismeretlen parancs vagy llomny nv\n" +STRING_ERROR_OUT_OF_MEMORY, "Nincs elg memria.\n" +STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary llomny!\n" +STRING_ERROR_D_PAUSEMSG, "A folytatshoz nyomj meg egy billentyt . . ." +STRING_ERROR_DRIVER_NOT_READY, "A meghajt nem ll kszen" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Parancssor rtelmez" +STRING_VERSION_RUNVER, " running on %s" +STRING_COPY_FILE , " %d llomny msolva\n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, "Hibs vltoz." +STRING_SCREEN_COL, "rvnytelen rtk oszlopnak" +STRING_SCREEN_ROW, "rvnytelen rtk sornak" +STRING_TIMER_TIME "Idzt %d rtke %s: " +} diff --git a/reactos/base/shell/cmd/Ja.rc b/reactos/base/shell/cmd/Ja.rc new file mode 100644 index 00000000000..f8c1077e35b --- /dev/null +++ b/reactos/base/shell/cmd/Ja.rc @@ -0,0 +1,658 @@ +#include "windows.h" +#include "resource.h" +/* + * Moved all hardcoded strings to En.rc. + * By Magnus Olsen 2005 + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, "t@C\\܂͕ύX܂B\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [t@C] ...\n\ + [/S [/D]]\n\n\ + + ݒ肵܂B\n\ + - ܂B\n\ + R ǂ݂ƂpB\n\ + A A[JCuB\n\ + S VXe t@CB\n\ + H Bt@CB\n\ + /S ݂̃tH_ƂׂẴTutH_̈vt@C\n\ + ܂B\n\ + /D tH_܂B\n\n\ +p[^w肵Ȃ ATTRIB Ɠ͂ƁAׂẴt@C̑\\܂B\n" + +STRING_ALIAS_HELP, "GCAX̐ݒAGCAX\\肵܂B\n\n\ +ALIAS [GCAX=[R}h]]\n\n\ + GCAX GCAXƂÂ閼OB\n\ + R}h GCAXƂĐݒ肷镶B\n\n\ +ׂẴGCAXꗗ\\ɂ:\n\ + ALIAS\n\n\ +VɃGCAXݒ肵ÃGCAXuɂ:\n\ + ALIAS da=dir a:\n\n\ +GCAX̃XgGCAX菜ɂ:\n\ + ALIAS da=" + +STRING_BEEP_HELP, "Xs[Jr[v‚炵܂B\n\nBEEP\n" + +STRING_CALL_HELP, "ob` vOʂ̃ob` vOĂяo܂B\n\n\ +CALL [hCu:][pX]t@C [ob`p[^]\n\n\ + ob`p[^ ob` vOŕKvȃR}h C\n\ + w肵܂B" + +STRING_CD_HELP, "݂̃fBNgύXAfBNg\\肵܂B\n\n\ +CHDIR [/D][hCu:][pX]\n\ +CHDIR[..|.]\n\ +CD [/D][hCu:]pX]\n\ +CD[..|.]\n\n\ + .. efBNg\n\ + . ݂̃fBNg\n\ + /D ݂̃hCuƃfBNg̗ύX܂B\n\n\ +CD hCu: Ɠ͂Ǝw肳ꂽhCǔ݂̃fBNg\\܂B\n\ +p[^w肵Ȃ CD Ɠ͂ƁÃ݂hCuƃfBNg\\܂B\n" + +STRING_CHCP_HELP, "݂̃R[h y[Wԍ\\܂͐ݒ肵܂B\n\n\ +CHCP [nnn]\n\n\ + nnn R[h y[Wԍw肵܂B\n\n\ +݂̃R[h y[Wԍ\\Ƃ́Ap[^w肹 CHCP Ɠ͂ĂB\n" + +STRING_CHOICE_HELP, "[U[I‚Î҂܂B\n\n\ +CHOICE [/C[:]I][/N][/S][/T[:]c,nn][]\n\n\ + /C[:]I L[͂w肵܂BftHg YN łB\n\ + /N vvg̍̕ŌɁAI ? \\܂B\n\ + /S L[͂̑啶Eʂ܂B\n\ + /T[:]c,nn nn bo߂ƎI c I܂B\n\ + \\vvg̕łB\n\n\ +[U[IɂL[ƁÃItZbg ERRORLEVEL ɃZbg܂B\n" + +STRING_CLS_HELP, "ʂ܂B\n\nCLS\n" + +STRING_CMD_HELP1, "\npłR}h:\n" + +STRING_CMD_HELP2, "\npł@\\:" + +STRING_CMD_HELP3," [GCAX]" + +STRING_CMD_HELP4," [qXg]" + +STRING_CMD_HELP5," [UNIX t@C⊮]" + +STRING_CMD_HELP6," [fBNg X^bN]" + +STRING_CMD_HELP7," [_CNgƃpCv]" + +STRING_CMD_HELP8, "ReactOS R}h C C^[v^̐VCX^XJn܂B\n\n\ +CMD [/[C|K] R}h][/P][/Q][/T:bf]\n\n\ + /C R}h w肳ꂽR}hsAI܂B\n\ + /K R}h w肳ꂽR}hs܂AI܂B\n\ + /P CMD ͉iIɓAautoexec.bat s܂\n\ + (I邱Ƃ͂ł܂)B\n\ + /T:bf OiFєwiFݒ肵܂ (ڍׂ COLOR /? QƂ\n\ + )B\n" + +STRING_COLOR_HELP1, "R\\[̃ftHg̑OiFєwiFݒ肵܂B\n\n\ +COLOR [ [/-F]] \n\n\ + R\\[o͂̐Fw肵܂B\n\ + /-F R\\[̋󂢂ĂԂɂ͐FKpȂB\n\n\ +F͎ 3 ނ̕@Ŏw肷邱Ƃł܂B\n\ +1) [F] on [F] (KvȂ͍̂ŏ 3 ł)\n\ +2) [10 i] on [10 i]\n\ +3) 2 16 i\n\n\ +F:\n\ +10i 16i F 10i 16i F\n\ +0 0 8 8 DF (邢)\n\ +1 1 9 9 邢\n\ +2 2 10 A 邢\n\ +3 3 F 11 B 邢F\n\ +4 4 12 C 邢\n\ +5 5 13 D 邢\n\ +6 6 F 14 E 邢F\n\ +7 7 15 F P\n" + +STRING_COPY_HELP1, "%s ㏑܂A낵ł? (Yes/No/All)? " + +STRING_COPY_HELP2, "1 ‚܂͕̃t@Cʂ̏ꏊɃRs[܂B\n\n\ +COPY [/V][/Y|/-Y][/A|/B] Rs[ [/A|/B]\n\ + [+ Rs[ [/A|/B] [+ ...]] [Rs[ [/A|/B]]\n\n\ + Rs[ Rs[t@C () w肵܂B\n\ + /A ASCII eLXg t@CƂĈ܂B\n\ + /B oCi t@CƂĈ܂B\n\ + Rs[ Vt@C̃fBNg܂̓t@C () \n\ + w肵܂B\n\ + /V Vt@C܂ꂽ܂B\n\ + /Y 󂯑̊̃t@C㏑OɊmF̃bZ[W\n\ + \\܂B\n\ + /-Y 󂯑̊̃t@C㏑OɊmF̃bZ[W\n\ + \\܂B\n\n\ +T‹ϐ COPYCMD ŃXCb` /Y ݒ肳Ăꍇ܂B\n\ +...\n" + +STRING_DATE_HELP1, "\nVt͂Ă (mm%cdd%cyyyy): " + +STRING_DATE_HELP2, "\nVt͂Ă (dd%cmm%cyyyy): " + +STRING_DATE_HELP3, "\nVt͂Ă (yyyy%cmm%cdd): " + +STRING_DATE_HELP4, "t\\܂͐ݒ肵܂B\n\n\ +DATE [/T][t]\n\n\ + /T t̕\\̂ݍs܂B\n\n\ +p[^̎w肪Ȃꍇ́A݂̓t\\AVt̓͂\n\ +߂܂BύXȂꍇ́AEnter L[܂B\n" + +STRING_DEL_HELP1, "1 ‚܂͕̃t@C폜܂B\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]]] t@C ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]]] t@C ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]]] t@C ...\n\n\ + t@C\n\ + 폜t@C () w肵܂B\n\n\ + /N Nothing. ܂B\n\ + /P Prompt. et@C폜OɊmF̃bZ[W\\܂B\n\ + /T Total. 폜ꂽt@C̑ƉꂽfBXN̈\\܂B\n\ + /Q Quiet.\n\ + /W Wipe. 폜OɁAt@C𗐐ŏ㏑܂B\n\ + /Y Yes. ChJ[hgpĈꊇ폜ƂAmF̃bZ[W\n\ + \\ɍ폜܂B\n\ + /F ǂ݂Ƃpt@CVXe t@CIɍ폜܂B\n\ + /S w肳ꂽt@CׂẴTufBNg폜܂B\n\ + /A ɂ폜t@CI܂B\n\ + \n\ + R ǂݎp\n\ + S VXe t@C\n\ + A A[JCu\n\ + H Bt@C\n\ + - ̑ȊO\n" + +STRING_DEL_HELP2, "fBNĝׂẴt@C폜܂!\n낵ł (Y/N)?" +STRING_DEL_HELP3, " %lu ‚̃t@C폜܂\n" +STRING_DEL_HELP4, " %lu ‚̃t@C폜܂\n" + +STRING_DELAY_HELP, "n bA܂ n ~bҋ@܂B\n\ +DELAY [/m]n\n\n\ + /m Pʂ~bɎw肵܂B\n\ + w肵ȂꍇAPʂɂ͕bg܂B\n" + +STRING_DIR_HELP1, "fBNg̃t@CƃTufBNgꗗ\\܂B\n\n\ +DIR [hCu:][pX][t@C] [/A[[:]]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]\\[g]] [/P] [/Q] [/S] [/T[[:]^CtB[h]] [/W] [/X] [/4]\n\n\ + [hCu:][pX][t@C]\n\ + ꗗ\\hCuAfBNgA܂̓t@Cw肵܂B\n\ + /A w肳ꂽ̃t@C\\܂B\n\ + D fBNg R ǂݎp\n\ + H Bt@C A A[JCu\n\ + S VXe t@C - ̑ȊO\n\ + /B t@Ĉ݂\\܂ (ov񂪕t܂)B\n\ + /C t@C TCY؂\\܂B\n\ + ftHg̐ݒłB/-C Ƃƌ؂\\܂B\n\ + /D /W ƓłAt@Cŕבւꗗ\\܂B\n\ + /L ŕ\\܂B\n\ + /N t@CE[ɕ\\Vꗗ`gp܂B\n\ + /O t@Cבւĕ\\܂B\n\ + \\[g N O (At@xbg) S TCY (ق)\n\ + E gq (At@xbg) D (Âق)\n\ + G O[v (fBNg) - ~\n\ + /P 1 ʂƂɒ~ĕ\\܂B\n\ + /Q t@C̏L҂\\܂B\n\ + /S w肳ꂽfBNgт̃TufBNĝׂĂ\n\ + t@C\\܂B\n\ + /T ǂ̃^CtB[h\\邩A܂͕בւɎgp邩\n\ + w肵܂B\n\ + ^CtB[h C 쐬n\n\ + A ŏIANZX\n\ + W ŏIXV\n\ + /W Chꗗ`ŕ\\܂B\n\ + /X ̃IvV MS-DOS ` (8.3) ȊÕt@Cɑ΂Z\n\ + O\\܂BȎOɒZO\\_΁A\n\ + /N IvVƓłBZOȂꍇ́AuN\n\ + Ȃ܂B\n\ + /4 4 ‚̐ŔN\\܂B\n\n\ +‹ϐ DIRCMD ɃXCb`ݒł܂B\n\ +/-W ̂悤 - (nCt) Oɂ‚ƁÃXCb`͖ɂȂ܂B\n" + +STRING_DIR_HELP2, " hCu %c ̃{[ x %s ł\n" +STRING_DIR_HELP3, " hCu %c ɂ̓{[ x܂B\n" +STRING_DIR_HELP4, " {[ VAԍ %04X-%04X ł\n" +STRING_DIR_HELP5, "\n t@C̑:\n%16i ‚̃t@C% 14s oCg\n" +STRING_DIR_HELP6, "%16i ‚̃fBNg% 15s oCg\n" +STRING_DIR_HELP7, "\n %s ̃fBNg\n\n" +STRING_DIR_HELP8, "%16i ‚̃t@C% 14s oCg\n" + +STRING_DIRSTACK_HELP1, "POPD R}hŎgp邽߂Ɍ݂̃fBNgۑA\n\ +w肵fBNgɕύX܂B\n\n\ +PUSHD [pX | ..]\n\n\ + pX ݂̃fBNgƂĐݒ肷fBNgw肵܂B\n" + +STRING_DIRSTACK_HELP2, "PUSHD R}hŋLꂽfBNgɕύX܂B\n\nPOPD" + +STRING_DIRSTACK_HELP3, "fBNg X^bN̈ꗗ\\܂B\n\nDIRS" + +STRING_DIRSTACK_HELP4, "fBNg X^bN͋łB" + +STRING_ECHO_HELP1, "bZ[W\\܂AOɃLbW ^[ƃCtB[h‚܂B\n\n\ + ECHOS bZ[W" + +STRING_ECHO_HELP2, "WG[ɃbZ[W\\܂B\n\n\ + ECHOERR bZ[W\n\ + ECHOERR. so͂܂B" + +STRING_ECHO_HELP3, "WG[ɃbZ[W\\܂AOɃLbW ^[\n\ +CtB[h‚܂B\n\n\ + ECHOSERR bZ[W" + +STRING_ECHO_HELP4, "bZ[W\\AR}h GR[ ON OFF ؂ւ܂B\n\n\ + ECHO [ON | OFF]\n\ + ECHO [bZ[W]\n\ + ECHO. so͂܂B\n\n\ +݂̃GR[ݒ\\ɂ́Ap[^w肹 ECHO Ɠ͂ĂB" + +STRING_ECHO_HELP5, "ECHO %s łB\n" + +STRING_EXIT_HELP, "R}h C^[v^I܂B\n\nEXIT\n" + +STRING_FOR_HELP1, "w肳ꂽR}ht@C Zbg̊et@Cɑ΂Ďs܂B\n\n\ +FOR %%ϐ IN (Zbg) DO R}h [p[^]\n\n\ + %%ϐ Pꕶ̒u”\\ȃp[^w肵܂B\n\ + (Zbg) t@C Zbgw肵܂BChJ[hgpł܂B\n\ + R}h et@CƂɎsR}hw肵܂B\n\ + p[^ w肳ꂽR}h̃p[^܂̓XCb`w肵܂B\n\n\ +ob` vO FOR R}hgpƂ́A%%ϐ̑ɁA\n\ +%%%%ϐgpĂB\n" + +STRING_FREE_HELP1, "\nhCu %c ̃{[ x %-11s ł\n\ + VAԍ %s ł\n\ + %16s oCg: SfBXNe\n\ + %16s oCg: gp\n\ + %16s oCg: 󂫗e\n" + +STRING_FREE_HELP2, "hCuɊւ\\܂B\n\nFREE [hCu: ...]\n" + +STRING_IF_HELP1, "ob` vOŏs܂B\n\n\ + IF [NOT] ERRORLEVEL ԍ R}h\n\ + IF [NOT] 1==2 R}h\n\ + IF [NOT] EXIST t@C R}h\n\ + IF [NOT] DEFINED ϐ R}h\n\n\ +NOT ȔꍇɂACMD R}hs邱Ƃ\n\ + w肵܂B\n\ +ERRORLEVEL ԍ Ō̃vO̎sŎw肳ꂽԍȏ̏IR[h\n\ + ԂꂽƂɁA^ɂȂ悤Ɏw肵܂B\n\ +R}h ^̂ƂɎsR}hw肵܂B\n\ +1==2 eLXg񂪈vƂɏ^ɂȂ悤Ɏw\n\ + ܂B\n\ +EXIST t@C w肵t@C݂Ƃɏ^ɂȂ悤\n\ + w肵܂B\n\ +DEFINED ϐ w肵ϐ`ĂƂɏ^ɂȂ悤\n\ + w肵܂B\n" + +STRING_GOTO_HELP1, "ob` vÓAxŎw肳Ăs֐ړ܂B\n\n\ +GOTO x\n\n\ + x ob` vOŃxƂĎgpeLXgw肵܂B\n\n\ +x̐擪ɂ : (R) w肵AxPƂ 1 sɓ͂Ă\n\ +B" + +STRING_LABEL_HELP1, "fBXÑ{[ x\\܂͕ύX܂B\n\nLABEL [hCu:][x]\n" + +STRING_LABEL_HELP2, "hCu %c: ̃{[ x %s ł\n" +STRING_LABEL_HELP3, "hCu %c: ɂ̓{[ x܂l\n" +STRING_LABEL_HELP4, "{[ VAԍ %04X-%04X\n ł" +STRING_LABEL_HELP5, "{[ x 11 ȓœ͂ĂB\nKvȂ Enter L[Ă: " + +STRING_LOCALE_HELP1, "ݎ" + +STRING_MKDIR_HELP, "fBNg쐬܂B\n\n\ +MKDIR [hCu:]pX\n\ +MD [hCu:]pX" + +STRING_MEMMORY_HELP1, "VXe ̗ʂ\\܂B\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% ̃gpĂ܂B\n\n\ + %13s oCg: S\n\ + %13s oCg: p”\\ȕ\n\n\ + %13s oCg: Sy[Wt@C\n\ + %13s oCg: p”\\ȃy[Wt@C\n\n\ + %13s oCg: Sz\n\ + %13s oCg: p”\\ȉz\n" + +STRING_MISC_HELP1, "sɂ͉L[Ă ...\n" + +STRING_MOVE_HELP1, "%s ㏑܂낵ł (Yes/No/All)? " + +STRING_MOVE_HELP2, "t@Cړуt@CƃfBNgύX܂B\n\n\ +1 ‚܂͕̃t@Cړɂ:\n\ +MOVE [/N][hCu:][pX]t@C1[,...] ړ\n\n\ +fBNgύXɂ:\n\ +MOVE [/N][hCu:][pX]ύXO ύX\n\n\ + [hCu:][pX]t@C1\n\ + ړt@C̏ꏊƖOw肵܂B\n\ + /N Nothing. t@CƃfBNg̈ړȊÔׂĂs܂B\n\n\ +iKł̐:\n\ + - t@CfBNgAقȂhCu܂Ĉړ邱Ƃ\n\ + ł܂B\n" + +STRING_MSGBOX_HELP, "bZ[W {bNX\\A[U[ɕԓ߂܂B\n\n\ +MSGBOX ^Cv ['^Cg'] bZ[W\n\n\ +^Cv \\{^̃^CvłB\n\ + ̒lgpł܂: OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ +^Cg bZ[W {bNX̃^CgłB\n\ +bZ[W bZ[W {bNXɕ\\郁bZ[WłB\n\n\n\ +ꂽ{^ɂA ERRORLEVEL ݒ肳܂:\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, "s”\\t@ČpX\\܂͐ݒ肵܂B\n\n\ +PATH [[hCu:]pX[;...]]\nPATH ;\n\n\ +p[^Ƃ ; (Z~R) w肷ƁAׂĂ̌pX\n\ +NAČ݂̃fBNg܂B\n\ +p[^w肹 PATH Ɠ͂ƁÃ݂pX\\܂B\n" + +STRING_PROMPT_HELP1, "R}h vvgύX܂B\n\n\ +PROMPT []\n\n\ + VR}h vvgw肵܂B\n\n\ +PROMPT ɂ͒ʏ̕ƎɎR[hgpł܂:\n\n\ + $A & (ApTh)\n\ + $B | (pCv)\n\ + $C ( ()\n\ + $D ݂̓t\n\ + $E GXP[v R[h (ASCII R[h 27)\n\ + $F ) (E)\n\ + $G > (s (Ȃ))\n\ + $H obNXy[X (O̕폜܂)\n\ + $L < (s (Ȃ))\n\ + $N ݂̃hCu\n\ + $P ݂̃hCuƃpX\n\ + $Q = ()\n\ + $T ݂̎\n\ + $V OS ̃o[Wԍ\n\ + $_ LbW ^[ƃCtB[h\n\ + $$ $ (hL)\n" + +STRING_PAUSE_HELP1, "ob` vȌꎞ~ÃbZ[W\\܂B:\n\ +'sɂ͉L[Ă ...' ܂̓[U[`bZ[WB\n\n\ +PAUSE [bZ[W]" + +STRING_PROMPT_HELP2, " $+ ݂̃fBNg X^bN̐[\\܂" + +STRING_PROMPT_HELP3, "\np[^w肹 PROMPT Ɠ͂ƁAvvg̐ݒ肪ftHgɃZbg܂B" + +STRING_REM_HELP, "ob` t@CɃRg () L^܂B\n\nREM [Rg]" + +STRING_RMDIR_HELP, "fBNg폜܂B\n\n\ +RMDIR [hCu:]pX\nRD [hCu:]pX\n\ + /S w肳ꂽfBNgɂt@CtH_ׂč폜܂B\n\ + /Q mF̃bZ[W\\܂B\n" +STRING_RMDIR_HELP2, "fBNgł͂܂!\n" + +STRING_REN_HELP1, "t@CfBNg () ̖OύX܂B\n\n\ +RENAME [/E /N /P /Q /S /T] ̃t@C ... Vt@C\n\ +REN [/E /N /P /Q /S /T] ̃t@C ... Vt@C\n\n\ + /E G[bZ[W\\܂B\n\ + /N ܂B\n\ + /P t@C̖OύXOɂꂼmF߂܂B\n\ + (܂Ă܂!)\n\ + /Q Quiet.\n\ + /S TufBNg̖OύXB\n\ + /T OύXt@C̑񍐂B\n\n\ +Vt@C ɂ͐VhCupXwłȂ̂ŒӂĂB\n\ +ړIɂ MOVE R}hpĂB\n" + +STRING_REN_HELP2, " %lu ‚̃t@C̖OύX܂\n" + +STRING_REN_HELP3, " %lu ‚̃t@C̖OύX܂\n" + +STRING_SHIFT_HELP, "ob` t@C̒u”\\ȃp[^̈ʒuύX܂B\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, "J[\\ړ܂BړA͂邱Ƃł܂B\n\n\ +SCREEN s [eLXg]\n\n\ + J[\\ړłB\n\ + s J[\\ړsłB" + +STRING_SET_HELP, "‹ϐ\\AݒA܂͍폜܂B\n\n\ +SET [ϐ[=]]]\n\n\ + ϐ ‹ϐw肵܂B\n\ + ϐɊ蓖Ă镶w肵܂B\n\n\ +݂̊‹ϐ\\ɂ́Ap[^w肹 SET Ɠ͂ĂB\n" + +STRING_START_HELP1, "ʂ̃EBhENAw肵vO܂̓R}hs܂B\n\n\ +START R}h\n\n\ + R}h sR}hw肵܂B\n\n\ +_ł́AR}hׂ͂ēɊJn܂B\n" + +STRING_TITLE_HELP, "R}h vvg EBhẼEBhE ^Cgݒ肵܂B\n\n\ +TITLE []\n\n\ + R}h vvg EBhẼ^Cgw肵܂B\n" + +STRING_TIME_HELP1, "VXe\\܂͐ݒ肵܂B\n\n\ +TIME [/T][]\n\n\ + /T ݎ̕\\̂ݍs܂B\n\n\ +p[^̎w肪Ȃ΁A݂̐ݒ肪\\AV͂ł\n\ +vvgɂȂ܂BύXȂꍇ́AEnter L[ĂB\n" + +STRING_TIME_HELP2, "V͂Ă: " + +STRING_TIMER_HELP1, "%d ~bo߁B\n" + +STRING_TIMER_HELP2, "%02d%c%02d%c%02d%c%02d o߁B\n" + +STRING_TIMER_HELP3, "10 ‚܂ł̃XgbvEHb`gƂł܂B\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON XgbvEHb` ON ɂ܂B\n\ + OFF XgbvEHb` OFF ɂ܂B\n\ + /S Split time. XgbvEHb`̒lύX邱ƂȂA\n\ + ݍł鎞Ԃ\\܂B\n\ + /n XgbvEHb`ԍw肵܂B\n\ + XgbvEHb` 0 9 ܂łpł܂B\n\ + w肵ȂꍇAftHgƂ 1 g܂B\n\ + /Fn o͂̏\n\ + n ɂ͎̓‚̒lp邱Ƃł܂:\n\ + 0 ~b\n\ + 1 hh%cmm%css%cdd\n\n\ +ONAOFFA/S ̂w肵Ȃꍇɂ́AXgbvEHb`\n\ +Ԃ؂ւ܂B\n\n" + +STRING_TYPE_HELP1, "eLXg t@C܂̓t@C̓e\\܂B\n\nTYPE [hCu:][pX]t@C \n\ + /P 1 x 1 ʂ•\\܂B\n" + +STRING_VERIFY_HELP1, "̃R}h̓_~[ł!!\n\ +t@CfBXNɐ܂ꂽƂƍ邩ǂw܂B\n\n\ +VERIFY [ON | OFF]\n\n\ +݂̐ݒ\\Ƃ́Ap[^w肹 VERIFY Ɠ͂ĂB\n" + +STRING_VERIFY_HELP2, "VERIFY %s łB\n" + +STRING_VERIFY_HELP3, "ON OFF ̂ǂ炩w肵ĂB" + +STRING_VERSION_HELP1, "VF̃o[W\\܂B\n\n\ +VER [/C][/R][/W]\n\n\ + /C NWbg\\܂B\n\ + /R ĔzzɊւ\\܂B\n\ + /W ۏ؂Ɋւ\\܂B" + +STRING_VERSION_HELP2, " *S̖ۏ* Œ񋟂܂Bڂ\n\ +'ver /w' ƃ^CvĉB̓t[\\tgEFAłẢ\n\ +ĔЕz邱ƂコĂ܂Bڂ 'ver /r' ƃ^CvĉB\n\ +NWbg̈ꗗɂ 'ver /c' ƃ^CvĉB" + +STRING_VERSION_HELP3, "\n ̃vO͗Lpł邱ƂĔЕz܂A*S̖ۏ*\n\ + łBƉ”\\̕ۏ؂̖ړIւ̓ḰAOɎꂽ̂\n\ + ߑS݂܂Bڂ GNU General Public License B" + +STRING_VERSION_HELP4, "\n ̃vO̓t[\\tgEFAłBȂ͂At[\\tgEF\n\ + AcɂĔsꂽ GNU General Public License (o[W 2 A\n\ + ]ɂĂ͂ȍ~̃o[Ŵǂꂩ) ̒߂̉ōĔ\n\ + z܂͉ς邱Ƃł܂B\n" + +STRING_VERSION_HELP5, "\noO񍐂 ֑ĂB\n\ +ŐṼo[W͎̃y[Wł܂: http://www.reactos.org" + +STRING_VERSION_HELP6, "\nFreeDOS version written by:\n" + +STRING_VERSION_HELP7, "\nReactOS version written by:\n" + +STRING_VOL_HELP1, " hCu %c: ̃{[ x %s łB\n" +STRING_VOL_HELP2, " hCu %c: ɂ̓{[ x܂B\n" +STRING_VOL_HELP3, " {[ VAԍ %04X-%04X łB\n" +STRING_VOL_HELP4, "݂Ȃ΁AfBXÑ{[ xƃVAԍ\\܂B\n\nVOL [hCu:]" + +STRING_WINDOW_HELP1, "R\\[ EBhE̊OύX܂B\n\n\ +WINDOW [/POS[=],,,]\n\ + [MIN|MAX|RESTORE] ['title']\n\n\ +/POS EBhËʒuƑ傫w肵܂B\n\ +MIN EBhEŏ܂B\n\ +MAX EBhEő剻܂B\n\ +RESTORE EBhẼTCYɖ߂܂B" + +STRING_WINDOW_HELP2, "R\\[ EBhE̊OύX܂B\n\n\ +ACTIVATE 'EBhE' [/POS[=],,,]\n\ + [MIN|MAX|RESTORE] ['^Cg']\n\n\ +EBhE OύXEBhẼ^CgłB\n\ +/POS EBhËʒuƑ傫w肵܂B\n\ +MIN EBhEŏ܂B\n\ +MAX EBhEő剻܂B\n\ +RESTORE EBhẼTCYɖ߂܂B\n\ +^Cg V^CgłB\n" + + +STRING_HELP1, "p”\\ȂׂẴR}ḧꗗƁA̐B\n\n\ + R}h /? ̃R}hɊւڍ׏\n\n\ +? p”\\ȂׂẴR}ḧꗗ (Ȃ)B\n\ +ALIAS GCAX̐ݒAGCAX\\肵܂B\n\ +ATTRIB t@C\\܂͕ύX܂B\n\ +BEEP Xs[Jr[v‚炵܂B\n\ +CALL ob` vOʂ̃ob` vOĂяo܂B\n\ +CD ݂̃fBNgύXAfBNg\\肵܂B\n\ +CHCP ݂̃R[h y[Wԍ\\܂͐ݒ肵܂B\n\ +CHOICE [U[I‚Î҂܂B\n\ +CLS ʂ܂B\n\ +CMD ReactOS R}h C^[v^̐VCX^XJn܂B\n\ +COLOR R\\[̃ftHg̑OiFєwiFݒ肵܂B\n\ +COPY 1 ‚܂͕̃t@Cʂ̏ꏊɃRs[܂B\n\ +DATE t\\܂͐ݒ肵܂B\n\ +DELAY n bA܂ n ~bҋ@܂B\n\ +DELETE 1 ‚܂͕̃t@C폜܂B\n\ +DIR fBNg̃t@CƃTufBNgꗗ\\܂B\n\ +ECHO bZ[W\\AR}h GR[ ON OFF ؂ւ܂B\n\ +ERASE 1 ‚܂͕̃t@C폜܂B\n\ +EXIT CMD.exe (R}h C C^[v^) I܂B\n\ +FOR w肳ꂽR}ht@C Zbg̊et@Cɑ΂Ďs܂B\n\ +FREE fBXN̋󂫗e\n\ +GOTO ob` vÓAxŎw肳Ăs֐ړ܂B\n\ +HELP ReactOS R}h̃wv񋟂܂B\n\ +HISTORY gpꂽׂẴR}hꗗ\\܂B\n\ +IF ob` vOŏs܂B\n\ +LABEL fBXÑ{[ x\\܂͕ύX܂B\n\ +MD fBNg쐬܂B\n\ +MKDIR fBNg쐬܂B\n\ +MOVE t@Cړуt@CƃfBNgύX܂B\n\ +PATH s”\\t@ČpX\\܂͐ݒ肵܂B\n\ +PAUSE ob` vȌꎞ~AbZ[W\\܂B\n\ +POPD ݂̃fBNg PUSHD R}hŋLꂽfBNg\n\ + ύX܂B\n\ +PROMPT R}h vvgύX܂B\n\ +PUSHD ݂̃fBNgۑAw肵fBNgɕύX܂B\n\ +RD fBNg폜܂B\n\ +REM ob` t@CɃRg () L^܂B\n\ +REN 1 ‚܂͕̃t@C̖OύX܂B\n\ +RENAME 1 ‚܂͕̃t@C̖OύX܂B\n\ +RMDIR fBNg폜܂B\n\ +SCREEN J[\\ړ܂BړA͂邱Ƃł܂B\n\ +SET ‹ϐ\\AݒA܂͍폜܂B\n\ +SHIFT J[\\ړ܂BړA͂邱Ƃł܂B\n" +STRING_HELP2, "START ʂ̃EBhENAw肵vO܂̓R}hs܂B\n\ +TIME VXe\\܂͐ݒ肵܂B\n\ +TIMER 10 ‚܂ł̃XgbvEHb`gƂł܂B\n\ +TITLE R}h vvg EBhẼEBhE ^Cgݒ肵܂B\n\ +TYPE eLXg t@C܂̓t@C̓e\\܂B\n\ +VER ReactOS ̃o[W\\܂B\n\ +VERIFY t@CfBXNɐ܂ꂽƂƍ邩ǂ\n\ + w܂B\n\ +VOL fBXÑ{[ xƃVAԍ\\܂B\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + + +STRING_ALIAS_ERROR, "GCAXWJ̃R}h C܂!\n" +STRING_BATCH_ERROR, "ob` t@CJƂɃG[܂B\n" +STRING_CHCP_ERROR1, "݂̃R[h y[W: %u\n" +STRING_CHCP_ERROR4, "ȃR[h y[Wł\n" +STRING_CHOICE_ERROR, "ȃIvVłB҂鏑: /C[:]IvV" +STRING_CHOICE_ERROR_TXT, "ȃIvVłB҂鏑: /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, "ȃIvVł: %s" +STRING_CMD_ERROR1, "t@C %s 烊_CNg͂ł܂B\n" +STRING_CMD_ERROR2, "f[^pCv邽߂̈ꎞt@C쐬̂ƂɃG[܂B\n" +STRING_CMD_ERROR3, "t@C %s ւƃ_CNgł܂B\n" +STRING_CMD_ERROR4, "%s sĂ܂...\n" +STRING_CMD_ERROR5, "cmdexit.bat sĂ܂...\n" +STRING_COLOR_ERROR1, "G[! Fw肳܂B\n (OiFƔwiF𓯂Fɂ邱Ƃ͂ł܂)" +STRING_COLOR_ERROR2, "F̎wɖ肪܂B" +STRING_COLOR_ERROR3, "Color %x\n" +STRING_COLOR_ERROR4, "G[! Fw肳܂B" +STRING_CONSOLE_ERROR, "sȃG[: %d\n" +STRING_COPY_ERROR1, "G[: ̃t@C %s J܂!\n" +STRING_COPY_ERROR2, "G[: Rs[ƃRs[悪ꏏł!\n" +STRING_COPY_ERROR3, "wւ݂̏ŃG[܂!\n" +STRING_COPY_ERROR4, "G[: ܂Ă܂!\n" +STRING_DATE_ERROR, "ȓtłB" +STRING_DEL_ERROR5, "t@C %s ͍폜܂! " +STRING_DEL_ERROR6, "낵ł (Y/N)?" +STRING_DEL_ERROR7, "폜Ă܂: %s\n" +STRING_ERROR_ERROR1, "sȃG[ł! G[ R[h: 0x%lx\n" +STRING_ERROR_ERROR2, "\\G[" +STRING_FOR_ERROR1, "ߕ 'in' sĂ܂B" +STRING_FOR_ERROR2, "ʂ‚܂B" +STRING_FOR_ERROR3, "'do' sĂ܂B" +STRING_FOR_ERROR4, "'do' ̌ɃR}h܂B" +STRING_FREE_ERROR1, "ȃhCułB" +STRING_FREE_ERROR2, "x܂B" +STRING_GOTO_ERROR1, "GOTO Ƀxw肳Ă܂B" +STRING_GOTO_ERROR2, "x '%s' ‚܂łB\n" + +STRING_MD_ERROR, "łɃfBNgɃTufBNgt@C݂Ă܂B\n" +STRING_MD_ERROR2, "VtH_ւ̃pX݂Ă܂B\n" +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[G[]\n" + +STRING_REN_ERROR1, "MoveFile() failed. G[: %lu\n" + +STRING_START_ERROR1, "_ł̓ob`̓T|[gĂ܂!" + +STRING_TIME_ERROR1, "ȎłB" + +STRING_TYPE_ERROR1, "'/%s' ͖ȃIvVł\n" + +STRING_WINDOW_ERROR1, "EBhE‚܂B" + + +STRING_ERROR_PARAMETERF_ERROR, "p[^̏ԈĂ܂B - %c\n" +STRING_ERROR_INVALID_SWITCH, "ȃXCb`łB - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, "p[^܂B - %s\n" +STRING_ERROR_PATH_NOT_FOUND, "pX‚܂B\n" +STRING_ERROR_FILE_NOT_FOUND, "t@C‚܂B\n" +STRING_ERROR_REQ_PARAM_MISSING, "Kvȃp[^sĂ܂B\n" +STRING_ERROR_INVALID_DRIVE, "ȃhCuwłB\n" +STRING_ERROR_INVALID_PARAM_FORMAT, "ȃp[^̏łB - %s\n" +STRING_ERROR_BADCOMMAND, "R}h܂̓t@CԈĂ܂B\n" +STRING_ERROR_OUT_OF_MEMORY, "sG[B\n" +STRING_ERROR_CANNOTPIPE, "G[! pCvł܂! ꎞt@CJ܂!\n" +STRING_ERROR_D_PAUSEMSG, "sɂ͉L[Ă . . ." +STRING_ERROR_DRIVER_NOT_READY, "hCȕłĂ܂B" + +STRING_PATH_ERROR, "CMD: Not in environment '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" +STRING_VERSION_RUNVER, " running on %s" +STRING_COPY_FILE , " %d ‚̃t@CRs[܂\n" +STRING_DELETE_WIPE, "Sɏ܂B" +STRING_FOR_ERROR, "ȕϐw肳܂B" +STRING_SCREEN_COL, "s̒lłB" +STRING_SCREEN_ROW, "̒lłB" +STRING_TIMER_TIME "^C}[ %d %s łB: " + +STRING_INVALID_OPERAND, "ȃIyhłB" +STRING_EXPECTED_CLOSE_PAREN, "Expected ')'" +STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name." +STRING_SYNTAX_COMMAND_INCORRECT, "R}h̍\\ԈĂ܂B" + +} diff --git a/reactos/base/shell/cmd/Ru.rc b/reactos/base/shell/cmd/Ru.rc new file mode 100644 index 00000000000..a4645b971fc --- /dev/null +++ b/reactos/base/shell/cmd/Ru.rc @@ -0,0 +1,656 @@ +#include "windows.h" +#include "resource.h" +/* + * Russian language file by + * Andrey Korotaev (unC0Rr@inbox.ru) + * and + * Aleksey Bragin (aleksey@reactos.com) + * Copyright 2005 + */ + + +LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + +STRING_ATTRIB_HELP, " .\n\n\ +ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] ...\n\ + [/S [/D]]\n\n\ + + .\n\ + - .\n\ + R "" "".\n\ + A """".\n\ + S """".\n\ + H """".\n\ + /S \n\ + .\n\ + /D , .\n\n\ +ATTRIB .\n" + +STRING_ALIAS_HELP, ", .\n\n\ +ALIAS [=[]]\n\n\ + .\n\ + , .\n\n\ + :\n\ + ALIAS\n\n\ + :\n\ + ALIAS da=dir a:\n\n\ + :\n\ + ALIAS da=" + +STRING_BEEP_HELP, " .\n\nBEEP\n" + +STRING_CALL_HELP, " .\n\n\ +CALL [:][]_ []\n\n\ + , \n\ + ." + +STRING_CD_HELP, " .\n\n\ +CHDIR [/D][:][]\n\ +CHDIR[..|.]\n\ +CD [/D][:][]\n\ +CD[..|.]\n\n\ + .. \n\ + . \n\ + /D .\n\n\ + CD : .\n\ + CD .\n" + +STRING_CHCP_HELP, " .\n\n\ +CHCP [nnn]\n\n\ + nnn .\n\n\ + CHCP .\n" + +STRING_CHOICE_HELP, ", .\n\n\ +CHOICE [/C[:]_][/N][/S][/T[:]c,nn][]\n\n\ + /C[:]_ . YN.\n\ + /N ? .\n\ + /S .\n\ + /T[:]c,nn c nn .\n\ + text .\n\n\ +ERRORLEVEL .\n" + +STRING_CLS_HELP, " .\n\nCLS\n" + +STRING_CMD_HELP1, "\n :\n" + +STRING_CMD_HELP2, "\n :" + +STRING_CMD_HELP3," []" + +STRING_CMD_HELP4," []" + +STRING_CMD_HELP5," [ unix]" + +STRING_CMD_HELP6," [ ]" + +STRING_CMD_HELP7," [ piping]" + +STRING_CMD_HELP8, " ReactOS.\n\n\ +CMD [/[C|K] ][/P][/Q][/T:bf]\n\n\ + /C .\n\ + /K .\n\ + /P CMD autoexec.bat\n\ + ( ).\n\ + /T: / ( . COLOR /?).\n" + +STRING_COLOR_HELP1, " .\n\n\ +COLOR [ [/-F]] \n\n\ + \n\ + /-F \n\n\ + :\n\ +1) ( )\n\ +2) (decimal on decimal)\n\ +3) \n\n\ + :\n\ +. . . .\n\ + 0 0 = 8 8 = \n\ + 1 1 = 9 9 = -\n\ + 2 2 = 10 A = -\n\ + 3 3 = 11 B = -\n\ + 4 4 = 12 C = -\n\ + 5 5 = 13 D = -\n\ + 6 6 = 14 E = -\n\ + 7 7 = 15 F = -\n" + +STRING_COPY_HELP1, " %s (Yes/No/All)? " + +STRING_COPY_HELP2, " .\n\n\ +COPY [/V][/Y|/-Y][/A|/B] [/A|/B]\n\ + [+ [/A|/B] [+ ...]] [ [/A|/B]]\n\n\ + .\n\ + /A ASCII.\n\ + /B .\n\ + / .\n\ + /V .\n\ + /Y \n\ + .\n\ + /-Y \n\ + .\n\n\ + /Y COPYCMD.\n\ +...\n" + +STRING_DATE_HELP1, "\n (%c%c): " + +STRING_DATE_HELP2, "\n (%c%c): " + +STRING_DATE_HELP3, "\n (%c%c): " + +STRING_DATE_HELP4, " .\n\n\ +DATE [/T][]\n\n\ + /T \n\n\ + DATE \n\ + . ENTER.\n" + +STRING_DEL_HELP1, " .\n\n\ +DEL [/N /P /T /Q /S /W /Y /Z /A[[:]]] _ ...\n\ +DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]]] _ ...\n\ +ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]]] _ ...\n\n\ + _ .\n\n\ + /N .\n\ + /P .\n\ + /T \n\ + .\n\ + /Q .\n\ + /W .\n\ + /Y \n\ + *.*.\n\ + /F , .\n\ + /S \n\ + /A .\n\ + R \n\ + S \n\ + A \n\ + H \n\ + ""-"" \n" + +STRING_DEL_HELP2, " !\n (Y/N)?" +STRING_DEL_HELP3, " %lu \n" +STRING_DEL_HELP4, " %lu \n" + +STRING_DELAY_HELP, " n \n\ +DELAY [/m]n\n\n\ + /m , n \n\ + n \n" + +STRING_DIR_HELP1, "DIR [:][][_] [/A[[:]]] [/B] [/C] [/D] [/L] [/N]\n\ + [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\ + [:][][_]\n\ + , / , .\n\n\ + /A .\n\ + D R \n\ + H A \n\ + S ""-"" \n\ + /B .\n\ + /C \n\ + ( ). /-C.\n\ + /D .\n\ + /L .\n\ + /N .\n\ + /O .\n\ + N () S ( )\n\ + E () D ( )\n\ + G ""-"" \n\ + /P .\n\ + /Q .\n\ + /S .\n\ + /T \n\ + C \n\ + A \n\ + W \n\ + /W .\n\ + /X , \n\ + 8.3. /N, \n\ + . \n\ + , .\n\ + /4 \n" + +STRING_DIR_HELP2, " %c %s\n" +STRING_DIR_HELP3, " %c .\n" +STRING_DIR_HELP4, " : %04X-%04X\n" +STRING_DIR_HELP5, "\n :\n%16i ()% 14s \n" +STRING_DIR_HELP6, "%16i Dir(s)% 15s \n" +STRING_DIR_HELP7, "\n of %s\n\n" +STRING_DIR_HELP8, "%16i ()% 14s \n" + +STRING_DIRSTACK_HELP1, " POPD, \n\ + .\n\n\ +PUSHD [path | ..]\n\n\ + path , \n" + +STRING_DIRSTACK_HELP2, " , PUSHD.\n\nPOPD" + +STRING_DIRSTACK_HELP3, " .\n\nDIRS" + +STRING_DIRSTACK_HELP4, " " + +STRING_ECHO_HELP1, " .\n\n\ + ECHOS message" + +STRING_ECHO_HELP2, " .\n\n\ + ECHOERR message\n\ + ECHOERR. " + +STRING_ECHO_HELP3, " .\n\n\ + ECHOSERR message" + +STRING_ECHO_HELP4, " .\n\n\ + ECHO [ON | OFF]\n\ + ECHO []\n\ + ECHO. \n\n\ +ECHO ." + +STRING_ECHO_HELP5, "ECHO is %s\n" + +STRING_EXIT_HELP, " .\n\nEXIT\n" + +STRING_FOR_HELP1, " \n\n\ +FOR % IN () DO []\n\n\ + % .\n\ + () .\n\ + .\n\ + , .\n\ + .\n\n\ + FOR \n\ +%% %.\n" + +STRING_FREE_HELP1, "\n %s: %-11s\n\ + : %s\n\ + %16s \n\ + %16s \n\ + %16s \n" + +STRING_FREE_HELP2, " .\n\nFREE [drive: ...]\n" + +STRING_IF_HELP1, " .\n\n\ + IF [NOT] ERRORLEVEL \n\ + IF [NOT] 1==2 \n\ + IF [NOT] EXIST _ \n\ + IF [NOT] DEFINED \n\n\ + NOT : \n\ + , - .\n\ + ERRORLEVEL , \n\ + .\n\ + 1==2 , \n\ + .\n\ + EXIST _ , \n\ + .\n\ +DEFINED , \n\ + \n\ + , .\n\ + ELSE,\n\ + , \n\ + , .\n" + +STRING_GOTO_HELP1, " .\n\n\ +GOTO \n\n\ + label , .\n\n\ + ." + +STRING_LABEL_HELP1, ", .\n\nLABEL [:][]\n" + +STRING_LABEL_HELP2, " %c %s\n" +STRING_LABEL_HELP3, " %c: \n" +STRING_LABEL_HELP4, " : %04X-%04X\n" +STRING_LABEL_HELP5, " (11 , )? " + +STRING_LOCALE_HELP1, " : " + +STRING_MKDIR_HELP, " .\n\n\ +MKDIR [:]\nMD [:]" + +STRING_MEMMORY_HELP1, " .\n\nMEMORY" + +STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\ + %13s .\n\ + %13s .\n\n\ + %13s .\n\ + %13s .\n\n\ + %13s .\n\ + %13s .\n" + +STRING_MISC_HELP1, " ...\n" + +STRING_MOVE_HELP1, " %s (Yes/No/All)? " + +STRING_MOVE_HELP2, " .\n\n\ + :\n\ +MOVE [/N][:][]_1[,...] \n\n\ + :\n\ +MOVE [/N][:][]_1 _2\n\n\ + [:][]_1 \n\ + .\n\ + /N Nothing. Do everything but move files or directories.\n\n\ + :\n\ + - .\n" + +STRING_MSGBOX_HELP, " \n\n\ +MSGBOX [''] \n\n\ + \n\ + : OK, OKCANCEL,\n\ + YESNO, YESNOCANCEL\n\ + \n\ + \n\n\n\ +ERRORLEVEL :\n\n\ +YES : 10 | NO : 11\n\ +OK : 10 | CANCEL : 12\n" + +STRING_PATH_HELP1, " .\n\n\ +PATH [[:][;...]]\nPATH ;\n\n\ + PATH ; , \n\ + .\n\ + PATH .\n" + +STRING_PROMPT_HELP1, " .\n\n\ +PROMPT []\n\n\ + .\n\n\ + :\n\n\ + $A & ()\n\ + $B | ( )\n\ + $C ( ( )\n\ + $D \n\ + $E ESC ( ASCII 27)\n\ + $F ) ( )\n\ + $G > ( """")\n\ + $H BACKSPACE ( )\n\ + $L < ( """")\n\ + $N \n\ + $P \n\ + $Q = ( )\n\ + $T \n\ + $V \n\ + $_ \n\ + $$ $ ( )\n" + +STRING_PAUSE_HELP1, " :\n\ +' ...' .\n\n\ +PAUSE []" + +STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack" + +STRING_PROMPT_HELP3, "\nPROMPT ." + +STRING_REM_HELP, " .\n\nREM []" + +STRING_RMDIR_HELP, " .\n\n\ +RMDIR [:]\nRD [:]\n\ +/S \n\ +/Q \n" +STRING_RMDIR_HELP2, " !\n" + +STRING_REN_HELP1, " .\n\n\ +RENAME [/E /N /P /Q /S /T] _ ... _\n\ +REN [/E /N /P /Q /S /T] _ ... _\n\n\ + /E .\n\ + /N Nothing.\n\ + /P .\n\ + (Not implemented yet!)\n\ + /Q Quiet.\n\ + /S .\n\ + /T .\n\n\ + .\n\ + MOVE.\n" + +STRING_REN_HELP2, " %lu \n" + +STRING_REN_HELP3, " %lu \n" + +STRING_SHIFT_HELP, " () .\n\n\ +SHIFT [DOWN]" + +STRING_SCREEN_HELP, " \n\n\ +SCREEN []\n\n\ + , \n\ + , " + +STRING_SET_HELP, ", .\n\n\ +SET [[=][]]\n\n\ + .\n\ + , .\n\n\ +SET .\n" + +STRING_START_HELP1, " .\n\n\ +START \n\n\ + .\n\n\ +At the moment all commands are started asynchronously.\n" + +STRING_TITLE_HELP, " .\n\n\ +TITLE []\n\n\ + .\n" + +STRING_TIME_HELP1, " .\n\n\ +TIME [/T][]\n\n\ + /T \n\n\ +TIME \n\ + . ENTER .\n" + +STRING_TIME_HELP2, " : " + +STRING_TIMER_HELP1, " %d \n" + +STRING_TIMER_HELP2, " %02d%c%02d%c%02d%c%02d\n" + +STRING_TIMER_HELP3, ".\n\n\ +TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\ + ON \n\ + OFF \n\ + /S . \n\ + \n\ + /n .\n\ + - 0 9\n\ + - 1\n\ + /Fn \n\ + n :\n\ + 0 \n\ + 1 %c%c%c\n\n\ + , \n\ + \n\n" + +STRING_TYPE_HELP1, " .\n\nTYPE [:][] \n\ + /P .\n" + +STRING_VERIFY_HELP1, "This command is just a dummy!!\n\ + a\n\ + .\n\n\ +VERIFY [ON | OFF]\n\n\ +VERIFY .\n" + +STRING_VERIFY_HELP2, "VERIFY %s.\n" + +STRING_VERIFY_HELP3, " ON OFF." + +STRING_VERSION_HELP1, " \n\n\ +VER [/C][/R][/W]\n\n\ + /C Displays credits.\n\ + /R Displays redistribution information.\n\ + /W Displays warranty information." + +STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\ +type: `ver /w'. This is free software, and you are welcome to redistribute\n\ +it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\ +listing of credits." + +STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\ + but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ + GNU General Public License for more details." + +STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\ + it under the terms of the GNU General Public License as published by\n\ + the Free Software Foundation; either version 2 of the License, or\n\ + (at your option) any later version.\n" + +STRING_VERSION_HELP5, "\n .\n\ + : http://www.reactos.org/" + +STRING_VERSION_HELP6, "\nFreeDOS- :\n" + +STRING_VERSION_HELP7, "\nReactOS- :\n" + +STRING_VOL_HELP1, " %c: %s" +STRING_VOL_HELP2, " %c: " +STRING_VOL_HELP3, " : %04X-%04X\n" +STRING_VOL_HELP4, " .\n\nVOL [:]" + +STRING_WINDOW_HELP1, " \n\n\ +WINDOW [/POS[=]left,top,,]\n\ + [MIN|MAX|RESTORE] ['']\n\n\ +/POS \n\ +MIN \n\ +MAX \n\ +RESTORE \n" + +STRING_WINDOW_HELP2, " \n\n\ +ACTIVATE 'window' [/POS[=]left,top,,]\n\ + [MIN|MAX|RESTORE] ['']\n\n\ +window , \n\ +/POS \n\ +MIN \n\ +MAX \n\ +RESTORE \n\ + \n" + + +STRING_HELP1, " \n\n\ + /? \n\n\ +? .\n\ +ALIAS , .\n\ +ATTRIB .\n\ +BEEP .\n\ +CALL .\n\ +CD .\n\ +CHCP .\n\ +CHOICE , .\n\ +CLS .\n\ +CMD .\n\ +COLOR .\n\ +COPY .\n\ +DATE .\n\ +DELETE .\n\ +DIR .\n\ +ECHO .\n\ +ERASE .\n\ +EXIT .\n\ +FOR .\n\ +FREE () .\n\ +GOTO \n\ +HELP ReactOS.\n\ +HISTORY \n\ +IF .\n\ +LABEL , .\n\ +MD .\n\ +MKDIR .\n\ +MOVE \n\ +PATH .\n\ +PAUSE .\n\ +POPD \n\ + PUSHD.\n\ +PROMPT .\n\ +PUSHD , .\n\ +RD .\n\ +REM () .\n\ +REN .\n\ +RENAME .\n\ +RMDIR .\n\ +SCREEN .\n\ +SET , .\n\ +SHIFT () \n" +STRING_HELP2, "START .\n\ + .\n\ +TIME .\n\ +TIMER .\n\ +TITLE .\n\ +TYPE .\n\ +VER .\n\ +VERIFY \n\ + .\n\ +VOL .\n" + + +STRING_CHOICE_OPTION, "YN" +STRING_COPY_OPTION, "YNA" + + +STRING_ALIAS_ERROR, " !\n" +STRING_BATCH_ERROR, " \n" +STRING_CHCP_ERROR1, " : %u\n" +STRING_CHCP_ERROR4, " \n" +STRING_CHOICE_ERROR, " . : /C[:]" +STRING_CHOICE_ERROR_TXT, " . : /T[:]c,nn" +STRING_CHOICE_ERROR_OPTION, " : %s" +STRING_MD_ERROR, " .\n" +STRING_MD_ERROR2, " .\n" +STRING_CMD_ERROR1, " %s\n" +STRING_CMD_ERROR2, " pipe-\n" +STRING_CMD_ERROR3, " %s\n" +STRING_CMD_ERROR4, " %s...\n" +STRING_CMD_ERROR5, " cmdexit.bat...\n" +STRING_COLOR_ERROR1, " ! ( )" +STRING_COLOR_ERROR2, " " +STRING_COLOR_ERROR3, " %x\n" +STRING_COLOR_ERROR4, " !" +STRING_CONSOLE_ERROR, " : %d\n" +STRING_COPY_ERROR1, ": - %s!\n" +STRING_COPY_ERROR2, ": !\n" +STRING_COPY_ERROR3, " !\n" +STRING_COPY_ERROR4, ": Not implemented yet!\n" +STRING_DATE_ERROR, " ." +STRING_DEL_ERROR5, " %s ! " +STRING_DEL_ERROR6, " (Y/N)?" +STRING_DEL_ERROR7, ": %s\n" +STRING_ERROR_ERROR1, " ! : 0x%lx\n" +STRING_ERROR_ERROR2, " " +STRING_FOR_ERROR1, "'in' for." +STRING_FOR_ERROR2, " ." +STRING_FOR_ERROR3, "'do' ." +STRING_FOR_ERROR4, " 'do'." +STRING_FREE_ERROR1, " " +STRING_FREE_ERROR2, "unlabeled" +STRING_GOTO_ERROR1, " GOTO" +STRING_GOTO_ERROR2, " '%s' \n" + +STRING_MOVE_ERROR1, "[OK]\n" +STRING_MOVE_ERROR2, "[]\n" + +STRING_REN_ERROR1, " MoveFile() . : %lu\n" + +STRING_START_ERROR1, " !" + +STRING_TIME_ERROR1, " ." + +STRING_TYPE_ERROR1, " '/%s'\n" + +STRING_WINDOW_ERROR1, " " + + +STRING_ERROR_PARAMETERF_ERROR, " - %c\n" +STRING_ERROR_INVALID_SWITCH, " - /%c\n" +STRING_ERROR_TOO_MANY_PARAMETERS, " - %s\n" +STRING_ERROR_PATH_NOT_FOUND, " \n" +STRING_ERROR_FILE_NOT_FOUND, " \n" +STRING_ERROR_REQ_PARAM_MISSING, " \n" +STRING_ERROR_INVALID_DRIVE, " \n" +STRING_ERROR_INVALID_PARAM_FORMAT, " - %s\n" +STRING_ERROR_BADCOMMAND, " \n" +STRING_ERROR_OUT_OF_MEMORY, " .\n" +STRING_ERROR_CANNOTPIPE, "! pipe! !\n" +STRING_ERROR_D_PAUSEMSG, " . . ." +STRING_ERROR_DRIVER_NOT_READY, " " + +STRING_PATH_ERROR, "CMD: '%s'\n" + +STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" +STRING_VERSION_RUNVER, " %s" +STRING_COPY_FILE , " %d () \n" +STRING_DELETE_WIPE, "wiped" +STRING_FOR_ERROR, " ." +STRING_SCREEN_COL, " " +STRING_SCREEN_ROW, " " +STRING_TIMER_TIME "Timer %d is %s: " + +STRING_INVALID_OPERAND, " ." +STRING_EXPECTED_CLOSE_PAREN, " ')'." +STRING_EXPECTED_NUMBER_OR_VARIABLE," ." +STRING_SYNTAX_COMMAND_INCORRECT, " ." + +} diff --git a/reactos/base/shell/cmd/alias.c b/reactos/base/shell/cmd/alias.c new file mode 100644 index 00000000000..a3aebd2cd68 --- /dev/null +++ b/reactos/base/shell/cmd/alias.c @@ -0,0 +1,344 @@ +/* + * ALIAS.C - alias administration module. + * + * + * History: + * + * 02/02/1996 (Oliver Mueller) + * started. + * + * 02/03/1996 (Oliver Mueller) + * Added sorting algorithm and case sensitive substitution by using + * partstrupr(). + * + * 27 Jul 1998 John P. Price + * added config.h include + * added ifdef's to disable aliases + * + * 09-Dec-1998 (Eric Kohl ) + * Fixed crash when removing an alias in DeleteAlias(). + * Added help text ("/?"). + * + * 14-Jan-1998 (Eric Kohl ) + * Clean up and Unicode safe! + * + * 24-Jan-1998 (Eric Kohl ) + * Redirection safe! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + + +#include +#include "resource.h" + +#ifdef FEATURE_ALIASES + +typedef struct tagALIAS +{ + struct tagALIAS *next; + LPTSTR lpName; + LPTSTR lpSubst; + DWORD dwUsed; +} ALIAS, *LPALIAS; + + +static LPALIAS lpFirst = NULL; +static LPALIAS lpLast = NULL; +static DWORD dwUsed = 0; + + +/* module internal functions */ +/* strlwr only for first word in string */ +static VOID +partstrlwr (LPTSTR str) +{ + LPTSTR c = str; + while (*c && !_istspace (*c) && *c != _T('=')) + { + *c = _totlower (*c); + c++; + } +} + + +static VOID +PrintAlias (VOID) +{ + LPALIAS ptr = lpFirst; + while (ptr) + { + ConOutPrintf (_T("%s=%s\n"), ptr->lpName, ptr->lpSubst); + ptr = ptr->next; + } +} + + +static VOID +DeleteAlias (LPTSTR pszName) +{ + LPALIAS ptr = lpFirst; + LPALIAS prev = NULL; + + while (ptr) + { + if (!_tcsicmp (ptr->lpName, pszName)) + { + if (prev) + prev->next = ptr->next; + else + lpFirst = ptr->next; + free (ptr->lpName); + free (ptr->lpSubst); + free (ptr); + return; + } + prev = ptr; + ptr = ptr->next; + } +} + + +static VOID +AddAlias (LPTSTR name, LPTSTR subst) +{ + LPALIAS ptr = lpFirst; + LPALIAS prev, entry; + LPTSTR s; + + while (ptr) + { + if (!_tcsicmp (ptr->lpName, name)) + { + s = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR)); + if (!s) + { + error_out_of_memory (); + return; + } + + free (ptr->lpSubst); + ptr->lpSubst = s; + _tcscpy (ptr->lpSubst, subst); + return; + } + ptr = ptr->next; + } + + ptr = (LPALIAS)malloc (sizeof (ALIAS)); + if (!ptr) + return; + + ptr->next = 0; + + ptr->lpName = (LPTSTR)malloc ((_tcslen (name) + 1)*sizeof(TCHAR)); + if (!ptr->lpName) + { + error_out_of_memory (); + free (ptr); + return; + } + _tcscpy (ptr->lpName, name); + + ptr->lpSubst = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR)); + if (!ptr->lpSubst) + { + error_out_of_memory (); + free (ptr->lpName); + free (ptr); + return; + } + _tcscpy (ptr->lpSubst, subst); + + /* it's necessary for recursive substitution */ + partstrlwr (ptr->lpSubst); + + ptr->dwUsed = 0; + + /* Alias table must be sorted! + * Here a little example: + * command line = "ls -c" + * If the entries are + * ls=dir + * ls -c=ls /w + * command line will be expanded to "dir -c" which is not correct. + * If the entries are sortet as + * ls -c=ls /w + * ls=dir + * it will be expanded to "dir /w" which is a valid DOS command. + */ + entry = lpFirst; + prev = 0; + while (entry) + { + if (_tcsicmp (ptr->lpName, entry->lpName) > 0) + { + if (prev) + { + prev->next = ptr; + ptr->next = entry; + } + else + { + ptr->next = entry; + lpFirst = ptr; + } + return; + } + prev = entry; + entry = entry->next; + } + + /* The new entry is the smallest (or the first) and must be + * added to the end of the list. + */ + if (!lpFirst) + lpFirst = ptr; + else + lpLast->next = ptr; + lpLast = ptr; + + return; +} + + +VOID InitializeAlias (VOID) +{ + lpFirst = NULL; + lpLast = NULL; + dwUsed = 0; +} + +VOID DestroyAlias (VOID) +{ + if (lpFirst == NULL) + return; + + while (lpFirst->next != NULL) + { + lpLast = lpFirst; + lpFirst = lpLast->next; + + free (lpLast->lpName); + free (lpLast->lpSubst); + free (lpLast); + } + + free (lpFirst->lpName); + free (lpFirst->lpSubst); + free (lpFirst); + + lpFirst = NULL; + lpLast = NULL; + dwUsed = 0; +} + +/* specified routines */ +VOID ExpandAlias (LPTSTR cmd, INT maxlen) +{ + unsigned n = 0, + m, + i, + len; + short d = 1; + LPALIAS ptr = lpFirst; + + dwUsed++; + if (dwUsed == 0) + { + while (ptr) + ptr->dwUsed = 0; + ptr = lpFirst; + dwUsed = 1; + } + + /* skipping white spaces */ + while (_istspace (cmd[n])) + n++; + + partstrlwr (&cmd[n]); + + if (!_tcsncmp (&cmd[n], _T("NOALIAS"), 7) && + (_istspace (cmd[n + 7]) || cmd[n + 7] == _T('\0'))) + { + memmove (cmd, &cmd[n + 7], (_tcslen (&cmd[n + 7]) + 1) * sizeof (TCHAR)); + return; + } + + /* substitution loop */ + while (d) + { + d = 0; + while (ptr) + { + len = _tcslen (ptr->lpName); + if (!_tcsncmp (&cmd[n], ptr->lpName, len) && + (_istspace (cmd[n + len]) || cmd[n + len] == _T('\0')) && + ptr->dwUsed != dwUsed) + { + m = _tcslen (ptr->lpSubst); + if ((int)(_tcslen (cmd) - len + m - n) > maxlen) + { + ConErrResPuts(STRING_ALIAS_ERROR); + + /* the parser won't cause any problems with an empty line */ + cmd[0] = _T('\0'); + } + else + { + memmove (&cmd[m], &cmd[n + len], (_tcslen(&cmd[n + len]) + 1) * sizeof (TCHAR)); + for (i = 0; i < m; i++) + cmd[i] = ptr->lpSubst[i]; + ptr->dwUsed = dwUsed; + /* whitespaces are removed! */ + n = 0; + d = 1; + } + } + ptr = ptr->next; + } + } +} + + +INT CommandAlias (LPTSTR cmd, LPTSTR param) +{ + LPTSTR ptr; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_ALIAS_HELP); + return 0; + } + + nErrorLevel = 0; + + if (param[0] == _T('\0')) + { + PrintAlias (); + return 0; + } + + nErrorLevel = 0; + + /* error if no '=' found */ + if ((ptr = _tcschr (param, _T('='))) == 0) + { + nErrorLevel = 1; + return 1; + } + + /* Split rest into name and substitute */ + *ptr++ = _T('\0'); + + partstrlwr (param); + + if (ptr[0] == _T('\0')) + DeleteAlias (param); + else + AddAlias (param, ptr); + + return 0; +} +#endif diff --git a/reactos/base/shell/cmd/attrib.c b/reactos/base/shell/cmd/attrib.c new file mode 100644 index 00000000000..d5deefee8c8 --- /dev/null +++ b/reactos/base/shell/cmd/attrib.c @@ -0,0 +1,346 @@ +/* + * ATTRIB.C - attrib internal command. + * + * + * History: + * + * 04-Dec-1998 (Eric Kohl ) + * started + * + * 09-Dec-1998 (Eric Kohl ) + * implementation works, except recursion ("attrib /s"). + * + * 05-Jan-1999 (Eric Kohl ) + * major rewrite. + * fixed recursion ("attrib /s"). + * started directory support ("attrib /s /d"). + * updated help text. + * + * 14-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 19-Jan-1999 (Eric Kohl ) + * Redirection ready! + * + * 21-Jan-1999 (Eric Kohl ) + * Added check for invalid filenames. + * + * 23-Jan-1999 (Eric Kohl ) + * Added handling of multiple filenames. + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_ATTRIB + + +static VOID +PrintAttribute (LPTSTR pszPath, LPTSTR pszFile, BOOL bRecurse) +{ + WIN32_FIND_DATA findData; + HANDLE hFind; + TCHAR szFullName[MAX_PATH]; + LPTSTR pszFileName; + + /* prepare full file name buffer */ + _tcscpy (szFullName, pszPath); + pszFileName = szFullName + _tcslen (szFullName); + + /* display all subdirectories */ + if (bRecurse) + { + /* append file name */ + _tcscpy (pszFileName, pszFile); + + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + return; + } + + do + { + if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + + if (!_tcscmp (findData.cFileName, _T(".")) || + !_tcscmp (findData.cFileName, _T(".."))) + continue; + + _tcscpy (pszFileName, findData.cFileName); + _tcscat (pszFileName, _T("\\")); + PrintAttribute (szFullName, pszFile, bRecurse); + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); + } + + /* append file name */ + _tcscpy (pszFileName, pszFile); + + /* display current directory */ + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + return; + } + + do + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + _tcscpy (pszFileName, findData.cFileName); + + ConOutPrintf (_T("%c %c%c%c %s\n"), + (findData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) ? _T('A') : _T(' '), + (findData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? _T('S') : _T(' '), + (findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? _T('H') : _T(' '), + (findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? _T('R') : _T(' '), + szFullName); + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); +} + + +static VOID +ChangeAttribute (LPTSTR pszPath, LPTSTR pszFile, DWORD dwMask, + DWORD dwAttrib, BOOL bRecurse, BOOL bDirectories) +{ + WIN32_FIND_DATA findData; + HANDLE hFind; + DWORD dwAttribute; + TCHAR szFullName[MAX_PATH]; + LPTSTR pszFileName; + + + /* prepare full file name buffer */ + _tcscpy (szFullName, pszPath); + pszFileName = szFullName + _tcslen (szFullName); + + /* change all subdirectories */ + if (bRecurse) + { + /* append file name */ + _tcscpy (pszFileName, _T("*.*")); + + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + nErrorLevel = 1; + return; + } + + do + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!_tcscmp (findData.cFileName, _T(".")) || + !_tcscmp (findData.cFileName, _T(".."))) + continue; + + _tcscpy (pszFileName, findData.cFileName); + _tcscat (pszFileName, _T("\\")); + + ChangeAttribute (szFullName, pszFile, dwMask, + dwAttrib, bRecurse, bDirectories); + } + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); + } + + /* append file name */ + _tcscpy (pszFileName, pszFile); + + hFind = FindFirstFile (szFullName, &findData); + if (hFind == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), pszFile); + nErrorLevel = 1; + return; + } + + do + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + _tcscpy (pszFileName, findData.cFileName); + + dwAttribute = GetFileAttributes (szFullName); + + if (dwAttribute != 0xFFFFFFFF) + { + dwAttribute = (dwAttribute & ~dwMask) | dwAttrib; + SetFileAttributes (szFullName, dwAttribute); + } + } + while (FindNextFile (hFind, &findData)); + FindClose (hFind); +} + + +INT CommandAttrib (LPTSTR cmd, LPTSTR param) +{ + LPTSTR *arg; + INT argc, i; + TCHAR szPath[MAX_PATH]; + TCHAR szFileName [MAX_PATH]; + BOOL bRecurse = FALSE; + BOOL bDirectories = FALSE; + DWORD dwAttrib = 0; + DWORD dwMask = 0; + + /* initialize strings */ + szPath[0] = _T('\0'); + szFileName[0] = _T('\0'); + + /* print help */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_ATTRIB_HELP); + return 0; + } + + nErrorLevel = 0; + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* check for options */ + for (i = 0; i < argc; i++) + { + if (_tcsicmp (arg[i], _T("/s")) == 0) + bRecurse = TRUE; + else if (_tcsicmp (arg[i], _T("/d")) == 0) + bDirectories = TRUE; + } + + /* create attributes and mask */ + for (i = 0; i < argc; i++) + { + if (*arg[i] == _T('+')) + { + if (_tcslen (arg[i]) != 2) + { + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + + switch ((TCHAR)_totupper (arg[i][1])) + { + case _T('A'): + dwMask |= FILE_ATTRIBUTE_ARCHIVE; + dwAttrib |= FILE_ATTRIBUTE_ARCHIVE; + break; + + case _T('H'): + dwMask |= FILE_ATTRIBUTE_HIDDEN; + dwAttrib |= FILE_ATTRIBUTE_HIDDEN; + break; + + case _T('R'): + dwMask |= FILE_ATTRIBUTE_READONLY; + dwAttrib |= FILE_ATTRIBUTE_READONLY; + break; + + case _T('S'): + dwMask |= FILE_ATTRIBUTE_SYSTEM; + dwAttrib |= FILE_ATTRIBUTE_SYSTEM; + break; + + default: + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + } + else if (*arg[i] == _T('-')) + { + if (_tcslen (arg[i]) != 2) + { + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + + switch ((TCHAR)_totupper (arg[i][1])) + { + case _T('A'): + dwMask |= FILE_ATTRIBUTE_ARCHIVE; + dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE; + break; + + case _T('H'): + dwMask |= FILE_ATTRIBUTE_HIDDEN; + dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN; + break; + + case _T('R'): + dwMask |= FILE_ATTRIBUTE_READONLY; + dwAttrib &= ~FILE_ATTRIBUTE_READONLY; + break; + + case _T('S'): + dwMask |= FILE_ATTRIBUTE_SYSTEM; + dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM; + break; + + default: + error_invalid_parameter_format (arg[i]); + freep (arg); + return -1; + } + } + } + + if (argc == 0) + { + DWORD len; + + len = GetCurrentDirectory (MAX_PATH, szPath); + if (szPath[len-1] != _T('\\')) + { + szPath[len] = _T('\\'); + szPath[len + 1] = 0; + } + _tcscpy (szFileName, _T("*.*")); + PrintAttribute (szPath, szFileName, bRecurse); + freep (arg); + return 0; + } + + /* get full file name */ + for (i = 0; i < argc; i++) + { + if ((*arg[i] != _T('+')) && (*arg[i] != _T('-')) && (*arg[i] != _T('/'))) + { + LPTSTR p; + GetFullPathName (arg[i], MAX_PATH, szPath, NULL); + p = _tcsrchr (szPath, _T('\\')) + 1; + _tcscpy (szFileName, p); + *p = _T('\0'); + + if (dwMask == 0) + PrintAttribute (szPath, szFileName, bRecurse); + else + ChangeAttribute (szPath, szFileName, dwMask, + dwAttrib, bRecurse, bDirectories); + } + } + + freep (arg); + return 0; +} + +#endif /* INCLUDE_CMD_ATTRIB */ diff --git a/reactos/base/shell/cmd/batch.c b/reactos/base/shell/cmd/batch.c new file mode 100644 index 00000000000..f15547ccc32 --- /dev/null +++ b/reactos/base/shell/cmd/batch.c @@ -0,0 +1,459 @@ +/* + * BATCH.C - batch file processor for CMD.EXE. + * + * + * History: + * + * ??/??/?? (Evan Jeffrey) + * started. + * + * 15 Jul 1995 (Tim Norman) + * modes and bugfixes. + * + * 08 Aug 1995 (Matt Rains) + * i have cleaned up the source code. changes now bring this + * source into guidelines for recommended programming practice. + * + * i have added some constants to help making changes easier. + * + * 29 Jan 1996 (Steffan Kaiser) + * made a few cosmetic changes + * + * 05 Feb 1996 (Tim Norman) + * changed to comply with new first/rest calling scheme + * + * 14 Jun 1997 (Steffen Kaiser) + * bug fixes. added error level expansion %?. ctrl-break handling + * + * 16 Jul 1998 (Hans B Pufal) + * Totally reorganised in conjunction with COMMAND.C (cf) to + * implement proper BATCH file nesting and other improvements. + * + * 16 Jul 1998 (John P Price ) + * Seperated commands into individual files. + * + * 19 Jul 1998 (Hans B Pufal) [HBP_001] + * Preserve state of echo flag across batch calls. + * + * 19 Jul 1998 (Hans B Pufal) [HBP_002] + * Implementation of FOR command + * + * 20-Jul-1998 (John P Price ) + * added error checking after malloc calls + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 02-Aug-1998 (Hans B Pufal) [HBP_003] + * Fixed bug in ECHO flag restoration at exit from batch file + * + * 26-Jan-1999 (Eric Kohl ) + * Replaced CRT io functions by Win32 io functions. + * Unicode safe! + * + * 23-Feb-2001 (Carl Nettelblad ) + * Fixes made to get "for" working. + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* The stack of current batch contexts. + * NULL when no batch is active + */ +LPBATCH_CONTEXT bc = NULL; + +BOOL bEcho = TRUE; /* The echo flag */ + + + +/* Buffer for reading Batch file lines */ +TCHAR textline[BATCH_BUFFSIZE]; + + +/* + * Returns a pointer to the n'th parameter of the current batch file. + * If no such parameter exists returns pointer to empty string. + * If no batch file is current, returns NULL + * + */ + +LPTSTR FindArg (INT n) +{ + LPTSTR pp; + +#ifdef _DEBUG + DebugPrintf (_T("FindArg: (%d)\n"), n); +#endif + + if (bc == NULL) + return NULL; + + n += bc->shiftlevel; + pp = bc->params; + + /* Step up the strings till we reach the end */ + /* or the one we want */ + while (*pp && n--) + pp += _tcslen (pp) + 1; + + return pp; +} + + +/* + * Batch_params builds a parameter list in newlay allocated memory. + * The parameters consist of null terminated strings with a final + * NULL character signalling the end of the parameters. + * +*/ + +LPTSTR BatchParams (LPTSTR s1, LPTSTR s2) +{ + LPTSTR dp = (LPTSTR)malloc ((_tcslen(s1) + _tcslen(s2) + 3) * sizeof (TCHAR)); + + /* JPP 20-Jul-1998 added error checking */ + if (dp == NULL) + { + error_out_of_memory(); + return NULL; + } + + if (s1 && *s1) + { + s1 = _stpcpy (dp, s1); + *s1++ = _T('\0'); + } + else + s1 = dp; + + while (*s2) + { + if (_istspace (*s2) || _tcschr (_T(",;"), *s2)) + { + *s1++ = _T('\0'); + s2++; + while (*s2 && _tcschr (_T(" ,;"), *s2)) + s2++; + continue; + } + + if ((*s2 == _T('"')) || (*s2 == _T('\''))) + { + TCHAR st = *s2; + + do + *s1++ = *s2++; + while (*s2 && (*s2 != st)); + } + + *s1++ = *s2++; + } + + *s1++ = _T('\0'); + *s1 = _T('\0'); + + return dp; +} + + +/* + * If a batch file is current, exits it, freeing the context block and + * chaining back to the previous one. + * + * If no new batch context is found, sets ECHO back ON. + * + * If the parameter is non-null or not empty, it is printed as an exit + * message + */ + +VOID ExitBatch (LPTSTR msg) +{ +#ifdef _DEBUG + DebugPrintf (_T("ExitBatch: (\'%s\')\n"), msg); +#endif + + if (bc != NULL) + { + LPBATCH_CONTEXT t = bc; + + if (bc->hBatchFile) + { + CloseHandle (bc->hBatchFile); + bc->hBatchFile = INVALID_HANDLE_VALUE; + } + + if (bc->params) + free(bc->params); + + if (bc->forproto) + free(bc->forproto); + + if (bc->ffind) + free(bc->ffind); + + /* Preserve echo state across batch calls */ + bEcho = bc->bEcho; + + bc = bc->prev; + free(t); + } + + if (msg && *msg) + ConOutPrintf (_T("%s\n"), msg); +} + + +/* + * Start batch file execution + * + * The firstword parameter is the full filename of the batch file. + * + */ + +BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param) +{ + HANDLE hFile; + SetLastError(0); + hFile = CreateFile (fullname, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | + FILE_FLAG_SEQUENTIAL_SCAN, NULL); + +#ifdef _DEBUG + DebugPrintf (_T("Batch: (\'%s\', \'%s\', \'%s\') hFile = %x\n"), + fullname, firstword, param, hFile); +#endif + + if (hFile == INVALID_HANDLE_VALUE) + { + ConErrResPuts(STRING_BATCH_ERROR); + return FALSE; + } + + /* Kill any and all FOR contexts */ + while (bc && bc->forvar) + ExitBatch (NULL); + + if (bc == NULL) + { + /* No curent batch file, create a new context */ + LPBATCH_CONTEXT n = (LPBATCH_CONTEXT)malloc (sizeof(BATCH_CONTEXT)); + + if (n == NULL) + { + error_out_of_memory (); + return FALSE; + } + + n->prev = bc; + bc = n; + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + } + else if (bc->hBatchFile != INVALID_HANDLE_VALUE) + { + /* Then we are transferring to another batch */ + CloseHandle (bc->hBatchFile); + bc->hBatchFile = INVALID_HANDLE_VALUE; + free (bc->params); + } + + bc->hBatchFile = hFile; + SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN); + bc->bEcho = bEcho; /* Preserve echo across batch calls */ + bc->shiftlevel = 0; + + bc->ffind = NULL; + bc->forvar = _T('\0'); + bc->forproto = NULL; + bc->params = BatchParams (firstword, param); + +#ifdef _DEBUG + DebugPrintf (_T("Batch: returns TRUE\n")); +#endif + + return TRUE; +} + +VOID AddBatchRedirection(TCHAR * ifn, TCHAR * ofn, TCHAR * efn) +{ + if(!bc) + return; + if(_tcslen(ifn)) + _tcscpy(bc->In,ifn); + if(_tcslen(ofn)) + _tcscpy(bc->Out,ofn); + if(_tcslen(efn)) + _tcscpy(bc->Err,efn); + +} + +/* + * Read and return the next executable line form the current batch file + * + * If no batch file is current or no further executable lines are found + * return NULL. + * + * Here we also look out for FOR bcontext structures which trigger the + * FOR expansion code. + * + * Set eflag to 0 if line is not to be echoed else 1 + */ + +LPTSTR ReadBatchLine (LPBOOL bLocalEcho) +{ + LPTSTR first; + LPTSTR ip; + + /* No batch */ + if (bc == NULL) + return NULL; + +#ifdef _DEBUG + DebugPrintf (_T("ReadBatchLine ()\n")); +#endif + + while (1) + { + /* User halt */ + if (CheckCtrlBreak (BREAK_BATCHFILE)) + { + while (bc) + ExitBatch (NULL); + return NULL; + } + + /* No batch */ + if (bc == NULL) + return NULL; + + /* If its a FOR context... */ + if (bc->forvar) + { + LPTSTR sp = bc->forproto; /* pointer to prototype command */ + LPTSTR dp = textline; /* Place to expand protoype */ + LPTSTR fv = FindArg (0); /* Next list element */ + + /* End of list so... */ + if ((fv == NULL) || (*fv == _T('\0'))) + { + /* just exit this context */ + ExitBatch (NULL); + continue; + } + + if (_tcscspn (fv, _T("?*")) == _tcslen (fv)) + { + /* element is wild file */ + bc->shiftlevel++; /* No use it and shift list */ + } + else + { + /* Wild file spec, find first (or next) file name */ + if (bc->ffind) + { + /* First already done so do next */ + + fv = FindNextFile (bc->hFind, bc->ffind) ? bc->ffind->cFileName : NULL; + } + else + { + /* For first find, allocate a find first block */ + if ((bc->ffind = (LPWIN32_FIND_DATA)malloc (sizeof (WIN32_FIND_DATA))) == NULL) + { + error_out_of_memory(); + return NULL; + } + + bc->hFind = FindFirstFile (fv, bc->ffind); + + fv = !(bc->hFind==INVALID_HANDLE_VALUE) ? bc->ffind->cFileName : NULL; + } + + if (fv == NULL) + { + /* Null indicates no more files.. */ + free (bc->ffind); /* free the buffer */ + bc->ffind = NULL; + bc->shiftlevel++; /* On to next list element */ + continue; + } + } + + /* At this point, fv points to parameter string */ + while (*sp) + { + if ((*sp == _T('%')) && (*(sp + 1) == bc->forvar)) + { + /* replace % var */ + dp = _stpcpy (dp, fv); + sp += 2; + } + else + { + /* Else just copy */ + *dp++ = *sp++; + } + } + + *dp = _T('\0'); + + *bLocalEcho = bEcho; + + return textline; + } + + if (!FileGetString (bc->hBatchFile, textline, sizeof (textline) / sizeof (textline[0]))) + { +#ifdef _DEBUG + DebugPrintf (_T("ReadBatchLine(): Reached EOF!\n")); +#endif + /* End of file.... */ + ExitBatch (NULL); + + if (bc == NULL) + return NULL; + + continue; + } +#ifdef _DEBUG + DebugPrintf (_T("ReadBatchLine(): textline: \'%s\'\n"), textline); +#endif + + /* Strip leading spaces and trailing space/control chars */ + for (first = textline; _istspace (*first); first++) + ; + + for (ip = first + _tcslen (first) - 1; _istspace (*ip) || _istcntrl (*ip); ip--) + ; + + *++ip = _T('\0'); + + /* ignore labels and empty lines */ + if (*first == _T(':') || *first == 0) + continue; + + if (*first == _T('@')) + { + /* don't echo this line */ + do + first++; + while (_istspace (*first)); + + *bLocalEcho = 0; + } + else + *bLocalEcho = bEcho; + + break; + } + + return first; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/batch.h b/reactos/base/shell/cmd/batch.h new file mode 100644 index 00000000000..9e68abb6d83 --- /dev/null +++ b/reactos/base/shell/cmd/batch.h @@ -0,0 +1,47 @@ +/* + * BATCH.H - A structure to preserve the context of a batch file + * + * + */ + +#ifndef _BATCH_H_INCLUDED_ +#define _BATCH_H_INCLUDED_ + + +typedef struct tagBATCHCONTEXT +{ + struct tagBATCHCONTEXT *prev; + LPWIN32_FIND_DATA ffind; + HANDLE hBatchFile; + LPTSTR forproto; + LPTSTR params; + INT shiftlevel; + BOOL bEcho; /* Preserve echo flag across batch calls */ + HANDLE hFind; /* Preserve find handle when doing a for */ + TCHAR In[MAX_PATH]; + TCHAR Out[MAX_PATH]; + TCHAR Err[MAX_PATH]; + TCHAR forvar; +} BATCH_CONTEXT, *LPBATCH_CONTEXT; + + +/* The stack of current batch contexts. + * NULL when no batch is active + */ +extern LPBATCH_CONTEXT bc; + +extern BOOL bEcho; /* The echo flag */ + +#define BATCH_BUFFSIZE 2048 + +extern TCHAR textline[BATCH_BUFFSIZE]; /* Buffer for reading Batch file lines */ + + +LPTSTR FindArg (INT); +LPTSTR BatchParams (LPTSTR, LPTSTR); +VOID ExitBatch (LPTSTR); +BOOL Batch (LPTSTR, LPTSTR, LPTSTR); +LPTSTR ReadBatchLine (LPBOOL); +VOID AddBatchRedirection(TCHAR *, TCHAR *, TCHAR *); + +#endif /* _BATCH_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/beep.c b/reactos/base/shell/cmd/beep.c new file mode 100644 index 00000000000..61537ed5cc4 --- /dev/null +++ b/reactos/base/shell/cmd/beep.c @@ -0,0 +1,50 @@ +/* + * BEEP.C - beep internal command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 14-Jan-1999 (Eric Kohl ) + * Added help text ("beep /?"). + * Unicode ready! + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection ready! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_BEEP + + +INT cmd_beep (LPTSTR cmd, LPTSTR param) +{ + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_BEEP_HELP); + return 0; + } + +#if 0 + /* check if run in batch mode */ + if (bc == NULL) + return 1; +#endif + MessageBeep (-1); + + return 0; +} +#endif diff --git a/reactos/base/shell/cmd/call.c b/reactos/base/shell/cmd/call.c new file mode 100644 index 00000000000..08c10d129d0 --- /dev/null +++ b/reactos/base/shell/cmd/call.c @@ -0,0 +1,100 @@ +/* + * CALL.C - call internal batch command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 04-Aug-1998 (Hans B Pufal) + * added lines to initialize for pointers (HBP004) This fixed the + * lock-up that happened sometimes when calling a batch file from + * another batch file. + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("call /?") and cleaned up. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform CALL command. + * + * Allocate a new batch context and add it to the current chain. + * Call parsecommandline passing in our param string + * If No batch file was opened then remove our newly allocted + * context block. + */ + +INT cmd_call (LPTSTR cmd, LPTSTR param) +{ + LPBATCH_CONTEXT n = NULL; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_call: (\'%s\',\'%s\')\n"), cmd, param); +#endif + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CALL_HELP); + return 0; + } + + nErrorLevel = 0; + + n = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT)); + + if (n == NULL) + { + error_out_of_memory (); + return 1; + } + + n->prev = bc; + bc = n; + + bc->hBatchFile = INVALID_HANDLE_VALUE; + bc->params = NULL; + bc->shiftlevel = 0; + bc->forvar = 0; /* HBP004 */ + bc->forproto = NULL; /* HBP004 */ + ParseCommandLine (param); + if (bc->prev) + { + _tcscpy(bc->In, bc->prev->In); + _tcscpy(bc->Out, bc->prev->Out); + _tcscpy(bc->Err, bc->prev->Err); + } + else + { + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + } + + + /* Wasn't a batch file so remove conext */ + if (bc->hBatchFile == INVALID_HANDLE_VALUE) + { + bc = bc->prev; + free (n); + } + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/chcp.c b/reactos/base/shell/cmd/chcp.c new file mode 100644 index 00000000000..bf34ded3533 --- /dev/null +++ b/reactos/base/shell/cmd/chcp.c @@ -0,0 +1,85 @@ +/* + * CHCP.C - chcp internal command. + * + * + * History: + * + * 23-Dec-1998 (Eric Kohl ) + * Started. + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + + +#ifdef INCLUDE_CMD_CHCP + +INT CommandChcp (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT args; + UINT uNewCodePage; + + /* print help */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CHCP_HELP); + return 0; + } + + nErrorLevel = 0; + + /* get parameters */ + arg = split (param, &args, FALSE); + + if (args == 0) + { + /* display active code page number */ + LoadString(CMD_ModuleHandle, STRING_CHCP_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, InputCodePage); + return 0; + } + + if (args >= 2) + { + /* too many parameters */ + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, param); + nErrorLevel = 1; + return 1; + } + + uNewCodePage = (UINT)_ttoi(arg[0]); + + if (uNewCodePage == 0) + { + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, arg[0]); + freep (arg); + nErrorLevel = 1; + return 1; + } + + if (!SetConsoleCP(uNewCodePage)) + { + ConErrResPuts(STRING_CHCP_ERROR4); + } + else + { + + SetConsoleOutputCP (uNewCodePage); + InitLocale (); + InputCodePage= GetConsoleCP(); + } + + freep (arg); + + return 0; +} + +#endif /* INCLUDE_CMD_CHCP */ diff --git a/reactos/base/shell/cmd/choice.c b/reactos/base/shell/cmd/choice.c new file mode 100644 index 00000000000..095a6b5e83d --- /dev/null +++ b/reactos/base/shell/cmd/choice.c @@ -0,0 +1,327 @@ +/* + * CHOICE.C - internal command. + * + * + * History: + * + * 12 Aug 1999 (Eric Kohl) + * started. + * + * 01 Sep 1999 (Eric Kohl) + * Fixed help text. + * + * 26 Sep 1999 (Paolo Pantaleo) + * Fixed timeout. + * + * 02 Apr 2005 (Magnus Olsen + * Remove Hardcode string so + * they can be translate + * + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_CHOICE + + +#define GC_TIMEOUT -1 +#define GC_NOKEY 0 //an event occurred but it wasn't a key pressed +#define GC_KEYREAD 1 //a key has been read + + +static INT +GetCharacterTimeout (LPTCH ch, DWORD dwMilliseconds) +{ +//-------------------------------------------- +// Get a character from standard input but with a timeout. +// The function will wait a limited amount +// of time, then the function returns GC_TIMEOUT. +// +// dwMilliseconds is the timeout value, that can +// be set to INFINITE, so the function works like +// stdio.h's getchar() + + HANDLE hInput; + DWORD dwRead; + + INPUT_RECORD lpBuffer; + + hInput = GetStdHandle (STD_INPUT_HANDLE); + + //if the timeout experied return GC_TIMEOUT + if (WaitForSingleObject (hInput, dwMilliseconds) == WAIT_TIMEOUT) + return GC_TIMEOUT; + + //otherwise get the event + ReadConsoleInput (hInput, &lpBuffer, 1, &dwRead); + + //if the event is a key pressed + if ((lpBuffer.EventType == KEY_EVENT) && + (lpBuffer.Event.KeyEvent.bKeyDown == TRUE)) + { + //read the key +#ifdef _UNICODE + *ch = lpBuffer.Event.KeyEvent.uChar.UnicodeChar; +#else + *ch = lpBuffer.Event.KeyEvent.uChar.AsciiChar; +#endif + return GC_KEYREAD; + } + + //else return no key + return GC_NOKEY; +} + +static INT +IsKeyInString (LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive) +{ + LPTCH p = lpString; + INT val = 0; + + while (*p) + { + if (bCaseSensitive) + { + if (*p == cKey) + return val; + } + else + { + if (_totlower (*p) == _totlower (cKey)) + return val; + } + + val++; + p++; + } + + return -1; +} + + +INT +CommandChoice (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR lpOptions; + TCHAR Options[6]; + LPTSTR lpText = NULL; + BOOL bNoPrompt = FALSE; + BOOL bCaseSensitive = FALSE; + BOOL bTimeout = FALSE; + INT nTimeout = 0; + TCHAR cDefault = _T('\0'); + INPUT_RECORD ir; + LPTSTR p, np; + LPTSTR *arg; + INT argc; + INT i; + INT val; + + INT GCret; + TCHAR Ch; + DWORD amount,clk; + + LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, Options, 4); + lpOptions = Options; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_CHOICE_HELP); + return 0; + } + + /* retrieve text */ + p = param; + + while (TRUE) + { + if (*p == _T('\0')) + break; + + if (*p != _T('/')) + { + lpText = p; + break; + } + np = _tcschr (p, _T(' ')); + if (!np) + break; + p = np + 1; + } + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* evaluate arguments */ + if (argc > 0) + { + for (i = 0; i < argc; i++) + { + if (_tcsnicmp (arg[i], _T("/c"), 2) == 0) + { + if (arg[i][2] == _T(':')) + lpOptions = &arg[i][3]; + else + lpOptions = &arg[i][2]; + + if (_tcslen (lpOptions) == 0) + { + ConErrResPuts(STRING_CHOICE_ERROR); + freep (arg); + return 1; + } + } + else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0) + { + bNoPrompt = TRUE; + } + else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0) + { + bCaseSensitive = TRUE; + } + else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0) + { + LPTSTR s; + + if (arg[i][2] == _T(':')) + { + cDefault = arg[i][3]; + s = &arg[i][4]; + } + else + { + cDefault = arg[i][2]; + s = &arg[i][3]; + } + + if (*s != _T(',')) + { + ConErrResPuts(STRING_CHOICE_ERROR_TXT); + freep (arg); + return 1; + } + + s++; + nTimeout = _ttoi(s); + bTimeout = TRUE; + } + else if (arg[i][0] == _T('/')) + { + LoadString(CMD_ModuleHandle, STRING_CHOICE_ERROR_OPTION, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, arg[i]); + freep (arg); + return 1; + } + } + } + + /* print text */ + if (lpText) + ConOutPrintf (_T("%s"), lpText); + + /* print options */ + if (bNoPrompt == FALSE) + { + ConOutPrintf (_T("[%c"), lpOptions[0]); + + for (i = 1; (unsigned)i < _tcslen (lpOptions); i++) + ConOutPrintf (_T(",%c"), lpOptions[i]); + + ConOutPrintf (_T("]?")); + } + + ConInFlush (); + + if(!bTimeout) + { + while (TRUE) + { + ConInKey (&ir); + + val = IsKeyInString (lpOptions, +#ifdef _UNICODE + ir.Event.KeyEvent.uChar.UnicodeChar, +#else + ir.Event.KeyEvent.uChar.AsciiChar, +#endif + bCaseSensitive); + + if (val >= 0) + { + ConOutPrintf (_T("%c\n"), lpOptions[val]); + + nErrorLevel = val + 1; + + break; + } + + Beep (440, 50); + } + + freep (arg); +#ifdef _DEBUG + DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel); +#endif /* _DEBUG */ + return 0; + } + + clk = GetTickCount (); + amount = nTimeout*1000; + +loop: + GCret = GetCharacterTimeout (&Ch, amount - (GetTickCount () - clk)); + + switch (GCret) + { + case GC_TIMEOUT: +#ifdef _DEBUG + DebugPrintf (_T("GC_TIMEOUT\n")); + DebugPrintf (_T("elapsed %d msecs\n"), GetTickCount () - clk); +#endif /* _DEBUG */ + break; + + case GC_NOKEY: +#ifdef _DEBUG + DebugPrintf(_T("GC_NOKEY\n")); + DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk); +#endif /* _DEBUG */ + goto loop; + + case GC_KEYREAD: +#ifdef _DEBUG + DebugPrintf(_T("GC_KEYREAD\n")); + DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk); + DebugPrintf(_T("read %c"), Ch); +#endif /* _DEBUG */ + if ((val=IsKeyInString(lpOptions,Ch,bCaseSensitive))==-1) + { + Beep (440, 50); + goto loop; + } + cDefault=Ch; + break; + } + +#ifdef _DEBUG + DebugPrintf(_T("exiting wait loop after %d msecs\n"), + GetTickCount () - clk); +#endif /* _DEBUG */ + + val = IsKeyInString (lpOptions, cDefault, bCaseSensitive); + ConOutPrintf (_T("%c\n"), lpOptions[val]); + + nErrorLevel = val + 1; + + freep (arg); + +#ifdef _DEBUG + DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel); +#endif /* _DEBUG */ + + return 0; +} +#endif /* INCLUDE_CMD_CHOICE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/cls.c b/reactos/base/shell/cmd/cls.c new file mode 100644 index 00000000000..b2e98d761b6 --- /dev/null +++ b/reactos/base/shell/cmd/cls.c @@ -0,0 +1,62 @@ +/* + * CLS.C - clear screen internal command. + * + * + * History: + * + * 07/27/1998 (John P. Price) + * started. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 04-Dec-1998 (Eric Kohl ) + * Changed to Win32 console app. + * + * 08-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 14-Jan-1998 (Eric Kohl ) + * Unicode ready! + * + * 20-Jan-1998 (Eric Kohl ) + * Redirection ready! + * + * 02-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_CLS + +INT cmd_cls (LPTSTR cmd, LPTSTR param) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD coPos; + DWORD dwWritten; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CLS_HELP); + return 0; + } + + GetConsoleScreenBufferInfo(hConsole, &csbi); + + coPos.X = 0; + coPos.Y = 0; + FillConsoleOutputAttribute(hConsole, wColor, + csbi.dwSize.X * csbi.dwSize.Y, + coPos, &dwWritten); + FillConsoleOutputCharacter(hConsole, _T(' '), + csbi.dwSize.X * csbi.dwSize.Y, + coPos, &dwWritten); + SetConsoleCursorPosition(hConsole, coPos); + + bIgnoreEcho = TRUE; + + return 0; +} +#endif diff --git a/reactos/base/shell/cmd/cmd.c b/reactos/base/shell/cmd/cmd.c new file mode 100644 index 00000000000..2652447a681 --- /dev/null +++ b/reactos/base/shell/cmd/cmd.c @@ -0,0 +1,1865 @@ +/* + * CMD.C - command-line interface. + * + * + * History: + * + * 17 Jun 1994 (Tim Norman) + * started. + * + * 08 Aug 1995 (Matt Rains) + * I have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * A added the the standard FreeDOS GNU licence test to the + * initialize() function. + * + * Started to replace puts() with printf(). this will help + * standardize output. please follow my lead. + * + * I have added some constants to help making changes easier. + * + * 15 Dec 1995 (Tim Norman) + * major rewrite of the code to make it more efficient and add + * redirection support (finally!) + * + * 06 Jan 1996 (Tim Norman) + * finished adding redirection support! Changed to use our own + * exec code (MUCH thanks to Svante Frey!!) + * + * 29 Jan 1996 (Tim Norman) + * added support for CHDIR, RMDIR, MKDIR, and ERASE, as per + * suggestion of Steffan Kaiser + * + * changed "file not found" error message to "bad command or + * filename" thanks to Dustin Norman for noticing that confusing + * message! + * + * changed the format to call internal commands (again) so that if + * they want to split their commands, they can do it themselves + * (none of the internal functions so far need that much power, anyway) + * + * 27 Aug 1996 (Tim Norman) + * added in support for Oliver Mueller's ALIAS command + * + * 14 Jun 1997 (Steffan Kaiser) + * added ctrl-break handling and error level + * + * 16 Jun 1998 (Rob Lake) + * Runs command.com if /P is specified in command line. Command.com + * also stays permanent. If /C is in the command line, starts the + * program next in the line. + * + * 21 Jun 1998 (Rob Lake) + * Fixed up /C so that arguments for the program + * + * 08-Jul-1998 (John P. Price) + * Now sets COMSPEC environment variable + * misc clean up and optimization + * added date and time commands + * changed to using spawnl instead of exec. exec does not copy the + * environment to the child process! + * + * 14 Jul 1998 (Hans B Pufal) + * Reorganised source to be more efficient and to more closely + * follow MS-DOS conventions. (eg %..% environment variable + * replacement works form command line as well as batch file. + * + * New organisation also properly support nested batch files. + * + * New command table structure is half way towards providing a + * system in which COMMAND will find out what internal commands + * are loaded + * + * 24 Jul 1998 (Hans B Pufal) [HBP_003] + * Fixed return value when called with /C option + * + * 27 Jul 1998 John P. Price + * added config.h include + * + * 28 Jul 1998 John P. Price + * added showcmds function to show commands and options available + * + * 07-Aug-1998 (John P Price ) + * Fixed carrage return output to better match MSDOS with echo + * on or off. (marked with "JPP 19980708") + * + * 07-Dec-1998 (Eric Kohl ) + * First ReactOS release. + * Extended length of commandline buffers to 512. + * + * 13-Dec-1998 (Eric Kohl ) + * Added COMSPEC environment variable. + * Added "/t" support (color) on cmd command line. + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("cmd /?"). + * + * 25-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * Fixed redirections and piping. + * Piping is based on temporary files, but basic support + * for anonymous pipes already exists. + * + * 27-Jan-1999 (Eric Kohl ) + * Replaced spawnl() by CreateProcess(). + * + * 22-Oct-1999 (Eric Kohl ) + * Added break handler. + * + * 15-Dec-1999 (Eric Kohl ) + * Fixed current directory + * + * 28-Dec-1999 (Eric Kohl ) + * Restore window title after program/batch execution + * + * 03-Feb-2001 (Eric Kohl ) + * Workaround because argc[0] is NULL under ReactOS + * + * 23-Feb-2001 (Carl Nettelblad ) + * %envvar% replacement conflicted with for. + * + * 30-Apr-2004 (Filip Navara ) + * Make MakeSureDirectoryPathExistsEx unicode safe. + * + * 28-Mai-2004 + * Removed MakeSureDirectoryPathExistsEx. + * Use the current directory if GetTempPath fails. + * + * 12-Jul-2004 (Jens Collin ) + * Added ShellExecute call when all else fails to be able to "launch" any file. + * + * 02-Apr-2005 (Magnus Olsen ) + * Remove all hardcode string to En.rc + * + * 06-May-2005 (Klemens Friedl ) + * Add 'help' command (list all commands plus description) + * + * 06-jul-2005 (Magnus Olsen ) + * translate '%errorlevel%' to the internal value. + * Add proper memmory alloc ProcessInput, the error + * handling for memmory handling need to be improve + */ + +#include +#include +#include "resource.h" + +#ifndef NT_SUCCESS +#define NT_SUCCESS(StatCode) ((NTSTATUS)(StatCode) >= 0) +#endif + +typedef NTSTATUS (WINAPI *NtQueryInformationProcessProc)(HANDLE, PROCESSINFOCLASS, + PVOID, ULONG, PULONG); +typedef NTSTATUS (WINAPI *NtReadVirtualMemoryProc)(HANDLE, PVOID, PVOID, ULONG, PULONG); + +BOOL bExit = FALSE; /* indicates EXIT was typed */ +BOOL bCanExit = TRUE; /* indicates if this shell is exitable */ +BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */ +BOOL bIgnoreEcho = FALSE; /* Ignore 'newline' before 'cls' */ +INT nErrorLevel = 0; /* Errorlevel of last launched external program */ +BOOL bChildProcessRunning = FALSE; +DWORD dwChildProcessId = 0; +OSVERSIONINFO osvi; +HANDLE hIn; +HANDLE hOut; +HANDLE hConsole; +HANDLE CMD_ModuleHandle; +HMODULE NtDllModule; + +static NtQueryInformationProcessProc NtQueryInformationProcessPtr = NULL; +static NtReadVirtualMemoryProc NtReadVirtualMemoryPtr = NULL; + +#ifdef INCLUDE_CMD_COLOR +WORD wColor; /* current color */ +WORD wDefColor; /* default color */ +#endif + +/* + * convert + * + * insert commas into a number + */ +INT +ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator) +{ + TCHAR temp[32]; + INT c = 0; + INT n = 0; + + if (num.QuadPart == 0) + { + des[0] = _T('0'); + des[1] = _T('\0'); + n = 1; + } + else + { + temp[31] = 0; + while (num.QuadPart > 0) + { + if ((((c + 1) % (nNumberGroups + 1)) == 0) && (bPutSeperator)) + temp[30 - c++] = cThousandSeparator; + temp[30 - c++] = (TCHAR)(num.QuadPart % 10) + _T('0'); + num.QuadPart /= 10; + } + + for (n = 0; n <= c; n++) + des[n] = temp[31 - c + n]; + } + + return n; +} + +/* + * is character a delimeter when used on first word? + * + */ +static BOOL IsDelimiter (TCHAR c) +{ + return (c == _T('/') || c == _T('=') || c == _T('\0') || _istspace (c)); +} + +/* + * Is a process a console process? + */ +static BOOL IsConsoleProcess(HANDLE Process) +{ + NTSTATUS Status; + PROCESS_BASIC_INFORMATION Info; + PEB ProcessPeb; + ULONG BytesRead; + + if (NULL == NtQueryInformationProcessPtr || NULL == NtReadVirtualMemoryPtr) + { + return TRUE; + } + + Status = NtQueryInformationProcessPtr ( + Process, ProcessBasicInformation, + &Info, sizeof(PROCESS_BASIC_INFORMATION), NULL); + if (! NT_SUCCESS(Status)) + { +#ifdef _DEBUG + DebugPrintf (_T("NtQueryInformationProcess failed with status %08x\n"), Status); +#endif + return TRUE; + } + Status = NtReadVirtualMemoryPtr ( + Process, Info.PebBaseAddress, &ProcessPeb, + sizeof(PEB), &BytesRead); + if (! NT_SUCCESS(Status) || sizeof(PEB) != BytesRead) + { +#ifdef _DEBUG + DebugPrintf (_T("Couldn't read virt mem status %08x bytes read %lu\n"), Status, BytesRead); +#endif + return TRUE; + } + + return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubSystem; +} + + + +#ifdef _UNICODE +#define SHELLEXECUTETEXT "ShellExecuteW" +#else +#define SHELLEXECUTETEXT "ShellExecuteA" +#endif + +typedef HINSTANCE (WINAPI *MYEX)( + HWND hwnd, + LPCTSTR lpOperation, + LPCTSTR lpFile, + LPCTSTR lpParameters, + LPCTSTR lpDirectory, + INT nShowCmd +); + + + +static BOOL RunFile(LPTSTR filename) +{ + HMODULE hShell32; + MYEX hShExt; + HINSTANCE ret; + +#ifdef _DEBUG + DebugPrintf (_T("RunFile(%s)\n"), filename); +#endif + hShell32 = LoadLibrary(_T("SHELL32.DLL")); + if (!hShell32) + { +#ifdef _DEBUG + DebugPrintf (_T("RunFile: couldn't load SHELL32.DLL!\n")); +#endif + return FALSE; + } + + hShExt = (MYEX)(FARPROC)GetProcAddress(hShell32, SHELLEXECUTETEXT); + if (!hShExt) + { +#ifdef _DEBUG + DebugPrintf (_T("RunFile: couldn't find ShellExecuteA/W in SHELL32.DLL!\n")); +#endif + FreeLibrary(hShell32); + return FALSE; + } + +#ifdef _DEBUG + DebugPrintf (_T("RunFile: ShellExecuteA/W is at %x\n"), hShExt); +#endif + + ret = (hShExt)(NULL, _T("open"), filename, NULL, NULL, SW_SHOWNORMAL); + +#ifdef _DEBUG + DebugPrintf (_T("RunFile: ShellExecuteA/W returned %d\n"), (DWORD)ret); +#endif + + FreeLibrary(hShell32); + return (((DWORD)ret) > 32); +} + + + +/* + * This command (in first) was not found in the command table + * + * Full - whole command line + * First - first word on command line + * Rest - rest of command line + */ + +static VOID +Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest) +{ + TCHAR *szFullName=NULL; + TCHAR *first = NULL; + TCHAR *rest = NULL; + TCHAR *full = NULL; + TCHAR *dot = NULL; + TCHAR szWindowTitle[MAX_PATH]; + DWORD dwExitCode = 0; + +#ifdef _DEBUG + DebugPrintf (_T("Execute: \'%s\' \'%s\'\n"), first, rest); +#endif + + /* we need biger buffer that First, Rest, Full are already + need rewrite some code to use realloc when it need instead + of add 512bytes extra */ + + first = malloc ( (_tcslen(First) + 512) * sizeof(TCHAR)); + if (first == NULL) + { + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + rest = malloc ( (_tcslen(Rest) + 512) * sizeof(TCHAR)); + if (rest == NULL) + { + free (first); + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + full = malloc ( (_tcslen(Full) + 512) * sizeof(TCHAR)); + if (full == NULL) + { + free (first); + free (rest); + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + szFullName = malloc ( (_tcslen(Full) + 512) * sizeof(TCHAR)); + if (full == NULL) + { + free (first); + free (rest); + free (full); + error_out_of_memory(); + nErrorLevel = 1; + return ; + } + + + /* Though it was already parsed once, we have a different set of rules + for parsing before we pass to CreateProccess */ + if(!_tcschr(Full,_T('\"'))) + { + _tcscpy(first,First); + _tcscpy(rest,Rest); + _tcscpy(full,Full); + } + else + { + UINT i = 0; + BOOL bInside = FALSE; + rest[0] = _T('\0'); + full[0] = _T('\0'); + first[0] = _T('\0'); + _tcscpy(first,Full); + /* find the end of the command and start of the args */ + for(i = 0; i < _tcslen(first); i++) + { + if(!_tcsncmp(&first[i], _T("\""), 1)) + bInside = !bInside; + if(!_tcsncmp(&first[i], _T(" "), 1) && !bInside) + { + _tcscpy(rest,&first[i]); + first[i] = _T('\0'); + break; + } + + } + i = 0; + /* remove any slashes */ + while(i < _tcslen(first)) + { + if(first[i] == _T('\"')) + memmove(&first[i],&first[i + 1], _tcslen(&first[i]) * sizeof(TCHAR)); + else + i++; + } + /* Drop quotes around it just in case there is a space */ + _tcscpy(full,_T("\"")); + _tcscat(full,first); + _tcscat(full,_T("\" ")); + _tcscat(full,rest); + } + + /* check for a drive change */ + if ((_istalpha (first[0])) && (!_tcscmp (first + 1, _T(":")))) + { + BOOL working = TRUE; + if (!SetCurrentDirectory(first)) + /* Guess they changed disc or something, handle that gracefully and get to root */ + { + TCHAR str[4]; + str[0]=first[0]; + str[1]=_T(':'); + str[2]=_T('\\'); + str[3]=0; + working = SetCurrentDirectory(str); + } + + if (!working) ConErrResPuts (STRING_FREE_ERROR1); + + free (first); + free (rest); + free (full); + free (szFullName); + nErrorLevel = 1; + return; + } + + /* get the PATH environment variable and parse it */ + /* search the PATH environment variable for the binary */ + if (!SearchForExecutable (first, szFullName)) + { + error_bad_command (); + free (first); + free (rest); + free (full); + free (szFullName); + nErrorLevel = 1; + return; + + } + + GetConsoleTitle (szWindowTitle, MAX_PATH); + + /* check if this is a .BAT or .CMD file */ + dot = _tcsrchr (szFullName, _T('.')); + if (dot && (!_tcsicmp (dot, _T(".bat")) || !_tcsicmp (dot, _T(".cmd")))) + { +#ifdef _DEBUG + DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest); +#endif + Batch (szFullName, first, rest); + } + else + { + /* exec the program */ + PROCESS_INFORMATION prci; + STARTUPINFO stui; + +#ifdef _DEBUG + DebugPrintf (_T("[EXEC: %s %s]\n"), full, rest); +#endif + /* build command line for CreateProcess() */ + + /* fill startup info */ + memset (&stui, 0, sizeof (STARTUPINFO)); + stui.cb = sizeof (STARTUPINFO); + stui.dwFlags = STARTF_USESHOWWINDOW; + stui.wShowWindow = SW_SHOWDEFAULT; + + // return console to standard mode + SetConsoleMode (GetStdHandle(STD_INPUT_HANDLE), + ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); + + if (CreateProcess (szFullName, + full, + NULL, + NULL, + TRUE, + 0, /* CREATE_NEW_PROCESS_GROUP */ + NULL, + NULL, + &stui, + &prci)) + + { + if (IsConsoleProcess(prci.hProcess)) + { + /* FIXME: Protect this with critical section */ + bChildProcessRunning = TRUE; + dwChildProcessId = prci.dwProcessId; + + WaitForSingleObject (prci.hProcess, INFINITE); + + /* FIXME: Protect this with critical section */ + bChildProcessRunning = FALSE; + + GetExitCodeProcess (prci.hProcess, &dwExitCode); + nErrorLevel = (INT)dwExitCode; + } + else + { + nErrorLevel = 0; + } + CloseHandle (prci.hThread); + CloseHandle (prci.hProcess); + } + else + { +#ifdef _DEBUG + DebugPrintf (_T("[ShellExecute: %s]\n"), full); +#endif + // See if we can run this with ShellExecute() ie myfile.xls + if (!RunFile(full)) + { +#ifdef _DEBUG + DebugPrintf (_T("[ShellExecute failed!: %s]\n"), full); +#endif + error_bad_command (); + nErrorLevel = 1; + } + else + { + nErrorLevel = 0; + } + } + // restore console mode + SetConsoleMode ( + GetStdHandle( STD_INPUT_HANDLE ), + ENABLE_PROCESSED_INPUT ); + } + + /* Get code page if it has been change */ + InputCodePage= GetConsoleCP(); + OutputCodePage = GetConsoleOutputCP(); + SetConsoleTitle (szWindowTitle); + + free(first); + free(rest); + free(full); + free (szFullName); +} + + +/* + * look through the internal commands and determine whether or not this + * command is one of them. If it is, call the command. If not, call + * execute to run it as an external program. + * + * line - the command line of the program to run + * + */ + +static VOID +DoCommand (LPTSTR line) +{ + TCHAR *com = NULL; /* the first word in the command */ + TCHAR *cp = NULL; + LPTSTR cstart; + LPTSTR rest; /* pointer to the rest of the command line */ + INT cl; + LPCOMMAND cmdptr; + +#ifdef _DEBUG + DebugPrintf (_T("DoCommand: (\'%s\')\n"), line); +#endif /* DEBUG */ + + com = malloc( (_tcslen(line) +512)*sizeof(TCHAR) ); + if (com == NULL) + { + error_out_of_memory(); + return; + } + + cp = com; + /* Skip over initial white space */ + while (_istspace (*line)) + line++; + rest = line; + + cstart = rest; + + /* Anything to do ? */ + if (*rest) + { + if (*rest == _T('"')) + { + /* treat quoted words specially */ + + rest++; + + while(*rest != _T('\0') && *rest != _T('"')) + *cp++ = _totlower (*rest++); + if (*rest == _T('"')) + rest++; + } + else + { + while (!IsDelimiter (*rest)) + *cp++ = _totlower (*rest++); + } + + + /* Terminate first word */ + *cp = _T('\0'); + + /* Do not limit commands to MAX_PATH */ + /* + if(_tcslen(com) > MAX_PATH) + { + error_bad_command(); + free(com); + return; + } + */ + + /* Skip over whitespace to rest of line, exclude 'echo' command */ + if (_tcsicmp (com, _T("echo"))) + { + while (_istspace (*rest)) + rest++; + } + + /* Scan internal command table */ + for (cmdptr = cmds;; cmdptr++) + { + /* If end of table execute ext cmd */ + if (cmdptr->name == NULL) + { + Execute (line, com, rest); + break; + } + + if (!_tcscmp (com, cmdptr->name)) + { + cmdptr->func (com, rest); + break; + } + + /* The following code handles the case of commands like CD which + * are recognised even when the command name and parameter are + * not space separated. + * + * e.g dir.. + * cd\freda + */ + + /* Get length of command name */ + cl = _tcslen (cmdptr->name); + + if ((cmdptr->flags & CMD_SPECIAL) && + (!_tcsncmp (cmdptr->name, com, cl)) && + (_tcschr (_T("\\.-"), *(com + cl)))) + { + /* OK its one of the specials...*/ + + /* Terminate first word properly */ + com[cl] = _T('\0'); + + /* Call with new rest */ + cmdptr->func (com, cstart + cl); + break; + } + } + } + free(com); +} + + +/* + * process the command line and execute the appropriate functions + * full input/output redirection and piping are supported + */ + +VOID ParseCommandLine (LPTSTR cmd) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR cmdline[CMDLINE_LENGTH]; + LPTSTR s; +#ifdef FEATURE_REDIRECTION + TCHAR in[CMDLINE_LENGTH] = _T(""); + TCHAR out[CMDLINE_LENGTH] = _T(""); + TCHAR err[CMDLINE_LENGTH] = _T(""); + TCHAR szTempPath[MAX_PATH] = _T(".\\"); + TCHAR szFileName[2][MAX_PATH] = {_T(""), _T("")}; + HANDLE hFile[2] = {INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}; + LPTSTR t = NULL; + INT num = 0; + INT nRedirFlags = 0; + INT Length; + UINT Attributes; + BOOL bNewBatch = TRUE; + HANDLE hOldConIn; + HANDLE hOldConOut; + HANDLE hOldConErr; +#endif /* FEATURE_REDIRECTION */ + + _tcscpy (cmdline, cmd); + s = &cmdline[0]; + +#ifdef _DEBUG + DebugPrintf (_T("ParseCommandLine: (\'%s\')\n"), s); +#endif /* DEBUG */ + +#ifdef FEATURE_ALIASES + /* expand all aliases */ + ExpandAlias (s, CMDLINE_LENGTH); +#endif /* FEATURE_ALIAS */ + +#ifdef FEATURE_REDIRECTION + /* find the temp path to store temporary files */ + Length = GetTempPath (MAX_PATH, szTempPath); + if (Length > 0 && Length < MAX_PATH) + { + Attributes = GetFileAttributes(szTempPath); + if (Attributes == 0xffffffff || + !(Attributes & FILE_ATTRIBUTE_DIRECTORY)) + { + Length = 0; + } + } + if (Length == 0 || Length >= MAX_PATH) + { + _tcscpy(szTempPath, _T(".\\")); + } + if (szTempPath[_tcslen (szTempPath) - 1] != _T('\\')) + _tcscat (szTempPath, _T("\\")); + + /* get the redirections from the command line */ + num = GetRedirection (s, in, out, err, &nRedirFlags); + + /* more efficient, but do we really need to do this? */ + for (t = in; _istspace (*t); t++) + ; + _tcscpy (in, t); + + for (t = out; _istspace (*t); t++) + ; + _tcscpy (out, t); + + for (t = err; _istspace (*t); t++) + ; + _tcscpy (err, t); + + if(bc && !_tcslen (in) && _tcslen (bc->In)) + _tcscpy(in, bc->In); + if(bc && !out[0] && _tcslen(bc->Out)) + { + nRedirFlags |= OUTPUT_APPEND; + _tcscpy(out, bc->Out); + } + if(bc && !_tcslen (err) && _tcslen (bc->Err)) + { + nRedirFlags |= ERROR_APPEND; + _tcscpy(err, bc->Err); + } + + + /* Set up the initial conditions ... */ + /* preserve STDIN, STDOUT and STDERR handles */ + hOldConIn = GetStdHandle (STD_INPUT_HANDLE); + hOldConOut = GetStdHandle (STD_OUTPUT_HANDLE); + hOldConErr = GetStdHandle (STD_ERROR_HANDLE); + + /* redirect STDIN */ + if (in[0]) + { + HANDLE hFile; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + /* Set up pipe for the standard input handler */ + hFile = CreateFile (in, GENERIC_READ, FILE_SHARE_READ, &sa, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, in); + return; + } + + if (!SetStdHandle (STD_INPUT_HANDLE, hFile)) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, in); + return; + } +#ifdef _DEBUG + DebugPrintf (_T("Input redirected from: %s\n"), in); +#endif + } + + /* Now do all but the last pipe command */ + *szFileName[0] = _T('\0'); + hFile[0] = INVALID_HANDLE_VALUE; + + while (num-- > 1) + { + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + /* Create unique temporary file name */ + GetTempFileName (szTempPath, _T("CMD"), 0, szFileName[1]); + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + /* Set current stdout to temporary file */ + hFile[1] = CreateFile (szFileName[1], GENERIC_WRITE, 0, &sa, + TRUNCATE_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL); + + if (hFile[1] == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + return; + } + + SetStdHandle (STD_OUTPUT_HANDLE, hFile[1]); + + DoCommand (s); + + /* close stdout file */ + SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut); + if ((hFile[1] != INVALID_HANDLE_VALUE) && (hFile[1] != hOldConOut)) + { + CloseHandle (hFile[1]); + hFile[1] = INVALID_HANDLE_VALUE; + } + + /* close old stdin file */ + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if ((hFile[0] != INVALID_HANDLE_VALUE) && (hFile[0] != hOldConIn)) + { + /* delete old stdin file, if it is a real file */ + CloseHandle (hFile[0]); + hFile[0] = INVALID_HANDLE_VALUE; + DeleteFile (szFileName[0]); + *szFileName[0] = _T('\0'); + } + + /* copy stdout file name to stdin file name */ + _tcscpy (szFileName[0], szFileName[1]); + *szFileName[1] = _T('\0'); + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + /* open new stdin file */ + hFile[0] = CreateFile (szFileName[0], GENERIC_READ, 0, &sa, + OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL); + SetStdHandle (STD_INPUT_HANDLE, hFile[0]); + + s = s + _tcslen (s) + 1; + } + + /* Now set up the end conditions... */ + /* redirect STDOUT */ + if (out[0]) + { + /* Final output to here */ + HANDLE hFile; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + /* we need make sure the LastError msg is zero before calling CreateFile */ + SetLastError(0); + + hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, &sa, + (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + INT size = _tcslen(out)-1; + + if (out[size] != _T(':')) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, out); + return; + } + + out[size]=_T('\0'); + hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, &sa, + (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, out); + return; + } + + } + + if (!SetStdHandle (STD_OUTPUT_HANDLE, hFile)) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, out); + return; + } + + if (nRedirFlags & OUTPUT_APPEND) + { + LONG lHighPos = 0; + + if (GetFileType (hFile) == FILE_TYPE_DISK) + SetFilePointer (hFile, 0, &lHighPos, FILE_END); + } +#ifdef _DEBUG + DebugPrintf (_T("Output redirected to: %s\n"), out); +#endif + } + else if (hOldConOut != INVALID_HANDLE_VALUE) + { + /* Restore original stdout */ + HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE); + SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut); + if (hOldConOut != hOut) + CloseHandle (hOut); + hOldConOut = INVALID_HANDLE_VALUE; + } + + /* redirect STDERR */ + if (err[0]) + { + /* Final output to here */ + HANDLE hFile; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; + + if (!_tcscmp (err, out)) + { +#ifdef _DEBUG + DebugPrintf (_T("Stdout and stderr will use the same file!!\n")); +#endif + DuplicateHandle (GetCurrentProcess (), + GetStdHandle (STD_OUTPUT_HANDLE), + GetCurrentProcess (), + &hFile, 0, TRUE, DUPLICATE_SAME_ACCESS); + } + else + { + hFile = CreateFile (err, + GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + &sa, + (nRedirFlags & ERROR_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, + NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, err); + return; + } + } + + if (!SetStdHandle (STD_ERROR_HANDLE, hFile)) + { + LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, err); + return; + } + + if (nRedirFlags & ERROR_APPEND) + { + LONG lHighPos = 0; + + if (GetFileType (hFile) == FILE_TYPE_DISK) + SetFilePointer (hFile, 0, &lHighPos, FILE_END); + } +#ifdef _DEBUG + DebugPrintf (_T("Error redirected to: %s\n"), err); +#endif + } + else if (hOldConErr != INVALID_HANDLE_VALUE) + { + /* Restore original stderr */ + HANDLE hErr = GetStdHandle (STD_ERROR_HANDLE); + SetStdHandle (STD_ERROR_HANDLE, hOldConErr); + if (hOldConErr != hErr) + CloseHandle (hErr); + hOldConErr = INVALID_HANDLE_VALUE; + } + + if(bc) + bNewBatch = FALSE; +#endif + + /* process final command */ + DoCommand (s); + +#ifdef FEATURE_REDIRECTION + if(bNewBatch && bc) + AddBatchRedirection(in, out, err); + /* close old stdin file */ +#if 0 /* buggy implementation */ + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if ((hFile[0] != INVALID_HANDLE_VALUE) && + (hFile[0] != hOldConIn)) + { + /* delete old stdin file, if it is a real file */ + CloseHandle (hFile[0]); + hFile[0] = INVALID_HANDLE_VALUE; + DeleteFile (szFileName[0]); + *szFileName[0] = _T('\0'); + } + + /* Restore original STDIN */ + if (hOldConIn != INVALID_HANDLE_VALUE) + { + HANDLE hIn = GetStdHandle (STD_INPUT_HANDLE); + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if (hOldConIn != hIn) + CloseHandle (hIn); + hOldConIn = INVALID_HANDLE_VALUE; + } + else + { +#ifdef _DEBUG + DebugPrintf (_T("Can't restore STDIN! Is invalid!!\n"), out); +#endif + } +#endif /* buggy implementation */ + + + if (hOldConIn != INVALID_HANDLE_VALUE) + { + HANDLE hIn = GetStdHandle (STD_INPUT_HANDLE); + SetStdHandle (STD_INPUT_HANDLE, hOldConIn); + if (hIn == INVALID_HANDLE_VALUE) + { +#ifdef _DEBUG + DebugPrintf (_T("Previous STDIN is invalid!!\n")); +#endif + } + else + { + if (GetFileType (hIn) == FILE_TYPE_DISK) + { + if (hFile[0] == hIn) + { + CloseHandle (hFile[0]); + hFile[0] = INVALID_HANDLE_VALUE; + DeleteFile (szFileName[0]); + *szFileName[0] = _T('\0'); + } + else + { +#ifdef _DEBUG + DebugPrintf (_T("hFile[0] and hIn dont match!!!\n")); +#endif + } + } + } + } + + + /* Restore original STDOUT */ + if (hOldConOut != INVALID_HANDLE_VALUE) + { + HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE); + SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut); + if (hOldConOut != hOut) + CloseHandle (hOut); + hOldConOut = INVALID_HANDLE_VALUE; + } + + /* Restore original STDERR */ + if (hOldConErr != INVALID_HANDLE_VALUE) + { + HANDLE hErr = GetStdHandle (STD_ERROR_HANDLE); + SetStdHandle (STD_ERROR_HANDLE, hOldConErr); + if (hOldConErr != hErr) + CloseHandle (hErr); + hOldConErr = INVALID_HANDLE_VALUE; + } +#endif /* FEATURE_REDIRECTION */ +} + +BOOL +GrowIfNecessary ( UINT needed, LPTSTR* ret, UINT* retlen ) +{ + if ( *ret && needed < *retlen ) + return TRUE; + *retlen = needed; + if ( *ret ) + free ( *ret ); + *ret = (LPTSTR)malloc ( *retlen * sizeof(TCHAR) ); + if ( !*ret ) + SetLastError ( ERROR_OUTOFMEMORY ); + return *ret != NULL; +} + +LPCTSTR +GetEnvVarOrSpecial ( LPCTSTR varName ) +{ + static LPTSTR ret = NULL; + static UINT retlen = 0; + UINT size; + + size = GetEnvironmentVariable ( varName, ret, retlen ); + if ( size > retlen ) + { + if ( !GrowIfNecessary ( size, &ret, &retlen ) ) + return NULL; + size = GetEnvironmentVariable ( varName, ret, retlen ); + } + if ( size ) + return ret; + + /* env var doesn't exist, look for a "special" one */ + /* %CD% */ + if (_tcsicmp(varName,_T("cd")) ==0) + { + size = GetCurrentDirectory ( retlen, ret ); + if ( size > retlen ) + { + if ( !GrowIfNecessary ( size, &ret, &retlen ) ) + return NULL; + size = GetCurrentDirectory ( retlen, ret ); + } + if ( !size ) + return NULL; + return ret; + } + /* %TIME% */ + else if (_tcsicmp(varName,_T("time")) ==0) + { + SYSTEMTIME t; + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + GetSystemTime(&t); + _sntprintf ( ret, retlen, _T("%02d%c%02d%c%02d%c%02d"), + t.wHour, cTimeSeparator, t.wMinute, cTimeSeparator, + t.wSecond, cDecimalSeparator, t.wMilliseconds ); + return ret; + } + /* %DATE% */ + else if (_tcsicmp(varName,_T("date")) ==0) + { + LPTSTR tmp; + + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + size = GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), ret, retlen ); + /* TODO FIXME - test whether GetDateFormat() can return a value indicating the buffer wasn't big enough */ + if ( !size ) + return NULL; + tmp = ret + _tcslen(ret); + *tmp++ = _T(' '); + size = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, tmp, retlen-(tmp-ret)); + /* TODO FIXME - test whether GetDateFormat() can return a value indicating the buffer wasn't big enough */ + if ( !size ) + return NULL; + return ret; + } + + /* %RANDOM% */ + else if (_tcsicmp(varName,_T("random")) ==0) + { + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + /* Get random number */ + _itot(rand(),ret,10); + return ret; + } + + /* %CMDCMDLINE% */ + else if (_tcsicmp(varName,_T("cmdcmdline")) ==0) + { + return GetCommandLine(); + } + + /* %CMDEXTVERSION% */ + else if (_tcsicmp(varName,_T("cmdextversion")) ==0) + { + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + /* Set version number to 2 */ + _itot(2,ret,10); + return ret; + } + + /* %ERRORLEVEL% */ + else if (_tcsicmp(varName,_T("errorlevel")) ==0) + { + if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) ) + return NULL; + _itot(nErrorLevel,ret,10); + return ret; + } + + GrowIfNecessary(_tcslen(varName) + 2, &ret, &retlen); + _stprintf(ret,_T("%%%s%%"),varName); + return ret; /* not found - return orginal string */ +} + +LPCTSTR +GetParsedEnvVar ( LPCTSTR varName, UINT* varNameLen, BOOL ModeSetA ) +{ + static LPTSTR ret = NULL; + static UINT retlen = 0; + LPTSTR p, tmp; + UINT size; + + if ( varNameLen ) + *varNameLen = 0; + SetLastError(0); + if ( *varName++ != '%' ) + return NULL; + switch ( *varName ) + { + case _T('0'): + case _T('1'): + case _T('2'): + case _T('3'): + case _T('4'): + case _T('5'): + case _T('6'): + case _T('7'): + case _T('8'): + case _T('9'): + if ((tmp = FindArg (*varName - _T('0')))) + { + if ( varNameLen ) + *varNameLen = 2; + if ( !*tmp ) + return _T(""); + if ( !GrowIfNecessary ( _tcslen(tmp)+1, &ret, &retlen ) ) + return NULL; + _tcscpy ( ret, tmp ); + return ret; + } + if ( !GrowIfNecessary ( 3, &ret, &retlen ) ) + return NULL; + ret[0] = _T('%'); + ret[1] = *varName; + ret[2] = 0; + if ( varNameLen ) + *varNameLen = 2; + return ret; + + case _T('%'): + if ( !GrowIfNecessary ( 2, &ret, &retlen ) ) + return NULL; + ret[0] = _T('%'); + ret[1] = 0; + if ( varNameLen ) + *varNameLen = 2; + return ret; + + case _T('?'): + /* TODO FIXME 10 is only max size for 32-bit */ + if ( !GrowIfNecessary ( 11, &ret, &retlen ) ) + return NULL; + _sntprintf ( ret, retlen, _T("%u"), nErrorLevel); + ret[retlen-1] = 0; + if ( varNameLen ) + *varNameLen = 2; + return ret; + } + if ( ModeSetA ) + { + /* HACK for set/a */ + if ( !GrowIfNecessary ( 2, &ret, &retlen ) ) + return NULL; + ret[0] = _T('%'); + ret[1] = 0; + if ( varNameLen ) + *varNameLen = 1; + return ret; + } + p = _tcschr ( varName, _T('%') ); + if ( !p ) + { + SetLastError ( ERROR_INVALID_PARAMETER ); + return NULL; + } + size = p-varName; + if ( varNameLen ) + *varNameLen = size + 2; + p = alloca ( (size+1) * sizeof(TCHAR) ); + memmove ( p, varName, size * sizeof(TCHAR) ); + p[size] = 0; + varName = p; + return GetEnvVarOrSpecial ( varName ); +} + + +/* + * do the prompt/input/process loop + * + */ + +static INT +ProcessInput (BOOL bFlag) +{ + TCHAR commandline[CMDLINE_LENGTH]; + TCHAR readline[CMDLINE_LENGTH]; + LPTSTR ip; + LPTSTR cp; + LPCTSTR tmp; + BOOL bEchoThisLine; + BOOL bModeSetA; + BOOL bIsBatch; + + do + { + /* if no batch input then... */ + if (!(ip = ReadBatchLine (&bEchoThisLine))) + { + if (bFlag) + return nErrorLevel; + + ReadCommand (readline, CMDLINE_LENGTH); + ip = readline; + bEchoThisLine = FALSE; + bIsBatch = FALSE; + } + else + { + bIsBatch = TRUE; + } + + /* skip leading blanks */ + while ( _istspace(*ip) ) + ++ip; + + cp = commandline; + bModeSetA = FALSE; + while (*ip) + { + if ( *ip == _T('%') ) + { + UINT envNameLen; + LPCTSTR envVal = GetParsedEnvVar ( ip, &envNameLen, bModeSetA ); + if ( envVal ) + { + ip += envNameLen; + cp = _stpcpy ( cp, envVal ); + } + } + + if (_istcntrl (*ip)) + *ip = _T(' '); + *cp++ = *ip++; + + /* HACK HACK HACK check whether bModeSetA needs to be toggled */ + *cp = 0; + tmp = commandline; + tmp += _tcsspn(tmp,_T(" \t")); + /* first we find and skip and pre-redirections... */ + while (( tmp ) && + ( _tcschr(_T("<>"),*tmp) + || !_tcsncmp(tmp,_T("1>"),2) + || !_tcsncmp(tmp,_T("2>"),2) )) + { + if ( _istdigit(*tmp) ) + tmp += 2; + else + tmp++; + tmp += _tcsspn(tmp,_T(" \t")); + if ( *tmp == _T('\"') ) + { + tmp = _tcschr(tmp+1,_T('\"')); + if ( tmp ) + ++tmp; + } + else + tmp = _tcspbrk(tmp,_T(" \t")); + if ( tmp ) + tmp += _tcsspn(tmp,_T(" \t")); + } + /* we should now be pointing to the actual command + * (if there is one yet)*/ + if ( tmp ) + { + /* if we're currently substituting ( which is default ) + * check to see if we've parsed out a set/a. if so, we + * need to disable substitution until we come across a + * redirection */ + if ( !bModeSetA ) + { + /* look for set /a */ + if ( !_tcsnicmp(tmp,_T("set"),3) ) + { + tmp += 3; + tmp += _tcsspn(tmp,_T(" \t")); + if ( !_tcsnicmp(tmp,_T("/a"),2) ) + bModeSetA = TRUE; + } + } + /* if we're not currently substituting, it means we're + * already inside a set /a. now we need to look for + * a redirection in order to turn redirection back on */ + else + { + /* look for redirector of some kind after the command */ + while ( (tmp = _tcspbrk ( tmp, _T("^<>|") )) ) + { + if ( *tmp == _T('^') ) + { + if ( _tcschr(_T("<>|&"), *++tmp ) && *tmp ) + ++tmp; + } + else + { + bModeSetA = FALSE; + break; + } + } + } + } + } + + *cp = _T('\0'); + + /* strip trailing spaces */ + while ((--cp >= commandline) && _istspace (*cp)); + + *(cp + 1) = _T('\0'); + + /* JPP 19980807 */ + /* Echo batch file line */ + if (bEchoThisLine) + { + PrintPrompt (); + ConOutPuts (commandline); + } + + if (!CheckCtrlBreak(BREAK_INPUT) && *commandline) + { + ParseCommandLine (commandline); + if (bEcho && !bIgnoreEcho && (!bIsBatch || bEchoThisLine)) + ConOutChar ('\n'); + bIgnoreEcho = FALSE; + } + } + while (!bCanExit || !bExit); + + return nErrorLevel; +} + + +/* + * control-break handler. + */ +BOOL WINAPI BreakHandler (DWORD dwCtrlType) +{ + + DWORD dwWritten; + INPUT_RECORD rec; + static BOOL SelfGenerated = FALSE; + + if ((dwCtrlType != CTRL_C_EVENT) && + (dwCtrlType != CTRL_BREAK_EVENT)) + { + return FALSE; + } + else + { + if(SelfGenerated) + { + SelfGenerated = FALSE; + return TRUE; + } + } + + if (bChildProcessRunning == TRUE) + { + SelfGenerated = TRUE; + GenerateConsoleCtrlEvent (dwCtrlType, 0); + return TRUE; + } + + + rec.EventType = KEY_EVENT; + rec.Event.KeyEvent.bKeyDown = TRUE; + rec.Event.KeyEvent.wRepeatCount = 1; + rec.Event.KeyEvent.wVirtualKeyCode = _T('C'); + rec.Event.KeyEvent.wVirtualScanCode = _T('C') - 35; + rec.Event.KeyEvent.uChar.AsciiChar = _T('C'); + rec.Event.KeyEvent.uChar.UnicodeChar = _T('C'); + rec.Event.KeyEvent.dwControlKeyState = RIGHT_CTRL_PRESSED; + + WriteConsoleInput( + hIn, + &rec, + 1, + &dwWritten); + + bCtrlBreak = TRUE; + /* FIXME: Handle batch files */ + + //ConOutPrintf(_T("^C")); + + + return TRUE; +} + + +VOID AddBreakHandler (VOID) +{ + SetConsoleCtrlHandler ((PHANDLER_ROUTINE)BreakHandler, TRUE); +} + + +VOID RemoveBreakHandler (VOID) +{ + SetConsoleCtrlHandler ((PHANDLER_ROUTINE)BreakHandler, FALSE); +} + + +/* + * show commands and options that are available. + * + */ +#if 0 +static VOID +ShowCommands (VOID) +{ + /* print command list */ + ConOutResPuts(STRING_CMD_HELP1); + PrintCommandList(); + + /* print feature list */ + ConOutResPuts(STRING_CMD_HELP2); + +#ifdef FEATURE_ALIASES + ConOutResPuts(STRING_CMD_HELP3); +#endif +#ifdef FEATURE_HISTORY + ConOutResPuts(STRING_CMD_HELP4); +#endif +#ifdef FEATURE_UNIX_FILENAME_COMPLETION + ConOutResPuts(STRING_CMD_HELP5); +#endif +#ifdef FEATURE_DIRECTORY_STACK + ConOutResPuts(STRING_CMD_HELP6); +#endif +#ifdef FEATURE_REDIRECTION + ConOutResPuts(STRING_CMD_HELP7); +#endif + ConOutChar(_T('\n')); +} +#endif + +/* + * set up global initializations and process parameters + * + * argc - number of parameters to command.com + * argv - command-line parameters + * + */ +static VOID +Initialize (int argc, TCHAR* argv[]) +{ + TCHAR commandline[CMDLINE_LENGTH]; + TCHAR ModuleName[_MAX_PATH + 1]; + INT i; + TCHAR lpBuffer[2]; + + //INT len; + //TCHAR *ptr, *cmdLine; + + /* get version information */ + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx (&osvi); + + /* Some people like to run ReactOS cmd.exe on Win98, it helps in the + * build process. So don't link implicitly against ntdll.dll, load it + * dynamically instead */ + + if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + /* ntdll is always present on NT */ + NtDllModule = GetModuleHandle(TEXT("ntdll.dll")); + } + else + { + /* not all 9x versions have a ntdll.dll, try to load it */ + NtDllModule = LoadLibrary(TEXT("ntdll.dll")); + } + + if (NtDllModule != NULL) + { + NtQueryInformationProcessPtr = (NtQueryInformationProcessProc)GetProcAddress(NtDllModule, "NtQueryInformationProcess"); + NtReadVirtualMemoryPtr = (NtReadVirtualMemoryProc)GetProcAddress(NtDllModule, "NtReadVirtualMemory"); + } + + +#ifdef _DEBUG + DebugPrintf (_T("[command args:\n")); + for (i = 0; i < argc; i++) + { + DebugPrintf (_T("%d. %s\n"), i, argv[i]); + } + DebugPrintf (_T("]\n")); +#endif + + InitLocale (); + + /* get default input and output console handles */ + hOut = GetStdHandle (STD_OUTPUT_HANDLE); + hIn = GetStdHandle (STD_INPUT_HANDLE); + + /* Set EnvironmentVariable PROMPT if it does not exists any env value. + for you can change the EnvirommentVariable for prompt before cmd start + this patch are not 100% right, if it does not exists a PROMPT value cmd should use + $P$G as defualt not set EnvirommentVariable PROMPT to $P$G if it does not exists */ + if (GetEnvironmentVariable(_T("PROMPT"),lpBuffer, sizeof(lpBuffer) / sizeof(lpBuffer[0])) == 0) + SetEnvironmentVariable (_T("PROMPT"), _T("$P$G")); + + + if (argc >= 2 && !_tcsncmp (argv[1], _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CMD_HELP8); + ExitProcess(0); + } + SetConsoleMode (hIn, ENABLE_PROCESSED_INPUT); + +#ifdef INCLUDE_CMD_CHDIR + InitLastPath (); +#endif + +#ifdef FATURE_ALIASES + InitializeAlias (); +#endif + + if (argc >= 2) + { + for (i = 1; i < argc; i++) + { + if (!_tcsicmp (argv[i], _T("/p"))) + { + if (!IsExistingFile (_T("\\autoexec.bat"))) + { +#ifdef INCLUDE_CMD_DATE + cmd_date (_T(""), _T("")); +#endif +#ifdef INCLUDE_CMD_TIME + cmd_time (_T(""), _T("")); +#endif + } + else + { + ParseCommandLine (_T("\\autoexec.bat")); + } + bCanExit = FALSE; + } + else if (!_tcsicmp (argv[i], _T("/c"))) + { + /* This just runs a program and exits */ + ++i; + if (i < argc) + { + _tcscpy (commandline, argv[i]); + while (++i < argc) + { + _tcscat (commandline, _T(" ")); + _tcscat (commandline, argv[i]); + } + + ParseCommandLine(commandline); + ExitProcess (ProcessInput (TRUE)); + } + else + { + ExitProcess (0); + } + } + else if (!_tcsicmp (argv[i], _T("/k"))) + { + /* This just runs a program and remains */ + ++i; + if (i < argc) + { + _tcscpy (commandline, _T("\"")); + _tcscat (commandline, argv[i]); + _tcscat (commandline, _T("\"")); + while (++i < argc) + { + _tcscat (commandline, _T(" ")); + _tcscat (commandline, argv[i]); + } + ParseCommandLine(commandline); + } + } +#ifdef INCLUDE_CMD_COLOR + else if (!_tcsnicmp (argv[i], _T("/t:"), 3)) + { + /* process /t (color) argument */ + wDefColor = (WORD)_tcstoul (&argv[i][3], NULL, 16); + wColor = wDefColor; + SetScreenColor (wColor, TRUE); + } +#endif + } + } + + /* run cmdstart.bat */ + if (IsExistingFile (_T("cmdstart.bat"))) + { + ParseCommandLine (_T("cmdstart.bat")); + } + else if (IsExistingFile (_T("\\cmdstart.bat"))) + { + ParseCommandLine (_T("\\cmdstart.bat")); + } + +#ifdef FEATURE_DIR_STACK + /* initialize directory stack */ + InitDirectoryStack (); +#endif + + +#ifdef FEATURE_HISTORY + /*initialize history*/ + InitHistory(); +#endif + + /* Set COMSPEC environment variable */ + if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1)) + { + ModuleName[_MAX_PATH] = _T('\0'); + SetEnvironmentVariable (_T("COMSPEC"), ModuleName); + } + + /* add ctrl break handler */ + AddBreakHandler (); +} + + +static VOID Cleanup (int argc, TCHAR *argv[]) +{ + /* run cmdexit.bat */ + if (IsExistingFile (_T("cmdexit.bat"))) + { + ConErrResPuts(STRING_CMD_ERROR5); + + ParseCommandLine (_T("cmdexit.bat")); + } + else if (IsExistingFile (_T("\\cmdexit.bat"))) + { + ConErrResPuts (STRING_CMD_ERROR5); + ParseCommandLine (_T("\\cmdexit.bat")); + } + +#ifdef FEATURE_ALIASES + DestroyAlias (); +#endif + +#ifdef FEATURE_DIECTORY_STACK + /* destroy directory stack */ + DestroyDirectoryStack (); +#endif + +#ifdef INCLUDE_CMD_CHDIR + FreeLastPath (); +#endif + +#ifdef FEATURE_HISTORY + CleanHistory(); +#endif + + + /* remove ctrl break handler */ + RemoveBreakHandler (); + SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ), + ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); + + if (NtDllModule != NULL) + { + FreeLibrary(NtDllModule); + } +} + +/* + * main function + */ +#ifdef _UNICODE +int _main(void) +#else +int _main (int argc, char *argv[]) +#endif +{ + TCHAR startPath[MAX_PATH]; + CONSOLE_SCREEN_BUFFER_INFO Info; + INT nExitCode; +#ifdef _UNICODE + PWCHAR * argv; + int argc=0; + argv = CommandLineToArgvW(GetCommandLineW(), &argc); +#endif + + GetCurrentDirectory(MAX_PATH,startPath); + _tchdir(startPath); + + SetFileApisToOEM(); + InputCodePage= 0; + OutputCodePage = 0; + + hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, 0, NULL); + if (GetConsoleScreenBufferInfo(hConsole, &Info) == FALSE) + { + ConErrFormatMessage(GetLastError()); + return(1); + } + wColor = Info.wAttributes; + wDefColor = wColor; + + InputCodePage= GetConsoleCP(); + OutputCodePage = GetConsoleOutputCP(); + CMD_ModuleHandle = GetModuleHandle(NULL); + + /* check switches on command-line */ + Initialize(argc, argv); + + /* call prompt routine */ + nExitCode = ProcessInput(FALSE); + + /* do the cleanup */ + Cleanup(argc, argv); + + return(nExitCode); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/cmd.h b/reactos/base/shell/cmd/cmd.h new file mode 100644 index 00000000000..5134f80eb01 --- /dev/null +++ b/reactos/base/shell/cmd/cmd.h @@ -0,0 +1,405 @@ +/* + * CMD.H - header file for the modules in CMD.EXE + * + * + * History: + * + * 7-15-95 Tim Norman + * started + * + * 06/29/98 (Rob Lake) + * Moved error messages in here + * + * 07/12/98 (Rob Lake) + * Moved more error messages here. + * + * 30-Jul-1998 (John P Price ) + * Added compile date to version. + * + * 26-Feb-1999 (Eric Kohl ) + * Introduced a new version string. + * Thanks to Emanuele Aliberti! + */ + +#ifndef _CMD_H_INCLUDED_ +#define _CMD_H_INCLUDED_ + +#include "config.h" + +#include +#include + +#include "cmdver.h" + +#define BREAK_BATCHFILE 1 +#define BREAK_OUTOFBATCH 2 +#define BREAK_INPUT 3 +#define BREAK_IGNORE 4 + +/* define some error messages */ + +#define D_ON _T("on") +#define D_OFF _T("off") + + +/* command line buffer length */ +#define CMDLINE_LENGTH 8192 + +/* global variables */ +extern HANDLE hOut; +extern HANDLE hIn; +extern HANDLE hConsole; +extern WORD wColor; +extern WORD wDefColor; +extern BOOL bCtrlBreak; +extern BOOL bIgnoreEcho; +extern BOOL bExit; +extern INT nErrorLevel; +extern SHORT maxx; +extern SHORT maxy; +extern OSVERSIONINFO osvi; + + + +/* Prototypes for ALIAS.C */ +VOID InitializeAlias (VOID); +VOID DestroyAlias (VOID); +VOID ExpandAlias (LPTSTR, INT); +INT CommandAlias (LPTSTR, LPTSTR); + + +/* Prototypes for ATTRIB.C */ +INT CommandAttrib (LPTSTR, LPTSTR); + + +/* Prototypes for BEEP.C */ +INT cmd_beep (LPTSTR, LPTSTR); + + +/* Prototypes for CALL.C */ +INT cmd_call (LPTSTR, LPTSTR); + + +/* Prototypes for CHCP.C */ +INT CommandChcp (LPTSTR, LPTSTR); + + +/* Prototypes for CHOICE.C */ +INT CommandChoice (LPTSTR, LPTSTR); + + +/* Prototypes for CLS.C */ +INT cmd_cls (LPTSTR, LPTSTR); + + +/* Prototypes for CMD.C */ +INT ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator); +VOID ParseCommandLine (LPTSTR); +LPCTSTR GetEnvVarOrSpecial ( LPCTSTR varName ); +VOID AddBreakHandler (VOID); +VOID RemoveBreakHandler (VOID); + +extern HANDLE CMD_ModuleHandle; + + +/* Prototypes for CMDINPUT.C */ +VOID ReadCommand (LPTSTR, INT); + + +/* Prototypes for CMDTABLE.C */ +#define CMD_SPECIAL 1 +#define CMD_BATCHONLY 2 +#define CMD_HIDE 4 + +typedef struct tagCOMMAND +{ + LPTSTR name; + INT flags; + INT (*func) (LPTSTR, LPTSTR); +} COMMAND, *LPCOMMAND; + +extern COMMAND cmds[]; /* The internal command table */ + +VOID PrintCommandList (VOID); +VOID PrintCommandListDetail (VOID); + + +/* Prototypes for COLOR.C */ +VOID SetScreenColor(WORD wArgColor, BOOL bFill); +INT CommandColor (LPTSTR, LPTSTR); + + +/* Prototypes for CONSOLE.C */ +#ifdef _DEBUG +VOID DebugPrintf (LPTSTR, ...); +#endif /* _DEBUG */ + +VOID ConInDummy (VOID); +VOID ConInDisable (VOID); +VOID ConInEnable (VOID); +VOID ConInFlush (VOID); +VOID ConInKey (PINPUT_RECORD); +VOID ConInString (LPTSTR, DWORD); + +VOID ConOutChar (TCHAR); +VOID ConOutPuts (LPTSTR); +VOID ConOutPrintf (LPTSTR, ...); +INT ConOutPrintfPaging (BOOL NewPage, LPTSTR, ...); +VOID ConErrChar (TCHAR); +VOID ConErrPuts (LPTSTR); +VOID ConErrPrintf (LPTSTR, ...); +VOID ConOutFormatMessage (DWORD MessageId, ...); +VOID ConErrFormatMessage (DWORD MessageId, ...); + +SHORT GetCursorX (VOID); +SHORT GetCursorY (VOID); +VOID GetCursorXY (PSHORT, PSHORT); +VOID SetCursorXY (SHORT, SHORT); + +VOID GetScreenSize (PSHORT, PSHORT); +VOID SetCursorType (BOOL, BOOL); + +VOID ConOutResPuts (UINT resID); +VOID ConErrResPuts (UINT resID); +VOID ConOutResPaging(BOOL NewPage, UINT resID); + +/* Prototypes for COPY.C */ +INT cmd_copy (LPTSTR, LPTSTR); + + +/* Prototypes for DATE.C */ +INT cmd_date (LPTSTR, LPTSTR); + + +/* Prototypes for DEL.C */ +INT CommandDelete (LPTSTR, LPTSTR); + + +/* Prototypes for DELAY.C */ +INT CommandDelay (LPTSTR, LPTSTR); + + +/* Prototypes for DIR.C */ +INT CommandDir (LPTSTR, LPTSTR); + + +/* Prototypes for DIRSTACK.C */ +VOID InitDirectoryStack (VOID); +VOID DestroyDirectoryStack (VOID); +INT GetDirectoryStackDepth (VOID); +INT CommandPushd (LPTSTR, LPTSTR); +INT CommandPopd (LPTSTR, LPTSTR); +INT CommandDirs (LPTSTR, LPTSTR); + + +/* Prototypes for ECHO.C */ +INT CommandEcho (LPTSTR, LPTSTR); +INT CommandEchos (LPTSTR, LPTSTR); +INT CommandEchoerr (LPTSTR, LPTSTR); +INT CommandEchoserr (LPTSTR, LPTSTR); + + +/* Prototypes for ERROR.C */ +VOID ErrorMessage (DWORD, LPTSTR, ...); + +VOID error_no_pipe (VOID); +VOID error_bad_command (VOID); +VOID error_invalid_drive (VOID); +VOID error_req_param_missing (VOID); +VOID error_sfile_not_found (LPTSTR); +VOID error_file_not_found (VOID); +VOID error_path_not_found (VOID); +VOID error_too_many_parameters (LPTSTR); +VOID error_parameter_format(TCHAR); +VOID error_invalid_switch (TCHAR); +VOID error_invalid_parameter_format (LPTSTR); +VOID error_out_of_memory (VOID); +VOID error_syntax (LPTSTR); + +VOID msg_pause (VOID); + + +/* Prototypes for FILECOMP.C */ +#ifdef FEATURE_UNIX_FILENAME_COMPLETION +VOID CompleteFilename (LPTSTR, UINT); +INT ShowCompletionMatches (LPTSTR, INT); +#endif +#ifdef FEATURE_4NT_FILENAME_COMPLETION +VOID CompleteFilename (LPTSTR, BOOL, LPTSTR, UINT); +#endif + + +/* Prototypes for FOR.C */ +INT cmd_for (LPTSTR, LPTSTR); + + +/* Prototypes for FREE.C */ +INT CommandFree (LPTSTR, LPTSTR); + + +/* Prototypes for GOTO.C */ +INT cmd_goto (LPTSTR, LPTSTR); + + +/* Prototypes for HISTORY.C */ +#ifdef FEATURE_HISTORY +VOID History (INT, LPTSTR);/*add entries browse history*/ +VOID History_move_to_bottom(VOID);/*F3*/ +VOID InitHistory(VOID); +VOID CleanHistory(VOID); +VOID History_del_current_entry(LPTSTR str);/*CTRL-D*/ +INT CommandHistory (LPTSTR cmd, LPTSTR param); +#endif + + +/* Prototypes for INTERNAL.C */ +VOID InitLastPath (VOID); +VOID FreeLastPath (VOID); +INT cmd_chdir (LPTSTR, LPTSTR); +INT cmd_mkdir (LPTSTR, LPTSTR); +INT cmd_rmdir (LPTSTR, LPTSTR); +INT CommandExit (LPTSTR, LPTSTR); +INT CommandRem (LPTSTR, LPTSTR); +INT CommandShowCommands (LPTSTR, LPTSTR); +INT CommandShowCommandsDetail (LPTSTR, LPTSTR); + +/* Prototypes for LABEL.C */ +INT cmd_label (LPTSTR, LPTSTR); + + +/* Prototypes for LOCALE.C */ +extern TCHAR cDateSeparator; +extern INT nDateFormat; +extern TCHAR cTimeSeparator; +extern INT nTimeFormat; +extern TCHAR cThousandSeparator; +extern TCHAR cDecimalSeparator; +extern INT nNumberGroups; + + +VOID InitLocale (VOID); +VOID PrintDate (VOID); +VOID PrintTime (VOID); + +/* cache codepage */ +extern UINT InputCodePage; +extern UINT OutputCodePage; + +/* Prototypes for MEMORY.C */ +INT CommandMemory (LPTSTR, LPTSTR); + + +/* Prototypes for MISC.C */ +INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size); +BOOL SetRootPath(TCHAR *InPath); +TCHAR cgetchar (VOID); +BOOL CheckCtrlBreak (INT); +BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry); +LPTSTR *split (LPTSTR, LPINT, BOOL); +VOID freep (LPTSTR *); +LPTSTR _stpcpy (LPTSTR, LPCTSTR); +BOOL IsValidPathName (LPCTSTR); +BOOL IsExistingFile (LPCTSTR); +BOOL IsExistingDirectory (LPCTSTR); +BOOL FileGetString (HANDLE, LPTSTR, INT); +VOID GetPathCase(TCHAR *, TCHAR *); + +#define PROMPT_NO 0 +#define PROMPT_YES 1 +#define PROMPT_ALL 2 +#define PROMPT_BREAK 3 + +INT PagePrompt (VOID); +INT FilePromptYN (LPTSTR, ...); +INT FilePromptYNA (LPTSTR, ...); + + +/* Prototypes for MOVE.C */ +INT cmd_move (LPTSTR, LPTSTR); + + +/* Prototypes for MSGBOX.C */ +INT CommandMsgbox (LPTSTR, LPTSTR); + + +/* Prototypes from PATH.C */ +INT cmd_path (LPTSTR, LPTSTR); + + +/* Prototypes from PROMPT.C */ +VOID PrintPrompt (VOID); +INT cmd_prompt (LPTSTR, LPTSTR); + + +/* Prototypes for REDIR.C */ +#define INPUT_REDIRECTION 1 +#define OUTPUT_REDIRECTION 2 +#define OUTPUT_APPEND 4 +#define ERROR_REDIRECTION 8 +#define ERROR_APPEND 16 +INT GetRedirection (LPTSTR, LPTSTR, LPTSTR, LPTSTR, LPINT); + + +/* Prototypes for REN.C */ +INT cmd_rename (LPTSTR, LPTSTR); + + +/* Prototypes for SCREEN.C */ +INT CommandScreen (LPTSTR, LPTSTR); + + +/* Prototypes for SET.C */ +INT cmd_set (LPTSTR, LPTSTR); + + +/* Prototypes for START.C */ +INT cmd_start (LPTSTR, LPTSTR); + + +/* Prototypes for STRTOCLR.C */ +BOOL StringToColor (LPWORD, LPTSTR *); + + +/* Prototypes for TIME.C */ +INT cmd_time (LPTSTR, LPTSTR); + + +/* Prototypes for TIMER.C */ +INT CommandTimer (LPTSTR cmd, LPTSTR param); + + +/* Prototypes for TITLE.C */ +INT cmd_title (LPTSTR, LPTSTR); + + +/* Prototypes for TYPE.C */ +INT cmd_type (LPTSTR, LPTSTR); + + +/* Prototypes for VER.C */ +VOID ShortVersion (VOID); +INT cmd_ver (LPTSTR, LPTSTR); + + +/* Prototypes for VERIFY.C */ +INT cmd_verify (LPTSTR, LPTSTR); + + +/* Prototypes for VOL.C */ +INT cmd_vol (LPTSTR, LPTSTR); + + +/* Prototypes for WHERE.C */ +BOOL SearchForExecutable (LPCTSTR, LPTSTR); + +/* Prototypes for WINDOW.C */ +INT CommandActivate (LPTSTR, LPTSTR); +INT CommandWindow (LPTSTR, LPTSTR); + + +/* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */ +int cmd_if(TCHAR *, TCHAR *); +int cmd_pause(TCHAR *, TCHAR *); +int cmd_shift(TCHAR *, TCHAR *); + +#endif /* _CMD_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/cmd.rc b/reactos/base/shell/cmd/cmd.rc new file mode 100644 index 00000000000..9c6a262db2a --- /dev/null +++ b/reactos/base/shell/cmd/cmd.rc @@ -0,0 +1,39 @@ +#include +#include "cmdver.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Command Processor\0" +#define REACTOS_STR_INTERNAL_NAME "cmd\0" +#define REACTOS_STR_ORIGINAL_FILENAME "cmd.exe\0" +#define REACTOS_STR_ORIGINAL_COPYRIGHT "Copyright (C) 1994-1998 Tim Norman and others\0" +#define REACTOS_STR_LEGAL_COPYRIGHT "Copyright (C) 1998-2006 Eric Kohl and others\0" + +#include +#include "En.rc" +#include "Fr.rc" +#include "De.rc" +#include "Es.rc" +#include "Ru.rc" +#include "Ja.rc" +#include "Hu.rc" + + +STRINGTABLE DISCARDABLE +{ + STRING_FREEDOS_DEV, " Tim Norman Matt Rains\n\ + Evan Jeffrey Steffen Kaiser\n\ + Svante Frey Oliver Mueller\n\ + Aaron Kaufman Marc Desrochers\n\ + Rob Lake John P Price\n\ + Hans B Pufal\n" + + STRING_REACTOS_DEV, " Eric Kohl Emanuele Aliberti\n\ + Paolo Pantaleo Phillip Susi\n\ + Sylvain Petreolle\n" +} + +1 ICON DISCARDABLE res/terminal.ico + + + + + diff --git a/reactos/base/shell/cmd/cmd.xml b/reactos/base/shell/cmd/cmd.xml new file mode 100644 index 00000000000..a36da9fa6a1 --- /dev/null +++ b/reactos/base/shell/cmd/cmd.xml @@ -0,0 +1,77 @@ + + include/wine + . + + + 0x0501 + precomp.h + + alias.c + attrib.c + batch.c + beep.c + call.c + chcp.c + choice.c + cls.c + cmd.c + cmdinput.c + cmdtable.c + color.c + console.c + copy.c + date.c + del.c + delay.c + dir.c + dirstack.c + echo.c + error.c + filecomp.c + for.c + free.c + goto.c + history.c + if.c + internal.c + label.c + locale.c + memory.c + misc.c + move.c + msgbox.c + path.c + pause.c + prompt.c + redir.c + ren.c + screen.c + set.c + shift.c + start.c + strtoclr.c + time.c + timer.c + title.c + type.c + ver.c + verify.c + vol.c + where.c + window.c + + + + include/wine + . + + + 0x0501 + kernel32 + cmd_base + main.c + cmd.rc + + + + diff --git a/reactos/base/shell/cmd/cmdinput.c b/reactos/base/shell/cmd/cmdinput.c new file mode 100644 index 00000000000..2bb36e3c350 --- /dev/null +++ b/reactos/base/shell/cmd/cmdinput.c @@ -0,0 +1,574 @@ +/* + * CMDINPUT.C - handles command input (tab completion, history, etc.). + * + * + * History: + * + * 01/14/95 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * i have added some constants to help making changes easier. + * + * 12/12/95 (Tim Norman) + * added findxy() function to get max x/y coordinates to display + * correctly on larger screens + * + * 12/14/95 (Tim Norman) + * fixed the Tab completion code that Matt Rains broke by moving local + * variables to a more global scope and forgetting to initialize them + * when needed + * + * 8/1/96 (Tim Norman) + * fixed a bug in tab completion that caused filenames at the beginning + * of the command-line to have their first letter truncated + * + * 9/1/96 (Tim Norman) + * fixed a silly bug using printf instead of fputs, where typing "%i" + * confused printf :) + * + * 6/14/97 (Steffan Kaiser) + * ctrl-break checking + * + * 6/7/97 (Marc Desrochers) + * recoded everything! now properly adjusts when text font is changed. + * removed findxy(), reposition(), and reprint(), as these functions + * were inefficient. added goxy() function as gotoxy() was buggy when + * the screen font was changed. the printf() problem with %i on the + * command line was fixed by doing printf("%s",str) instead of + * printf(str). Don't ask how I find em just be glad I do :) + * + * 7/12/97 (Tim Norman) + * Note: above changes pre-empted Steffan's ctrl-break checking. + * + * 7/7/97 (Marc Desrochers) + * rewrote a new findxy() because the new dir() used it. This + * findxy() simply returns the values of *maxx *maxy. In the + * future, please use the pointers, they will always be correct + * since they point to BIOS values. + * + * 7/8/97 (Marc Desrochers) + * once again removed findxy(), moved the *maxx, *maxy pointers + * global and included them as externs in command.h. Also added + * insert/overstrike capability + * + * 7/13/97 (Tim Norman) + * added different cursor appearance for insert/overstrike mode + * + * 7/13/97 (Tim Norman) + * changed my code to use _setcursortype until I can figure out why + * my code is crashing on some machines. It doesn't crash on mine :) + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28-Jul-1998 (John P Price ) + * put ifdef's around filename completion code. + * + * 30-Jul-1998 (John P Price ) + * moved filename completion code to filecomp.c + * made second TAB display list of filename matches + * + * 31-Jul-1998 (John P Price ) + * Fixed bug where if you typed something, then hit HOME, then tried + * to type something else in insert mode, it crashed. + * + * 07-Aug-1998 (John P Price ) + * Fixed carrage return output to better match MSDOS with echo + * on or off.(marked with "JPP 19980708") + * + * 13-Dec-1998 (Eric Kohl ) + * Added insert/overwrite cursor. + * + * 25-Jan-1998 (Eric Kohl ) + * Replaced CRT io functions by Win32 console io functions. + * This can handle - for 4NT filename completion. + * Unicode and redirection safe! + * + * 04-Feb-1999 (Eric Kohl ) + * Fixed input bug. A "line feed" character remained in the keyboard + * input queue when you pressed . This sometimes caused + * some very strange effects. + * Fixed some command line editing annoyances. + * + * 30-Apr-2004 (Filip Navara ) + * Fixed problems when the screen was scrolled away. + */ + +#include +#include "resource.h" + + +SHORT maxx; +SHORT maxy; + +/* + * global command line insert/overwrite flag + */ +static BOOL bInsert = TRUE; + + +static VOID +ClearCommandLine (LPTSTR str, INT maxlen, SHORT orgx, SHORT orgy) +{ + INT count; + + SetCursorXY (orgx, orgy); + for (count = 0; count < (INT)_tcslen (str); count++) + ConOutChar (_T(' ')); + _tcsnset (str, _T('\0'), maxlen); + SetCursorXY (orgx, orgy); +} + + +/* read in a command line */ +VOID ReadCommand (LPTSTR str, INT maxlen) +{ + SHORT orgx; /* origin x/y */ + SHORT orgy; + SHORT curx; /*current x/y cursor position*/ + SHORT cury; + SHORT tempscreen; + INT count; /*used in some for loops*/ + INT current = 0; /*the position of the cursor in the string (str)*/ + INT charcount = 0;/*chars in the string (str)*/ + INPUT_RECORD ir; + WORD wLastKey = 0; + TCHAR ch; + BOOL bContinue=FALSE;/*is TRUE the second case will not be executed*/ + BOOL bReturn = FALSE; + TCHAR szPath[MAX_PATH]; + BOOL bCharInput; + + /* get screen size */ + GetScreenSize (&maxx, &maxy); + + /* JPP 19980807 - if echo off, don't print prompt */ + if (bEcho) + PrintPrompt(); + + GetCursorXY (&orgx, &orgy); + GetCursorXY (&curx, &cury); + + memset (str, 0, maxlen * sizeof (TCHAR)); + + SetCursorType (bInsert, TRUE); + + do + { + + bReturn = FALSE; + + ConInKey (&ir); + + if (ir.Event.KeyEvent.dwControlKeyState & + (RIGHT_ALT_PRESSED|RIGHT_ALT_PRESSED| + RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) ) + { + + switch (ir.Event.KeyEvent.wVirtualKeyCode) + { + +#ifdef FEATURE_HISTORY + + case 'K': + /*add the current command line to the history*/ + if (ir.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + { + + if (str[0]) + History(0,str); + + ClearCommandLine (str, maxlen, orgx, orgy); + current = charcount = 0; + curx = orgx; + cury = orgy; + bContinue=TRUE; + break; + } + + case 'D': + /*delete current history entry*/ + if (ir.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED)) + { + ClearCommandLine (str, maxlen, orgx, orgy); + History_del_current_entry(str); + current = charcount = _tcslen (str); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); + bContinue=TRUE; + break; + } + +#endif/*FEATURE_HISTORY*/ + } + + + + + } + + //if (bContinue) + // continue; + + + bCharInput = FALSE; + + switch (ir.Event.KeyEvent.wVirtualKeyCode) + { + case VK_BACK: + /* - delete character to left of cursor */ + if (current > 0 && charcount > 0) + { + if (current == charcount) + { + /* if at end of line */ + str[current - 1] = _T('\0'); + if (GetCursorX () != 0) + { + ConOutPrintf (_T("\b \b")); + curx--; + } + else + { + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + ConOutChar (_T(' ')); + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + cury--; + curx = maxx - 1; + } + } + else + { + for (count = current - 1; count < charcount; count++) + str[count] = str[count + 1]; + if (GetCursorX () != 0) + { + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); + curx--; + } + else + { + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + cury--; + curx = maxx - 1; + } + GetCursorXY (&curx, &cury); + ConOutPrintf (_T("%s "), &str[current - 1]); + SetCursorXY (curx, cury); + } + charcount--; + current--; + } + break; + + case VK_INSERT: + /* toggle insert/overstrike mode */ + bInsert ^= TRUE; + SetCursorType (bInsert, TRUE); + break; + + case VK_DELETE: + /* delete character under cursor */ + if (current != charcount && charcount > 0) + { + for (count = current; count < charcount; count++) + str[count] = str[count + 1]; + charcount--; + GetCursorXY (&curx, &cury); + ConOutPrintf (_T("%s "), &str[current]); + SetCursorXY (curx, cury); + } + break; + + case VK_HOME: + /* goto beginning of string */ + if (current != 0) + { + SetCursorXY (orgx, orgy); + curx = orgx; + cury = orgy; + current = 0; + } + break; + + case VK_END: + /* goto end of string */ + if (current != charcount) + { + SetCursorXY (orgx, orgy); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); + current = charcount; + } + break; + + case VK_TAB: +#ifdef FEATURE_UNIX_FILENAME_COMPLETION + /* expand current file name */ + if ((current == charcount) || + (current == charcount - 1 && + str[current] == _T('"'))) /* only works at end of line*/ + { + if (wLastKey != VK_TAB) + { + /* if first TAB, complete filename*/ + tempscreen = charcount; + CompleteFilename (str, charcount); + charcount = _tcslen (str); + current = charcount; + + SetCursorXY (orgx, orgy); + ConOutPrintf (_T("%s"), str); + + if (tempscreen > charcount) + { + GetCursorXY (&curx, &cury); + for (count = tempscreen - charcount; count--; ) + ConOutChar (_T(' ')); + SetCursorXY (curx, cury); + } + else + { + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + } + + /* set cursor position */ + SetCursorXY ((orgx + current) % maxx, + orgy + (orgx + current) / maxx); + GetCursorXY (&curx, &cury); + } + else + { + /*if second TAB, list matches*/ + if (ShowCompletionMatches (str, charcount)) + { + PrintPrompt (); + GetCursorXY (&orgx, &orgy); + ConOutPrintf (_T("%s"), str); + + /* set cursor position */ + SetCursorXY ((orgx + current) % maxx, + orgy + (orgx + current) / maxx); + GetCursorXY (&curx, &cury); + } + + } + } + else + { + MessageBeep (-1); + } +#endif +#ifdef FEATURE_4NT_FILENAME_COMPLETION + + /* used to later see if we went down to the next line */ + tempscreen = charcount; + szPath[0]=_T('\0'); + + /* str is the whole things that is on the current line + that is and and out. arg 2 is weather it goes back + one file or forward one file */ + CompleteFilename(str, !(ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED), szPath, current); + /* Attempt to clear the line */ + ClearCommandLine (str, maxlen, orgx, orgy); + curx = orgx; + cury = orgy; + current = charcount = 0; + //str[0]=_T('\0'); + + /* Everything is deleted, lets add it back in */ + _tcscpy(str,szPath); + + /* Figure out where cusor is going to be after we print it */ + charcount = _tcslen (str); + current = charcount; + + SetCursorXY (orgx, orgy); + /* Print out what we have now */ + ConOutPrintf (_T("%s"), str); + + /* Move cursor accordingly */ + if(tempscreen > charcount) + { + GetCursorXY (&curx, &cury); + for(count = tempscreen - charcount; count--; ) + ConOutChar (_T(' ')); + SetCursorXY (curx, cury); + } + else + { + if(((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + } + SetCursorXY((short)(((int)orgx + current) % maxx), (short)((int)orgy + ((int)orgx + current) / maxx)); + GetCursorXY(&curx, &cury); + +#endif + break; + + case _T('M'): + case _T('C'): + /* ^M does the same as return */ + bCharInput = TRUE; + if(!(ir.Event.KeyEvent.dwControlKeyState & + (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED))) + { + break; + } + + case VK_RETURN: + /* end input, return to main */ +#ifdef FEATURE_HISTORY + /* add to the history */ + if (str[0]) + History (0, str); +#endif + ConInDummy (); + ConOutChar (_T('\n')); + bReturn = TRUE; + break; + + case VK_ESCAPE: + /* clear str Make this callable! */ + ClearCommandLine (str, maxlen, orgx, orgy); + curx = orgx; + cury = orgy; + current = charcount = 0; + break; + +#ifdef FEATURE_HISTORY + case VK_F3: + History_move_to_bottom(); +#endif + case VK_UP: +#ifdef FEATURE_HISTORY + /* get previous command from buffer */ + ClearCommandLine (str, maxlen, orgx, orgy); + History (-1, str); + current = charcount = _tcslen (str); + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); +#endif + break; + + case VK_DOWN: +#ifdef FEATURE_HISTORY + /* get next command from buffer */ + ClearCommandLine (str, maxlen, orgx, orgy); + History (1, str); + current = charcount = _tcslen (str); + if (((charcount + orgx) / maxx) + orgy > maxy - 1) + orgy += maxy - ((charcount + orgx) / maxx + orgy + 1); + ConOutPrintf (_T("%s"), str); + GetCursorXY (&curx, &cury); +#endif + break; + + case VK_LEFT: + /* move cursor left */ + if (current > 0) + { + current--; + if (GetCursorX () == 0) + { + SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1)); + curx = maxx - 1; + cury--; + } + else + { + SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ()); + curx--; + } + } + else + { + MessageBeep (-1); + } + break; + + case VK_RIGHT: + /* move cursor right */ + if (current != charcount) + { + current++; + if (GetCursorX () == maxx - 1) + { + SetCursorXY (0, (SHORT)(GetCursorY () + 1)); + curx = 0; + cury++; + } + else + { + SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ()); + curx++; + } + } + break; + + default: + /* This input is just a normal char */ + bCharInput = TRUE; + + } +#ifdef _UNICODE + ch = ir.Event.KeyEvent.uChar.UnicodeChar; + if ((ch >= 32 && (charcount != (maxlen - 2)) && bCharInput) +#else + ch = ir.Event.KeyEvent.uChar.AsciiChar; + if ((UCHAR)ch >= 32 && (charcount != (maxlen - 2)) && bCharInput) +#endif /* _UNICODE */ + { + /* insert character into string... */ + if (bInsert && current != charcount) + { + /* If this character insertion will cause screen scrolling, + * adjust the saved origin of the command prompt. */ + tempscreen = _tcslen(str + current) + curx; + if ((tempscreen % maxx) == (maxx - 1) && + (tempscreen / maxx) + cury == (maxy - 1)) + { + orgy--; + cury--; + } + + for (count = charcount; count > current; count--) + str[count] = str[count - 1]; + str[current++] = ch; + if (curx == maxx - 1) + curx = 0, cury++; + else + curx++; + ConOutPrintf (_T("%s"), &str[current - 1]); + SetCursorXY (curx, cury); + charcount++; + } + else + { + if (current == charcount) + charcount++; + str[current++] = ch; + if (GetCursorX () == maxx - 1 && GetCursorY () == maxy - 1) + orgy--, cury--; + if (GetCursorX () == maxx - 1) + curx = 0, cury++; + else + curx++; + ConOutChar (ch); + } + } + + wLastKey = ir.Event.KeyEvent.wVirtualKeyCode; + } + while (!bReturn); + + SetCursorType (bInsert, TRUE); +} diff --git a/reactos/base/shell/cmd/cmdtable.c b/reactos/base/shell/cmd/cmdtable.c new file mode 100644 index 00000000000..3af74432d5e --- /dev/null +++ b/reactos/base/shell/cmd/cmdtable.c @@ -0,0 +1,269 @@ +/* + * CMDTABLE.C - table of internal commands. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * New file to keep the internal command table. I plan on + * getting rid of the table real soon now and replacing it + * with a dynamic mechnism. + * + * 27 Jul 1998 John P. Price + * added config.h include + * + * 21-Jan-1999 (Eric Kohl ) + * Unicode ready! + */ + +#include +#include "resource.h" + + +/* a list of all the internal commands, associating their command names */ +/* to the functions to process them */ + + +COMMAND cmds[] = +{ + {_T("?"), 0, CommandShowCommands}, + + +#ifdef INCLUDE_CMD_ACTIVATE + {_T("activate"), 0, CommandActivate}, +#endif + +#ifdef FEATURE_ALIASES + {_T("alias"), 0, CommandAlias}, +#endif + +#ifdef INCLUDE_CMD_ATTRIB + {_T("attrib"), 0, CommandAttrib}, +#endif + +#ifdef INCLUDE_CMD_BEEP + {_T("beep"), 0, cmd_beep}, +#endif + + {_T("call"), CMD_BATCHONLY, cmd_call}, + +#ifdef INCLUDE_CMD_CHDIR + {_T("cd"), CMD_SPECIAL, cmd_chdir}, + {_T("chdir"), CMD_SPECIAL, cmd_chdir}, +#endif + +#ifdef INCLUDE_CMD_CHCP + {_T("chcp"), 0, CommandChcp}, +#endif + +#ifdef INCLUDE_CMD_CHOICE + {_T("choice"), 0, CommandChoice}, +#endif + +#ifdef INCLUDE_CMD_CLS + {_T("cls"), 0, cmd_cls}, +#endif + +#ifdef INCLUDE_CMD_COLOR + {_T("color"), 0, CommandColor}, +#endif + +#ifdef INCLUDE_CMD_COPY + {_T("copy"), 0, cmd_copy}, +#endif + +#ifdef INCLUDE_CMD_DATE + {_T("date"), 0, cmd_date}, +#endif + +#ifdef INCLUDE_CMD_DEL + {_T("del"), 0, CommandDelete}, + {_T("delete"), 0, CommandDelete}, +#endif + +#ifdef INCLUDE_CMD_DELAY + {_T("delay"), 0, CommandDelay}, +#endif + +#ifdef INCLUDE_CMD_DIR + {_T("dir"), CMD_SPECIAL, CommandDir}, +#endif + +#ifdef FEATURE_DIRECTORY_STACK + {_T("dirs"), 0, CommandDirs}, +#endif + + {_T("echo"), 0, CommandEcho}, + {_T("echo."), CMD_HIDE, CommandEcho}, + {_T("echos"), 0, CommandEchos}, + {_T("echoerr"), 0, CommandEchoerr}, + {_T("echoerr."), CMD_HIDE, CommandEchoerr}, + {_T("echoserr"), 0, CommandEchoserr}, + +#ifdef INCLUDE_CMD_DEL + {_T("erase"), 0, CommandDelete}, +#endif + + {_T("exit"), 0, CommandExit}, + + {_T("for"), 0, cmd_for}, + +#ifdef INCLUDE_CMD_FREE + {_T("free"), 0, CommandFree}, +#endif + + {_T("goto"), CMD_BATCHONLY, cmd_goto}, + + {_T("help"), 0, CommandShowCommandsDetail}, + +#ifdef FEATURE_HISTORY + {_T("history"), 0, CommandHistory}, +#endif + + {_T("if"), 0, cmd_if}, + +#ifdef INCLUDE_CMD_LABEL + {_T("label"), 0, cmd_label}, +#endif + +#ifdef INCLUDE_CMD_MEMORY + {_T("memory"), 0, CommandMemory}, +#endif + +#ifdef INCLUDE_CMD_MKDIR + {_T("md"), CMD_SPECIAL, cmd_mkdir}, + {_T("mkdir"), CMD_SPECIAL, cmd_mkdir}, +#endif + +#ifdef INCLUDE_CMD_MOVE + {_T("move"), 0, cmd_move}, +#endif + +#ifdef INCLUDE_CMD_MSGBOX + {_T("msgbox"), 0, CommandMsgbox}, +#endif + +#ifdef INCLUDE_CMD_PATH + {_T("path"), 0, cmd_path}, +#endif + +#ifdef INCLUDE_CMD_PAUSE + {_T("pause"), 0, cmd_pause}, +#endif + +#ifdef FEATURE_DIRECTORY_STACK + {_T("popd"), 0, CommandPopd}, +#endif + +#ifdef INCLUDE_CMD_PROMPT + {_T("prompt"), 0, cmd_prompt}, +#endif + +#ifdef FEATURE_DIRECTORY_STACK + {_T("pushd"), 0, CommandPushd}, +#endif + +#ifdef INCLUDE_CMD_RMDIR + {_T("rd"), CMD_SPECIAL, cmd_rmdir}, +#endif + +#ifdef INCLUDE_CMD_REM + {_T("rem"), 0, CommandRem}, +#endif + +#ifdef INCLUDE_CMD_RENAME + {_T("ren"), 0, cmd_rename}, + {_T("rename"), 0, cmd_rename}, +#endif + +#ifdef INCLUDE_CMD_RMDIR + {_T("rmdir"), CMD_SPECIAL, cmd_rmdir}, +#endif + +#ifdef INCLUDE_CMD_SCREEN + {_T("screen"), 0, CommandScreen}, +#endif + +#ifdef INCLUDE_CMD_SET + {_T("set"), 0, cmd_set}, +#endif + + {_T("shift"), CMD_BATCHONLY, cmd_shift}, + +#ifdef INCLUDE_CMD_START + {_T("start"), 0, cmd_start}, +#endif + +#ifdef INCLUDE_CMD_TIME + {_T("time"), 0, cmd_time}, +#endif + +#ifdef INCLUDE_CMD_TIMER + {_T("timer"), 0, CommandTimer}, +#endif + +#ifdef INCLUDE_CMD_TITLE + {_T("title"), 0, cmd_title}, +#endif + +#ifdef INCLUDE_CMD_TYPE + {_T("type"), 0, cmd_type}, +#endif + +#ifdef INCLUDE_CMD_VER + {_T("ver"), 0, cmd_ver}, +#endif + +#ifdef INCLUDE_CMD_VERIFY + {_T("verify"), 0, cmd_verify}, +#endif + +#ifdef INCLUDE_CMD_VOL + {_T("vol"), 0, cmd_vol}, +#endif + +#ifdef INCLUDE_CMD_WINDOW + {_T("window"), 0, CommandWindow}, +#endif + + {NULL, 0, NULL} +}; + + +VOID PrintCommandList (VOID) +{ + LPCOMMAND cmdptr; + INT y; + + y = 0; + cmdptr = cmds; + while (cmdptr->name) + { + if (!(cmdptr->flags & CMD_HIDE)) + { + if (++y == 8) + { + ConOutPuts (cmdptr->name); + y = 0; + } + else + { + ConOutPrintf (_T("%-10s"), cmdptr->name); + } + } + + cmdptr++; + } + + if (y != 0) + ConOutChar ('\n'); +} + +VOID PrintCommandListDetail (VOID) +{ + ConOutResPaging(TRUE,STRING_HELP1); + ConOutResPaging(FALSE,STRING_HELP2); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/cmdver.h b/reactos/base/shell/cmd/cmdver.h new file mode 100644 index 00000000000..93ed1b8f446 --- /dev/null +++ b/reactos/base/shell/cmd/cmdver.h @@ -0,0 +1,2 @@ +#define CMD_VER "0.1.2" +#define CMD_VER_RC CMD_VER"\0" diff --git a/reactos/base/shell/cmd/color.c b/reactos/base/shell/cmd/color.c new file mode 100644 index 00000000000..8db6dc767d1 --- /dev/null +++ b/reactos/base/shell/cmd/color.c @@ -0,0 +1,137 @@ +/* + * COLOR.C - color internal command. + * + * + * History: + * + * 13-Dec-1998 (Eric Kohl ) + * Started. + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection ready! + * + * 14-Oct-1999 (Paolo Pantaleo ) + * 4nt's syntax implemented. + * + * 03-Apr-2005 (Magnus Olsen) ) + * Move all hardcoded strings to En.rc. + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_COLOR + + + + + +VOID SetScreenColor (WORD wColor, BOOL bNoFill) +{ + DWORD dwWritten; + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD coPos; + + + if ((wColor & 0xF) == (wColor &0xF0) >> 4) + { + ConErrResPuts(STRING_COLOR_ERROR1); + } + else + { + if (bNoFill != TRUE) + { + GetConsoleScreenBufferInfo (hConsole, &csbi); + + coPos.X = 0; + coPos.Y = 0; + FillConsoleOutputAttribute (hConsole, + (WORD)(wColor & 0x00FF), + (csbi.dwSize.X)*(csbi.dwSize.Y), + coPos, + &dwWritten); + } + SetConsoleTextAttribute (hConsole, (WORD)(wColor & 0x00FF)); + } +} + + +/* + * color + * + * internal dir command + */ +INT CommandColor (LPTSTR first, LPTSTR rest) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + if (_tcsncmp (rest, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_COLOR_HELP1); + return 0; + } + + nErrorLevel = 0; + + if (rest[0] == _T('\0')) + { + /* set default color */ + wColor = wDefColor; + SetScreenColor (wColor, FALSE); + return 0; + } + + + if ( _tcslen(&rest[0])==1) + { + if ( (_tcscmp(&rest[0], _T("0")) >=0 ) && (_tcscmp(&rest[0], _T("9")) <=0 ) ) + { + SetConsoleTextAttribute (hConsole, (WORD)_ttoi(rest)); + return 0; + } + else if ( (_tcscmp(&rest[0], _T("a")) >=0 ) && (_tcscmp(&rest[0], _T("f")) <=0 ) ) + { + SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('a')) ); + return 0; + } + else if ( (_tcscmp(&rest[0], _T("A")) >=0 ) && (_tcscmp(&rest[0], _T("F")) <=0 ) ) + { + SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('A')) ); + return 0; + } + ConErrResPuts(STRING_COLOR_ERROR2); + nErrorLevel = 1; + return 1; + } + + if (StringToColor(&wColor, &rest) == FALSE) + { + ConErrResPuts(STRING_COLOR_ERROR2); + nErrorLevel = 1; + return 1; + } + + LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, wColor); + + if ((wColor & 0xF) == (wColor &0xF0) >> 4) + { + LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR4, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, wColor); + nErrorLevel = 1; + return 1; + } + + /* set color */ + SetScreenColor(wColor, + (_tcsstr (rest,_T("/-F")) || _tcsstr (rest,_T("/-f")))); + + return 0; +} + +#endif /* INCLUDE_CMD_COLOR */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/config.h b/reactos/base/shell/cmd/config.h new file mode 100644 index 00000000000..356af141446 --- /dev/null +++ b/reactos/base/shell/cmd/config.h @@ -0,0 +1,99 @@ +/* + * CONFIG.H - Used to configure what will be compiled into the shell. + * + * + * History: + * + * 27 Jul 1998 - John P. Price + * started. + * + */ + +/* Define only if used under ReactOS */ +#define __REACTOS__ + +#ifndef _CONFIG_H_INCLUDED_ +#define _CONFIG_H_INCLUDED_ + +/* Define to enable debugging code */ +//#define _DEBUG + +#define WIN32_LEAN_AND_MEAN + +//#define NT4_INTERNAL_COMMANDS + +/* Define to enable the alias command, and aliases.*/ +#define FEATURE_ALIASES + + +/* Define to enable history */ +#define FEATURE_HISTORY + +/*Define to enable history wrap (4nt's style)*/ +#define WRAP_HISTORY + + +/* Define one of these to enable filename completion */ +//#define FEATURE_UNIX_FILENAME_COMPLETION +#define FEATURE_4NT_FILENAME_COMPLETION + + +/* Define to enable the directory stack */ +#define FEATURE_DIRECTORY_STACK + + +/* Define to activate redirections and piping */ +#define FEATURE_REDIRECTION + + +/* Define one of these to select the used locale. */ +/* (date and time formats etc.) used in DATE, TIME, */ +/* DIR, PROMPT etc. */ +#define LOCALE_WINDOWS /* System locale */ +/* #define LOCALE_GERMAN */ /* German locale */ +/* #define LOCALE_DEFAULT */ /* United States locale */ + +#ifdef NT4_INTERNAL_COMMANDS +#define INCLUDE_CMD_ACTIVATE +#endif +#define INCLUDE_CMD_ATTRIB +#define INCLUDE_CMD_CHCP +#define INCLUDE_CMD_CHDIR +#define INCLUDE_CMD_CHOICE +#define INCLUDE_CMD_CLS +#define INCLUDE_CMD_COLOR +#define INCLUDE_CMD_COPY +#define INCLUDE_CMD_DATE +#define INCLUDE_CMD_DEL +#define INCLUDE_CMD_DELAY +#define INCLUDE_CMD_DIR +#define INCLUDE_CMD_FREE +#define INCLUDE_CMD_LABEL +#define INCLUDE_CMD_MEMORY +#define INCLUDE_CMD_MKDIR +#define INCLUDE_CMD_MOVE +#ifdef NT4_INTERNAL_COMMANDS +#define INCLUDE_CMD_MSGBOX +#endif +#define INCLUDE_CMD_PATH +#define INCLUDE_CMD_PROMPT +#define INCLUDE_CMD_RMDIR +#define INCLUDE_CMD_RENAME +#define INCLUDE_CMD_SCREEN +#define INCLUDE_CMD_SET +#define INCLUDE_CMD_START +#define INCLUDE_CMD_TIME +#define INCLUDE_CMD_TIMER +#define INCLUDE_CMD_TITLE +#define INCLUDE_CMD_TYPE +#define INCLUDE_CMD_VER +#define INCLUDE_CMD_REM +#define INCLUDE_CMD_PAUSE +#define INCLUDE_CMD_BEEP +#define INCLUDE_CMD_VERIFY +#define INCLUDE_CMD_VOL +#ifdef NT4_INTERNAL_COMMANDS +#define INCLUDE_CMD_WINDOW +#endif + +#endif /* _CONFIG_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/console.c b/reactos/base/shell/cmd/console.c new file mode 100644 index 00000000000..352a64e2f9a --- /dev/null +++ b/reactos/base/shell/cmd/console.c @@ -0,0 +1,527 @@ +/* + * CONSOLE.C - console input/output functions. + * + * + * History: + * + * 20-Jan-1999 (Eric Kohl ) + * started + * + * 03-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + * 01-Jul-2005 (Brandon Turner) ) + * Added ConPrintfPaging and ConOutPrintfPaging + */ + + + +#include +#include "resource.h" + + +#define OUTPUT_BUFFER_SIZE 4096 + + +UINT InputCodePage; +UINT OutputCodePage; + + +VOID ConInDisable (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + DWORD dwMode; + + GetConsoleMode (hInput, &dwMode); + dwMode &= ~ENABLE_PROCESSED_INPUT; + SetConsoleMode (hInput, dwMode); +} + + +VOID ConInEnable (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + DWORD dwMode; + + GetConsoleMode (hInput, &dwMode); + dwMode |= ENABLE_PROCESSED_INPUT; + SetConsoleMode (hInput, dwMode); +} + + +VOID ConInDummy (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + INPUT_RECORD dummy; + DWORD dwRead; + +#ifdef _DEBUG + if (hInput == INVALID_HANDLE_VALUE) + DebugPrintf (_T("Invalid input handle!!!\n")); +#endif /* _DEBUG */ + ReadConsoleInput (hInput, &dummy, 1, &dwRead); +} + +VOID ConInFlush (VOID) +{ + FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE)); +} + + +VOID ConInKey (PINPUT_RECORD lpBuffer) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + DWORD dwRead; + +#ifdef _DEBUG + if (hInput == INVALID_HANDLE_VALUE) + DebugPrintf (_T("Invalid input handle!!!\n")); +#endif /* _DEBUG */ + + do + { + ReadConsoleInput (hInput, lpBuffer, 1, &dwRead); + if ((lpBuffer->EventType == KEY_EVENT) && + (lpBuffer->Event.KeyEvent.bKeyDown == TRUE)) + break; + } + while (TRUE); +} + + + +VOID ConInString (LPTSTR lpInput, DWORD dwLength) +{ + DWORD dwOldMode; + DWORD dwRead; + HANDLE hFile; + + LPTSTR p; + DWORD i; + PCHAR pBuf; + +#ifdef _UNICODE + pBuf = (PCHAR)malloc(dwLength); +#else + pBuf = lpInput; +#endif + ZeroMemory (lpInput, dwLength * sizeof(TCHAR)); + hFile = GetStdHandle (STD_INPUT_HANDLE); + GetConsoleMode (hFile, &dwOldMode); + + SetConsoleMode (hFile, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT); + + ReadFile (hFile, (PVOID)pBuf, dwLength, &dwRead, NULL); + +#ifdef _UNICODE + MultiByteToWideChar( InputCodePage, 0, pBuf, dwLength + 1, lpInput, dwLength + 1); +#endif + p = lpInput; + for (i = 0; i < dwRead; i++, p++) + { + if (*p == _T('\x0d')) + { + *p = _T('\0'); + break; + } + } + +#ifdef _UNICODE + free(pBuf); +#endif + + SetConsoleMode (hFile, dwOldMode); +} + +static VOID ConChar(TCHAR c, DWORD nStdHandle) +{ + DWORD dwWritten; + CHAR cc; +#ifdef _UNICODE + CHAR as[2]; + WCHAR ws[2]; + ws[0] = c; + ws[1] = 0; + WideCharToMultiByte( OutputCodePage, 0, ws, 2, as, 2, NULL, NULL); + cc = as[0]; +#else + cc = c; +#endif + WriteFile (GetStdHandle (nStdHandle), + &cc, + 1, + &dwWritten, + NULL); +} + +VOID ConOutChar (TCHAR c) +{ + ConChar(c, STD_OUTPUT_HANDLE); +} + +VOID ConPuts(LPTSTR szText, DWORD nStdHandle) +{ + DWORD dwWritten; + PCHAR pBuf; + INT len; + + len = _tcslen(szText); +#ifdef _UNICODE + pBuf = malloc(len + 1); + len = WideCharToMultiByte( OutputCodePage, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1; +#else + pBuf = szText; +#endif + WriteFile (GetStdHandle (nStdHandle), + pBuf, + len, + &dwWritten, + NULL); + WriteFile (GetStdHandle (nStdHandle), + _T("\n"), + 1, + &dwWritten, + NULL); +#ifdef UNICODE + free(pBuf); +#endif +} + +VOID ConOutResPaging(BOOL NewPage, UINT resID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintfPaging(NewPage, szMsg); +} + +VOID ConOutResPuts (UINT resID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE); + + ConPuts(szMsg, STD_OUTPUT_HANDLE); +} + +VOID ConOutPuts (LPTSTR szText) +{ + ConPuts(szText, STD_OUTPUT_HANDLE); +} + + +VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) +{ + INT len; + PCHAR pBuf; + TCHAR szOut[OUTPUT_BUFFER_SIZE]; + DWORD dwWritten; + + len = _vstprintf (szOut, szFormat, arg_ptr); +#ifdef _UNICODE + pBuf = malloc(len + 1); + len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1; +#else + pBuf = szOut; +#endif + + WriteFile (GetStdHandle (nStdHandle), + pBuf, + len, + &dwWritten, + NULL); + + +#ifdef UNICODE + free(pBuf); +#endif +} + +INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle) +{ + INT len; + PCHAR pBuf; + CONSOLE_SCREEN_BUFFER_INFO csbi; + TCHAR szOut[OUTPUT_BUFFER_SIZE]; + DWORD dwWritten; + + /* used to count number of lines since last pause */ + static int LineCount = 0; + + /* used to see how big the screen is */ + int ScreenLines = 0; + + /* the number of chars in a roow */ + int ScreenCol = 0; + + /* chars since end of line */ + int CharEL = 0; + + int i = 0; + + if(NewPage == TRUE) + LineCount = 0; + + /* rest LineCount and return if no string have been given */ + if (szFormat == NULL) + return 0; + + + //get the size of the visual screen that can be printed too + if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) + { + // we assuming its a file handle + ConPrintf(szFormat, arg_ptr, nStdHandle); + return 0; + } + //subtract 2 to account for "press any key..." and for the blank line at the end of PagePrompt() + ScreenLines = (csbi.srWindow.Bottom - csbi.srWindow.Top) - 4; + ScreenCol = (csbi.srWindow.Right - csbi.srWindow.Left) + 1; + + //make sure they didnt make the screen to small + if(ScreenLines<4) + { + ConPrintf(szFormat, arg_ptr, nStdHandle); + return 0; + } + + len = _vstprintf (szOut, szFormat, arg_ptr); +#ifdef _UNICODE + pBuf = malloc(len + 1); + len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1; +#else + pBuf = szOut; +#endif + + for(i = 0; i < len; i++) + { + + if(pBuf[i] == _T('\n')) + { + LineCount++; + CharEL=0; + } + else + { + CharEL++; + if (CharEL>=ScreenCol) + { + if (i+1= ScreenLines) + { + if(_tcsnicmp(&pBuf[i], _T("\n"), 2)!=0) + WriteFile (GetStdHandle (nStdHandle),_T("\n"),sizeof(CHAR),&dwWritten,NULL); + + if(PagePrompt() != PROMPT_YES) + { + return 1; + } + //reset the number of lines being printed + LineCount = 0; + CharEL=0; + } + + } + +#ifdef UNICODE + free(pBuf); +#endif + return 0; +} + +VOID ConErrFormatMessage (DWORD MessageId, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + DWORD ret; + LPTSTR text; + va_list arg_ptr; + + va_start (arg_ptr, MessageId); + ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + MessageId, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &text, + 0, + &arg_ptr); + + va_end (arg_ptr); + if(ret > 0) + { + ConErrPuts (text); + LocalFree(text); + } + else + { + LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + } +} + +VOID ConOutFormatMessage (DWORD MessageId, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + DWORD ret; + LPTSTR text; + va_list arg_ptr; + + va_start (arg_ptr, MessageId); + ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + MessageId, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &text, + 0, + &arg_ptr); + + va_end (arg_ptr); + if(ret > 0) + { + ConErrPuts (text); + LocalFree(text); + } + else + { + LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + } +} + +VOID ConOutPrintf (LPTSTR szFormat, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE); + va_end (arg_ptr); +} + +INT ConOutPrintfPaging (BOOL NewPage, LPTSTR szFormat, ...) +{ + INT iReturn; + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + iReturn = ConPrintfPaging(NewPage, szFormat, arg_ptr, STD_OUTPUT_HANDLE); + va_end (arg_ptr); + return iReturn; +} + +VOID ConErrChar (TCHAR c) +{ + ConChar(c, STD_ERROR_HANDLE); +} + + +VOID ConErrResPuts (UINT resID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE); + ConPuts(szMsg, STD_ERROR_HANDLE); +} + +VOID ConErrPuts (LPTSTR szText) +{ + ConPuts(szText, STD_ERROR_HANDLE); +} + + +VOID ConErrPrintf (LPTSTR szFormat, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE); + va_end (arg_ptr); +} + +#ifdef _DEBUG +VOID DebugPrintf (LPTSTR szFormat, ...) +{ + va_list arg_ptr; + + va_start (arg_ptr, szFormat); + ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE); + va_end (arg_ptr); +#if 0 + TCHAR szOut[OUTPUT_BUFFER_SIZE]; + va_start (arg_ptr, szFormat); + _vstprintf (szOut, szFormat, arg_ptr); + OutputDebugString (szOut); + va_end (arg_ptr); +#endif +} +#endif /* _DEBUG */ + +VOID SetCursorXY (SHORT x, SHORT y) +{ + COORD coPos; + + coPos.X = x; + coPos.Y = y; + SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coPos); +} + + +VOID GetCursorXY (PSHORT x, PSHORT y) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + *x = csbi.dwCursorPosition.X; + *y = csbi.dwCursorPosition.Y; +} + + +SHORT GetCursorX (VOID) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + return csbi.dwCursorPosition.X; +} + + +SHORT GetCursorY (VOID) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + return csbi.dwCursorPosition.Y; +} + + +VOID GetScreenSize (PSHORT maxx, PSHORT maxy) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo (hConsole, &csbi); + + if (maxx) + *maxx = csbi.dwSize.X; + if (maxy) + *maxy = csbi.dwSize.Y; +} + + +VOID SetCursorType (BOOL bInsert, BOOL bVisible) +{ + CONSOLE_CURSOR_INFO cci; + + cci.dwSize = bInsert ? 10 : 99; + cci.bVisible = bVisible; + + SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/copy.c b/reactos/base/shell/cmd/copy.c new file mode 100644 index 00000000000..a54b8751d84 --- /dev/null +++ b/reactos/base/shell/cmd/copy.c @@ -0,0 +1,888 @@ +/* + * COPY.C -- copy internal command. + * + * + * History: + * + * 01-Aug-98 (Rob Lake z63rrl@morgan.ucs.mun.ca) + * started + * + * 13-Aug-1998 (John P. Price) + * fixed memory leak problem in copy function. + * fixed copy function so it would work with wildcards in the source + * + * 13-Dec-1998 (Eric Kohl ) + * Added COPY command to CMD. + * + * 26-Jan-1998 (Eric Kohl ) + * Replaced CRT io functions by Win32 io functions. + * + * 27-Oct-1998 (Eric Kohl ) + * Disabled prompting when used in batch mode. + * + * 03-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + * 13-Jul-2005 (Brandon Turner) ) + * Rewrite to clean up copy and support wildcard. + * + * 20-Jul-2005 (Brandon Turner) ) + * Add touch syntax. "copy arp.exe+,," + * Copy command is now completed. + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_COPY + +enum +{ + COPY_ASCII = 0x001, /* /A */ + COPY_DECRYPT = 0x004, /* /D */ + COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */ + COPY_SHORTNAME = 0x010, /* /N : Dummy, Never will be Impleneted */ + COPY_NO_PROMPT = 0x020, /* /Y */ + COPY_PROMPT = 0x040, /* /-Y */ + COPY_RESTART = 0x080, /* /Z */ + COPY_BINARY = 0x100, /* /B */ +}; + +#define BUFF_SIZE 16384 /* 16k = max buffer size */ + + +INT +copy (TCHAR source[MAX_PATH], + TCHAR dest[MAX_PATH], + INT append, + DWORD lpdwFlags, + BOOL bTouch) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + FILETIME srctime,NewFileTime; + HANDLE hFileSrc; + HANDLE hFileDest; + LPBYTE buffer; + DWORD dwAttrib; + DWORD dwRead; + DWORD dwWritten; + DWORD i; + BOOL bEof = FALSE; + TCHAR TrueDest[MAX_PATH]; + TCHAR TempSrc[MAX_PATH]; + TCHAR * FileName; + SYSTEMTIME CurrentTime; + + /* Check Breaker */ + if(CheckCtrlBreak(BREAK_INPUT)) + return 0; + +#ifdef _DEBUG + DebugPrintf (_T("checking mode\n")); +#endif + + if(bTouch) + { + hFileSrc = CreateFile (source, GENERIC_WRITE, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + if (hFileSrc == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + nErrorLevel = 1; + return 0; + } + + GetSystemTime(&CurrentTime); + SystemTimeToFileTime(&CurrentTime, &NewFileTime); + if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime)) + { + CloseHandle(hFileSrc); + nErrorLevel = 1; + return 1; + + } + else + { + CloseHandle(hFileSrc); + return 0; + } + } + + dwAttrib = GetFileAttributes (source); + + hFileSrc = CreateFile (source, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, NULL); + if (hFileSrc == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + nErrorLevel = 1; + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("getting time\n")); +#endif + + GetFileTime (hFileSrc, &srctime, NULL, NULL); + +#ifdef _DEBUG + DebugPrintf (_T("copy: flags has %s\n"), + lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY"); +#endif + + /* Check to see if /D or /Z are true, if so we need a middle + man to copy the file too to allow us to use CopyFileEx later */ + if(lpdwFlags & COPY_DECRYPT) + { + GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH); + _tcscat(TempSrc,_T("\\")); + FileName = _tcsrchr(source,_T('\\')); + FileName++; + _tcscat(TempSrc,FileName); + /* This is needed to be on the end to prevent an error + if the user did "copy /D /Z foo bar then it would be copied + too %TEMP%\foo here and when %TEMP%\foo when it sets it up + for COPY_RESTART, this would mean it is copying to itself + which would error when it tried to open the handles for ReadFile + and WriteFile */ + _tcscat(TempSrc,_T(".decrypt")); + if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION)) + { + nErrorLevel = 1; + return 0; + } + _tcscpy(source, TempSrc); + } + + + if(lpdwFlags & COPY_RESTART) + { + _tcscpy(TrueDest, dest); + GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH); + _tcscat(dest,_T("\\")); + FileName = _tcsrchr(TrueDest,_T('\\')); + FileName++; + _tcscat(dest,FileName); + } + + + + if (!IsExistingFile (dest)) + { +#ifdef _DEBUG + DebugPrintf (_T("opening/creating\n")); +#endif + hFileDest = + CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + } + else if (!append) + { + if (!_tcscmp (dest, source)) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + + CloseHandle (hFileSrc); + nErrorLevel = 1; + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("SetFileAttributes (%s, FILE_ATTRIBUTE_NORMAL);\n"), dest); +#endif + SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); + +#ifdef _DEBUG + DebugPrintf (_T("DeleteFile (%s);\n"), dest); +#endif + DeleteFile (dest); + + hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + } + else + { + LONG lFilePosHigh = 0; + + if (!_tcscmp (dest, source)) + { + CloseHandle (hFileSrc); + return 0; + } + +#ifdef _DEBUG + DebugPrintf (_T("opening/appending\n")); +#endif + SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL); + + hFileDest = + CreateFile (dest, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + + /* Move to end of file to start writing */ + SetFilePointer (hFileDest, 0, &lFilePosHigh,FILE_END); + } + + + if (hFileDest == INVALID_HANDLE_VALUE) + { + CloseHandle (hFileSrc); + ConOutResPuts(STRING_ERROR_PATH_NOT_FOUND); + nErrorLevel = 1; + return 0; + } + buffer = (LPBYTE)malloc (BUFF_SIZE); + if (buffer == NULL) + { + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + ConOutResPuts(STRING_ERROR_OUT_OF_MEMORY); + nErrorLevel = 1; + return 0; + } + + do + { + + ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL); + if (lpdwFlags & COPY_ASCII) + { + for (i = 0; i < dwRead; i++) + { + /* we're dealing with ASCII files! */ + if (((LPSTR)buffer)[i] == 0x1A) + { + bEof = TRUE; + break; + } + } + dwRead = i; + } + + if (dwRead == 0) + break; + + WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL); + if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT)) + { + ConOutResPuts(STRING_COPY_ERROR3); + + free (buffer); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + nErrorLevel = 1; + return 0; + } + } + while (dwRead && !bEof); + +#ifdef _DEBUG + DebugPrintf (_T("setting time\n")); +#endif + SetFileTime (hFileDest, &srctime, NULL, NULL); + + if (lpdwFlags & COPY_ASCII) + { + /* we're dealing with ASCII files! */ + ((LPSTR)buffer)[0] = 0x1A; + ((LPSTR)buffer)[1] = '\0'; +#ifdef _DEBUG + DebugPrintf (_T("appending ^Z\n")); +#endif + WriteFile (hFileDest, buffer, sizeof(CHAR), &dwWritten, NULL); + } + + free (buffer); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + +#ifdef _DEBUG + DebugPrintf (_T("setting mode\n")); +#endif + SetFileAttributes (dest, dwAttrib); + + /* Now finish off the copy if needed with CopyFileEx */ + if(lpdwFlags & COPY_RESTART) + { + if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE)) + { + nErrorLevel = 1; + DeleteFile(dest); + return 0; + } + /* Take care of file in the temp folder */ + DeleteFile(dest); + + } + + if(lpdwFlags & COPY_DECRYPT) + DeleteFile(TempSrc); + + + + return 1; +} + + +static INT CopyOverwrite (LPTSTR fn) +{ + /*ask the user if they want to override*/ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT res; + LoadString(CMD_ModuleHandle, STRING_COPY_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,fn); + res = FilePromptYNA (_T("")); + return res; +} + + +INT cmd_copy (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT argc, i, nFiles, nOverwrite = 0, nSrc = -1, nDes = -1; + /* this is the path up to the folder of the src and dest ie C:\windows\ */ + TCHAR szDestPath[MAX_PATH]; + TCHAR szSrcPath[MAX_PATH]; + DWORD dwFlags = 0; + /* If this is the type of copy where we are adding files */ + BOOL bAppend = FALSE; + WIN32_FIND_DATA findBuffer; + HANDLE hFile; + BOOL bTouch = FALSE; + /* Used when something like "copy c*.exe d*.exe" during the process of + figuring out the new name */ + TCHAR tmpName[MAX_PATH] = _T(""); + /* Pointer to keep track of how far through the append input(file1+file2+file3) we are */ + TCHAR * appendPointer = _T("\0"); + /* The full path to src and dest. This has drive letter, folders, and filename */ + TCHAR tmpDestPath[MAX_PATH]; + TCHAR tmpSrcPath[MAX_PATH]; + /* A bool on weather or not the destination name will be taking from the input */ + BOOL bSrcName = FALSE; + /* Seems like a waste but it is a pointer used to copy from input to PreserveName */ + TCHAR * UseThisName; + /* Stores the name( i.e. blah.txt or blah*.txt) which later we might need */ + TCHAR PreserveName[MAX_PATH]; + /* for CMDCOPY env */ + TCHAR *evar; + int size; + TCHAR * szTouch; + BOOL bDone = FALSE; + + + /*Show help/usage info*/ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE, STRING_COPY_HELP2); + return 0; + } + + nErrorLevel = 0; + + /* Get the envor value if it exists */ + evar = malloc(512 * sizeof(TCHAR)); + if (evar==NULL) size = 0; + else + { + size = GetEnvironmentVariable (_T("COPYCMD"), evar, 512); + } + if (size > 512) + { + evar = realloc(evar,size * sizeof(TCHAR) ); + if (evar!=NULL) + { + size = GetEnvironmentVariable (_T("COPYCMD"), evar, size); + } + else + { + size=0; + } + } + + /* check see if we did get any env variable */ + if (size !=0) + { + int t=0; + /* scan and set the flags */ + for (t=0;t= 2) + { + switch (_totupper(arg[i][1])) + { + + case _T('A'): + dwFlags |= COPY_ASCII; + break; + + case _T('B'): + dwFlags |= COPY_BINARY; + break; + + case _T('D'): + dwFlags |= COPY_DECRYPT; + break; + + case _T('V'): + dwFlags |= COPY_VERIFY; + break; + + case _T('N'): + dwFlags |= COPY_SHORTNAME; + break; + + case _T('Y'): + dwFlags |= COPY_NO_PROMPT; + dwFlags &= ~COPY_PROMPT; + break; + + case _T('-'): + if(_tcslen(arg[i]) >= 3) + if(_totupper(arg[i][2]) == _T('Y')) + { + dwFlags &= ~COPY_NO_PROMPT; + dwFlags |= COPY_PROMPT; + } + + break; + + case _T('Z'): + dwFlags |= COPY_RESTART; + break; + + default: + /* invaild switch */ + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(arg[i][1])); + nErrorLevel = 1; + return 1; + break; + } + } + /*If it was a switch, subtract from total arguments*/ + nFiles--; + } + else + { + /*if it isnt a switch then it is the source or destination*/ + if(nSrc == -1) + { + nSrc = i; + } + else if(*arg[i] == _T('+') || *arg[i] == _T(',')) + { + /* Add these onto the source string + this way we can do all checks + directly on source string later on */ + _tcscat(arg[nSrc],arg[i]); + nFiles--; + } + else if(nDes == -1) + { + nDes = i; + } + + } + } + + /* keep quiet within batch files */ + if (bc != NULL) + { + dwFlags |= COPY_NO_PROMPT; + dwFlags &= ~COPY_PROMPT; + } + + if(nFiles < 1) + { + /* There is not enough files, there has to be at least 1 */ + ConOutResPuts(STRING_ERROR_REQ_PARAM_MISSING); + freep (arg); + return 1; + } + + if(nFiles > 2) + { + /* there is too many file names in command */ + LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg,_T("")); + nErrorLevel = 1; + freep (arg); + return 1; + } + + if(((_tcschr (arg[nSrc], _T('+')) != NULL) || + (_tcschr (arg[nSrc], _T('*')) != NULL && _tcschr (arg[nDes], _T('*')) == NULL) || + (IsExistingDirectory (arg[nSrc]) && (_tcschr (arg[nDes], _T('*')) == NULL && !IsExistingDirectory (arg[nDes]))) + )) + { + /* There is a + in the source filename, this means + that there is more then one file being put into + one file. */ + bAppend = TRUE; + if(_tcschr (arg[nSrc], _T('+')) != NULL) + appendPointer = arg[nSrc]; + } + + /* Reusing the number of files variable */ + nFiles = 0; + + do + { + /* Set up the string that is the path to the destination */ + if(nDes != -1) + { + if(_tcslen(arg[nDes]) == 2 && arg[nDes][1] == _T(':')) + { + GetRootPath(arg[nDes],szDestPath,MAX_PATH); + } + else + /* If the user entered two file names then form the full string path*/ + GetFullPathName (arg[nDes], MAX_PATH, szDestPath, NULL); + + } + else + { + /* If no destination was entered then just use + the current directory as the destination */ + GetCurrentDirectory (MAX_PATH, szDestPath); + } + + + /* Get the full string of the path to the source file*/ + if(_tcschr (arg[nSrc], _T('+')) != NULL) + { + _tcscpy(tmpName,_T("\0")); + /* Loop through the source file name and copy all + the chars one at a time until it gets too + */ + while(TRUE) + { + if(!_tcsncmp (appendPointer,_T("+"),1) || !_tcsncmp (appendPointer,_T("\0"),1)) + { + /* Now that the pointer is on the + we + need to go to the start of the next filename */ + if(!_tcsncmp (appendPointer,_T("+"),1)) + appendPointer++; + else + bDone = TRUE; + break; + + } + + _tcsncat(tmpName,appendPointer,1); + appendPointer++; + + } + /* Finish the string off with a null char */ + _tcsncat(tmpName,_T("\0"),1); + + if(_tcschr (arg[nSrc], _T(',')) != NULL) + { + /* Only time there is a , in the source is when they are using touch + Cant have a destination and can only have on ,, at the end of the string + Cant have more then one file name */ + szTouch = _tcsstr (arg[nSrc], _T("+")); + if(_tcsncmp (szTouch,_T("+,,\0"),4) || nDes != -1) + { + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg,arg[nSrc]); + nErrorLevel = 1; + freep (arg); + return 1; + } + bTouch = TRUE; + bDone = TRUE; + } + + if(_tcslen(tmpName) == 2) + { + if(tmpName[1] == _T(':')) + { + + GetRootPath(tmpName,szSrcPath,MAX_PATH); + } + } + else + /* Get the full path to first file in the string of file names */ + GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL); + } + else + { + bDone = TRUE; + if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':')) + { + GetRootPath(arg[nSrc],szSrcPath,MAX_PATH); + } + else + /* Get the full path of the source file */ + GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL); + + } + + /* From this point on, we can assume that the shortest path is 3 letters long + and that would be [DriveLetter]:\ */ + + /* If there is no * in the path name and it is a folder + then we will need to add a wildcard to the pathname + so FindFirstFile comes up with all the files in that + folder */ + if(_tcschr (szSrcPath, _T('*')) == NULL && + IsExistingDirectory (szSrcPath)) + { + /* If it doesnt have a \ at the end already then on needs to be added */ + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\')) + _tcscat (szSrcPath, _T("\\")); + /* Add a wildcard after the \ */ + _tcscat (szSrcPath, _T("*")); + } + /* Make sure there is an ending slash to the path if the dest is a folder */ + if(_tcschr (szDestPath, _T('*')) == NULL && + IsExistingDirectory(szDestPath)) + { + if(szDestPath[_tcslen(szDestPath) - 1] != _T('\\')) + _tcscat (szDestPath, _T("\\")); + } + + + /* Get a list of all the files */ + hFile = FindFirstFile (szSrcPath, &findBuffer); + + + /* We need to figure out what the name of the file in the is going to be */ + if((szDestPath[_tcslen(szDestPath) - 1] == _T('*') && szDestPath[_tcslen(szDestPath) - 2] == _T('\\')) || + szDestPath[_tcslen(szDestPath) - 1] == _T('\\')) + { + /* In this case we will be using the same name as the source file + for the destination file because destination is a folder */ + bSrcName = TRUE; + } + else + { + /* Save the name the user entered */ + UseThisName = _tcsrchr(szDestPath,_T('\\')); + UseThisName++; + _tcscpy(PreserveName,UseThisName); + } + + /* Strip the paths back to the folder they are in */ + for(i = (_tcslen(szSrcPath) - 1); i > -1; i--) + if(szSrcPath[i] != _T('\\')) + szSrcPath[i] = _T('\0'); + else + break; + + for(i = (_tcslen(szDestPath) - 1); i > -1; i--) + if(szDestPath[i] != _T('\\')) + szDestPath[i] = _T('\0'); + else + break; + + do + { + /* Check Breaker */ + if(CheckCtrlBreak(BREAK_INPUT)) + { + freep(arg); + return 1; + } + /* Set the override to yes each new file */ + nOverwrite = 1; + + /* If it couldnt open the file handle, print out the error */ + if(hFile == INVALID_HANDLE_VALUE) + { + ConOutFormatMessage (GetLastError(), szSrcPath); + freep (arg); + nErrorLevel = 1; + return 1; + } + + /* Ignore the . and .. files */ + if(!_tcscmp (findBuffer.cFileName, _T(".")) || + !_tcscmp (findBuffer.cFileName, _T(".."))|| + findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + /* Copy the base folder over to a tmp string */ + _tcscpy(tmpDestPath,szDestPath); + + /* Can't put a file into a folder that isnt there */ + if(!IsExistingDirectory(szDestPath)) + { + ConOutFormatMessage (GetLastError (), szSrcPath); + freep (arg); + nErrorLevel = 1; + return 1; + } + /* Copy over the destination path name */ + if(bSrcName) + _tcscat (tmpDestPath, findBuffer.cFileName); + else + { + /* If there is no wildcard you can use the name the user entered */ + if(_tcschr (PreserveName, _T('*')) == NULL) + { + _tcscat (tmpDestPath, PreserveName); + } + else + { + /* The following lines of copy were written by someone else + (most likely Eric Khoul) and it was taken from ren.c */ + LPTSTR p,q,r; + TCHAR DoneFile[MAX_PATH]; + /* build destination file name */ + p = findBuffer.cFileName; + q = PreserveName; + r = DoneFile; + while(*q != 0) + { + if (*q == '*') + { + q++; + while (*p != 0 && *p != *q) + { + *r = *p; + p++; + r++; + } + } + else if (*q == '?') + { + q++; + if (*p != 0) + { + *r = *p; + p++; + r++; + } + } + else + { + *r = *q; + if (*p != 0) + p++; + q++; + r++; + } + } + *r = 0; + /* Add the filename to the tmp string path */ + _tcscat (tmpDestPath, DoneFile); + + } + } + + + /* Build the string path to the source file */ + _tcscpy(tmpSrcPath,szSrcPath); + _tcscat (tmpSrcPath, findBuffer.cFileName); + + /* Check to see if the file is the same file */ + if(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath)) + continue; + + /* Handle any overriding / prompting that needs to be done */ + if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch) + nOverwrite = CopyOverwrite(tmpDestPath); + if(nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK) + continue; + if(nOverwrite == PROMPT_ALL || (nOverwrite == PROMPT_YES && bAppend)) + dwFlags |= COPY_NO_PROMPT; + + /* Tell weather the copy was successful or not */ + if(copy(tmpSrcPath,tmpDestPath, bAppend, dwFlags, bTouch)) + { + nFiles++; + /* only print source name when more then one file */ + if(_tcschr (arg[nSrc], _T('+')) != NULL || _tcschr (arg[nSrc], _T('*')) != NULL) + ConOutPrintf(_T("%s\n"),findBuffer.cFileName); + //LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + } + else + { + /* print out the error message */ + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg); + ConOutFormatMessage (GetLastError(), szSrcPath); + nErrorLevel = 1; + } + + /* Loop through all wildcard files */ + }while(FindNextFile (hFile, &findBuffer)); + /* Loop through all files in src string with a + */ + }while(!bDone); + + /* print out the number of files copied */ + LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, nFiles); + + CloseHandle(hFile); + if (arg!=NULL) + free(arg); + + return 0; +} + + +#endif /* INCLUDE_CMD_COPY */ diff --git a/reactos/base/shell/cmd/date.c b/reactos/base/shell/cmd/date.c new file mode 100644 index 00000000000..3c71a4b6329 --- /dev/null +++ b/reactos/base/shell/cmd/date.c @@ -0,0 +1,273 @@ +/* + * DATE.C - date internal command. + * + * + * History: + * + * 08 Jul 1998 (John P. Price) + * started. + * + * 20 Jul 1998 (John P. Price) + * corrected number of days for December from 30 to 31. + * (Thanx to Steffen Kaiser for bug report) + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 29-Jul-1998 (Rob Lake) + * fixed stand-alone mode. + * Added Pacific C compatible dos_getdate functions + * + * 09-Jan-1999 (Eric Kohl ) + * Added locale support + * + * 23-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 04-Feb-1999 (Eric Kohl ) + * Fixed date input bug. + * + * 03-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DATE + + +static WORD awMonths[2][13] = +{ + {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} +}; + + +static VOID +PrintDateString (VOID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + LoadString(CMD_ModuleHandle, STRING_DATE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cDateSeparator, cDateSeparator); + break; + + case 1: /* ddmmyy */ + LoadString(CMD_ModuleHandle, STRING_DATE_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cDateSeparator, cDateSeparator); + break; + + case 2: /* yymmdd */ + LoadString(CMD_ModuleHandle, STRING_DATE_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cDateSeparator, cDateSeparator); + break; + } +} + + +static BOOL +ReadNumber (LPTSTR *s, LPWORD lpwValue) +{ + if (_istdigit (**s)) + { + while (_istdigit (**s)) + { + *lpwValue = *lpwValue * 10 + **s - _T('0'); + (*s)++; + } + return TRUE; + } + return FALSE; +} + + +static BOOL +ReadSeparator (LPTSTR *s) +{ + if (**s == _T('/') || **s == _T('-') || **s == cDateSeparator) + { + (*s)++; + return TRUE; + } + return FALSE; +} + + +static BOOL +ParseDate (LPTSTR s) +{ + SYSTEMTIME d; + unsigned char leap; + LPTSTR p = s; + + if (!*s) + return TRUE; + + GetLocalTime (&d); + + d.wYear = 0; + d.wDay = 0; + d.wMonth = 0; + + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + if (!ReadNumber (&p, &d.wMonth)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wDay)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wYear)) + return FALSE; + break; + + case 1: /* ddmmyy */ + if (!ReadNumber (&p, &d.wDay)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wMonth)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wYear)) + return FALSE; + break; + + case 2: /* yymmdd */ + if (!ReadNumber (&p, &d.wYear)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wMonth)) + return FALSE; + if (!ReadSeparator (&p)) + return FALSE; + if (!ReadNumber (&p, &d.wDay)) + return FALSE; + break; + } + + /* if only entered two digits: */ + /* assume 2000's if value less than 80 */ + /* assume 1900's if value greater or equal 80 */ + if (d.wYear <= 99) + { + if (d.wYear >= 80) + d.wYear = 1900 + d.wYear; + else + d.wYear = 2000 + d.wYear; + } + + leap = (!(d.wYear % 4) && (d.wYear % 100)) || !(d.wYear % 400); + + if ((d.wMonth >= 1 && d.wMonth <= 12) && + (d.wDay >= 1 && d.wDay <= awMonths[leap][d.wMonth]) && + (d.wYear >= 1980 && d.wYear <= 2099)) + { + SetLocalTime (&d); + return TRUE; + } + + return FALSE; +} + + +INT cmd_date (LPTSTR cmd, LPTSTR param) +{ + LPTSTR *arg; + INT argc; + INT i; + BOOL bPrompt = TRUE; + INT nDateString = -1; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_DATE_HELP4); + return 0; + } + + nErrorLevel = 0; + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* check for options */ + for (i = 0; i < argc; i++) + { + if (_tcsicmp (arg[i], _T("/t")) == 0) + bPrompt = FALSE; + if ((*arg[i] != _T('/')) && (nDateString == -1)) + nDateString = i; + } + + if (nDateString == -1) + PrintDate (); + + if (!bPrompt) + { + freep (arg); + return 0; + } + + if (nDateString == -1) + { + while (TRUE) /* forever loop */ + { + TCHAR s[40]; + + PrintDateString (); + ConInString (s, 40); +#ifdef _DEBUG + DebugPrintf (_T("\'%s\'\n"), s); +#endif + while (*s && s[_tcslen (s) - 1] < _T(' ')) + s[_tcslen (s) - 1] = _T('\0'); + if (ParseDate (s)) + { + freep (arg); + return 0; + } + ConErrResPuts(STRING_DATE_ERROR); + + } + } + else + { + if (!ParseDate (arg[nDateString])) + { + while (TRUE) /* forever loop */ + { + TCHAR s[40]; + ConErrResPuts(STRING_DATE_ERROR); + + PrintDateString (); + ConInString (s, 40); + + while (*s && s[_tcslen (s) - 1] < _T(' ')) + s[_tcslen (s) - 1] = _T('\0'); + if (ParseDate (s)) + { + freep (arg); + return 0; + } + } + } + } + + freep (arg); + + return 0; +} +#endif /* INCLUDE_CMD_DATE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/del.c b/reactos/base/shell/cmd/del.c new file mode 100644 index 00000000000..b059e551463 --- /dev/null +++ b/reactos/base/shell/cmd/del.c @@ -0,0 +1,570 @@ +/* +* DEL.C - del internal command. +* +* +* History: +* +* 06/29/98 (Rob Lake rlake@cs.mun.ca) +* rewrote del to support wildcards +* added my name to the contributors +* +* 07/13/98 (Rob Lake) +* fixed bug that caused del not to delete file with out +* attribute. moved set, del, ren, and ver to there own files +* +* 27-Jul-1998 (John P Price ) +* added config.h include +* +* 09-Dec-1998 (Eric Kohl ) +* Fixed command line parsing bugs. +* +* 21-Jan-1999 (Eric Kohl ) +* Started major rewrite using a new structure. +* +* 03-Feb-1999 (Eric Kohl ) +* First working version. +* +* 30-Mar-1999 (Eric Kohl ) +* Added quiet ("/Q"), wipe ("/W") and zap ("/Z") option. +* +* 06-Nov-1999 (Eric Kohl ) +* Little fix to keep DEL quiet inside batch files. +* +* 28-Jan-2004 (Michael Fritscher ) +* Added prompt ("/P"), yes ("/Y") and wipe("/W") option. +* +* 22-Jun-2005 (Brandon Turner ) +* Added exclusive deletion "del * -abc.txt -text*.txt" +* +* 22-Jun-2005 (Brandon Turner ) +* Implemented /A example "del /A:H /A:-R *.exe -ping.exe" +* +* 07-Aug-2005 +* Removed the exclusive deletion (see two comments above) because '-' is a valid file name character. +* Optimized the recursive deletion in directories. +* Preload some nice strings. +*/ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DEL + + +enum +{ + DEL_ATTRIBUTES = 0x001, /* /A */ + DEL_NOTHING = 0x004, /* /N */ + DEL_PROMPT = 0x008, /* /P */ + DEL_QUIET = 0x010, /* /Q */ + DEL_SUBDIR = 0x020, /* /S */ + DEL_TOTAL = 0x040, /* /T */ + DEL_WIPE = 0x080, /* /W */ + DEL_EMPTYDIR = 0x100, /* /X : not implemented */ + DEL_YES = 0x200, /* /Y */ + DEL_FORCE = 0x800 /* /F */ +}; + +enum +{ + ATTR_ARCHIVE = 0x001, /* /A:A */ + ATTR_HIDDEN = 0x002, /* /A:H */ + ATTR_SYSTEM = 0x004, /* /A:S */ + ATTR_READ_ONLY = 0x008, /* /A:R */ + ATTR_N_ARCHIVE = 0x010, /* /A:-A */ + ATTR_N_HIDDEN = 0x020, /* /A:-H */ + ATTR_N_SYSTEM = 0x040, /* /A:-S */ + ATTR_N_READ_ONLY = 0x080 /* /A:-R */ +}; + +static TCHAR szDeleteWipe[RC_STRING_MAX_SIZE]; +static TCHAR szDelHelp2[RC_STRING_MAX_SIZE]; +static TCHAR szDelHelp3[RC_STRING_MAX_SIZE]; +static TCHAR szDelHelp4[RC_STRING_MAX_SIZE]; +static TCHAR szDelError5[RC_STRING_MAX_SIZE]; +static TCHAR szDelError6[RC_STRING_MAX_SIZE]; +static TCHAR szDelError7[RC_STRING_MAX_SIZE]; +static TCHAR CMDPath[MAX_PATH]; + +static BOOLEAN StringsLoaded = FALSE; + +static VOID LoadStrings(VOID) +{ + LoadString( CMD_ModuleHandle, STRING_DELETE_WIPE, szDeleteWipe, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szDelHelp2, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_HELP3, szDelHelp3, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_HELP4, szDelHelp4, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_ERROR5, szDelError5, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_ERROR6, szDelError6, RC_STRING_MAX_SIZE); + LoadString( CMD_ModuleHandle, STRING_DEL_ERROR7, szDelError7, RC_STRING_MAX_SIZE); + GetModuleFileName(NULL, CMDPath, MAX_PATH); + StringsLoaded = TRUE; +} + +static BOOL +RemoveFile (LPTSTR lpFileName, DWORD dwFlags, WIN32_FIND_DATA* f) +{ + /*This function is called by CommandDelete and + does the actual process of deleting the single + file*/ + if(CheckCtrlBreak(BREAK_INPUT)) + return 1; + + /*check to see if it is read only and if this is done based on /A + if it is done by file name, access is denied. However, if it is done + using the /A switch you must un-read only the file and allow it to be + deleted*/ + if((dwFlags & DEL_ATTRIBUTES) || (dwFlags & DEL_FORCE)) + { + if(f->dwFileAttributes & FILE_ATTRIBUTE_READONLY) + { + /*setting file to normal, not saving old attrs first + because the file is going to be deleted anyways + so the only thing that matters is that it isnt + read only.*/ + SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL); + } + } + + if (dwFlags & DEL_WIPE) + { + + HANDLE file; + DWORD temp; +#define BufferSize 65536 + BYTE buffer[BufferSize]; + LONGLONG i; + LARGE_INTEGER FileSize; + + FileSize.u.HighPart = f->nFileSizeHigh; + FileSize.u.LowPart = f->nFileSizeLow; + + for(i = 0; i < BufferSize; i++) + { + buffer[i]=rand() % 256; + } + file = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); + if (file != INVALID_HANDLE_VALUE) + { + for(i = 0; i < (FileSize.QuadPart - BufferSize); i += BufferSize) + { + WriteFile (file, buffer, BufferSize, &temp, NULL); + ConOutPrintf (_T("%I64d%% %s\r"),(i * (LONGLONG)100)/FileSize.QuadPart,szDeleteWipe); + } + WriteFile (file, buffer, (DWORD)(FileSize.QuadPart - i), &temp, NULL); + ConOutPrintf (_T("100%% %s\n"),szDeleteWipe); + CloseHandle (file); + } + } + + return DeleteFile (lpFileName); +} + + +static DWORD +DeleteFiles(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags) +{ + TCHAR szFullPath[MAX_PATH]; + TCHAR szFileName[MAX_PATH]; + LPTSTR pFilePart; + HANDLE hFile; + WIN32_FIND_DATA f; + BOOL bExclusion; + INT res; + DWORD dwFiles = 0; + + _tcscpy(szFileName, FileName); + + if(_tcschr (szFileName, _T('*')) == NULL && + IsExistingDirectory (szFileName)) + { + /* If it doesnt have a \ at the end already then on needs to be added */ + if(szFileName[_tcslen(szFileName) - 1] != _T('\\')) + _tcscat (szFileName, _T("\\")); + /* Add a wildcard after the \ */ + _tcscat (szFileName, _T("*")); + } + + if(!_tcscmp (szFileName, _T("*")) || + !_tcscmp (szFileName, _T("*.*")) || + (szFileName[_tcslen(szFileName) - 2] == _T('\\') && szFileName[_tcslen(szFileName) - 1] == _T('*'))) + { + /* well, the user wants to delete everything but if they didnt yes DEL_YES, DEL_QUIET, or DEL_PROMPT + then we are going to want to make sure that in fact they want to do that. */ + + if (!((*dwFlags & DEL_YES) || (*dwFlags & DEL_QUIET) || (*dwFlags & DEL_PROMPT))) + { + res = FilePromptYNA (szDelHelp2); + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + return 0x80000000; + if(res == PROMPT_ALL) + *dwFlags |= DEL_YES; + } + } + + GetFullPathName (szFileName, + MAX_PATH, + szFullPath, + &pFilePart); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + bExclusion = FALSE; + + /*if it is going to be excluded by - no need to check attrs*/ + if(*dwFlags & DEL_ATTRIBUTES && !bExclusion) + { + + /*save if file attr check if user doesnt care about that attr anyways*/ + if(dwAttrFlags & ATTR_ARCHIVE && !(f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_HIDDEN && !(f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_SYSTEM && !(f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_READ_ONLY && !(f.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_ARCHIVE && (f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_HIDDEN && (f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_SYSTEM && (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) + bExclusion = TRUE; + if(dwAttrFlags & ATTR_N_READ_ONLY && (f.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + bExclusion = TRUE; + } + + if(bExclusion) + continue; + + /* ignore directories */ + if (f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + + _tcscpy (pFilePart, f.cFileName); + + /* We cant delete ourselves */ + if(!_tcscmp (CMDPath,szFullPath)) + continue; + + +#ifdef _DEBUG + ConErrPrintf(_T("Full filename: %s\n"), szFullPath); +#endif + + /* ask for deleting */ + if (*dwFlags & DEL_PROMPT) + { + ConErrPrintf(szDelError5, szFullPath); + + res = FilePromptYN (szDelError6); + + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + nErrorLevel = 0; + continue; + } + } + + /*user cant ask it to be quiet and tell you what it did*/ + if (!(*dwFlags & DEL_QUIET) && !(*dwFlags & DEL_TOTAL)) + { + ConErrPrintf(szDelError7, szFullPath); + } + + /* delete the file */ + if(*dwFlags & DEL_NOTHING) + continue; + + if(RemoveFile (szFullPath, *dwFlags, &f)) + dwFiles++; + else + { + ErrorMessage (GetLastError(), _T("")); +// FindClose(hFile); +// return -1; + } + } + while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + return dwFiles; +} + + +static DWORD +ProcessDirectory(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags) +{ + TCHAR szFullPath[MAX_PATH]; + LPTSTR pFilePart; + LPTSTR pSearchPart; + HANDLE hFile; + WIN32_FIND_DATA f; + DWORD dwFiles = 0; + + GetFullPathName (FileName, + MAX_PATH, + szFullPath, + &pFilePart); + + dwFiles = DeleteFiles(szFullPath, dwFlags, dwAttrFlags); + if (dwFiles & 0x80000000) + return dwFiles; + + if (*dwFlags & DEL_SUBDIR) + { + /* Get just the file name */ + pSearchPart = _tcsrchr(FileName,_T('\\')); + if(pSearchPart != NULL) + pSearchPart++; + else + pSearchPart = FileName; + + /* Get the full path to the file */ + GetFullPathName (FileName,MAX_PATH,szFullPath,NULL); + + /* strip the filename off of it */ + pFilePart = _tcsrchr(szFullPath, _T('\\')); + if (pFilePart == NULL) + { + pFilePart = szFullPath; + } + else + { + pFilePart++; + } + + _tcscpy(pFilePart, _T("*")); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || + !_tcscmp(f.cFileName, _T(".")) || + !_tcscmp(f.cFileName, _T(".."))) + continue; + + _tcscpy(pFilePart, f.cFileName); + _tcscat(pFilePart, _T("\\")); + _tcscat(pFilePart, pSearchPart); + + dwFiles +=ProcessDirectory(szFullPath, dwFlags, dwAttrFlags); + if (dwFiles & 0x80000000) + { + break; + } + } + while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + } + return dwFiles; +} + + + +INT CommandDelete (LPTSTR cmd, LPTSTR param) +{ + /*cmd is the command that was given, in this case it will always be "del" or "delete" + param is whatever is given after the command*/ + + LPTSTR *arg = NULL; + INT args; + INT i; + INT nEvalArgs = 0; /* nunber of evaluated arguments */ + DWORD dwFlags = 0; + DWORD dwAttrFlags = 0; + DWORD dwFiles = 0; + LONG ch; + TCHAR szOrginalArg[MAX_PATH]; + + /*checks the first two chars of param to see if it is /? + this however allows the following command to not show help + "del frog.txt /?" */ + + if (!StringsLoaded) + { + LoadStrings(); + } + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_DEL_HELP1); + return 0; + } + + nErrorLevel = 0; + + arg = split (param, &args, FALSE); + + if (args == 0) + { + /* only command given */ + error_req_param_missing (); + freep (arg); + return 1; + } + /* check for options anywhere in command line */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + { + /*found a command, but check to make sure it has something after it*/ + if (_tcslen (arg[i]) >= 2) + { + ch = _totupper (arg[i][1]); + if (ch == _T('N')) + { + dwFlags |= DEL_NOTHING; + } + else if (ch == _T('P')) + { + dwFlags |= DEL_PROMPT; + } + else if (ch == _T('Q')) + { + dwFlags |= DEL_QUIET; + } + else if (ch == _T('F')) + { + dwFlags |= DEL_FORCE; + } + else if (ch == _T('S')) + { + dwFlags |= DEL_SUBDIR; + } + else if (ch == _T('T')) + { + dwFlags |= DEL_TOTAL; + } + else if (ch == _T('W')) + { + dwFlags |= DEL_WIPE; + } + else if (ch == _T('Y')) + { + dwFlags |= DEL_YES; + } + else if (ch == _T('A')) + { + + dwFlags |= DEL_ATTRIBUTES; + /*the proper syntax for /A has a min of 4 chars + i.e. /A:R or /A:-H */ + if (_tcslen (arg[i]) < 4) + { + error_invalid_parameter_format(arg[i]); + return 0; + } + ch = _totupper (arg[i][3]); + if (_tcslen (arg[i]) == 4) + { + if(ch == _T('A')) + { + dwAttrFlags |= ATTR_ARCHIVE; + } + if(ch == _T('H')) + { + dwAttrFlags |= ATTR_HIDDEN; + } + if(ch == _T('S')) + { + dwAttrFlags |= ATTR_SYSTEM; + } + if(ch == _T('R')) + { + dwAttrFlags |= ATTR_READ_ONLY; + } + } + if (_tcslen (arg[i]) == 5) + { + if(ch == _T('-')) + { + ch = _totupper (arg[i][4]); + if(ch == _T('A')) + { + dwAttrFlags |= ATTR_N_ARCHIVE; + } + if(ch == _T('H')) + { + dwAttrFlags |= ATTR_N_HIDDEN; + } + if(ch == _T('S')) + { + dwAttrFlags |= ATTR_N_SYSTEM; + } + if(ch == _T('R')) + { + dwAttrFlags |= ATTR_N_READ_ONLY; + } + } + } + } + } + + nEvalArgs++; + } + } + + /* there are only options on the command line --> error!!! + there is the same number of args as there is flags, so none of the args were filenames*/ + if (args == nEvalArgs) + { + error_req_param_missing (); + freep (arg); + return 1; + } + + /* keep quiet within batch files */ + if (bc != NULL) + dwFlags |= DEL_QUIET; + + /* check for filenames anywhere in command line */ + for (i = 0; i < args && !(dwFiles & 0x80000000); i++) + { + + /*this checks to see if it isnt a flag, if it isnt, we assume it is a file name*/ + if((*arg[i] == _T('/')) || (*arg[i] == _T('-'))) + continue; + + /* We want to make a copies of the argument */ + if(_tcslen(arg[i]) == 2 && arg[i][1] == _T(':')) + { + /* Check for C: D: ... */ + GetRootPath(arg[i],szOrginalArg,MAX_PATH); + } + else + { + _tcscpy(szOrginalArg,arg[i]); + } + dwFiles += ProcessDirectory(szOrginalArg, &dwFlags, dwAttrFlags); + + } + + freep (arg); + + /*Based on MS cmd, we only tell what files are being deleted when /S is used */ + if (dwFlags & DEL_TOTAL) + { + dwFiles &= 0x7fffffff; + if (dwFiles < 2) + { + ConOutPrintf(szDelHelp3, dwFiles); + } + else + { + ConOutPrintf(szDelHelp4, dwFiles); + } + } + + return 0; +} + + +#endif diff --git a/reactos/base/shell/cmd/delay.c b/reactos/base/shell/cmd/delay.c new file mode 100644 index 00000000000..4b383102e33 --- /dev/null +++ b/reactos/base/shell/cmd/delay.c @@ -0,0 +1,49 @@ +/* + * DELAY.C - internal command. + * + * clone from 4nt delay command + * + * 30 Aug 1999 + * started - Paolo Pantaleo + * + * + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DELAY + + +INT CommandDelay (LPTSTR cmd, LPTSTR param) +{ + DWORD val; + DWORD mul=1000; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_DELAY_HELP); + return 0; + } + + nErrorLevel = 0; + + if (*param==0) + { + error_req_param_missing (); + return 1; + } + + if (_tcsnicmp(param,_T("/m"),2) == 0) + { + mul = 1; + param += 2; + } + + val = _ttoi(param); + Sleep(val * mul); + + return 0; +} + +#endif /* INCLUDE_CMD_DELAY */ diff --git a/reactos/base/shell/cmd/dir.c b/reactos/base/shell/cmd/dir.c new file mode 100644 index 00000000000..e70e1bcf300 --- /dev/null +++ b/reactos/base/shell/cmd/dir.c @@ -0,0 +1,2111 @@ +/* + * DIR.C - dir internal command. + * + * + * History: + * + * 01/29/97 (Tim Norman) + * started. + * + * 06/13/97 (Tim Norman) + * Fixed code. + * + * 07/12/97 (Tim Norman) + * Fixed bug that caused the root directory to be unlistable + * + * 07/12/97 (Marc Desrochers) + * Changed to use maxx, maxy instead of findxy() + * + * 06/08/98 (Rob Lake) + * Added compatibility for /w in dir + * + * 06/09/98 (Rob Lake) + * Compatibility for dir/s started + * Tested that program finds directories off root fine + * + * 06/10/98 (Rob Lake) + * do_recurse saves the cwd and also stores it in Root + * build_tree adds the cwd to the beginning of its' entries + * Program runs fine, added print_tree -- works fine.. as EXE, + * program won't work properly as COM. + * + * 06/11/98 (Rob Lake) + * Found problem that caused COM not to work + * + * 06/12/98 (Rob Lake) + * debugged... + * added free mem routine + * + * 06/13/98 (Rob Lake) + * debugged the free mem routine + * debugged whole thing some more + * Notes: + * ReadDir stores Root name and _Read_Dir does the hard work + * PrintDir prints Root and _Print_Dir does the hard work + * KillDir kills Root _after_ _Kill_Dir does the hard work + * Integrated program into DIR.C(this file) and made some same + * changes throughout + * + * 06/14/98 (Rob Lake) + * Cleaned up code a bit, added comments + * + * 06/16/98 (Rob Lake) + * Added error checking to my previously added routines + * + * 06/17/98 (Rob Lake) + * Rewrote recursive functions, again! Most other recursive + * functions are now obsolete -- ReadDir, PrintDir, _Print_Dir, + * KillDir and _Kill_Dir. do_recurse does what PrintDir did + * and _Read_Dir did what it did before along with what _Print_Dir + * did. Makes /s a lot faster! + * Reports 2 more files/dirs that MS-DOS actually reports + * when used in root directory(is this because dir defaults + * to look for read only files?) + * Added support for /b, /a and /l + * Made error message similar to DOS error messages + * Added help screen + * + * 06/20/98 (Rob Lake) + * Added check for /-(switch) to turn off previously defined + * switches. + * Added ability to check for DIRCMD in environment and + * process it + * + * 06/21/98 (Rob Lake) + * Fixed up /B + * Now can dir *.ext/X, no spaces! + * + * 06/29/98 (Rob Lake) + * error message now found in command.h + * + * 07/08/1998 (John P. Price) + * removed extra returns; closer to MSDOS + * fixed wide display so that an extra return is not displayed + * when there is five filenames in the last line. + * + * 07/12/98 (Rob Lake) + * Changed error messages + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * + * 04-Dec-1998 (Eric Kohl ) + * Converted source code to Win32, except recursive dir ("dir /s"). + * + * 10-Dec-1998 (Eric Kohl ) + * Fixed recursive dir ("dir /s"). + * + * 14-Dec-1998 (Eric Kohl ) + * Converted to Win32 directory functions and + * fixed some output bugs. There are still some more ;) + * + * 10-Jan-1999 (Eric Kohl ) + * Added "/N" and "/4" options, "/O" is a dummy. + * Added locale support. + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection safe! + * + * 01-Mar-1999 (Eric Kohl ) + * Replaced all runtime io functions by their Win32 counterparts. + * + * 23-Feb-2001 (Carl Nettelblad ) + * dir /s now works in deeper trees + * + * 28-Jan-2004 (Michael Fritscher ) + * Fix for /p, so it is working under Windows in GUI-mode, too. + * + * 30-Apr-2004 (Filip Navara ) + * Fix /w to print long names. + * + * 27-Feb-2005 (Konstantinos Paliouras ) + * Implemented all the switches that were missing, and made + * the ros dir very similar to windows dir. Major part of + * the code is rewritten. /p is removed, to be rewriten in + * the main cmd code. + * + * 1-Jul-2004 (Brandon Turner ) + * Added /p back in using ConOutPrintfPaging + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_DIR + + + +/* Time Field enumeration */ +enum ETimeField +{ + TF_CREATIONDATE = 0, + TF_MODIFIEDDATE = 1, + TF_LASTACCESSEDDATE = 2 +}; + +/* Ordered by enumeration */ +enum EOrderBy +{ + ORDER_NAME = 0, + ORDER_SIZE = 1, + ORDER_DIRECTORY = 2, + ORDER_EXTENSION = 3, + ORDER_TIME = 4 +}; + +/* The struct for holding the switches */ +typedef struct _DirSwitchesFlags +{ + BOOL bBareFormat; /* Bare Format */ + BOOL bTSeperator; /* Thousands seperator */ + BOOL bWideList; /* Wide list format */ + BOOL bWideListColSort; /* Wide list format but sorted by column */ + BOOL bLowerCase; /* Uses lower case */ + BOOL bNewLongList; /* New long list */ + BOOL bPause; /* Pause per page */ + BOOL bUser; /* Displays the owner of file */ + BOOL bRecursive; /* Displays files in specified directory and all sub */ + BOOL bShortName; /* Displays the sort name of files if exist */ + BOOL b4Digit; /* Four digit year */ + struct + { + DWORD dwAttribVal; /* The desired state of attribute */ + DWORD dwAttribMask; /* Which attributes to check */ + BOOL bUnSet; /* A helper flag if "-" was given with the switch */ + BOOL bParSetted; /* A helper flag if parameters of switch were given */ + } stAttribs; /* Displays files with this attributes only */ + struct + { + enum EOrderBy eCriteria[3]; /* Criterias used to order by */ + BOOL bCriteriaRev[3]; /* If the criteria is in reversed order */ + short sCriteriaCount; /* The quantity of criterias */ + BOOL bUnSet; /* A helper flag if "-" was given with the switch */ + BOOL bParSetted; /* A helper flag if parameters of switch were given */ + } stOrderBy; /* Ordered by criterias */ + struct + { + enum ETimeField eTimeField; /* The time field that will be used for */ + BOOL bUnSet; /* A helper flag if "-" was given with the switch */ + BOOL bParSetted; /* A helper flag if parameters of switch were given */ + } stTimeField; /* The time field to display or use for sorting */ +} DIRSWITCHFLAGS, *LPDIRSWITCHFLAGS; + + +typedef struct _DIRFINDLISTNODE +{ + WIN32_FIND_DATA stFindInfo; + struct _DIRFINDLISTNODE *ptrNext; +} DIRFINDLISTNODE, *PDIRFINDLISTNODE; + + +typedef BOOL +(WINAPI *PGETFREEDISKSPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); + + +/* Globally save the # of dirs, files and bytes, + * probabaly later pass them to functions. Rob Lake */ +static ULONG recurse_dir_cnt; +static ULONG recurse_file_cnt; +static ULARGE_INTEGER recurse_bytes; + + +/* + * help + * + * displays help screen for dir + * Rob Lake + */ +static VOID +DirHelp(VOID) +{ + ConOutResPaging(TRUE, STRING_DIR_HELP1); +} + + + +/* + * DirReadParameters + * + * Parse the parameters and switches of the command line and exports them + */ +static BOOL +DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */ + LPTSTR** params, /* [OUT] The parameters after parsing */ + LPINT entries, /* [OUT] The number of parameters after parsing */ + LPDIRSWITCHFLAGS lpFlags) /* [IN/OUT] The flags after calculating switches */ +{ + TCHAR cCurSwitch; /* The current switch */ + TCHAR cCurChar; /* Current examing character */ + TCHAR cCurUChar; /* Current upper examing character */ + BOOL bNegative; /* Negative switch */ + BOOL bPNegative; /* Negative switch parameter */ + BOOL bIntoQuotes; /* A flag showing if we are in quotes (") */ + LPTSTR ptrStart; /* A pointer to the first character of a parameter */ + LPTSTR ptrEnd; /* A pointer to the last character of a parameter */ + LPTSTR temp; + + /* Initialize parameter array */ + *params = malloc(sizeof(LPTSTR)); + if(!params) + return FALSE; + *params = NULL; + *entries = 0; + ptrStart = NULL; + ptrEnd = NULL; + + /* Initialize variables; */ + cCurSwitch = _T(' '); + bNegative = FALSE; + bPNegative = FALSE; + bIntoQuotes = FALSE; + + /* We suppose that switch parameters + were given to avoid setting them to default + if the switch was not given */ + lpFlags->stAttribs.bParSetted = TRUE; + lpFlags->stOrderBy.bParSetted = TRUE; + lpFlags->stTimeField.bParSetted = TRUE; + + + /* Main Loop (see README_DIR.txt) */ + /* scan the command line char per char, and we process its char */ + while (*Line) + { + /* we save current character as it is and its upper case */ + cCurChar = *Line; + cCurUChar = _totupper(*Line); + + /* 1st section (see README_DIR.txt) */ + /* When a switch is expecting */ + if (cCurSwitch == _T('/')) + { + if ((cCurUChar == _T('A')) ||(cCurUChar == _T('T')) || (cCurUChar == _T('O'))) + { + cCurSwitch = cCurUChar; + switch (cCurUChar) + { + case _T('A'): + lpFlags->stAttribs.bUnSet = bNegative; + lpFlags->stAttribs.bParSetted = FALSE; + break; + case _T('T'): + lpFlags->stTimeField.bUnSet = bNegative; + lpFlags->stTimeField.bParSetted = FALSE; + break; + case _T('O'): + lpFlags->stOrderBy.bUnSet = bNegative; + lpFlags->stOrderBy.bParSetted = FALSE; + break; + } + } + else if (cCurUChar == _T('L')) + lpFlags->bLowerCase = ! bNegative; + else if (cCurUChar == _T('B')) + lpFlags->bBareFormat = ! bNegative; + else if (cCurUChar == _T('C')) + lpFlags->bTSeperator = ! bNegative; + else if (cCurUChar == _T('W')) + lpFlags->bWideList = ! bNegative; + else if (cCurUChar == _T('D')) + lpFlags->bWideListColSort = ! bNegative; + else if (cCurUChar == _T('N')) + lpFlags->bNewLongList = ! bNegative; + else if (cCurUChar == _T('P')) + lpFlags->bPause = ! bNegative; + else if (cCurUChar == _T('Q')) + lpFlags->bUser = ! bNegative; + else if (cCurUChar == _T('S')) + lpFlags->bRecursive = ! bNegative; + else if (cCurUChar == _T('X')) + lpFlags->bShortName = ! bNegative; + else if (cCurChar == _T('4')) + lpFlags->b4Digit = ! bNegative; + else if (cCurChar == _T('?')) + { + DirHelp(); + return FALSE; + } + else if (cCurChar == _T('-')) + { + bNegative = TRUE; + } + else + { + error_invalid_switch ((TCHAR)_totupper (*Line)); + return FALSE; + } + + /* We check if we calculated the negative value and realese the flag */ + if ((cCurChar != _T('-')) && bNegative) + bNegative = FALSE; + + /* if not a,o,t or - option then next parameter is not a switch */ + if ((cCurSwitch == _T('/')) && (!bNegative)) + cCurSwitch = _T(' '); + + } + else if ((cCurSwitch == _T(' ')) || (cCurSwitch == _T('P'))) + { + /* 2nd section (see README_DIR.txt) */ + /* We are expecting parameter or the unknown */ + + if (cCurChar == _T('/')) + cCurSwitch = _T('/'); + + /* Process a spacer */ + else if (cCurChar == _T(' ')) + { + if (!bIntoQuotes) + { + cCurSwitch = _T(' '); + if(ptrStart && ptrEnd) + { + temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + if(!temp) + return FALSE; + memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + temp[(ptrEnd - ptrStart + 1)] = _T('\0'); + if(!add_entry(entries, params, temp)) + { + free(temp); + freep(*params); + return FALSE; + } + + free(temp); + + ptrStart = NULL; + ptrEnd = NULL; + } + } + + } + else if (cCurChar == _T('\"')) + { + /* Process a quote */ + bIntoQuotes = !bIntoQuotes; + if(!bIntoQuotes) + ptrEnd = Line; + } + else + { + /* Process a character for parameter */ + if ((cCurSwitch == _T(' ')) && ptrStart && ptrEnd) + { + temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + if(!temp) + return FALSE; + memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + temp[(ptrEnd - ptrStart + 1)] = _T('\0'); + if(!add_entry(entries, params, temp)) + { + free(temp); + freep(*params); + return FALSE; + } + + free(temp); + + ptrStart = NULL; + ptrEnd = NULL; + } + cCurSwitch = _T('P'); + if(!ptrStart) + ptrStart = ptrEnd = Line; + ptrEnd = Line; + } + } + else + { + /* 3rd section (see README_DIR.txt) */ + /* We are waiting for switch parameters */ + + /* Check if there are no more switch parameters */ + if ((cCurChar == _T('/')) || ( cCurChar == _T(' '))) + { + /* Wrong desicion path, reprocess current character */ + cCurSwitch = cCurChar; + continue; + } + /* Process parameter switch */ + switch(cCurSwitch) + { + case _T('A'): /* Switch parameters for /A (attributes filter) */ + /* Ok a switch parameter was given */ + lpFlags->stAttribs.bParSetted = TRUE; + + if (cCurChar == _T(':')) + /* =V= dead command, used to make the "if" work */ + cCurChar = cCurChar; + else if(cCurChar == _T('-')) + bPNegative = TRUE; + else if(cCurUChar == _T('D')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_DIRECTORY; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_DIRECTORY; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_DIRECTORY; + } + else if(cCurUChar == _T('R')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_READONLY; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_READONLY; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_READONLY; + } + else if(cCurUChar == _T('H')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_HIDDEN; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_HIDDEN; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_HIDDEN; + } + else if(cCurUChar == _T('A')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_ARCHIVE; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_ARCHIVE; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_ARCHIVE; + } + else if(cCurUChar == _T('S')) + { + lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_SYSTEM; + if (bPNegative) + lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_SYSTEM; + else + lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_SYSTEM; + } + else + { + error_parameter_format((TCHAR)_totupper (*Line)); + return FALSE; + } + break; + case _T('T'): /* Switch parameters for /T (time field) */ + + /* Ok a switch parameter was given */ + lpFlags->stTimeField.bParSetted = TRUE; + + if (cCurChar == _T(':')) + /* =V= dead command, used to make the "if" work */ + cCurChar = cCurChar; + else if(cCurUChar == _T('C')) + lpFlags->stTimeField.eTimeField= TF_CREATIONDATE ; + else if(cCurUChar == _T('A')) + lpFlags->stTimeField.eTimeField= TF_LASTACCESSEDDATE ; + else if(cCurUChar == _T('W')) + lpFlags->stTimeField.eTimeField= TF_MODIFIEDDATE ; + else + { + error_parameter_format((TCHAR)_totupper (*Line)); + return FALSE; + } + break; + case _T('O'): /* Switch parameters for /O (order) */ + /* Ok a switch parameter was given */ + lpFlags->stOrderBy.bParSetted = TRUE; + + if (cCurChar == _T(':')) + /* <== dead command, used to make the "if" work */ + cCurChar = cCurChar; + else if(cCurChar == _T('-')) + bPNegative = TRUE; + else if(cCurUChar == _T('N')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_NAME; + } + else if(cCurUChar == _T('S')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_SIZE; + } + else if(cCurUChar == _T('G')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_DIRECTORY; + } + else if(cCurUChar == _T('E')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_EXTENSION; + } + else if(cCurUChar == _T('D')) + { + if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++; + lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative; + lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_TIME; + } + + else + { + error_parameter_format((TCHAR)_totupper (*Line)); + return FALSE; + } + + + } + /* We check if we calculated the negative value and realese the flag */ + if ((cCurChar != _T('-')) && bPNegative) + bPNegative = FALSE; + } + + Line++; + } + /* Terminate the parameters */ + if(ptrStart && ptrEnd) + { + temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + if(!temp) + return FALSE; + memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR)); + temp[(ptrEnd - ptrStart + 1)] = _T('\0'); + if(!add_entry(entries, params, temp)) + { + free(temp); + freep(*params); + return FALSE; + } + + free(temp); + + ptrStart = NULL; + ptrEnd = NULL; + } + + /* Calculate the switches with no switch paramater */ + if (!(lpFlags->stAttribs.bParSetted)) + { + lpFlags->stAttribs.dwAttribVal = 0L; + lpFlags->stAttribs.dwAttribMask = lpFlags->stAttribs.dwAttribVal; + } + if (!(lpFlags->stOrderBy.bParSetted)) + { + lpFlags->stOrderBy.sCriteriaCount = 1; + lpFlags->stOrderBy.eCriteria[0] = ORDER_NAME; + lpFlags->stOrderBy.bCriteriaRev[0] = FALSE; + } + if (!(lpFlags->stOrderBy.bParSetted)) + lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE ; + + /* Calculate the unsetted switches (the "-" prefixed)*/ + if (lpFlags->stAttribs.bUnSet) + { + lpFlags->stAttribs.bUnSet = FALSE; + lpFlags->stAttribs.dwAttribVal = 0L; + lpFlags->stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + } + if (lpFlags->stOrderBy.bUnSet) + { + lpFlags->stOrderBy.bUnSet = FALSE; + lpFlags->stOrderBy.sCriteriaCount = 0; + } + if (lpFlags->stTimeField.bUnSet ) + { + lpFlags->stTimeField.bUnSet = FALSE; + lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE; + } + return TRUE; +} + + +/* + * ExtendFilespec + * + * extend the filespec, possibly adding wildcards + */ +static VOID +ExtendFilespec (LPTSTR file) +{ + INT len = 0; + + if (!file) + return; + + + /* if no file spec, change to "*.*" */ + if (*file == _T('\0')) + { + _tcscpy (file, _T("*.*")); + return; + } + + // add support for *. + if ((file[0] == _T('*')) && (file[1] == _T('.') )) + { + return; + } + + /* if starts with . add * in front */ + if (*file == _T('.')) + { + memmove (&file[1], &file[0], (_tcslen (file) + 1) * sizeof(TCHAR)); + file[0] = _T('*'); + } + + /* if no . add .* */ + if (!_tcschr (file, _T('.'))) + { + _tcscat (file, _T(".*")); + return; + } + + + + /* if last character is '.' add '*' */ + len = _tcslen (file); + if (file[len - 1] == _T('.')) + { + _tcscat (file, _T("*")); + return; + } +} + + +/* + * dir_parse_pathspec + * + * split the pathspec into drive, directory, and filespec + */ +static INT +DirParsePathspec (LPTSTR szPathspec, LPTSTR szPath, LPTSTR szFilespec) +{ + TCHAR szOrigPath[MAX_PATH]; + LPTSTR start; + LPTSTR tmp; + INT i; + BOOL bWildcards = FALSE; + + GetCurrentDirectory (MAX_PATH, szOrigPath); + + /* get the drive and change to it */ + if (szPathspec[1] == _T(':')) + { + TCHAR szRootPath[] = _T("A:"); + + szRootPath[0] = szPathspec[0]; + start = szPathspec + 2; + if (!SetCurrentDirectory (szRootPath)) + { + ErrorMessage (GetLastError(), NULL); + return 1; + } + } + else + { + start = szPathspec; + } + + + /* check for wildcards */ + for (i = 0; szPathspec[i]; i++) + { + if (szPathspec[i] == _T('*') || szPathspec[i] == _T('?')) + bWildcards = TRUE; + } + + /* check if this spec is a directory */ + if (!bWildcards) + { + if (SetCurrentDirectory (szPathspec)) + { + _tcscpy (szFilespec, _T("*.*")); + + if (!GetCurrentDirectory (MAX_PATH, szPath)) + { + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; + } + + SetCurrentDirectory (szOrigPath); + return 0; + } + } + + /* find the file spec */ + tmp = _tcsrchr (start, _T('\\')); + + /* if no path is specified */ + if (!tmp) + { + _tcscpy (szFilespec, start); + ExtendFilespec (szFilespec); + if (!GetCurrentDirectory (MAX_PATH, szPath)) + { + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory(); + return 1; + } + + SetCurrentDirectory (szOrigPath); + return 0; + } + + /* get the filename */ + _tcscpy (szFilespec, tmp+1); + ExtendFilespec (szFilespec); + + if (tmp == start) + { + /* change to the root directory */ + if (!SetCurrentDirectory (_T("\\"))) + { + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_path_not_found (); + return 1; + } + } + else + { + *tmp = _T('\0'); + + /* change to this directory */ + if (!SetCurrentDirectory (start)) + { + *tmp = _T('\\'); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_path_not_found (); + return 1; + } + } + + /* get the full name of the directory */ + if (!GetCurrentDirectory (MAX_PATH, szPath)) + { + *tmp = _T('\\'); + szFilespec[0] = _T('\0'); + SetCurrentDirectory (szOrigPath); + error_out_of_memory (); + return 1; + } + + *tmp = _T('\\'); + + SetCurrentDirectory (szOrigPath); + + return 0; +} + + +/* + * incline + * + * increment our line if paginating, display message at end of screen + */ +#if 0 +static BOOL +IncLine (LPINT pLine, LPDIRSWITCHFLAGS lpFlags) +{ + BOOL bError; + CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo; + LONG WindowHeight; + + bError = GetConsoleScreenBufferInfo(hConsole, &lpConsoleScreenBufferInfo); + + WindowHeight = lpConsoleScreenBufferInfo.srWindow.Bottom - lpConsoleScreenBufferInfo.srWindow.Top; + + /* That prevents bad behiour if WindowHeight could not be calculated */ + if (!WindowHeight) + { + WindowHeight= 1000000; + } + + if (!(lpFlags->bPause)) + return FALSE; + + (*pLine)++; + + /* + * Because I don't know if WindowsHeight work in all cases, + * perhaps then maxy is the right value + */ + if (*pLine >= (int)maxy - 2 || *pLine >= WindowHeight) + { + *pLine = 0; + return (PagePrompt () == PROMPT_BREAK); + } + + return FALSE; +} +#endif + +/* + * PrintDirectoryHeader + * + * print the header for the dir command + */ +static BOOL +PrintDirectoryHeader(LPTSTR szPath, LPINT pLine, LPDIRSWITCHFLAGS lpFlags) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szRootName[MAX_PATH]; + TCHAR szVolName[80]; + DWORD dwSerialNr; + LPTSTR p; + + if (lpFlags->bBareFormat) + return TRUE; + + /* build usable root path */ + if (szPath[1] == _T(':') && szPath[2] == _T('\\')) + { + /* normal path */ + szRootName[0] = szPath[0]; + szRootName[1] = _T(':'); + szRootName[2] = _T('\\'); + szRootName[3] = 0; + } + else if (szPath[0] == _T('\\') && szPath[1] == _T('\\')) + { + /* UNC path */ + p = _tcschr(&szPath[2], _T('\\')); + if (p == NULL) + { + error_invalid_drive(); + return(FALSE); + } + p = _tcschr(p+1, _T('\\')); + if (p == NULL) + { + _tcscpy(szRootName, szPath); + _tcscat(szRootName, _T("\\")); + } + else + { + *p = 0; + _tcscpy(szRootName, szPath); + _tcscat(szRootName, _T("\\")); + *p = _T('\\'); + } + } + else + { + error_invalid_drive(); + return(FALSE); + } + + /* get the media ID of the drive */ + if (!GetVolumeInformation(szRootName, szVolName, 80, &dwSerialNr, + NULL, NULL, NULL, 0)) + { + error_invalid_drive(); + return(FALSE); + } + + /* print drive info */ + if (szVolName[0] != _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_DIR_HELP2, szMsg, RC_STRING_MAX_SIZE); + //needs to have first paramter as TRUE because + //this is the first output and need to clear the static + if(lpFlags->bPause) + ConOutPrintfPaging(TRUE,szMsg, szRootName[0], szVolName); + else + ConOutPrintf(szMsg, szRootName[0], szVolName); + + } + else + { + LoadString(CMD_ModuleHandle, STRING_DIR_HELP3, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(TRUE,szMsg, szRootName[0]); + else + ConOutPrintf(szMsg, szRootName[0]); + } + + /* print the volume serial number if the return was successful */ + LoadString(CMD_ModuleHandle, STRING_DIR_HELP4, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg, + HIWORD(dwSerialNr), + LOWORD(dwSerialNr)); + else + ConOutPrintf(szMsg, + HIWORD(dwSerialNr), + LOWORD(dwSerialNr)); + + + return TRUE; +} + + +/* + * convert + * + * insert commas into a number + * + */ +#if 0 +static INT +ConvertULong (ULONG num, LPTSTR des, INT len) +{ + TCHAR temp[32]; + INT c = 0; + INT n = 0; + + if (num == 0) + { + des[0] = _T('0'); + des[1] = _T('\0'); + n = 1; + } + else + { + temp[31] = 0; + while (num > 0) + { + if (((c + 1) % (nNumberGroups + 1)) == 0) + temp[30 - c++] = cThousandSeparator; + temp[30 - c++] = (TCHAR)(num % 10) + _T('0'); + num /= 10; + } + + for (n = 0; n <= c; n++) + des[n] = temp[31 - c + n]; + } + + return n; +} +#endif + +static VOID +DirPrintFileDateTime(TCHAR *lpDate, + TCHAR *lpTime, + LPWIN32_FIND_DATA lpFile, + LPDIRSWITCHFLAGS lpFlags) +{ + FILETIME ft; + SYSTEMTIME dt; + TCHAR szDate[30]; + TCHAR szTime[30]; + WORD wYear; + + /* Select the right time field */ + switch (lpFlags->stTimeField.eTimeField) + { + case TF_CREATIONDATE: + if (!FileTimeToLocalFileTime(&lpFile->ftCreationTime, &ft)) + return; + FileTimeToSystemTime(&ft, &dt); + break; + + case TF_LASTACCESSEDDATE : + if (!FileTimeToLocalFileTime(&lpFile->ftLastAccessTime, &ft)) + return; + FileTimeToSystemTime(&ft, &dt); + break; + + case TF_MODIFIEDDATE: + if (!FileTimeToLocalFileTime(&lpFile->ftLastWriteTime, &ft)) + return; + FileTimeToSystemTime(&ft, &dt); + break; + } + + /* Format date */ + wYear = (lpFlags->b4Digit) ? dt.wYear : dt.wYear%100; + switch (nDateFormat) + { + case 0: /* mmddyy */ + default: + _stprintf (szDate, _T("%02d%c%02d%c%0*d"), + dt.wMonth, cDateSeparator, + dt.wDay, cDateSeparator, + lpFlags->b4Digit?4:2, wYear); + break; + + case 1: /* ddmmyy */ + _stprintf (szDate, _T("%02d%c%02d%c%0*d"), + dt.wDay, cDateSeparator, dt.wMonth, + cDateSeparator,lpFlags->b4Digit?4:2, wYear); + break; + + case 2: /* yymmdd */ + _stprintf (szDate, _T("%0*d%c%02d%c%02d"), + lpFlags->b4Digit?4:2, wYear, cDateSeparator, + dt.wMonth, cDateSeparator, dt.wDay); + break; + } + /* Format Time */ + switch (nTimeFormat) + { + case 0: /* 12 hour format */ + default: + _stprintf (szTime,_T(" %02d%c%02u%c"), + (dt.wHour == 0 ? 12 : (dt.wHour <= 12 ? dt.wHour : dt.wHour - 12)), + cTimeSeparator, + dt.wMinute, (dt.wHour <= 11 ? _T('a') : _T('p'))); + break; + + case 1: /* 24 hour format */ + _stprintf (szTime, _T(" %02d%c%02u"), + dt.wHour, cTimeSeparator, dt.wMinute); + break; + } + /* Copy results */ + _tcscpy(lpDate, szDate); + _tcscpy(lpTime, szTime); +} + + +static VOID +GetUserDiskFreeSpace(LPCTSTR lpRoot, + PULARGE_INTEGER lpFreeSpace) +{ + PGETFREEDISKSPACEEX pGetFreeDiskSpaceEx; + HINSTANCE hInstance; + DWORD dwSecPerCl; + DWORD dwBytPerSec; + DWORD dwFreeCl; + DWORD dwTotCl; + ULARGE_INTEGER TotalNumberOfBytes, TotalNumberOfFreeBytes; + + lpFreeSpace->QuadPart = 0; + + hInstance = LoadLibrary(_T("KERNEL32")); + if (hInstance != NULL) + { + pGetFreeDiskSpaceEx = (PGETFREEDISKSPACEEX)GetProcAddress(hInstance, +#ifdef _UNICODE + "GetDiskFreeSpaceExW"); +#else + "GetDiskFreeSpaceExA"); +#endif + if (pGetFreeDiskSpaceEx != NULL) + { + if (pGetFreeDiskSpaceEx(lpRoot, lpFreeSpace, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == TRUE) + return; + } + FreeLibrary(hInstance); + } + + GetDiskFreeSpace(lpRoot, + &dwSecPerCl, + &dwBytPerSec, + &dwFreeCl, + &dwTotCl); + + lpFreeSpace->QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; +} + + +/* + * print_summary: prints dir summary + * Added by Rob Lake 06/17/98 to compact code + * Just copied Tim's Code and patched it a bit + * + */ +static INT +PrintSummary(LPTSTR szPath, + ULONG ulFiles, + ULONG ulDirs, + ULARGE_INTEGER u64Bytes, + LPINT pLine, + LPDIRSWITCHFLAGS lpFlags) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szBuffer[64]; + ULARGE_INTEGER uliFree; + TCHAR szRoot[] = _T("A:\\"); + + + /* Here we check if we didn't find anything */ + if (!(ulFiles + ulDirs)) + { + error_file_not_found(); + return 1; + } + + + /* In bare format we don't print results */ + if (lpFlags->bBareFormat) + return 0; + + /* Print recursive specific results */ + + /* Take this code offline to fix /S does not print duoble info */ + if (lpFlags->bRecursive) + { + ConvertULargeInteger(u64Bytes, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator); + LoadString(CMD_ModuleHandle, STRING_DIR_HELP5, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer); + else + ConOutPrintf(szMsg,ulFiles, szBuffer); + } + else + { + + /* Print File Summary */ + /* Condition to print summary is: + If we are not in bare format and if we have results! */ + if (ulFiles > 0) + { + ConvertULargeInteger(u64Bytes, szBuffer, 20, lpFlags->bTSeperator); + LoadString(CMD_ModuleHandle, STRING_DIR_HELP8, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer); + else + ConOutPrintf(szMsg,ulFiles, szBuffer); + + } + + } + /* Print total directories and freespace */ + szRoot[0] = szPath[0]; + GetUserDiskFreeSpace(szRoot, &uliFree); + ConvertULargeInteger(uliFree, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator); + LoadString(CMD_ModuleHandle, STRING_DIR_HELP6, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,szMsg,ulDirs, szBuffer); + else + ConOutPrintf(szMsg,ulDirs, szBuffer); + + return 0; +} + +/* + * getExt + * + * Get the extension of a filename + */ +TCHAR* getExt(const TCHAR* file) +{ + static TCHAR *NoExt = _T(""); + TCHAR* lastdot = _tcsrchr(file, _T('.')); + return (lastdot != NULL ? lastdot + 1 : NoExt); +} + +/* + * getName + * + * Get the name of the file without extension + */ +static LPTSTR +getName(const TCHAR* file, TCHAR * dest) +{ + int iLen; + LPTSTR end; + + /* Check for "." and ".." folders */ + if ((_tcscmp(file, _T(".")) == 0) || + (_tcscmp(file, _T("..")) == 0)) + { + _tcscpy(dest,file); + return dest; + } + + end = _tcsrchr(file, _T('.')); + if (!end) + iLen = _tcslen(file); + else + iLen = (end - file); + + + _tcsncpy(dest, file, iLen); + *(dest + iLen) = _T('\0'); + + return dest; +} + + +/* + * DirPrintNewList + * + * The function that prints in new style + */ +static VOID +DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[], /* [IN]Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR *szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + DWORD i; + TCHAR szSize[30]; + TCHAR szShortName[15]; + TCHAR szDate[20]; + TCHAR szTime[20]; + INT iSizeFormat; + ULARGE_INTEGER u64FileSize; + + for (i = 0;i < dwCount;i++) + { + /* Calculate size */ + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directory */ + iSizeFormat = -14; + _tcscpy(szSize, _T("")); + } + else + { + /* File */ + iSizeFormat = 14; + u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh; + u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow; + ConvertULargeInteger(u64FileSize, szSize, 20, lpFlags->bTSeperator); + } + + /* Calculate short name */ + szShortName[0] = _T('\0'); + if (lpFlags->bShortName) + _stprintf(szShortName, _T(" %-12s"), ptrFiles[i]->cAlternateFileName); + + /* Format date and time */ + DirPrintFileDateTime(szDate, szTime, ptrFiles[i], lpFlags); + + /* Print the line */ + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%10s %-8s %*s%s %s\n"), + szDate, + szTime, + iSizeFormat, + szSize, + szShortName, + ptrFiles[i]->cFileName) == 1) + return ; + } + else + ConOutPrintf(_T("%10s %-8s %*s%s %s\n"), + szDate, + szTime, + iSizeFormat, + szSize, + szShortName, + ptrFiles[i]->cFileName); + } +} + + +/* + * DirPrintWideList + * + * The function that prints in wide list + */ +static VOID +DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR *szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + SHORT iScreenWidth; + USHORT iColumns; + USHORT iLines; + UINT iLongestName; + TCHAR szTempFname[MAX_PATH]; + DWORD i; + DWORD j; + DWORD temp; + + /* Calculate longest name */ + iLongestName = 1; + for (i = 0; i < dwCount; i++) + { + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directories need 2 additinal characters for brackets */ + if ((_tcslen(ptrFiles[i]->cFileName) + 2) > iLongestName) + iLongestName = _tcslen(ptrFiles[i]->cFileName) + 2; + } + else + { + if (_tcslen(ptrFiles[i]->cFileName) > iLongestName) + iLongestName = _tcslen(ptrFiles[i]->cFileName); + } + } + + /* Count the highest number of columns */ + GetScreenSize(&iScreenWidth, 0); + iColumns = iScreenWidth / iLongestName; + + /* Check if there is enough space for spaces between names */ + if (((iLongestName * iColumns) + iColumns) >= (UINT)iScreenWidth) + iColumns --; + + /* A last check at iColumns to avoid division by zero */ + if (!(iColumns)) + iColumns = 1; + + /* Print Column sorted */ + if (lpFlags->bWideListColSort) + { + /* Calculate the lines that will be printed */ +// iLines = ceil((float)dwCount/(float)iColumns); + iLines = (USHORT)(dwCount / iColumns); + + for (i = 0;i < iLines;i++) + { + for (j = 0; j < iColumns; j++) + { + temp = (j * iLines) + i; + if (temp >= dwCount) + break; + + if (ptrFiles[temp]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _stprintf(szTempFname, _T("[%s]"), ptrFiles[temp]->cFileName); + else + _stprintf(szTempFname, _T("%s"), ptrFiles[temp]->cFileName); + + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1 , szTempFname); + else + ConOutPrintf(_T("%-*s"), iLongestName + 1 , szTempFname); + } + + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("\n")); + else + ConOutPrintf(_T("\n")); + } + } + else + { + /* Print Line sorted */ + for (i = 0; i < dwCount; i++) + { + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _stprintf(szTempFname, _T("[%s]"), ptrFiles[i]->cFileName); + else + _stprintf(szTempFname, _T("%s"), ptrFiles[i]->cFileName); + + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1, szTempFname ); + else + ConOutPrintf(_T("%-*s"), iLongestName + 1, szTempFname ); + + /* + * We print a new line at the end of each column + * except for the case that it is the last item. + */ + if (!((i + 1) % iColumns) && (i < (dwCount - 1))) + { + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("\n")); + else + ConOutPrintf(_T("\n")); + } + } + + /* Add a new line after the last item */ + if(lpFlags->bPause) + ConOutPrintfPaging(FALSE,_T("\n")); + else + ConOutPrintf(_T("\n")); + } +} + + +/* + * DirPrintOldList + * + * The function that prints in old style + */ +static VOID +DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR * szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ +DWORD i; /* An indexer for "for"s */ +TCHAR szName[10]; /* The name of file */ +TCHAR szExt[5]; /* The extension of file */ +TCHAR szDate[30],szTime[30]; /* Used to format time and date */ +TCHAR szSize[30]; /* The size of file */ +int iSizeFormat; /* The format of size field */ +ULARGE_INTEGER u64FileSize; /* The file size */ + + for(i = 0;i < dwCount;i++) + { + /* Broke 8.3 format */ + if (*ptrFiles[i]->cAlternateFileName ) + { + /* If the file is long named then we read the alter name */ + getName( ptrFiles[i]->cAlternateFileName, szName); + _tcscpy(szExt, getExt( ptrFiles[i]->cAlternateFileName)); + } + else + { + /* If the file is not long name we read its original name */ + getName( ptrFiles[i]->cFileName, szName); + _tcscpy(szExt, getExt( ptrFiles[i]->cFileName)); + } + + /* Calculate size */ + if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directory, no size it's a directory*/ + iSizeFormat = -17; + _tcscpy(szSize, _T("")); + } + else + { + /* File */ + iSizeFormat = 17; + u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh; + u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow; + ConvertULargeInteger(u64FileSize, szSize, 20, lpFlags->bTSeperator); + } + + /* Format date and time */ + DirPrintFileDateTime(szDate,szTime,ptrFiles[i],lpFlags); + + /* Print the line */ + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%-8s %-3s %*s %s %s\n"), + szName, /* The file's 8.3 name */ + szExt, /* The file's 8.3 extension */ + iSizeFormat, /* print format for size column */ + szSize, /* The size of file or "" for dirs */ + szDate, /* The date of file/dir */ + szTime) == 1) /* The time of file/dir */ + { + return ; + } + } + else + ConOutPrintf(_T("%-8s %-3s %*s %s %s\n"), + szName, /* The file's 8.3 name */ + szExt, /* The file's 8.3 extension */ + iSizeFormat, /* print format for size column */ + szSize, /* The size of file or "" for dirs */ + szDate, /* The date of file/dir */ + szTime); /* The time of file/dir */ + } +} + +/* + * DirPrintBareList + * + * The function that prints in bare format + */ +static VOID +DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The number of files */ + LPTSTR lpCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + TCHAR szFullName[MAX_PATH]; + DWORD i; + + for (i = 0; i < dwCount; i++) + { + if ((_tcscmp(ptrFiles[i]->cFileName, _T(".")) == 0) || + (_tcscmp(ptrFiles[i]->cFileName, _T("..")) == 0)) + { + /* at bare format we don't print "." and ".." folder */ + continue; + } + if (lpFlags->bRecursive) + { + /* at recursive mode we print full path of file */ + _tcscpy(szFullName, lpCurPath); + _tcscat(szFullName, ptrFiles[i]->cFileName); + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%s\n"), szFullName) == 1) + { + return ; + } + } + else + ConOutPrintf(_T("%s\n"), szFullName); + } + else + { + /* if we are not in recursive mode we print the file names */ + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,_T("%s\n"),ptrFiles[i]->cFileName) == 1) + { + return ; + } + } + else + ConOutPrintf(_T("%s\n"),ptrFiles[i]->cFileName); + } + } +} + + +/* + * DirPrintFiles + * + * The functions that prints the files list + */ +static VOID +DirPrintFiles(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */ + DWORD dwCount, /* [IN] The quantity of files */ + TCHAR *szCurPath, /* [IN] Full path of current directory */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */ +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szTemp[MAX_PATH]; /* A buffer to format the directory header */ + + /* Print directory header */ + _tcscpy(szTemp, szCurPath); + + /* We cut the trailing \ of the full path */ + szTemp[_tcslen(szTemp)-1] = _T('\0'); + + /* Condition to print header: + We are not printing in bare format + and if we are in recursive mode... we must have results */ + if (!(lpFlags->bBareFormat ) && !((lpFlags->bRecursive) && (dwCount <= 0))) + { + LoadString(CMD_ModuleHandle, STRING_DIR_HELP7, szMsg, RC_STRING_MAX_SIZE); + if(lpFlags->bPause) + { + if (ConOutPrintfPaging(FALSE,szMsg, szTemp) == 1) + { + return ; + } + } + else + ConOutPrintf(szMsg, szTemp); + } + + if (lpFlags->bBareFormat) + { + /* Bare format */ + DirPrintBareList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else if(lpFlags->bShortName) + { + /* New list style / Short names */ + DirPrintNewList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else if(lpFlags->bWideListColSort || lpFlags->bWideList) + { + /* Wide list */ + DirPrintWideList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else if (lpFlags->bNewLongList ) + { + /* New list style*/ + DirPrintNewList(ptrFiles, dwCount, szCurPath, lpFlags); + } + else + { + /* If nothing is selected old list is the default */ + DirPrintOldList(ptrFiles, dwCount, szCurPath, lpFlags); + } +} + + + +/* + * CompareFiles + * + * Compares 2 files based on the order criteria + */ +static BOOL +CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of file 1 */ + LPWIN32_FIND_DATA lpFile2, /* [IN] A pointer to WIN32_FIND_DATA of file 2 */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags that we use to list */ +{ + ULARGE_INTEGER u64File1; + ULARGE_INTEGER u64File2; + int i; + long iComp = 0; /* The comparison result */ + + /* Calculate critiries by order given from user */ + for (i = 0;i < lpFlags->stOrderBy.sCriteriaCount;i++) + { + + /* Calculate criteria */ + switch(lpFlags->stOrderBy.eCriteria[i]) + { + case ORDER_SIZE: /* Order by size /o:s */ + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->nFileSizeLow; + u64File1.HighPart = lpFile1->nFileSizeHigh; + u64File2.LowPart = lpFile2->nFileSizeLow; + u64File2.HighPart = lpFile2->nFileSizeHigh; + + /* In case that differnce is too big for a long */ + if (u64File1.QuadPart < u64File2.QuadPart) + iComp = -1; + else if (u64File1.QuadPart > u64File2.QuadPart) + iComp = 1; + else + iComp = 0; + break; + + case ORDER_DIRECTORY: /* Order by directory attribute /o:g */ + iComp = ((lpFile2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)- + (lpFile1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)); + break; + + case ORDER_EXTENSION: /* Order by extension name /o:e */ + iComp = _tcsicmp(getExt(lpFile1->cFileName),getExt(lpFile2->cFileName)); + break; + + case ORDER_NAME: /* Order by filename /o:n */ + iComp = _tcsicmp(lpFile1->cFileName, lpFile2->cFileName); + break; + + case ORDER_TIME: /* Order by file's time /o:t */ + /* We compare files based on the time field selected by /t */ + switch(lpFlags->stTimeField.eTimeField) + { + case TF_CREATIONDATE: + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->ftCreationTime.dwLowDateTime; + u64File1.HighPart = lpFile1->ftCreationTime.dwHighDateTime ; + u64File2.LowPart = lpFile2->ftCreationTime.dwLowDateTime; + u64File2.HighPart = lpFile2->ftCreationTime.dwHighDateTime ; + break; + case TF_LASTACCESSEDDATE : + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->ftLastAccessTime.dwLowDateTime; + u64File1.HighPart = lpFile1->ftLastAccessTime.dwHighDateTime ; + u64File2.LowPart = lpFile2->ftLastAccessTime.dwLowDateTime; + u64File2.HighPart = lpFile2->ftLastAccessTime.dwHighDateTime ; + break; + case TF_MODIFIEDDATE: + /* concat the 32bit integers to a 64bit */ + u64File1.LowPart = lpFile1->ftLastWriteTime.dwLowDateTime; + u64File1.HighPart = lpFile1->ftLastWriteTime.dwHighDateTime ; + u64File2.LowPart = lpFile2->ftLastWriteTime.dwLowDateTime; + u64File2.HighPart = lpFile2->ftLastWriteTime.dwHighDateTime ; + break; + } + + /* In case that differnce is too big for a long */ + if (u64File1.QuadPart < u64File2.QuadPart) + iComp = -1; + else if (u64File1.QuadPart > u64File2.QuadPart) + iComp = 1; + else + iComp = 0; + break; + } + + /* Reverse if desired */ + if (lpFlags->stOrderBy.bCriteriaRev[i]) + iComp *= -1; + + /* If that criteria was enough for distinguishing + the files/dirs,there is no need to calculate the others*/ + if (iComp != 0) break; + } + + /* Translate the value of iComp to boolean */ + if (iComp > 0) + return TRUE; + else + return FALSE; +} + +/* + * QsortFiles + * + * Sort files by the order criterias using quicksort method + */ +static VOID +QsortFiles(LPWIN32_FIND_DATA ptrArray[], /* [IN/OUT] The array with file info pointers */ + int i, /* [IN] The index of first item in array */ + int j, /* [IN] The index to last item in array */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags that we will use to sort */ +{ + LPWIN32_FIND_DATA lpTemp; /* A temporary pointer */ + int First, Last, Temp; + BOOL Way; + + if (i < j) + { + First = i; + Last = j; + Way = TRUE; + while (i != j) + { + if (Way == CompareFiles(ptrArray[i], ptrArray[j], lpFlags)) + { + /* Swap the pointers of the array */ + lpTemp = ptrArray[i]; + ptrArray[i]= ptrArray[j]; + ptrArray[j] = lpTemp; + + /* Swap the indexes for inverting sorting */ + Temp = i; + i = j; + j =Temp; + + Way = !Way; + } + + j += (!Way - Way); + } + + QsortFiles(ptrArray,First, i-1, lpFlags); + QsortFiles(ptrArray,i+1,Last, lpFlags); + } +} + + + +/* + * DirList + * + * The functions that does everything except for printing results + */ +static INT +DirList(LPTSTR szPath, /* [IN] The path that dir starts */ + LPTSTR szFilespec, /* [IN] The type of file that we are looking for */ + LPINT pLine, /* FIXME: Maybe used for paginating */ + LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags of the listing */ +{ + HANDLE hSearch; /* The handle of the search */ + HANDLE hRecSearch; /* The handle for searching recursivly */ + WIN32_FIND_DATA wfdFileInfo; /* The info of file that found */ + LPWIN32_FIND_DATA * ptrFileArray; /* An array of pointers with all the files */ + PDIRFINDLISTNODE ptrStartNode; /* The pointer to the first node */ + PDIRFINDLISTNODE ptrNextNode; /* A pointer used for relatives refernces */ +TCHAR szFullPath[MAX_PATH]; /* The full path that we are listing with trailing \ */ +TCHAR szFullFileSpec[MAX_PATH]; /* The full path with file specs that we ll request\ */ +DWORD dwCount; /* A counter of files found in directory */ +DWORD dwCountFiles; /* Counter for files */ +DWORD dwCountDirs; /* Counter for directories */ +ULARGE_INTEGER u64CountBytes; /* Counter for bytes */ +ULARGE_INTEGER u64Temp; /* A temporary counter */ + + /* Initialize Variables */ + ptrStartNode = NULL; + ptrNextNode = NULL; + dwCount = 0; + dwCountFiles = 0; + dwCountDirs = 0; + u64CountBytes.QuadPart = 0; + + /* Create szFullPath and szFullFileSpec */ + _tcscpy (szFullPath, szPath); + if (szFullPath[_tcslen(szFullPath) - 1] != _T('\\')) + _tcscat (szFullPath, _T("\\")); + _tcscpy (szFullFileSpec, szFullPath); + _tcscat (szFullFileSpec, szFilespec); + + /* Prepare the linked list, first node is allocated */ + ptrStartNode = malloc(sizeof(DIRFINDLISTNODE)); + if (ptrStartNode == NULL) + { +#ifdef _DEBUG + ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrStartNode!\n")); +#endif + return 1; /* Error cannot allocate memory for 1st object */ + } + ptrNextNode = ptrStartNode; + + /* Collect the results for the current folder */ + hSearch = FindFirstFile(szFullFileSpec, &wfdFileInfo); + do + { + if (hSearch != INVALID_HANDLE_VALUE) + { + /* Here we filter all the specified attributes */ + if ((wfdFileInfo.dwFileAttributes & lpFlags->stAttribs.dwAttribMask ) + == (lpFlags->stAttribs.dwAttribMask & lpFlags->stAttribs.dwAttribVal )) + { + ptrNextNode->ptrNext = malloc(sizeof(DIRFINDLISTNODE)); + if (ptrNextNode->ptrNext == NULL) + { +#ifdef _DEBUG + ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrNextNode->ptrNext!\n")); +#endif + while (ptrStartNode) + { + ptrNextNode = ptrStartNode->ptrNext; + free(ptrStartNode); + ptrStartNode = ptrNextNode; + dwCount --; + } + return 1; + } + + /* If malloc fails we go to next file in hope it works, + without braking the linked list! */ + if (ptrNextNode->ptrNext) + { + /* Copy the info of search at linked list */ + memcpy(&ptrNextNode->ptrNext->stFindInfo, + &wfdFileInfo, + sizeof(WIN32_FIND_DATA)); + + /* If lower case is selected do it here */ + if (lpFlags->bLowerCase) + { + _tcslwr(ptrNextNode->ptrNext->stFindInfo.cAlternateFileName); + _tcslwr(ptrNextNode->ptrNext->stFindInfo.cFileName); + } + + /* Continue at next node at linked list */ + ptrNextNode = ptrNextNode->ptrNext; + dwCount ++; + + /* Grab statistics */ + if (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + /* Directory */ + dwCountDirs++; + } + else + { + /* File */ + dwCountFiles++; + u64Temp.HighPart = wfdFileInfo.nFileSizeHigh; + u64Temp.LowPart = wfdFileInfo.nFileSizeLow; + u64CountBytes.QuadPart += u64Temp.QuadPart; + } + } + } + } + }while(FindNextFile(hSearch, &wfdFileInfo)); + FindClose(hSearch); + + /* Terminate list */ + ptrNextNode->ptrNext = NULL; + + /* Calculate and allocate space need for making an array of pointers */ + ptrFileArray = malloc(sizeof(LPWIN32_FIND_DATA) * dwCount); + if (ptrFileArray == NULL) + { +#ifdef _DEBUG + ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrFileArray!\n")); +#endif + while (ptrStartNode) + { + ptrNextNode = ptrStartNode->ptrNext; + free(ptrStartNode); + ptrStartNode = ptrNextNode; + dwCount --; + } + return 1; + } + + /* + * Create an array of pointers from the linked list + * this will be used to sort and print data, rather than the list + */ + ptrNextNode = ptrStartNode; + dwCount = 0; + while (ptrNextNode->ptrNext) + { + *(ptrFileArray + dwCount) = &ptrNextNode->ptrNext->stFindInfo; + ptrNextNode = ptrNextNode->ptrNext; + dwCount++; + } + + /* Sort Data if requested*/ + if (lpFlags->stOrderBy.sCriteriaCount > 0) + QsortFiles(ptrFileArray, 0, dwCount-1,lpFlags); + + /* Print Data */ + DirPrintFiles(ptrFileArray, dwCount, szFullPath, lpFlags); + + /* Free array */ + free(ptrFileArray); + if (CheckCtrlBreak(BREAK_INPUT)) + return 1; + + + /* Add statistics to recursive statistics*/ + recurse_dir_cnt += dwCountDirs; + recurse_file_cnt += dwCountFiles; + recurse_bytes.QuadPart += u64CountBytes.QuadPart; + + /* Do the recursive job if requested + the recursive is be done on ALL(indepent of their attribs) + directoried of the current one.*/ + if (lpFlags->bRecursive) + { + /* The new search is involving any *.* file */ + _tcscpy(szFullFileSpec, szFullPath); + _tcscat(szFullFileSpec, _T("*.*")); + hRecSearch = FindFirstFile (szFullFileSpec, &wfdFileInfo); + do + { + if (hRecSearch != INVALID_HANDLE_VALUE) + { + /* We search for directories other than "." and ".." */ + if ((_tcsicmp(wfdFileInfo.cFileName, _T(".")) != 0) && + (_tcsicmp(wfdFileInfo.cFileName, _T("..")) != 0 ) && + (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + /* Concat the path and the directory to do recursive */ + _tcscpy(szFullFileSpec, szFullPath); + _tcscat(szFullFileSpec, wfdFileInfo.cFileName); + /* We do the same for tha folder */ + if (DirList(szFullFileSpec, szFilespec, pLine,lpFlags) != 0) + { + return 1; + } + } + } + }while(FindNextFile(hRecSearch,&wfdFileInfo)); + FindClose(hRecSearch); + } + + /* Free linked list */ + while (ptrStartNode) + { + ptrNextNode = ptrStartNode->ptrNext; + free(ptrStartNode); + ptrStartNode = ptrNextNode; + dwCount --; + } + + return 0; +} + + + +/* + * dir + * + * internal dir command + */ +INT +CommandDir(LPTSTR first, LPTSTR rest) +{ + TCHAR dircmd[256]; /* A variable to store the DIRCMD enviroment variable */ + TCHAR cDrive; + TCHAR szPath[MAX_PATH]; + TCHAR szFilespec[MAX_PATH]; + LPTSTR* params; + INT entries = 0; + INT nLine = 0; + UINT loop = 0; + DIRSWITCHFLAGS stFlags; + + /* Initialize variables */ + cDrive = 0; + recurse_dir_cnt = 0L; + recurse_file_cnt = 0L; + recurse_bytes.QuadPart = 0; + + /* Initialize Switch Flags < Default switches are setted here!> */ + stFlags.b4Digit = TRUE; + stFlags.bBareFormat = FALSE; + stFlags.bLowerCase = FALSE; + stFlags.bNewLongList = TRUE; + stFlags.bPause = FALSE; + stFlags.bRecursive = FALSE; + stFlags.bShortName = FALSE; + stFlags.bTSeperator = TRUE; + stFlags.bUser = FALSE; + stFlags.bWideList = FALSE; + stFlags.bWideListColSort = FALSE; + stFlags.stTimeField.eTimeField = TF_MODIFIEDDATE; + stFlags.stTimeField.bUnSet = FALSE; + stFlags.stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + stFlags.stAttribs.dwAttribVal = 0L; + stFlags.stAttribs.bUnSet = FALSE; + stFlags.stOrderBy.sCriteriaCount = 0; + stFlags.stOrderBy.bUnSet = FALSE; + + nErrorLevel = 0; + + /* read the parameters from the DIRCMD environment variable */ + if (GetEnvironmentVariable (_T("DIRCMD"), dircmd, 256)) + if (!DirReadParam(dircmd, ¶ms, &entries, &stFlags)) + { + nErrorLevel = 1; + return 1; + } + + /* read the parameters */ + if (!DirReadParam(rest, ¶ms, &entries, &stFlags) || CheckCtrlBreak(BREAK_INPUT)) + { + nErrorLevel = 1; + return 1; + } + + /* default to current directory */ + if(entries == 0) { + if(!add_entry(&entries, ¶ms, _T("."))) { + nErrorLevel = 1; + return 1; + } + } + + for(loop = 0; loop < entries; loop++) + { + /* parse the directory info */ + if (DirParsePathspec (params[loop], szPath, szFilespec) || CheckCtrlBreak(BREAK_INPUT)) + { + nErrorLevel = 1; + return 1; + } + + /* + Uncomment this to show the final state of switch flags*/ + #ifdef _DEBUG + { + int i; + ConOutPrintf(_T("Attributes mask/value %x/%x\n"),stFlags.stAttribs.dwAttribMask,stFlags.stAttribs.dwAttribVal ); + ConOutPrintf(_T("(B) Bare format : %i\n"), stFlags.bBareFormat ); + ConOutPrintf(_T("(C) Thousand : %i\n"), stFlags.bTSeperator ); + ConOutPrintf(_T("(W) Wide list : %i\n"), stFlags.bWideList ); + ConOutPrintf(_T("(D) Wide list sort by column : %i\n"), stFlags.bWideListColSort ); + ConOutPrintf(_T("(L) Lowercase : %i\n"), stFlags.bLowerCase ); + ConOutPrintf(_T("(N) New : %i\n"), stFlags.bNewLongList ); + ConOutPrintf(_T("(O) Order : %i\n"), stFlags.stOrderBy.sCriteriaCount ); + for (i =0;i) + * Implemented PUSHD and POPD command. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 20-Jan-1999 (Eric Kohl ) + * Added DIRS command. + */ + +#include +#include "resource.h" + +#ifdef FEATURE_DIRECTORY_STACK + +typedef struct tagDIRENTRY +{ + struct tagDIRENTRY *prev; + struct tagDIRENTRY *next; + LPTSTR pszPath; +} DIRENTRY, *LPDIRENTRY; + + +static INT nStackDepth; +static LPDIRENTRY lpStackTop; +static LPDIRENTRY lpStackBottom; + + +static INT +PushDirectory (LPTSTR pszPath) +{ + LPDIRENTRY lpDir; + + nErrorLevel = 0; + + lpDir = (LPDIRENTRY)malloc (sizeof (DIRENTRY)); + if (!lpDir) + { + error_out_of_memory (); + return -1; + } + + lpDir->prev = NULL; + if (lpStackTop == NULL) + { + lpDir->next = NULL; + lpStackBottom = lpDir; + } + else + { + lpDir->next = lpStackTop; + lpStackTop->prev = lpDir; + } + lpStackTop = lpDir; + + lpDir->pszPath = (LPTSTR)malloc ((_tcslen(pszPath)+1)*sizeof(TCHAR)); + if (!lpDir->pszPath) + { + free (lpDir); + error_out_of_memory (); + return -1; + } + + _tcscpy (lpDir->pszPath, pszPath); + + nStackDepth++; + + return 0; +} + + +static VOID +PopDirectory (VOID) +{ + LPDIRENTRY lpDir; + + nErrorLevel = 0; + + if (nStackDepth == 0) + return; + + lpDir = lpStackTop; + lpStackTop = lpDir->next; + if (lpStackTop != NULL) + lpStackTop->prev = NULL; + else + lpStackBottom = NULL; + + free (lpDir->pszPath); + free (lpDir); + + nStackDepth--; +} + + +static VOID +GetDirectoryStackTop (LPTSTR pszPath) +{ + nErrorLevel = 0; + + if (lpStackTop) + _tcsncpy (pszPath, lpStackTop->pszPath, MAX_PATH); + else + *pszPath = _T('\0'); +} + + +/* + * initialize directory stack + */ +VOID InitDirectoryStack (VOID) +{ + nStackDepth = 0; + lpStackTop = NULL; + lpStackBottom = NULL; +} + + +/* + * destroy directory stack + */ +VOID DestroyDirectoryStack (VOID) +{ + while (nStackDepth) + PopDirectory (); +} + + +INT GetDirectoryStackDepth (VOID) +{ + return nStackDepth; +} + + +/* + * pushd command + */ +INT CommandPushd (LPTSTR first, LPTSTR rest) +{ + TCHAR curPath[MAX_PATH]; + TCHAR newPath[MAX_PATH]; + BOOL bChangePath = FALSE; + + if (!_tcsncmp (rest, _T("/?"), 2)) + { + ConOutResPuts(STRING_DIRSTACK_HELP1); + return 0; + } + + nErrorLevel = 0; + + if (rest[0] != _T('\0')) + { + GetFullPathName (rest, MAX_PATH, newPath, NULL); + bChangePath = IsValidPathName (newPath); + } + + GetCurrentDirectory (MAX_PATH, curPath); + if (PushDirectory (curPath)) + return 0; + + if (bChangePath) + SetCurrentDirectory (newPath); + + return 0; +} + + +/* + * popd command + */ +INT CommandPopd (LPTSTR first, LPTSTR rest) +{ + TCHAR szPath[MAX_PATH]; + + if (!_tcsncmp(rest, _T("/?"), 2)) + { + ConOutResPuts(STRING_DIRSTACK_HELP2); + return 0; + } + + nErrorLevel = 0; + + if (GetDirectoryStackDepth () == 0) + return 0; + + GetDirectoryStackTop (szPath); + PopDirectory (); + + SetCurrentDirectory (szPath); + + return 0; +} + + +/* + * dirs command + */ +INT CommandDirs (LPTSTR first, LPTSTR rest) +{ + LPDIRENTRY lpDir; + + if (!_tcsncmp(rest, _T("/?"), 2)) + { + ConOutResPuts(STRING_DIRSTACK_HELP3); + return 0; + } + + nErrorLevel = 0; + + lpDir = lpStackBottom; + + if (lpDir == NULL) + { + ConOutResPuts(STRING_DIRSTACK_HELP4); + return 0; + } + + while (lpDir != NULL) + { + ConOutPuts (lpDir->pszPath); + + lpDir = lpDir->prev; + } + + return 0; +} + +#endif /* FEATURE_DIRECTORY_STACK */ diff --git a/reactos/base/shell/cmd/echo.c b/reactos/base/shell/cmd/echo.c new file mode 100644 index 00000000000..0019c15f502 --- /dev/null +++ b/reactos/base/shell/cmd/echo.c @@ -0,0 +1,181 @@ +/* + * ECHO.C - internal echo commands. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * Started. + * + * 16 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * Added config.h include + * + * 08-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 13-Jul-2000 (Eric Kohl ) + * Implemented 'echo.' and 'echoerr.'. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +INT CommandEcho (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR p1, p2; + +#ifdef _DEBUG + DebugPrintf (_T("CommandEcho '%s' : '%s'\n"), cmd, param); +#endif + + if (_tcsicmp (cmd, _T("echo.")) == 0) + { + if (param[0] == 0) + ConOutChar (_T('\n')); + else + ConOutPuts (param); + } + else + { + /* skip the first delimiter */ + if (_istspace(*param)) + param++; + + /* skip all spaces for the check of '/?', 'ON' and 'OFF' */ + p1 = param; + while(_istspace(*p1)) + p1++; + + if (!_tcsncmp (p1, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_ECHO_HELP4); + return 0; + } + + if (_tcsnicmp (p1, D_OFF, sizeof(D_OFF)/sizeof(TCHAR) - 1) == 0) + { + p2 = p1 + sizeof(D_OFF)/sizeof(TCHAR) - 1; + while (_istspace(*p2)) + p2++; + if (*p2 == _T('\0')) + { + bEcho = FALSE; + return 0; + } + } + else if (_tcsnicmp (p1, D_ON, sizeof(D_ON)/sizeof(TCHAR) - 1) == 0) + { + p2 = p1 + sizeof(D_ON)/sizeof(TCHAR) - 1; + while (_istspace(*p2)) + p2++; + if (*p2 == _T('\0')) + { + bEcho = TRUE; + return 0; + } + } + if (*p1 != _T('\0')) + { + p1 = param; + while (NULL != (p1 = _tcschr(p1, _T('^')))) + { + memmove(p1, p1 + 1, (_tcslen(p1 + 1) + 1) * sizeof(TCHAR)); + if (*p1) + { + //skip past the char being escaped + p1++; + } + } + ConOutPuts (param); + } + else + { + LoadString(CMD_ModuleHandle, STRING_ECHO_HELP5, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, bEcho ? D_ON : D_OFF); + } + } + + return 0; +} + + +INT CommandEchos (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("CommandEchos '%s' : '%s'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPuts(STRING_ECHO_HELP1); + return 0; + } + + if (*param) + ConOutPrintf (_T("%s"), param); + + return 0; +} + + +INT CommandEchoerr (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("CommandEchoerr '%s' : '%s'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPuts(STRING_ECHO_HELP2); + return 0; + } + + if (_tcsicmp (cmd, _T("echoerr.")) == 0) + { + if (param[0] == 0) + ConErrChar (_T('\n')); + else + ConErrPuts (param); + } + else if (*param) + { + ConErrPuts (param); + } + + return 0; +} + + +INT CommandEchoserr (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("CommandEchoserr '%s' : '%s'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPuts(STRING_ECHO_HELP3); + return 0; + } + + if (*param) + ConOutPrintf (_T("%s"), param); + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/error.c b/reactos/base/shell/cmd/error.c new file mode 100644 index 00000000000..9bbc13b3fb1 --- /dev/null +++ b/reactos/base/shell/cmd/error.c @@ -0,0 +1,179 @@ +/* + * ERROR.C - error reporting functions. + * + * + * History: + * + * 07/12/98 (Rob Lake) + * started + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 24-Jan-1999 (Eric Kohl ) + * Redirection safe! + * + * 02-Feb-1999 (Eric Kohl ) + * Use FormatMessage() for error reports. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szMessage[1024]; + LPTSTR szError; + va_list arg_ptr; + + if (dwErrorCode == ERROR_SUCCESS) + return; + + nErrorLevel = 1; + + if (szFormat) + { + va_start (arg_ptr, szFormat); + _vstprintf (szMessage, szFormat, arg_ptr); + va_end (arg_ptr); + } + + if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&szError, 0, NULL)) + { + ConErrPrintf (_T("%s %s\n"), szError, szMessage); + if(szError) + LocalFree (szError); + return; + } + + /* Fall back just in case the error is not defined */ + if (szFormat) + ConErrPrintf (_T("%s -- %s\n"), szMsg, szMessage); + else + ConErrPrintf (_T("%s\n"), szMsg); +} + +VOID error_parameter_format(TCHAR ch) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_PARAMETERF_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, ch); + nErrorLevel = 1; +} + + +VOID error_invalid_switch (TCHAR ch) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, ch); + nErrorLevel = 1; +} + + +VOID error_too_many_parameters (LPTSTR s) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, s); + nErrorLevel = 1; +} + + +VOID error_path_not_found (VOID) +{ + ConErrResPuts(STRING_ERROR_PATH_NOT_FOUND); + nErrorLevel = 1; +} + + +VOID error_file_not_found (VOID) +{ + ConErrResPuts(STRING_ERROR_FILE_NOT_FOUND); + nErrorLevel = 1; +} + + +VOID error_sfile_not_found (LPTSTR f) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_FILE_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(_T("%s - %s\n"), szMsg, f); + nErrorLevel = 1; +} + + +VOID error_req_param_missing (VOID) +{ + ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); + nErrorLevel = 1; +} + + +VOID error_invalid_drive (VOID) +{ + ConErrResPuts(STRING_ERROR_INVALID_DRIVE); + nErrorLevel = 1; +} + + +VOID error_bad_command (VOID) +{ + ConErrResPuts(STRING_ERROR_BADCOMMAND); + nErrorLevel = 9009; +} + + +VOID error_no_pipe (VOID) +{ + ConErrResPuts(STRING_ERROR_CANNOTPIPE); + nErrorLevel = 1; +} + + +VOID error_out_of_memory (VOID) +{ + ConErrResPuts(STRING_ERROR_OUT_OF_MEMORY); + nErrorLevel = 1; +} + + +VOID error_invalid_parameter_format (LPTSTR s) +{ + ConErrResPuts(STRING_ERROR_INVALID_PARAM_FORMAT); + nErrorLevel = 1; +} + + +VOID error_syntax (LPTSTR s) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_ERROR_ERROR2, szMsg, RC_STRING_MAX_SIZE); + + if (s) + ConErrPrintf(_T("%s - %s\n"), szMsg, s); + else + ConErrPrintf(_T("%s.\n"), szMsg); + + nErrorLevel = 1; +} + + +VOID msg_pause (VOID) +{ + ConOutResPuts(STRING_ERROR_D_PAUSEMSG); +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/filecomp.c b/reactos/base/shell/cmd/filecomp.c new file mode 100644 index 00000000000..5ef710147f5 --- /dev/null +++ b/reactos/base/shell/cmd/filecomp.c @@ -0,0 +1,751 @@ +/* + * FILECOMP.C - handles filename completion. + * + * + * Comments: + * + * 30-Jul-1998 (John P Price ) + * moved from command.c file + * made second TAB display list of filename matches + * made filename be lower case if last character typed is lower case + * + * 25-Jan-1999 (Eric Kohl ) + * Cleanup. Unicode safe! + * + * 30-Apr-2004 (Filip Navara ) + * Make the file listing readable when there is a lot of long names. + * + + * 05-Jul-2004 (Jens Collin ) + * Now expands lfn even when trailing " is omitted. + */ + +#include +#include "cmd.h" + +#ifdef FEATURE_UNIX_FILENAME_COMPLETION + +VOID CompleteFilename (LPTSTR str, UINT charcount) +{ + WIN32_FIND_DATA file; + HANDLE hFile; + INT curplace = 0; + INT start; + INT count; + INT step; + INT c = 0; + BOOL found_dot = FALSE; + BOOL perfectmatch = TRUE; + TCHAR path[MAX_PATH]; + TCHAR fname[MAX_PATH]; + TCHAR maxmatch[MAX_PATH] = _T(""); + TCHAR directory[MAX_PATH]; + LPCOMMAND cmds_ptr; + + /* expand current file name */ + count = charcount - 1; + if (count < 0) + count = 0; + + /* find how many '"'s there is typed already.*/ + step = count; + while (step > 0) + { + if (str[step] == _T('"')) + c++; + step--; + } + /* if c is odd, then user typed " before name, else not.*/ + + /* find front of word */ + if (str[count] == _T('"') || (c % 2)) + { + count--; + while (count > 0 && str[count] != _T('"')) + count--; + } + else + { + while (count > 0 && str[count] != _T(' ')) + count--; + } + + /* if not at beginning, go forward 1 */ + if (str[count] == _T(' ')) + count++; + + start = count; + + if (str[count] == _T('"')) + count++; /* don't increment start */ + + /* extract directory from word */ + _tcscpy (directory, &str[count]); + curplace = _tcslen (directory) - 1; + + if (curplace >= 0 && directory[curplace] == _T('"')) + directory[curplace--] = _T('\0'); + + _tcscpy (path, directory); + + while (curplace >= 0 && directory[curplace] != _T('\\') && + directory[curplace] != _T(':')) + { + directory[curplace] = 0; + curplace--; + } + + /* look for a '.' in the filename */ + for (count = _tcslen (directory); path[count] != _T('\0'); count++) + { + if (path[count] == _T('.')) + { + found_dot = TRUE; + break; + } + } + + if (found_dot) + _tcscat (path, _T("*")); + else + _tcscat (path, _T("*.*")); + + /* current fname */ + curplace = 0; + + hFile = FindFirstFile (path, &file); + if (hFile != INVALID_HANDLE_VALUE) + { + /* find anything */ + do + { + /* ignore "." and ".." */ + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) + continue; + + _tcscpy (fname, file.cFileName); + + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _tcscat (fname, _T("\\")); + + if (!maxmatch[0] && perfectmatch) + { + _tcscpy(maxmatch, fname); + } + else + { + for (count = 0; maxmatch[count] && fname[count]; count++) + { + if (tolower(maxmatch[count]) != tolower(fname[count])) + { + perfectmatch = FALSE; + maxmatch[count] = 0; + break; + } + } + + if (maxmatch[count] == _T('\0') && + fname[count] != _T('\0')) + perfectmatch = FALSE; + } + } + while (FindNextFile (hFile, &file)); + + FindClose (hFile); + + /* only quote if the filename contains spaces */ + if (_tcschr(directory, _T(' ')) || + _tcschr(maxmatch, _T(' '))) + { + str[start] = _T('\"'); + _tcscpy (&str[start+1], directory); + _tcscat (&str[start], maxmatch); + _tcscat (&str[start], _T("\"") ); + } + else + { + _tcscpy (&str[start], directory); + _tcscat (&str[start], maxmatch); + } + + if(!perfectmatch) + { + MessageBeep (-1); + } + } + else + { + /* no match found - search for internal command */ + for (cmds_ptr = cmds; cmds_ptr->name; cmds_ptr++) + { + if (!_tcsnicmp (&str[start], cmds_ptr->name, + _tcslen (&str[start]))) + { + /* return the mach only if it is unique */ + if (_tcsnicmp (&str[start], (cmds_ptr+1)->name, _tcslen (&str[start]))) + _tcscpy (&str[start], cmds_ptr->name); + break; + } + } + + MessageBeep (-1); + } +} + + +/* + * returns 1 if at least one match, else returns 0 + */ + +BOOL ShowCompletionMatches (LPTSTR str, INT charcount) +{ + WIN32_FIND_DATA file; + HANDLE hFile; + BOOL found_dot = FALSE; + INT curplace = 0; + INT start; + UINT count; + TCHAR path[MAX_PATH]; + TCHAR fname[MAX_PATH]; + TCHAR directory[MAX_PATH]; + UINT longestfname = 0; + SHORT screenwidth; + + /* expand current file name */ + count = charcount - 1; + if (count < 0) + count = 0; + + /* find front of word */ + if (str[count] == _T('"')) + { + count--; + while (count > 0 && str[count] != _T('"')) + count--; + } + else + { + while (count > 0 && str[count] != _T(' ')) + count--; + } + + /* if not at beginning, go forward 1 */ + if (str[count] == _T(' ')) + count++; + + start = count; + + if (str[count] == _T('"')) + count++; /* don't increment start */ + + /* extract directory from word */ + _tcscpy (directory, &str[count]); + curplace = _tcslen (directory) - 1; + + if (curplace >= 0 && directory[curplace] == _T('"')) + directory[curplace--] = _T('\0'); + + _tcscpy (path, directory); + + while (curplace >= 0 && + directory[curplace] != _T('\\') && + directory[curplace] != _T(':')) + { + directory[curplace] = 0; + curplace--; + } + + /* look for a . in the filename */ + for (count = _tcslen (directory); path[count] != _T('\0'); count++) + { + if (path[count] == _T('.')) + { + found_dot = TRUE; + break; + } + } + + if (found_dot) + _tcscat (path, _T("*")); + else + _tcscat (path, _T("*.*")); + + /* current fname */ + curplace = 0; + + hFile = FindFirstFile (path, &file); + if (hFile != INVALID_HANDLE_VALUE) + { + /* Get the size of longest filename first. */ + do + { + if (_tcslen(file.cFileName) > longestfname) + { + longestfname = _tcslen(file.cFileName); + /* Directories get extra brackets around them. */ + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + longestfname += 2; + } + } + while (FindNextFile (hFile, &file)); + FindClose (hFile); + + hFile = FindFirstFile (path, &file); + + /* Count the highest number of columns */ + GetScreenSize(&screenwidth, 0); + + /* For counting columns of output */ + count = 0; + + /* Increase by the number of spaces behind file name */ + longestfname += 3; + + /* find anything */ + ConOutChar (_T('\n')); + do + { + /* ignore . and .. */ + if (!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) + continue; + + if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + _stprintf (fname, _T("[%s]"), file.cFileName); + else + _tcscpy (fname, file.cFileName); + + ConOutPrintf (_T("%*s"), - longestfname, fname); + count++; + /* output as much columns as fits on the screen */ + if (count >= (screenwidth / longestfname)) + { + /* print the new line only if we aren't on the + * last column, in this case it wraps anyway */ + if (count * longestfname != (UINT)screenwidth) + ConOutPrintf (_T("\n")); + count = 0; + } + } + while (FindNextFile (hFile, &file)); + + FindClose (hFile); + + if (count) + ConOutChar (_T('\n')); + } + else + { + /* no match found */ + MessageBeep (-1); + return FALSE; + } + + return TRUE; +} +#endif + +#ifdef FEATURE_4NT_FILENAME_COMPLETION + +typedef struct _FileName +{ + TCHAR Name[MAX_PATH]; +} FileName; + +VOID FindPrefixAndSuffix(LPTSTR strIN, LPTSTR szPrefix, LPTSTR szSuffix) +{ + /* String that is to be examined */ + TCHAR str[MAX_PATH]; + /* temp pointers to used to find needed parts */ + TCHAR * szSearch; + TCHAR * szSearch1; + TCHAR * szSearch2; + /* number of quotes in the string */ + INT nQuotes = 0; + /* used in for loops */ + UINT i; + /* Char number to break the string at */ + INT PBreak = 0; + INT SBreak = 0; + /* when phrasing a string, this tells weather + you are inside quotes ot not. */ + BOOL bInside = FALSE; + + szPrefix[0] = _T('\0'); + szSuffix[0] = _T('\0'); + + /* Copy over the string to later be edited */ + _tcscpy(str,strIN); + + /* Count number of " */ + for(i = 0; i < _tcslen(str); i++) + if(str[i] == _T('\"')) + nQuotes++; + + /* Find the prefix and suffix */ + if(nQuotes % 2 && nQuotes >= 1) + { + /* Odd number of quotes. Just start from the last " */ + /* THis is the way MS does it, and is an easy way out */ + szSearch = _tcsrchr(str, _T('\"')); + /* Move to the next char past the " */ + szSearch++; + _tcscpy(szSuffix,szSearch); + /* Find the one closest to end */ + szSearch1 = _tcsrchr(str, _T('\"')); + szSearch2 = _tcsrchr(str, _T('\\')); + if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2)) + szSearch = szSearch2; + else + szSearch = szSearch1; + /* Move one char past */ + szSearch++; + szSearch[0] = _T('\0'); + _tcscpy(szPrefix,str); + return; + + } + + if(!_tcschr(str, _T(' '))) + { + /* No spaces, everything goes to Suffix */ + _tcscpy(szSuffix,str); + /* look for a slash just in case */ + szSearch = _tcsrchr(str, _T('\\')); + if(szSearch) + { + szSearch++; + szSearch[0] = _T('\0'); + _tcscpy(szPrefix,str); + } + else + { + szPrefix[0] = _T('\0'); + } + return; + } + + if(!nQuotes) + { + /* No quotes, and there is a space*/ + /* Take it after the last space */ + szSearch = _tcsrchr(str, _T(' ')); + szSearch++; + _tcscpy(szSuffix,szSearch); + /* Find the closest to the end space or \ */ + _tcscpy(str,strIN); + szSearch1 = _tcsrchr(str, _T(' ')); + szSearch2 = _tcsrchr(str, _T('\\')); + if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2)) + szSearch = szSearch2; + else + szSearch = szSearch1; + szSearch++; + szSearch[0] = _T('\0'); + _tcscpy(szPrefix,str); + return; + } + + /* All else fails and there is a lot of quotes, spaces and | + Then we search through and find the last space or \ that is + not inside a quotes */ + for(i = 0; i < _tcslen(str); i++) + { + if(str[i] == _T('\"')) + bInside = !bInside; + if(str[i] == _T(' ') && !bInside) + SBreak = i; + if((str[i] == _T(' ') || str[i] == _T('\\')) && !bInside) + PBreak = i; + + } + SBreak++; + PBreak++; + _tcscpy(szSuffix,&strIN[SBreak]); + strIN[PBreak] = _T('\0'); + _tcscpy(szPrefix,strIN); + if(szPrefix[_tcslen(szPrefix) - 2] == _T('\"')) + { + /* need to remove the " right before a \ at the end to + allow the next stuff to stay inside one set of quotes + otherwise you would have multiple sets of quotes*/ + _tcscpy(&szPrefix[_tcslen(szPrefix) - 2],_T("\\")); + + } + +} + int __cdecl compare(const void *arg1,const void *arg2) + { + FileName * File1; + FileName * File2; + INT ret; + + File1 = malloc(sizeof(FileName)); + File2 = malloc(sizeof(FileName)); + if(!File1 || !File2) + return 0; + + memcpy(File1,arg1,sizeof(FileName)); + memcpy(File2,arg2,sizeof(FileName)); + + /* ret = _tcsicmp(File1->Name, File2->Name); */ + ret = lstrcmpi(File1->Name, File2->Name); + + free(File1); + free(File2); + return ret; + } + +VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) +{ + /* Length of string before we complete it */ + INT StartLength; + /* Length of string after completed */ + INT EndLength; + /* The number of chars added too it */ + static INT DiffLength = 0; + /* Used to find and assemble the string that is returned */ + TCHAR szBaseWord[MAX_PATH]; + TCHAR szPrefix[MAX_PATH]; + TCHAR szOrginal[MAX_PATH]; + TCHAR szSearchPath[MAX_PATH]; + /* Save the strings used last time, so if they hit tab again */ + static TCHAR LastReturned[MAX_PATH]; + static TCHAR LastSearch[MAX_PATH]; + static TCHAR LastPrefix[MAX_PATH]; + /* Used to search for files */ + HANDLE hFile; + WIN32_FIND_DATA file; + /* List of all the files */ + FileName * FileList = NULL; + /* Number of files */ + INT FileListSize = 0; + /* Used for loops */ + UINT i; + /* Editable string of what was passed in */ + TCHAR str[MAX_PATH]; + /* Keeps track of what element was last selected */ + static INT Sel; + BOOL NeededQuote = FALSE; + BOOL ShowAll = TRUE; + TCHAR * line = strIN; + + strOut[0] = _T('\0'); + + while (_istspace (*line)) + line++; + if(!_tcsnicmp (line, _T("rd "), 3) || !_tcsnicmp (line, _T("cd "), 3)) + ShowAll = FALSE; + + /* Copy the string, str can be edited and orginal should not be */ + _tcscpy(str,strIN); + _tcscpy(szOrginal,strIN); + + /* Look to see if the cusor is not at the end of the string */ + if((cusor + 1) < _tcslen(str)) + str[cusor] = _T('\0'); + + /* Look to see if they hit tab again, if so cut off the diff length */ + if(_tcscmp(str,LastReturned) || !_tcslen(str)) + { + /* We need to know how many chars we added from the start */ + StartLength = _tcslen(str); + + /* no string, we need all files in that directory */ + if(!StartLength) + { + _tcscat(str,_T("*")); + } + + /* Zero it out first */ + szBaseWord[0] = _T('\0'); + szPrefix[0] = _T('\0'); + + /*What comes out of this needs to be: + szBaseWord = path no quotes to the object + szPrefix = what leads up to the filename + no quote at the END of the full name */ + FindPrefixAndSuffix(str,szPrefix,szBaseWord); + /* Strip quotes */ + for(i = 0; i < _tcslen(szBaseWord); ) + { + if(szBaseWord[i] == _T('\"')) + memmove(&szBaseWord[i],&szBaseWord[i + 1], _tcslen(&szBaseWord[i]) * sizeof(TCHAR)); + else + i++; + } + + /* clear it out */ + memset(szSearchPath, 0, sizeof(szSearchPath)); + + /* Start the search for all the files */ + GetFullPathName(szBaseWord, MAX_PATH, szSearchPath, NULL); + if(StartLength > 0) + { + _tcscat(szSearchPath,_T("*")); + } + _tcscpy(LastSearch,szSearchPath); + _tcscpy(LastPrefix,szPrefix); + } + else + { + _tcscpy(szSearchPath, LastSearch); + _tcscpy(szPrefix, LastPrefix); + StartLength = 0; + } + /* search for the files it might be */ + hFile = FindFirstFile (szSearchPath, &file); + + /* aseemble a list of all files names */ + do + { + if(hFile == INVALID_HANDLE_VALUE) + { + /* Assemble the orginal string and return */ + _tcscpy(strOut,szOrginal); + CloseHandle(hFile); + if(FileList != NULL) + free(FileList); + return; + } + + if(!_tcscmp (file.cFileName, _T(".")) || + !_tcscmp (file.cFileName, _T(".."))) + continue; + + /* Don't show files when they are doing 'cd' or 'rd' */ + if(!ShowAll && + file.dwFileAttributes != 0xFFFFFFFF && + !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { + continue; + } + + /* Add the file to the list of files */ + if(FileList == NULL) + { + FileListSize = 1; + FileList = malloc(FileListSize * sizeof(FileName)); + } + else + { + FileListSize++; + FileList = realloc(FileList, FileListSize * sizeof(FileName)); + } + + if(FileList == NULL) + { + /* Assemble the orginal string and return */ + _tcscpy(strOut,szOrginal); + CloseHandle(hFile); + ConOutFormatMessage (GetLastError()); + return; + } + /* Copies the file name into the struct */ + _tcscpy(FileList[FileListSize-1].Name,file.cFileName); + + }while(FindNextFile(hFile,&file)); + + /* Check the size of the list to see if we + found any matches */ + if(FileListSize == 0) + { + _tcscpy(strOut,szOrginal); + CloseHandle(hFile); + if(FileList != NULL) + free(FileList); + return; + + } + /* Sort the files */ + qsort(FileList,FileListSize,sizeof(FileName), compare); + + /* Find the next/previous */ + if(!_tcscmp(szOrginal,LastReturned)) + { + if(bNext) + { + if(FileListSize - 1 == Sel) + Sel = 0; + else + Sel++; + } + else + { + if(!Sel) + Sel = FileListSize - 1; + else + Sel--; + } + } + else + { + Sel = 0; + } + + /* nothing found that matched last time + so return the first thing in the list */ + strOut[0] = _T('\0'); + + /* space in the name */ + if(_tcschr(FileList[Sel].Name, _T(' '))) + { + INT LastSpace; + BOOL bInside; + /* It needs a " at the end */ + NeededQuote = TRUE; + LastSpace = -1; + bInside = FALSE; + /* Find the place to put the " at the start */ + for(i = 0; i < _tcslen(szPrefix); i++) + { + if(szPrefix[i] == _T('\"')) + bInside = !bInside; + if(szPrefix[i] == _T(' ') && !bInside) + LastSpace = i; + + } + /* insert the quoation and move things around */ + if(szPrefix[LastSpace + 1] != _T('\"') && LastSpace != -1) + { + memmove ( &szPrefix[LastSpace+1], &szPrefix[LastSpace], (_tcslen(szPrefix)-LastSpace+1) * sizeof(TCHAR) ); + + if((UINT)(LastSpace + 1) == _tcslen(szPrefix)) + { + _tcscat(szPrefix,_T("\"")); + } + szPrefix[LastSpace + 1] = _T('\"'); + } + else if(LastSpace == -1) + { + _tcscpy(szBaseWord,_T("\"")); + _tcscat(szBaseWord,szPrefix); + _tcscpy(szPrefix,szBaseWord); + + } + } + + _tcscpy(strOut,szPrefix); + _tcscat(strOut,FileList[Sel].Name); + + /* check for odd number of quotes means we need to close them */ + if(!NeededQuote) + { + for(i = 0; i < _tcslen(strOut); i++) + if(strOut[i] == _T('\"')) + NeededQuote = !NeededQuote; + } + + if(szPrefix[_tcslen(szPrefix) - 1] == _T('\"') || NeededQuote) + _tcscat(strOut,_T("\"")); + + _tcscpy(LastReturned,strOut); + EndLength = _tcslen(strOut); + DiffLength = EndLength - StartLength; + CloseHandle(hFile); + if(FileList != NULL) + free(FileList); + +} +#endif diff --git a/reactos/base/shell/cmd/files.txt b/reactos/base/shell/cmd/files.txt new file mode 100644 index 00000000000..0004b4f0b1c --- /dev/null +++ b/reactos/base/shell/cmd/files.txt @@ -0,0 +1,57 @@ +Archive Contents +~~~~~~~~~~~~~~~~ +files.txt This file list +history.txt History of revsions. Not to date. see svn.reactos.com for more info. +license.txt GNU license - applies to all files named here +readme.txt General shell info +readme2.txt Techincal shell info +todo.txt Things that need to be implmented or fixed(including bugs) + +alias.c Alias code +alias.h Alias header file +attrib.c Implements attrib command +batch.c Batch file interpreter +beep.c Implements beep command +call.c Implements call command +chcp.c Implements chcp command +choice.c Implements choice command +cls.c Implements cls command +cmdinput.c Command-line input functions +cmdtable.c Table of available internal commands +cmd.c Main code for command-line interpreter +cmd.h Command header file +color.c Implements color command +console.c Windows console handling code +copy.c Implements copy command +date.c Implements date command +del.c Implements del command +dir.c Directory listing code +dirstack.c Directory stack code (PUSHD and POPD) +echo.c Implements echo command +error.c Error Message Routines +filecomp.c Filename completion functions +for.c Implements for command +free.c Implements free command +goto.c Implements goto command +history.c Command-line history handling +if.c Implements if command +internal.c Internal commands (DIR, RD, CD, etc) +label.c Implements label command +locale.c Locale handling code +memory.c Implements memory command +misc.c Misc. Functions +msgbox.c Implements msgbox command +move.c Implements move command +path.c Implements path command +pause.c Implements pause command +prompt.c Prompt handling functions +redir.c Redirection and piping parsing functions +ren.c Implements rename command +set.c Implements set command +shift.c Implements shift command +time.c Implements time command +timer.c Implements timer command +type.c Implements type command +ver.c Implements ver command +where.c Code to search path for executables +verify.c Implements verify command diff --git a/reactos/base/shell/cmd/for.c b/reactos/base/shell/cmd/for.c new file mode 100644 index 00000000000..b503a57b141 --- /dev/null +++ b/reactos/base/shell/cmd/for.c @@ -0,0 +1,152 @@ +/* + * FOR.C - for internal batch command. + * + * + * History: + * + * 16-Jul-1998 (Hans B Pufal) + * Started. + * + * 16-Jul-1998 (John P Price) + * Seperated commands into individual files. + * + * 19-Jul-1998 (Hans B Pufal) + * Implementation of FOR. + * + * 27-Jul-1998 (John P Price ) + * Added config.h include. + * + * 20-Jan-1999 (Eric Kohl) + * Unicode and redirection safe! + * + * 01-Sep-1999 (Eric Kohl) + * Added help text. + * + * 23-Feb-2001 (Carl Nettelblad ) + * Implemented preservation of echo flag. Some other for related + * code in other files fixed, too. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform FOR command. + * + * First check syntax is correct : FOR %v IN ( ) DO + * v must be alphabetic, must not be empty. + * + * If all is correct build a new bcontext structure which preserves + * the necessary information so that readbatchline can expand + * each the command prototype for each list element. + * + * You might look on a FOR as being a called batch file with one line + * per list element. + */ + +INT cmd_for (LPTSTR cmd, LPTSTR param) +{ + LPBATCH_CONTEXT lpNew; + LPTSTR pp; + TCHAR var; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_for (\'%s\', \'%s\'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_FOR_HELP1); + return 0; + } + + /* Check that first element is % then an alpha char followed by space */ + if ((*param != _T('%')) || !_istalpha (*(param + 1)) || !_istspace (*(param + 2))) + { + LoadString( CMD_ModuleHandle, STRING_FOR_ERROR, szMsg, RC_STRING_MAX_SIZE); + error_syntax (szMsg); + return 1; + } + + param++; + var = *param++; /* Save FOR var name */ + + while (_istspace (*param)) + param++; + + /* Check next element is 'IN' */ + if ((_tcsnicmp (param, _T("in"), 2) != 0) || !_istspace (*(param + 2))) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR1, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + param += 2; + while (_istspace (*param)) + param++; + + /* Folowed by a '(', find also matching ')' */ + if ((*param != _T('(')) || (NULL == (pp = _tcsrchr (param, _T(')'))))) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR2, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + *pp++ = _T('\0'); + param++; /* param now points at null terminated list */ + + while (_istspace (*pp)) + pp++; + + /* Check DO follows */ + if ((_tcsnicmp (pp, _T("do"), 2) != 0) || !_istspace (*(pp + 2))) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR3, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + pp += 2; + while (_istspace (*pp)) + pp++; + + /* Check that command tail is not empty */ + if (*pp == _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_FOR_ERROR4, szMsg, RC_STRING_MAX_SIZE); + error_syntax(szMsg); + return 1; + } + + /* OK all is correct, build a bcontext.... */ + lpNew = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT)); + + lpNew->prev = bc; + bc = lpNew; + + bc->hBatchFile = INVALID_HANDLE_VALUE; + bc->ffind = NULL; + bc->params = BatchParams (_T(""), param); /* Split out list */ + bc->shiftlevel = 0; + bc->forvar = var; + bc->forproto = _tcsdup (pp); + if (bc->prev) + bc->bEcho = bc->prev->bEcho; + else + bc->bEcho = bEcho; + bc->In[0] = _T('\0'); + bc->Out[0] = _T('\0'); + bc->Err[0] = _T('\0'); + + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/free.c b/reactos/base/shell/cmd/free.c new file mode 100644 index 00000000000..f739cd3522f --- /dev/null +++ b/reactos/base/shell/cmd/free.c @@ -0,0 +1,124 @@ +/* + * FREE.C - internal command. + * + * + * History: + * + * 01-Sep-1999 (Eric Kohl) + * Started. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_FREE + +static VOID +PrintDiskInfo (LPTSTR szDisk) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szRootPath[4] = _T("A:\\"); + TCHAR szDrive[2] = _T("A"); + TCHAR szVolume[64]; + TCHAR szSerial[10]; + TCHAR szTotal[40]; + TCHAR szUsed[40]; + TCHAR szFree[40]; + DWORD dwSerial; + ULARGE_INTEGER uliSize; + DWORD dwSecPerCl; + DWORD dwBytPerSec; + DWORD dwFreeCl; + DWORD dwTotCl; + + if (_tcslen (szDisk) < 2 || szDisk[1] != _T(':')) + { + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + return; + } + + szRootPath[0] = szDisk[0]; + szDrive[0] = _totupper (szRootPath[0]); + + if (!GetVolumeInformation (szRootPath, szVolume, 64, &dwSerial, + NULL, NULL, NULL, 0)) + { + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(_T("%s %s:\n"), szMsg, szDrive); + return; + } + + if (szVolume[0] == _T('\0')) + { + + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + _tcscpy (szVolume, szMsg); + } + + _stprintf (szSerial, + _T("%04X-%04X"), + HIWORD(dwSerial), + LOWORD(dwSerial)); + + if (!GetDiskFreeSpace (szRootPath, &dwSecPerCl, + &dwBytPerSec, &dwFreeCl, &dwTotCl)) + { + LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf (_T("%s %s:\n"), szMsg, szDrive); + return; + } + + uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwTotCl; + ConvertULargeInteger (uliSize, szTotal, 40, TRUE); + + uliSize.QuadPart = dwSecPerCl * dwBytPerSec * (dwTotCl - dwFreeCl); + ConvertULargeInteger (uliSize, szUsed, 40, TRUE); + + uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl; + ConvertULargeInteger (uliSize, szFree, 40, TRUE); + + + LoadString(CMD_ModuleHandle, STRING_FREE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, szDrive, szVolume, szSerial, szTotal, szUsed, szFree); +} + + +INT CommandFree (LPTSTR cmd, LPTSTR param) +{ + LPTSTR szParam; + TCHAR szDefPath[MAX_PATH]; + INT argc, i; + LPTSTR *arg; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_FREE_HELP2); + return 0; + } + + if (!param || *param == _T('\0')) + { + GetCurrentDirectory (MAX_PATH, szDefPath); + szDefPath[2] = _T('\0'); + szParam = szDefPath; + } + else + szParam = param; + + arg = split (szParam, &argc, FALSE); + + for (i = 0; i < argc; i++) + PrintDiskInfo (arg[i]); + + freep (arg); + + return 0; +} + +#endif /* INCLUDE_CMD_FREE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/goto.c b/reactos/base/shell/cmd/goto.c new file mode 100644 index 00000000000..4f2cf77d553 --- /dev/null +++ b/reactos/base/shell/cmd/goto.c @@ -0,0 +1,127 @@ +/* + * GOTO.C - goto internal batch command. + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28 Jul 1998 (Hans B Pufal) [HBP_003] + * Terminate label on first space character, use only first 8 chars of + * label string + * + * 24-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 27-Jan-1999 (Eric Kohl ) + * Added help text ("/?"). + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform GOTO command. + * + * Only valid if batch file current. + * + */ + +INT cmd_goto (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR tmp; + LONG lNewPosHigh; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_goto (\'%s\', \'%s\'\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_GOTO_HELP1); + return 0; + } + + /* if not in batch -- error!! */ + if (bc == NULL) + { + return 1; + } + + if (*param == _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ExitBatch(szMsg); + return 1; + } + + /* terminate label at first space char */ + tmp = param+1; + while (!_istcntrl (*tmp) && !_istspace (*tmp) && (*tmp != _T(':'))) + tmp++; + *(tmp) = _T('\0'); + + /* set file pointer to the beginning of the batch file */ + lNewPosHigh = 0; + + /* jump to end of the file */ + if ( _tcsicmp( param, _T(":eof"))==0) + { + SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_END); + return 0; + } + + /* jump to begin of the file */ + SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_BEGIN); + + while (FileGetString (bc->hBatchFile, textline, sizeof(textline) / sizeof(textline[0]))) + { + int pos; + int size; + + /* Strip out any trailing spaces or control chars */ + tmp = textline + _tcslen (textline) - 1; + + + while (_istcntrl (*tmp) || _istspace (*tmp) || (*tmp == _T(':'))) + tmp--; + *(tmp + 1) = _T('\0'); + + /* Then leading spaces... */ + tmp = textline; + while (_istspace (*tmp)) + tmp++; + + /* All space after leading space terminate the string */ + size = _tcslen(tmp) -1; + pos=0; + while (tmp+pos < tmp+size) + { + if (_istspace(tmp[pos])) + tmp[pos]=_T('\0'); + pos++; + } + + /* use whole label name */ + if ((*tmp == _T(':')) && (_tcsicmp (++tmp, param) == 0)) + return 0; + } + + LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, param); + ExitBatch(NULL); + return 1; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/history.c b/reactos/base/shell/cmd/history.c new file mode 100644 index 00000000000..aae395d0d8a --- /dev/null +++ b/reactos/base/shell/cmd/history.c @@ -0,0 +1,486 @@ +/* + * HISTORY.C - command line history. + * + * + * History: + * + * 14/01/95 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 25-Jan-1999 (Eric Kohl ) + * Cleanup! + * Unicode and redirection safe! + * + * 25-Jan-1999 (Paolo Pantaleo ) + * Added lots of comments (beginning studying the source) + * Added command.com's F3 support (see cmdinput.c) + * + */ + + + +/* + * HISTORY.C - command line history. Second version + * + * + * History: + * + * 06/12/99 (Paolo Pantaleo ) + * started. + * + */ + +#include + +#ifdef FEATURE_HISTORY + +typedef struct tagHISTORY +{ + struct tagHISTORY *prev; + struct tagHISTORY *next; + LPTSTR string; +} HIST_ENTRY, * LPHIST_ENTRY; + +static INT size, + max_size=100; + + + +static LPHIST_ENTRY Top; +static LPHIST_ENTRY Bottom; + + +static LPHIST_ENTRY curr_ptr=0; + + +VOID InitHistory(VOID); +VOID History_move_to_bottom(VOID); +VOID History (INT dir, LPTSTR commandline); +VOID CleanHistory(VOID); +VOID History_del_current_entry(LPTSTR str); + +/*service functions*/ +static VOID del(LPHIST_ENTRY item); +static VOID add_at_bottom(LPTSTR string); +/*VOID add_before_last(LPTSTR string);*/ +VOID set_size(INT new_size); + + + +INT CommandHistory (LPTSTR cmd, LPTSTR param) +{ + LPTSTR tmp; + INT tmp_int; + LPHIST_ENTRY h_tmp; + TCHAR szBuffer[2048]; + + tmp=_tcschr(param,_T('/')); + + if (tmp) + { + param=tmp; + switch (_totupper(param[1])) + { + case _T('F'):/*delete history*/ + CleanHistory();InitHistory(); + break; + + case _T('R'):/*read history from standard in*/ + //hIn=GetStdHandle (STD_INPUT_HANDLE); + + for(;;) + { + ConInString(szBuffer,sizeof(szBuffer)/sizeof(TCHAR)); + if (*szBuffer!=_T('\0')) + History(0,szBuffer); + else + break; + } + break; + + case _T('A'):/*add an antry*/ + History(0,param+2); + break; + + case _T('S'):/*set history size*/ + if ((tmp_int=_ttoi(param+2))) + set_size(tmp_int); + break; + + default: + return 1; + } + } + else + { + for (h_tmp = Top->prev; h_tmp != Bottom; h_tmp = h_tmp->prev) + ConErrPuts(h_tmp->string); + } + return 0; +} + +VOID set_size(INT new_size) +{ + while (new_sizeprev); + + max_size=new_size; +} + + +VOID InitHistory(VOID) +{ + size=0; + + Top = malloc(sizeof(HIST_ENTRY)); + Bottom = malloc(sizeof(HIST_ENTRY)); + + Top->prev = Bottom; + Top->next = NULL; + Top->string = NULL; + + Bottom->prev = NULL; + Bottom->next = Top; + Bottom->string = NULL; + + curr_ptr=Bottom; +} + + + + +VOID CleanHistory(VOID) +{ + while (Bottom->next!=Top) + del(Bottom->next); + + free(Top); + free(Bottom); +} + + +VOID History_del_current_entry(LPTSTR str) +{ + LPHIST_ENTRY tmp; + + if (size == 0) + return; + + if (curr_ptr == Bottom) + curr_ptr=Bottom->next; + + if (curr_ptr == Top) + curr_ptr=Top->prev; + + + tmp = curr_ptr; + curr_ptr = curr_ptr->prev; + del(tmp); + History(-1, str); +} + + +static +VOID del(LPHIST_ENTRY item) +{ + if (item==NULL || item==Top || item==Bottom) + { +#ifdef _DEBUG + DebugPrintf(_T("del in ") _T(__FILE__) _T(": retrning\n") + _T("item is 0x%08x (Bottom is0x%08x)\n"), + item, Bottom); +#endif + return; + } + + + + /*free string's mem*/ + if (item->string) + free(item->string); + + /*set links in prev and next item*/ + item->next->prev=item->prev; + item->prev->next=item->next; + + free(item); + + size--; +} + + +#if 0 +static +VOID add_before_last(LPTSTR string) +{ + LPHIST_ENTRY tmp,before,after; + + /*delete first entry if maximum number of entries is reached*/ + while(size>=max_size) + del(Top->prev); + + while (_istspace(*string)) + string++; + + if (*string==_T('\0')) + return; + + /*allocte entry and string*/ + tmp=malloc(sizeof(HIST_ENTRY)); + tmp->string=malloc((_tcslen(string)+1)*sizeof(TCHAR)); + _tcscpy(tmp->string,string); + + /*set links*/ + before=Bottom->next; + after=before->next; + + tmp->prev=before; + tmp->next=after; + + after->prev=tmp; + before->next=tmp; + + /*set new size*/ + size++; + + +} +#endif/*0*/ + +static +VOID add_at_bottom(LPTSTR string) +{ + + + LPHIST_ENTRY tmp; + + + /*delete first entry if maximum number of entries is reached*/ + while(size>=max_size) + del(Top->prev); + + while (_istspace(*string)) + string++; + + if (*string==_T('\0')) + return; + + + /*if new entry is the same than the last do not add it*/ + if(size) + if(_tcscmp(string,Bottom->next->string)==0) + return; + + + /*fill bottom with string, it will become Bottom->next*/ + Bottom->string=malloc((_tcslen(string)+1)*sizeof(TCHAR)); + _tcscpy(Bottom->string,string); + + /*save Bottom value*/ + tmp=Bottom; + + + /*create new void Bottom*/ + Bottom=malloc(sizeof(HIST_ENTRY)); + Bottom->next=tmp; + Bottom->prev=NULL; + Bottom->string=NULL; + + tmp->prev=Bottom; + + /*set new size*/ + size++; + +} + + + +VOID History_move_to_bottom(VOID) +{ + curr_ptr=Bottom; + +} + + +VOID History (INT dir, LPTSTR commandline) +{ + + if(dir==0) + { + add_at_bottom(commandline); + curr_ptr=Bottom; + return; + } + + if (size==0) + { + commandline[0]=_T('\0'); + return; + } + + + if(dir<0)/*key up*/ + { + if (curr_ptr->next==Top || curr_ptr==Top) + { +#ifdef WRAP_HISTORY + curr_ptr=Bottom; +#else + curr_ptr=Top; + commandline[0]=_T('\0'); + return; +#endif + } + + + curr_ptr = curr_ptr->next; + if(curr_ptr->string) + _tcscpy(commandline,curr_ptr->string); + + } + + + + + + if(dir>0) + { + + if (curr_ptr->prev==Bottom || curr_ptr==Bottom) + { +#ifdef WRAP_HISTORY + curr_ptr=Top; +#else + curr_ptr=Bottom; + commandline[0]=_T('\0'); + return; +#endif + } + + curr_ptr=curr_ptr->prev; + if(curr_ptr->string) + _tcscpy(commandline,curr_ptr->string); + + } +} + + + + + + +#if 0 + +LPTSTR history = NULL; /*buffer to sotre all the lines*/ +LPTSTR lines[MAXLINES]; /*array of pointers to each line(entry)*/ + /*located in history buffer*/ + +INT curline = 0; /*the last line recalled by user*/ +INT numlines = 0; /*number of entries, included the last*/ + /*empty one*/ + +INT maxpos = 0; /*index of last byte of last entry*/ + + + +VOID History (INT dir, LPTSTR commandline) +{ + + INT count; /*used in for loops*/ + INT length; /*used in the same loops of count*/ + /*both to make room when is full + either history or lines*/ + + /*first time History is called allocate mem*/ + if (!history) + { + history = malloc (history_size * sizeof (TCHAR)); + lines[0] = history; + history[0] = 0; + } + + if (dir > 0) + { + /* next command */ + if (curline < numlines) + { + curline++; + } + + if (curline == numlines) + { + commandline[0] = 0; + } + else + { + _tcscpy (commandline, lines[curline]); + } + } + else if (dir < 0) + { + /* prev command */ + if (curline > 0) + { + curline--; + } + + _tcscpy (commandline, lines[curline]); + } + else + { + /* add to history */ + /* remove oldest string until there's enough room for next one */ + /* strlen (commandline) must be less than history_size! */ + while ((maxpos + (INT)_tcslen (commandline) + 1 > history_size) || (numlines >= MAXLINES)) + { + length = _tcslen (lines[0]) + 1; + + for (count = 0; count < maxpos && count + (lines[1] - lines[0]) < history_size; count++) + { + history[count] = history[count + length]; + } + + maxpos -= length; + + for (count = 0; count <= numlines && count < MAXLINES; count++) + { + lines[count] = lines[count + 1] - length; + } + + numlines--; +#ifdef DEBUG + ConOutPrintf (_T("Reduced size: %ld lines\n"), numlines); + + for (count = 0; count < numlines; count++) + { + ConOutPrintf (_T("%d: %s\n"), count, lines[count]); + } +#endif + } + + /*copy entry in the history bufer*/ + _tcscpy (lines[numlines], commandline); + numlines++; + + /*set last lines[numlines] pointer next the end of last, valid, + just setted entry (the two lines above)*/ + lines[numlines] = lines[numlines - 1] + _tcslen (commandline) + 1; + maxpos += _tcslen (commandline) + 1; + /* last line, empty */ + + curline = numlines; + } + + return; +} + +#endif + +#endif //#if 0 diff --git a/reactos/base/shell/cmd/history.txt b/reactos/base/shell/cmd/history.txt new file mode 100644 index 00000000000..a0cac6f59d1 --- /dev/null +++ b/reactos/base/shell/cmd/history.txt @@ -0,0 +1,367 @@ +FreeDOS Command Line Interface Development History +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +11/11/94 version 0.01 +~~~~~~~~~~~~~~~~~~~~~ +o initial release. + +01/01/95 version 0.10 +~~~~~~~~~~~~~~~~~~~~~ +o removed some scaffolding. +o modified CD. +o added tab file completion. +o added command line history. + +01/15/95 version 0.20 +~~~~~~~~~~~~~~~~~~~~~ +o formatted all existing source modules. +o added prompt support. +o added drive selection. +o added dir command. +o started this development log. + +08/06/95 prerelease of version 0.30 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o reorganized code into separate source modules. +o added batch processing support (thanks to Evan Jeffrey). +o added exec code (thanks to Steffan Kaiser). +o removed environment handling (thanks again to Steffan Kaiser) + + [ 08/08/95 -- Matt Rains ] +o formatted this development log. +o formatted all existing source modules so that they comply with recommended + programming practice. +o added MD command. +o added RD command. +o added VER command. +o replaced CD command. +o modified DIR command. +o DIR now called regardless of other DIR.??? files. this is done because of + exec() problems. + +12/10/95 version 0.30 +~~~~~~~~~~~~~~~~~~~~~ +o used Borland's spawnve to fix exec problem +o fixed CD again so you don't need a space after it +o couple of spelling fixes + +12/14/95 version 0.31 +~~~~~~~~~~~~~~~~~~~~~ +o modified cmdinput.c to work with non-standard screen sizes (see 28.com) +o fixed a bug in history.c that made it not work when you hit the up arrow + on the first line +o fixed DIR to work a little more like MS-DOS's DIR (see internal.c) +o fixed some code in where.c to make things a bit more efficient and nicer + +01/06/96 version 0.40 (never released) +~~~~~~~~~~~~~~~~~~~~~ +o added redirection and piping support!!! (see redir.c and command.c) +o fixed a stupid pointer problem in where.c that was causing LOTS of + problems in the strangest places... +o added day of the week support to prompt.c (oops, that was already supposed + to be there! :) +o fixed and reorganized the EXEC code!!! Thanks to Svante Frey! +o reorganized command.c and internal.c to handle parsing internal commands + more efficiently and consistently. +o changed the behavior of MD, CD, RD to work without spaces (e.g. CD\DOS) +o small changes here and there to make it work with redirection/piping + (e.g. DIR only pauses if you're not doing redirection) + +01/17/96 version 0.50 +~~~~~~~~~~~~~~~~~~~~~ +Version 0.40 was never released because I was home on Christmas vacation, +and I couldn't upload it. By the time I got back to school, I had the +LOADHIGH patch from Svante Frey, so I decided to jump up to 0.50 without any +release of 0.40... - Tim Norman + +o LOADHIGH/LOADFIX/LH support added!!!! Many thanks go to Svante Frey! +o bug fixed in command parsing that didn't handle / switches correctly... +o removed debugging output from history.c + +07/26/96 version 0.60 +~~~~~~~~~~~~~~~~~~~~~ +Lots of internal changes here... Not much added to the interface. + +o Changed internals to use first,rest parameters instead of arrays of params +o Fixed some bugs +o Some other things I don't remember :) + +07/26/96 version 0.61 +~~~~~~~~~~~~~~~~~~~~~ +Bugfixes + +o Added hook to the PATH command +o Fixed CD.. bug + +08/27/96 version 0.70 +~~~~~~~~~~~~~~~~~~~~~ +Finally added Oliver Mueller's ALIAS command! Also numerous bug fixes. + +o Added ALIAS command +o Removed support for - as a switch in LOADHIGH.C +o Bugfixes in BATCH.C. %0 was returning garbage +o Removed lots of unused variables, reducing # of warnings when compiling +o Other miscellaneous code clean-ups +o Changed WHERE.C to use a little less memory + +06/14/97 version 0.71 +~~~~~~~~~~~~~~~~~~~~~ +Lots of bug fixes, plus some additional features. + +o New DIR command. Now more like MS-DOS's DIR. /p supported, /s coming soon +o bug fix in internal.c - parse_firstarg +o Rewrote parser in batch.c (Steffan Kaiser) +o Ctrl-Break checking in various places (Steffan Kaiser) +o Error level setting/checking (%? in batch files) (Steffan Kaiser) +o bug fix in cmdinput.c ("%i" on command-line caused weird behavior) +o bug fix in where.c (first item in path wasn't searched) + +07/12/97 version 0.72 +~~~~~~~~~~~~~~~~~~~~~ +More bug fixes and code cleanup + +o Rewrote cmdinput.c to be more efficient (Marc Desrochers) +o Added insert/overstrike modes (Marc Desrochers) +o Replaced findxy() with pointers into BIOS (maxx, maxy) (Marc Desrochers) +o Fixed bug that disallowed listing of root directories +o Fixed bug that didn't search the first path (again!) + +07/13/97 version 0.72b +~~~~~~~~~~~~~~~~~~~~~~ +Disabled a feature that caused a crash on some machines. + +o Replaced setcursor calls in cmdinput.c with _setcursortype +o Added dir.c to the distribution (was left out in 0.72) + +07/01/98 version 0.73 (Rob Lake) +~~~~~~~~~~~~~~~~~~~~~~ +o New DIR commands supported: /S, /B, /L, /A and /W. + (/R changed to /S). Also /? added. +o Supports DIRCMD in environment. +o Supports turning off commands with hyphen (ex. /-S + turns off recursive listing) +o Changed error messages for DIR and DEL to more MS-DOS'ish +o Moved error messages from DIR.C and DEL.C to COMMAND.H + (more may go there soon) +o Fixed bug that caused dir *.ext/X not to work (no spaces + between filespec and slash) +o Added wildcard support for DEL command +o Added prompt and help switch for DEL command, /P and /? + respectively. +o Added support for /C when envoking the shell +o Added /P support when Kernel loads shell. This means + the shell now is permanent and runs the autoexec.bat + (/E is not implemented) +o Added my name (Rob Lake) to the developer listing +o Changed version routine to print out copyright notice + with no args, and with appropriate switches, warranty + and redistribution notices and developer listing + +07/08/1998 version 0.74 (John P. Price (linux-guru@gcfl.net)) +~~~~~~~~~~~~~~~~~~~~~~~~ +COMMAND.C/COMMAND.H: +o Now sets COMSPEC environment variable +o misc clean up and optimization +o added date, time and type commands +o changed to using spawnl instead of exec. exec does not copy the + environment to the child process! +DIR.C +o removed extra returns; closer to MSDOS +o fixed wide display so that an extra return is not displayed when + there is five filenames in the last line. +ENVIRON.C +o commented out show_environment function. Not used anymore. +INTERAL.C +o removed call to show_environment in set command. +o moved test for syntax before allocating memory in set command. +o misc clean up and optimization. + +o created DATE.C +o created TIME.C +o created TYPE.C + +07/08/1998 version 0.74b (John P. Price (linux-guru@gcfl.net)) +~~~~~~~~~~~~~~~~~~~~~~~~ +COMMAND.C +o fixed call to spawnl so that it would pass command line arguments + correctly. + +07/12/98 version 0.74c (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +Various Files: +o removed redundant use of error message defines and moved + error printing calls to ERROR.C to reduced program size. + +o created MISC.C +o created ERR_HAND.C/H +o created ERROR.C + +07/13/98 version 0.74d (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +INTERNAL.C +o removed most of the commands and placed them in there own file + -- del, ren, set and ver +o created DEL.C, REN.C SET.C and VER.C +o fixed bug that caused del not to delete files with no attributes +o the critical error handler count number of times called, autofails + at 5 calls + + +16 Jul 1998 (Hans B Pufal ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +batch.c + A new version, implements CALL, ECHO, GOT, IF, PAUSE, SHIFT and + BEEP. There is a stub for FOR but that's all. + +cmdtable.c + New file to keep the internal command table. I plan on getting rid + of the table real soon now and replacing it with a dynamic + mechanism. + +command.c + A new (improved ;) version. Conforms closely to MS-DOS specs. + Cleaned up (and fixed) the redirection handler. + +command.h + Version D with changes. Look for the HBP tag. + +redir.c + Modified file, now supports append redirects. + + +16 Jul 1998 (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +Added TRUENAME command. + + +19 Jul 1998 (Hans B Pufal) ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Preserve state of echo flag across batch calls. +o Implementation of FOR command + + +20 Jul 1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug in DATE.C. +o Fixed bug in LH.ASM. +o Separated commands into individual files. + + +28 Jul 1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Added CLS command. +o Put ifdef's around all commands and added include file config.h + Now you can define exact what commands you want to include in + command.com. +o Also added ifdefs for optional features: aliases, command history + and filename completion. +o Added display of available internal commands and options at startup. + + +29 Jul 1998 (Rob Lake rlake@cs.mun.ca) +~~~~~~~~~~~~~~~~~~~~~~ +o changed date.c and time.c, and wrote datefunc.c and timefunc.c to + impliment _dos_getdate, _dos_setdate, _dos_gettime and _dos_settime. + This is the first of many steps to make the shell compatible under + Pacific C. + +30-Jul-1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Changed filename completion so that a second TAB displays a list of + matching filenames! +o made filename be lower case if last character typed is lower case. +o Moved filename completion code to filecomp.c. +o Change ver command to display email address to report bugs, and the + web page address for updates. +o fixed so that it find_which returns NULL if filename is not + executable (does not have .bat, .com, or .exe extension). Before + command would to execute any file with any extension. (opps!) + +30-Jul-1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug where if you typed something, then hit HOME, then tried to + type something else in insert mode, it locked up. +o Changed default insert mode to on. There should be a way to change + this. Maybe options to doskey command. +o Added VERIFY command + +02-Aug-1998 (Hans B Pufal) ) +~~~~~~~~~~~~~~~~~~~~~~ +o batch.c: Fixed bug in ECHO flag restoration at exit from batch file +o command.c: Fixed return value when called with /C option +o Terminate label on first space character, use only first 8 chars of + label string + +04-Aug-1998 (Hans B Pufal) ) +~~~~~~~~~~~~~~~~~~~~~~ +o call.c: added lines to initialize for pointers. This fixed the + lock-up that happened sometimes when calling a batch file from + another batch file. + +07-Aug-1998 (John P Price ) +~~~~~~~~~~~~~~~~~~~~~~ +o Fixed carrage return output to better match MSDOS with echo on or off. + + +07-Dec-1998 ReactOS CMD version 0.0.1 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o First test release. +o Added internal ATTRIB command. + +11-Dec-1998 ReactOS CMD version 0.0.2 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug in ALIAS. CMD crashed when you tried to remove an alias. +o Fixed bug in split(). Added freep(). This fixed the DEL command. +o Improved ATTRIB command. +o Added most help texts. +o Fixed recursive DIR ("dir /s"). +o Fixed DATE and TIME command. Now they accept values when used + without parameter. +o Implemented LABEL command. + +05-Jan-1999 ReactOS CMD version 0.0.3 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Added COLOR command and "/t" option. +o Cursor shows insert/overwrite mode. +o COMSPEC environment variable is set upon startup. +o Started COPY command. +o Started MOVE command. +o Added directory stack (PUSHD and POPD commands). +o Added support for file names or paths that contain spaces + (quoted paths / file names). +o Added recursion to ATTRIB command. +o Added locale support for DIR, DATE, TIME and PROMPT. +o Fixed VERIFY. + +10-Feb-1999 ReactOS CMD version 0.0.4 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o "?" lists all available commands. +o Most commands are unicode and redirection aware now. +o Input-, Output- and Error-Redirections works with most commands. +o ATTRIB and DEL can handle multiple filenames now. +o Fixed handling of environment variables. +o Added CHCP command. +o Fixed keyboard input bug. +o Rewrote DEL and MOVE commands. + +28-Dec-1999 ReactOS CMD version 0.1 (Eric Kohl ) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Cleaned up DIR command. +o Searching for executables in the right order. +o Fixed some little but nasty bugs. +o Added TITLE command. Thanks to Emanuele Aliberti! +o Added "/Q", "/W" and "/Z" options to DEL command. +o Added CHOICE, TIMER, FREE and MEMORY commands. +o Added MSGBOX command (not available under ReactOS). +o Added and fixed missing help texts. +o Fixed bugs in MD and RD that crashed cmd when no directory was specified. +o Improved history support. +o Improved COLOR command. + +09-Apr-2000 ReactOS CMD version 0.1 (EricKohl +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Fixed bug in COPY command. CMD crashed if source file didn't exist. + +13-Jul-2000 ReactOS CMD version 0.1.1 (EricKohl +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +o Implemented 'ECHO.' and 'ECHOERR.' commands. diff --git a/reactos/base/shell/cmd/if.c b/reactos/base/shell/cmd/if.c new file mode 100644 index 00000000000..b040d1c098d --- /dev/null +++ b/reactos/base/shell/cmd/if.c @@ -0,0 +1,213 @@ +/* + * IF.C - if internal batch command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("if /?") and cleaned up. + * + * 21-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 01-Sep-1999 (Eric Kohl ) + * Fixed help text. + * + * 17-Feb-2001 (ea) + * IF DEFINED variable command + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + */ + +#include +#include "resource.h" + + +#define X_EXEC 1 +#define X_EMPTY 0x80 + +INT cmd_if (LPTSTR cmd, LPTSTR param) +{ + INT x_flag = 0; /* when set cause 'then' clause to be executed */ + LPTSTR pp; + +#ifdef _DEBUG + DebugPrintf (_T("cmd_if: (\'%s\', \'%s\')\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_IF_HELP1); + return 0; + } + + /* First check if param string begins with 'not' */ + if (!_tcsnicmp (param, _T("not"), 3) && _istspace (*(param + 3))) + { + x_flag = X_EXEC; /* Remember 'NOT' */ + param += 3; /* Step over 'NOT' */ + while (_istspace (*param)) /* And subsequent spaces */ + param++; + } + + /* Check for 'exist' form */ + if (!_tcsnicmp (param, _T("exist"), 5) && _istspace (*(param + 5))) + { + UINT i; + BOOL bInside = FALSE; + + param += 5; + while (_istspace (*param)) + param++; + + pp = param; + + /* find the whole path to the file */ + for(i = 0; i < _tcslen(param); i++) + { + if(param[i] == _T('\"')) + bInside = !bInside; + if((param[i] == _T(' ')) && !bInside) + { + break; + } + pp++; + } + *pp++ = _T('\0'); + i = 0; + /* remove quotes */ + while(i < _tcslen(param)) + { + if(param[i] == _T('\"')) + memmove(¶m[i],¶m[i + 1], _tcslen(¶m[i]) * sizeof(TCHAR)); + else + i++; + } + + if (*pp) + { + WIN32_FIND_DATA f; + HANDLE hFind; + + hFind = FindFirstFile (param, &f); + x_flag ^= (hFind == INVALID_HANDLE_VALUE) ? 0 : X_EXEC; + if (hFind != INVALID_HANDLE_VALUE) + { + FindClose (hFind); + } + } + else + return 0; + } + else if (!_tcsnicmp (param, _T("defined"), 7) && _istspace (*(param + 7))) + { + /* Check for 'defined' form */ + TCHAR Value [1]; + INT ValueSize = 0; + + param += 7; + /* IF [NOT] DEFINED var COMMAND */ + /* ^ */ + while (_istspace (*param)) + param++; + /* IF [NOT] DEFINED var COMMAND */ + /* ^ */ + pp = param; + while (*pp && !_istspace (*pp)) + pp++; + /* IF [NOT] DEFINED var COMMAND */ + /* ^ */ + if (*pp) + { + *pp++ = _T('\0'); + ValueSize = GetEnvironmentVariable(param, Value, sizeof(Value) / sizeof(Value[0])); + x_flag ^= (0 == ValueSize) + ? 0 + : X_EXEC; + x_flag |= X_EMPTY; + } + else + return 0; + } + else if (!_tcsnicmp (param, _T("errorlevel"), 10) && _istspace (*(param + 10))) + { + /* Check for 'errorlevel' form */ + INT n = 0; + + pp = param + 10; + while (_istspace (*pp)) + pp++; + + while (_istdigit (*pp)) + n = n * 10 + (*pp++ - _T('0')); + + x_flag ^= (nErrorLevel != n) ? 0 : X_EXEC; + + x_flag |= X_EMPTY; /* Syntax error if comd empty */ + } + else + { + BOOL bInQuote = FALSE; + INT p1len; + pp = param; + while ( *pp && ( bInQuote || *pp != _T('=') ) ) + { + if ( *pp == _T('\"') ) + bInQuote = !bInQuote; + ++pp; + } + p1len = pp-param; + /* check for "==" */ + if ( *pp++ != _T('=') || *pp++ != _T('=') ) + { + error_syntax ( NULL ); + return 1; + } + while (_istspace (*pp)) /* Skip subsequent spaces */ + pp++; + + /* are the two sides equal, and does the second end in the same place? */ + if ( !_tcsncmp(param,pp,p1len) && _tcschr(_T(" ("),pp[p1len]) ) + x_flag ^= X_EXEC; + pp += p1len; + + if ( x_flag ) + { + while (*pp && !_istspace (*pp)) /* Find first space, */ + pp++; + x_flag |= X_EMPTY; + } + } + + if (x_flag & X_EMPTY) + { + while (_istspace (*pp)) /* Then skip spaces */ + pp++; + + if (*pp == _T('\0')) /* If nothing left then syntax err */ + { + error_syntax (NULL); + return 1; + } + } + + if (x_flag & X_EXEC) + { + ParseCommandLine (pp); + } + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/internal.c b/reactos/base/shell/cmd/internal.c new file mode 100644 index 00000000000..5c62a9bbd2b --- /dev/null +++ b/reactos/base/shell/cmd/internal.c @@ -0,0 +1,767 @@ +/* + * INTERNAL.C - command.com internal commands. + * + * + * History: + * + * 17/08/94 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source into + * guidelines for recommended programming practice. + * + * cd() + * started. + * + * dir() + * i have added support for file attributes to the DIR() function. the + * routine adds "d" (directory) and "r" (read only) output. files with the + * system attribute have the filename converted to lowercase. files with + * the hidden attribute are not displayed. + * + * i have added support for directorys. now if the directory attribute is + * detected the file size if replaced with the string "". + * + * ver() + * started. + * + * md() + * started. + * + * rd() + * started. + * + * del() + * started. + * + * does not support wildcard selection. + * + * todo: add delete directory support. + * add recursive directory delete support. + * + * ren() + * started. + * + * does not support wildcard selection. + * + * todo: add rename directory support. + * + * a general structure has been used for the cd, rd and md commands. this + * will be better in the long run. it is too hard to maintain such diverse + * functions when you are involved in a group project like this. + * + * 12/14/95 (Tim Norman) + * fixed DIR so that it will stick \*.* if a directory is specified and + * that it will stick on .* if a file with no extension is specified or + * *.* if it ends in a \ + * + * 1/6/96 (Tim Norman) + * added an isatty call to DIR so it won't prompt for keypresses unless + * stdin and stdout are the console. + * + * changed parameters to be mutually consistent to make calling the + * functions easier + * + * rem() + * started. + * + * doskey() + * started. + * + * 01/22/96 (Oliver Mueller) + * error messages are now handled by perror. + * + * 02/05/96 (Tim Norman) + * converted all functions to accept first/rest parameters + * + * 07/26/96 (Tim Norman) + * changed return values to int instead of void + * + * path() started. + * + * 12/23/96 (Aaron Kaufman) + * rewrote dir() to mimic MS-DOS's dir + * + * 01/28/97 (Tim Norman) + * cleaned up Aaron's DIR code + * + * 06/13/97 (Tim Norman) + * moved DIR code to dir.c + * re-implemented Aaron's DIR code + * + * 06/14/97 (Steffan Kaiser) + * ctrl-break handling + * bug fixes + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 03-Dec-1998 (Eric Kohl ) + * Replaced DOS calls by Win32 calls. + * + * 08-Dec-1998 (Eric Kohl ) + * Added help texts ("/?"). + * + * 18-Dec-1998 (Eric Kohl ) + * Added support for quoted arguments (cd "program files"). + * + * 07-Jan-1999 (Eric Kohl ) + * Clean up. + * + * 26-Jan-1999 (Eric Kohl ) + * Replaced remaining CRT io functions by Win32 io functions. + * Unicode safe! + * + * 30-Jan-1999 (Eric Kohl ) + * Added "cd -" feature. Changes to the previous directory. + * + * 15-Mar-1999 (Eric Kohl ) + * Fixed bug in "cd -" feature. If the previous directory was a root + * directory, it was ignored. + * + * 23-Feb-2001 (Carl Nettelblad ) + * Improved chdir/cd command. + * + * 02-Apr-2004 (Magnus Olsen ) + * Remove all hard code string so they can be + * translate to other langues. + * + * 19-jul-2005 (Brandon Turner +#include "resource.h" + +#ifdef INCLUDE_CMD_CHDIR + +static LPTSTR lpLastPath; + + +VOID InitLastPath (VOID) +{ + lpLastPath = NULL; +} + + +VOID FreeLastPath (VOID) +{ + if (lpLastPath) + free (lpLastPath); +} + +/* help functions for getting current path from drive + without changing drive. Return code 0 = ok, 1 = fail. + INT GetRootPath("C:",outbuffer,chater size of outbuffer); + the first param can have any size, if the the two frist + letter are not a drive with : it will get Currentpath on + current drive exacly as GetCurrentDirectory does. + */ + +INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size) +{ + INT retcode = 1; + + if (_tcslen(InPath)>1) + { + if (InPath[1]==_T(':')) + { + INT t=0; + + if ((InPath[0] >= _T('0')) && (InPath[0] <= _T('9'))) + { + t = (InPath[0] - _T('0')) +28; + } + + if ((InPath[0] >= _T('a')) && (InPath[0] <= _T('z'))) + { + t = (InPath[0] - _T('a')) +1; + InPath[0] = t + _T('A') - 1; + } + + if ((InPath[0] >= _T('A')) && (InPath[0] <= _T('Z'))) + { + t = (InPath[0] - _T('A')) +1; + } + + if (_tgetdcwd(t,OutPath,size) != NULL) + { + return 0; + } + } + } + + /* fail */ + if (_tcslen(InPath)>1) + { + if (InPath[1]==_T(':')) + return 1; + } + + /* Get current directory */ + retcode = GetCurrentDirectory(size,OutPath); + if (retcode==0) + return 1; + + return 0; +} + + +BOOL SetRootPath(TCHAR *InPath) +{ + TCHAR oldpath[MAX_PATH]; + TCHAR OutPath[MAX_PATH]; + TCHAR OutPathTemp[MAX_PATH]; + TCHAR OutPathTemp2[MAX_PATH]; + BOOL fail; + + + /* Get The current directory path and save it */ + fail = GetCurrentDirectory(MAX_PATH,oldpath); + if (!fail) + return 1; + + /* Get current drive directory path if C: was only pass down*/ + + if (_tcsncicmp(&InPath[1],_T(":\\"),2)!=0) + { + if (!GetRootPath(InPath,OutPathTemp,MAX_PATH)) + _tcscpy(OutPathTemp,InPath); + } + else + { + _tcscpy(OutPathTemp,InPath); + } + + _tcsupr(OutPathTemp); + /* The use of both of these together will correct the case of a path + where as one alone or GetFullPath will not. Exameple: + c:\windows\SYSTEM32 => C:\WINDOWS\system32 */ + GetFullPathName(OutPathTemp, MAX_PATH, OutPathTemp2, NULL); + GetPathCase(OutPathTemp2, OutPath); + + fail = SetCurrentDirectory(OutPath); + if (!fail) + return 1; + + + + SetCurrentDirectory(OutPath); + GetCurrentDirectory(MAX_PATH,OutPath); + _tchdir(OutPath); + + if (_tcsncicmp(OutPath,oldpath,2)!=0) + SetCurrentDirectory(oldpath); + + return 0; +} + + +/* + * CD / CHDIR + * + */ +INT cmd_chdir (LPTSTR cmd, LPTSTR param) +{ + + WIN32_FIND_DATA f; + HANDLE hFile; + BOOL bChangeDrive = FALSE; + TCHAR szPath[MAX_PATH]; + TCHAR szFinalPath[MAX_PATH]; + TCHAR * tmpPath; + TCHAR szCurrent[MAX_PATH]; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT i; + + + /* Filter out special cases first */ + + /* Print Help */ + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_CD_HELP); + return 0; + } + + /* Set Error Level to Success */ + nErrorLevel = 0; + + /* Input String Contains /D Switch */ + if (!_tcsncicmp(param, _T("/D"), 2)) + { + bChangeDrive = TRUE; + tmpPath = _tcsstr(param,_T(" ")); + if(!tmpPath) + { + /* Didnt find an directories */ + LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + nErrorLevel = 1; + return 1; + } + tmpPath++; + _tcscpy(szPath,tmpPath); + } + else + { + _tcscpy(szPath,param); + } + + /* Print Current Directory on a disk */ + if (_tcslen(szPath) == 2 && szPath[1] == _T(':')) + { + if(GetRootPath(szPath,szCurrent,MAX_PATH)) + { + nErrorLevel = 1; + return 1; + } + ConOutPuts(szCurrent); + return 0; + } + + /* Get Current Directory */ + GetRootPath(_T("."),szCurrent,MAX_PATH); + + /* Remove " */ + i = 0; + while(i < (INT)_tcslen(szPath)) + { + if(szPath[i] == _T('\"')) + memmove(&szPath[i],&szPath[i + 1], _tcslen(&szPath[i]) * sizeof(TCHAR)); + else + i++; + } + + tmpPath = szPath; + while (_istspace (*tmpPath)) + tmpPath++; + _tcscpy(szPath,tmpPath); + + if (szPath[0] == _T('\0')) + { + ConOutPuts(szCurrent); + return 0; + } + + + /* change to full path if relative path was given */ + GetFullPathName(szPath,MAX_PATH,szFinalPath,NULL); + + if(szFinalPath[_tcslen(szFinalPath) - 1] == _T('\\') && _tcslen(szFinalPath) > 3) + szFinalPath[_tcslen(szFinalPath) - 1] = _T('\0'); + + /* Handle Root Directory Alone*/ + if (_tcslen(szFinalPath) == 3 && szFinalPath[1] == _T(':')) + { + if(!SetRootPath(szFinalPath)) + { + /* Change prompt if it is one the same drive or /D */ + if(bChangeDrive || !_tcsncicmp(szFinalPath,szCurrent,1)) + SetCurrentDirectory(szFinalPath); + return 0; + } + /* Didnt find an directories */ + LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + nErrorLevel = 1; + return 1; + + } + + /* Get a list of all the files */ + hFile = FindFirstFile (szFinalPath, &f); + + do + { + if(hFile == INVALID_HANDLE_VALUE) + { + ConErrFormatMessage (GetLastError(), szFinalPath); + nErrorLevel = 1; + return 1; + } + + /* Strip the paths back to the folder they are in */ + for(i = (_tcslen(szFinalPath) - 1); i > -1; i--) + if(szFinalPath[i] != _T('\\')) + szFinalPath[i] = _T('\0'); + else + break; + + _tcscat(szFinalPath,f.cFileName); + + if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) + { + if(!SetRootPath(szFinalPath)) + { + /* Change for /D */ + if(bChangeDrive) + { + _tcsupr(szFinalPath); + GetPathCase(szFinalPath, szPath); + SetCurrentDirectory(szPath); + } + return 0; + } + + } + }while(FindNextFile (hFile, &f)); + + /* Didnt find an directories */ + LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg); + nErrorLevel = 1; + return 1; +} + +#endif + + + +#ifdef INCLUDE_CMD_MKDIR + +/* Helper funtion for mkdir to make directories in a path. +Dont use the api to decrease depence on libs */ +BOOL +MakeFullPath(TCHAR * DirPath) +{ + TCHAR path[MAX_PATH]; + TCHAR *p = DirPath; + INT n; + + if (p[0] && p[1] == _T(':')) + p += 2; + while (*p == _T('\\')) + p++; /* skip drive root */ + while ((p = _tcschr(p, _T('\\'))) != NULL) + { + n = p - DirPath + 1; + memcpy(path, DirPath, n); + path[n] = _T('\0'); + if( !CreateDirectory(path, NULL) && + (GetLastError() != ERROR_ALREADY_EXISTS)) + return FALSE; + p++; + } + if (GetLastError() == ERROR_ALREADY_EXISTS) + SetLastError(ERROR_SUCCESS); + + return TRUE; +} + +/* + * MD / MKDIR + * + */ +INT cmd_mkdir (LPTSTR cmd, LPTSTR param) +{ + LPTSTR dir; /* pointer to the directory to change to */ + LPTSTR place; /* used to search for the \ when no space is used */ + LPTSTR *p = NULL; + INT argc; + nErrorLevel = 0; + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_MKDIR_HELP); + return 0; + } + + + /* check if there is no space between the command and the path */ + if (param[0] == _T('\0')) + { + /* search for the \ or . so that both short & long names will work */ + for (place = cmd; *place; place++) + if (*place == _T('.') || *place == _T('\\')) + break; + + if (*place) + dir = place; + else + /* signal that there are no parameters */ + dir = NULL; + } + else + { + p = split (param, &argc, FALSE); + if (argc > 1) + { + /*JPP 20-Jul-1998 use standard error message */ + error_too_many_parameters (param); + freep (p); + return 1; + } + else + dir = p[0]; + } + + if (!dir) + { + ConErrResPuts (STRING_ERROR_REQ_PARAM_MISSING); + nErrorLevel = 1; + if(p != NULL) + freep (p); + return 1; + } + + /* Add a \ at the end of the path is there isnt on already */ + if (dir[_tcslen (dir) - 1] != _T('\\')) + _tcscat(dir,_T("\\")); + + if (!MakeFullPath(dir)) + { + if(GetLastError() == ERROR_PATH_NOT_FOUND) + { + ConErrResPuts(STRING_MD_ERROR2); + } + else + { + ErrorMessage (GetLastError(), _T("MD")); + } + nErrorLevel = 1; + freep (p); + return 1; + } + + freep (p); + + return 0; +} +#endif + + +#ifdef INCLUDE_CMD_RMDIR +/* + * RD / RMDIR + * + */ +BOOL DeleteFolder(LPTSTR FileName) +{ + TCHAR Base[MAX_PATH]; + TCHAR TempFileName[MAX_PATH]; + HANDLE hFile; + WIN32_FIND_DATA f; + _tcscpy(Base,FileName); + _tcscat(Base,_T("\\*")); + hFile = FindFirstFile(Base, &f); + Base[_tcslen(Base) - 1] = _T('\0'); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!_tcscmp(f.cFileName, _T(".")) || + !_tcscmp(f.cFileName, _T(".."))) + continue; + _tcscpy(TempFileName,Base); + _tcscat(TempFileName,f.cFileName); + + if(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + DeleteFolder(TempFileName); + else + { + SetFileAttributes(TempFileName,FILE_ATTRIBUTE_NORMAL); + if(!DeleteFile(TempFileName)) + return 0; + } + + }while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + return RemoveDirectory(FileName); +} +INT cmd_rmdir (LPTSTR cmd, LPTSTR param) +{ + TCHAR dir[MAX_PATH]; /* pointer to the directory to change to */ + char ch; + INT args; + LPTSTR *arg = NULL; + INT i; + BOOL RD_SUB = FALSE; + BOOL RD_QUIET = FALSE; + HANDLE hFile; + WIN32_FIND_DATA f; + INT res; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szFullPath[MAX_PATH]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_RMDIR_HELP); + return 0; + } + + nErrorLevel = 0; + + arg = split (param, &args, FALSE); + + if (args == 0) + { + /* only command given */ + error_req_param_missing (); + freep (arg); + return 1; + } + + dir[0] = 0; + /* check for options anywhere in command line */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + { + /*found a command, but check to make sure it has something after it*/ + if (_tcslen (arg[i]) == 2) + { + ch = _totupper (arg[i][1]); + if (ch == _T('S')) + { + RD_SUB = TRUE; + } + else if (ch == _T('Q')) + { + RD_QUIET = TRUE; + } + } + } + else + { + /* get the folder name */ + _tcscpy(dir,arg[i]); + } + } + + if (dir[0] == _T('\0')) + { + /* No folder to remove */ + ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); + freep(arg); + return 1; + } + + GetFullPathName(dir,MAX_PATH,szFullPath,NULL); + /* remove trailing \ if any, but ONLY if dir is not the root dir */ + if (_tcslen (szFullPath) >= 2 && szFullPath[_tcslen (szFullPath) - 1] == _T('\\')) + szFullPath[_tcslen(szFullPath) - 1] = _T('\0'); + + if(RD_SUB) + { + /* ask if they want to delete evrything in the folder */ + if (!RD_QUIET) + { + LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szMsg, RC_STRING_MAX_SIZE); + res = FilePromptYNA (szMsg); + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + freep(arg); + nErrorLevel = 1; + return 1; + } + } + + } + else + { + /* check for files in the folder */ + _tcscat(szFullPath,_T("\\*")); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!_tcscmp(f.cFileName,_T(".")) || + !_tcscmp(f.cFileName,_T(".."))) + continue; + ConOutResPuts(STRING_RMDIR_HELP2); + freep(arg); + FindClose (hFile); + nErrorLevel = 1; + return 1; + }while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + /* reovme the \\* */ + szFullPath[_tcslen(szFullPath) - 2] = _T('\0'); + } + + if (!DeleteFolder(szFullPath)) + { + /* Couldnt delete the folder, clean up and print out the error */ + ErrorMessage (GetLastError(), _T("RD")); + freep (arg); + nErrorLevel = 1; + return 1; + } + + freep (arg); + return 0; +} +#endif + + +/* + * set the exitflag to true + * + */ +INT CommandExit (LPTSTR cmd, LPTSTR param) +{ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_EXIT_HELP); + /* Just make sure */ + bExit = FALSE; + /* Dont exit */ + return 0; + } + + if (bc != NULL && _tcsnicmp(param,_T("/b"),2) == 0) + { + param += 2; + while (_istspace (*param)) + param++; + if (_istdigit(*param)) + nErrorLevel = _ttoi(param); + ExitBatch (NULL); + } + + else + bExit = TRUE; + + + return 0; + +} + +#ifdef INCLUDE_CMD_REM +/* + * does nothing + * + */ +INT CommandRem (LPTSTR cmd, LPTSTR param) +{ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_REM_HELP); + } + + return 0; +} +#endif /* INCLUDE_CMD_REM */ + + +INT CommandShowCommands (LPTSTR cmd, LPTSTR param) +{ + PrintCommandList (); + return 0; +} + +INT CommandShowCommandsDetail (LPTSTR cmd, LPTSTR param) +{ + PrintCommandListDetail (); + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/label.c b/reactos/base/shell/cmd/label.c new file mode 100644 index 00000000000..670e0b3deb9 --- /dev/null +++ b/reactos/base/shell/cmd/label.c @@ -0,0 +1,129 @@ +/* + * LABEL.C - label internal command. + * + * + * History: + * + * 10-Dec-1998 (Eric Kohl ) + * Started. + * + * 11-Dec-1998 (Eric Kohl ) + * Finished. + * + * 19-Jan-1998 (Eric Kohl ) + * Unicode ready! + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_LABEL + + +INT cmd_label (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szRootPath[] = _T("A:\\"); + TCHAR szLabel[80]; + TCHAR szOldLabel[80]; + DWORD dwSerialNr; + LPTSTR *arg; + INT args; + + /* set empty label string */ + szLabel[0] = _T('\0'); + + /* print help */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_LABEL_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* get parameters */ + arg = split (param, &args, FALSE); + + if (args > 2) + { + /* too many parameters */ + error_too_many_parameters (arg[args - 1]); + freep (arg); + nErrorLevel = 1; + return 1; + } + + if (args == 0) + { + /* get label of current drive */ + TCHAR szCurPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szCurPath); + szRootPath[0] = szCurPath[0]; + } + else + { + if ((_tcslen (arg[0]) >= 2) && (arg[0][1] == _T(':'))) + { + szRootPath[0] = toupper (*arg[0]); + if (args == 2) + _tcsncpy (szLabel, arg[1], 12); + } + else + { + TCHAR szCurPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szCurPath); + szRootPath[0] = szCurPath[0]; + _tcsncpy (szLabel, arg[0], 12); + } + } + + /* check root path */ + if (!IsValidPathName (szRootPath)) + { + error_invalid_drive (); + freep (arg); + nErrorLevel = 1; + return 1; + } + + GetVolumeInformation(szRootPath, szOldLabel, 80, &dwSerialNr, + NULL, NULL, NULL, 0); + + /* print drive info */ + if (szOldLabel[0] != _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(szRootPath[0]), szOldLabel); + } + else + { + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _totupper(szRootPath[0])); + } + + /* print the volume serial number */ + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP4, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr)); + + if (szLabel[0] == _T('\0')) + { + LoadString(CMD_ModuleHandle, STRING_LABEL_HELP5, szMsg, RC_STRING_MAX_SIZE); + ConOutResPuts(STRING_LABEL_HELP5); + + ConInString(szLabel, 80); + } + + SetVolumeLabel(szRootPath, szLabel); + + freep(arg); + + return 0; +} + +#endif /* INCLUDE_CMD_LABEL */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/license.txt b/reactos/base/shell/cmd/license.txt new file mode 100644 index 00000000000..c4fb365c774 --- /dev/null +++ b/reactos/base/shell/cmd/license.txt @@ -0,0 +1,342 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + diff --git a/reactos/base/shell/cmd/locale.c b/reactos/base/shell/cmd/locale.c new file mode 100644 index 00000000000..fe77f67699e --- /dev/null +++ b/reactos/base/shell/cmd/locale.c @@ -0,0 +1,81 @@ +/* + * LOCALE.C - locale handling. + * + * + * History: + * + * 09-Jan-1999 (Eric Kohl ) + * Started. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode safe! + */ + +#include +#include "resource.h" + + +TCHAR cDateSeparator; +TCHAR cTimeSeparator; +TCHAR cThousandSeparator; +TCHAR cDecimalSeparator; +INT nDateFormat; +INT nTimeFormat; +INT nNumberGroups; + + +VOID InitLocale (VOID) +{ + TCHAR szBuffer[256]; + + /* date settings */ + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDATE, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cDateSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, (LPTSTR)&nDateFormat, sizeof(nDateFormat) / sizeof(TCHAR)); + + /* time settings */ + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIME, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cTimeSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME | LOCALE_RETURN_NUMBER, (LPTSTR)&nTimeFormat, sizeof(nTimeFormat) / sizeof(TCHAR)); + + /* number settings */ + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cThousandSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + cDecimalSeparator = szBuffer[0]; + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SGROUPING, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + nNumberGroups = _ttoi(szBuffer); +#if 0 + /* days of week */ + for (i = 0; i < 7; i++) + { + GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1 + i, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])); + _tcscpy (aszDayNames[(i+1)%7], szBuffer); /* little hack */ + } +#endif +} + + +VOID PrintDate (VOID) +{ + TCHAR szDateDay[32]; + TCHAR szDate[32]; + + GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), szDateDay, sizeof (szDateDay)); + + GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL,szDate, sizeof (szDate)); + ConOutPrintf(_T("%s %s"),szDateDay, szDate); +} + + +VOID PrintTime (VOID) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + SYSTEMTIME t; + GetLocalTime(&t); + + LoadString(CMD_ModuleHandle, STRING_LOCALE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(_T("%s: %02d%c%02d%c%02d%c%02d\n"), szMsg, t.wHour, cTimeSeparator, + t.wMinute , cTimeSeparator, + t.wSecond , cDecimalSeparator, t.wMilliseconds ); +} diff --git a/reactos/base/shell/cmd/main.c b/reactos/base/shell/cmd/main.c new file mode 100644 index 00000000000..85bb80b7542 --- /dev/null +++ b/reactos/base/shell/cmd/main.c @@ -0,0 +1,26 @@ +#include +#include "resource.h" + +#ifdef _UNICODE +extern int _main (void); +#else +extern int _main (int argc, char *argv[]); +#endif + +/* + * main function + */ +#ifdef _UNICODE +int main(void) +#else +int main (int argc, char *argv[]) +#endif +{ +#ifdef _UNICODE + return _main(); +#else + return _main(argc, argv); +#endif +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/memory.c b/reactos/base/shell/cmd/memory.c new file mode 100644 index 00000000000..2a917ffd8d1 --- /dev/null +++ b/reactos/base/shell/cmd/memory.c @@ -0,0 +1,97 @@ +/* + * MEMORY.C - internal command. + * + * + * History: + * + * 01-Sep-1999 (Eric Kohl) + * Started. + * + * 28-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_MEMORY + + +/* + * convert + * + * insert commas into a number + */ +static INT +ConvertDWord (DWORD num, LPTSTR des, INT len, BOOL bSeparator) +{ + TCHAR temp[32]; + INT c = 0; + INT n = 0; + + if (num == 0) + { + des[0] = _T('0'); + des[1] = _T('\0'); + n = 1; + } + else + { + temp[31] = 0; + while (num > 0) + { + if (bSeparator && (((c + 1) % (nNumberGroups + 1)) == 0)) + temp[30 - c++] = cThousandSeparator; + temp[30 - c++] = (TCHAR)(num % 10) + _T('0'); + num /= 10; + } + + for (n = 0; n <= c; n++) + des[n] = temp[31 - c + n]; + } + + return n; +} + + +INT CommandMemory (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + MEMORYSTATUS ms; + TCHAR szMemoryLoad[20]; + TCHAR szTotalPhys[20]; + TCHAR szAvailPhys[20]; + TCHAR szTotalPageFile[20]; + TCHAR szAvailPageFile[20]; + TCHAR szTotalVirtual[20]; + TCHAR szAvailVirtual[20]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_MEMMORY_HELP1); + return 0; + } + + ms.dwLength = sizeof(MEMORYSTATUS); + + GlobalMemoryStatus (&ms); + + ConvertDWord (ms.dwMemoryLoad, szMemoryLoad, 20, FALSE); + ConvertDWord (ms.dwTotalPhys, szTotalPhys, 20, TRUE); + ConvertDWord (ms.dwAvailPhys, szAvailPhys, 20, TRUE); + ConvertDWord (ms.dwTotalPageFile, szTotalPageFile, 20, TRUE); + ConvertDWord (ms.dwAvailPageFile, szAvailPageFile, 20, TRUE); + ConvertDWord (ms.dwTotalVirtual, szTotalVirtual, 20, TRUE); + ConvertDWord (ms.dwAvailVirtual, szAvailVirtual, 20, TRUE); + + LoadString(CMD_ModuleHandle, STRING_MEMMORY_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, + szMemoryLoad, szTotalPhys, szAvailPhys, szTotalPageFile, + szAvailPageFile, szTotalVirtual, szAvailVirtual); + + return 0; +} + +#endif /* INCLUDE_CMD_MEMORY */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/misc.c b/reactos/base/shell/cmd/misc.c new file mode 100644 index 00000000000..38843619a1e --- /dev/null +++ b/reactos/base/shell/cmd/misc.c @@ -0,0 +1,659 @@ +/* + * MISC.C - misc. functions. + * + * + * History: + * + * 07/12/98 (Rob Lake) + * started + * + * 07/13/98 (Rob Lake) + * moved functions in here + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 18-Dec-1998 (Eric Kohl ) + * Changed split() to accept quoted arguments. + * Removed parse_firstarg(). + * + * 23-Jan-1999 (Eric Kohl ) + * Fixed an ugly bug in split(). In rare cases (last character + * of the string is a space) it ignored the NULL character and + * tried to add the following to the argument list. + * + * 28-Jan-1999 (Eric Kohl ) + * FileGetString() seems to be working now. + * + * 06-Nov-1999 (Eric Kohl ) + * Added PagePrompt() and FilePrompt(). + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * get a character out-of-band and honor Ctrl-Break characters + */ +TCHAR cgetchar (VOID) +{ + HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE); + INPUT_RECORD irBuffer; + DWORD dwRead; +/* + do + { + ReadConsoleInput (hInput, &irBuffer, 1, &dwRead); + if ((irBuffer.EventType == KEY_EVENT) && + (irBuffer.Event.KeyEvent.bKeyDown == TRUE)) + { + if ((irBuffer.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) & + (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C')) + bCtrlBreak = TRUE; + + break; + } + } + while (TRUE); +*/ + do + { + ReadConsoleInput (hInput, &irBuffer, 1, &dwRead); + + if (irBuffer.EventType == KEY_EVENT) + { + if (irBuffer.Event.KeyEvent.dwControlKeyState & + (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + { + if (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C') + { +// if (irBuffer.Event.KeyEvent.bKeyDown == TRUE) +// { + bCtrlBreak = TRUE; + break; +// } + } + } + else if ((irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)) + { + ; + } + + else + { + break; + } + } + } + while (TRUE); + +#ifndef _UNICODE + return irBuffer.Event.KeyEvent.uChar.AsciiChar; +#else + return irBuffer.Event.KeyEvent.uChar.UnicodeChar; +#endif /* _UNICODE */ +} + +/* + * Takes a path in and returns it with the correct case of the letters + */ +VOID GetPathCase( TCHAR * Path, TCHAR * OutPath) +{ + INT i = 0; + TCHAR TempPath[MAX_PATH]; + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + _tcscpy(TempPath, _T("")); + _tcscpy(OutPath, _T("")); + + + for(i = 0; i < _tcslen(Path); i++) + { + if(Path[i] != _T('\\')) + { + _tcsncat(TempPath, &Path[i], 1); + if(i != _tcslen(Path) - 1) + continue; + } + /* Handle the base part of the path different. + Because if you put it into findfirstfile, it will + return your current folder */ + if(_tcslen(TempPath) == 2 && TempPath[1] == _T(':')) + { + _tcscat(OutPath, TempPath); + _tcscat(OutPath, _T("\\")); + _tcscat(TempPath, _T("\\")); + } + else + { + hFind = FindFirstFile(TempPath,&FindFileData); + if(hFind == INVALID_HANDLE_VALUE) + { + _tcscpy(OutPath, Path); + return; + } + _tcscat(TempPath, _T("\\")); + _tcscat(OutPath, FindFileData.cFileName); + _tcscat(OutPath, _T("\\")); + CloseHandle(hFind); + } + } +} + +/* + * Check if Ctrl-Break was pressed during the last calls + */ + +BOOL CheckCtrlBreak (INT mode) +{ + static BOOL bLeaveAll = FALSE; /* leave all batch files */ + TCHAR c; + + switch (mode) + { + case BREAK_OUTOFBATCH: + bLeaveAll = 0; + return FALSE; + + case BREAK_BATCHFILE: + if (bLeaveAll) + return TRUE; + + if (!bCtrlBreak) + return FALSE; + + /* we need to be sure the string arrives on the screen! */ + do + ConOutPuts (_T("\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) ")); + while (!_tcschr (_T("YNA\3"), c = _totupper (cgetchar())) || !c); + + ConOutPuts (_T("\r\n")); + + if (c == _T('N')) + return bCtrlBreak = FALSE; /* ignore */ + + /* leave all batch files */ + bLeaveAll = ((c == _T('A')) || (c == _T('\3'))); + break; + + case BREAK_INPUT: + if (!bCtrlBreak) + return FALSE; + break; + } + + /* state processed */ + bCtrlBreak = FALSE; + return TRUE; +} + +/* add new entry for new argument */ +BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry) +{ + LPTSTR q; + LPTSTR *oldarg; + + q = malloc ((_tcslen(entry) + 1) * sizeof (TCHAR)); + if (NULL == q) + { + return FALSE; + } + _tcscpy (q, entry); + + oldarg = *arg; + *arg = realloc (oldarg, (*ac + 2) * sizeof (LPTSTR)); + if (NULL == *arg) + { + *arg = oldarg; + return FALSE; + } + + /* save new entry */ + (*arg)[*ac] = q; + (*arg)[++(*ac)] = NULL; + + return TRUE; +} + +static BOOL expand (LPINT ac, LPTSTR **arg, LPCTSTR pattern) +{ + HANDLE hFind; + WIN32_FIND_DATA FindData; + BOOL ok; + LPCTSTR pathend; + LPTSTR dirpart, fullname; + + pathend = _tcsrchr (pattern, _T('\\')); + if (NULL != pathend) + { + dirpart = malloc((pathend - pattern + 2) * sizeof(TCHAR)); + if (NULL == dirpart) + { + return FALSE; + } + memcpy(dirpart, pattern, pathend - pattern + 1); + dirpart[pathend - pattern + 1] = _T('\0'); + } + else + { + dirpart = NULL; + } + hFind = FindFirstFile (pattern, &FindData); + if (INVALID_HANDLE_VALUE != hFind) + { + do + { + if (NULL != dirpart) + { + fullname = malloc((_tcslen(dirpart) + _tcslen(FindData.cFileName) + 1) * sizeof(TCHAR)); + if (NULL == fullname) + { + ok = FALSE; + } + else + { + _tcscat (_tcscpy (fullname, dirpart), FindData.cFileName); + ok = add_entry(ac, arg, fullname); + free (fullname); + } + } + else + { + ok = add_entry(ac, arg, FindData.cFileName); + } + } while (FindNextFile (hFind, &FindData) && ok); + FindClose (hFind); + } + else + { + ok = add_entry(ac, arg, pattern); + } + + if (NULL != dirpart) + { + free (dirpart); + } + + return ok; +} + +/* + * split - splits a line up into separate arguments, deliminators + * are spaces and slashes ('/'). + */ + +LPTSTR *split (LPTSTR s, LPINT args, BOOL expand_wildcards) +{ + LPTSTR *arg; + LPTSTR start; + LPTSTR q; + INT ac; + INT len; + BOOL bQuoted = FALSE; + + arg = malloc (sizeof (LPTSTR)); + if (!arg) + return NULL; + *arg = NULL; + + ac = 0; + while (*s) + { + /* skip leading spaces */ + while (*s && (_istspace (*s) || _istcntrl (*s))) + ++s; + + /* if quote (") then set bQuoted */ + if (*s == _T('\"')) + { + ++s; + bQuoted = TRUE; + } + + start = s; + + /* the first character can be '/' */ + if (*s == _T('/')) + ++s; + + /* skip to next word delimiter or start of next option */ + if (bQuoted) + { + while (_istprint (*s) && (*s != _T('\"')) && (*s != _T('/'))) + ++s; + } + else + { + while (_istprint (*s) && !_istspace (*s) && (*s != _T('/'))) + ++s; + } + + /* a word was found */ + if (s != start) + { + q = malloc (((len = s - start) + 1) * sizeof (TCHAR)); + if (!q) + { + return NULL; + } + memcpy (q, start, len * sizeof (TCHAR)); + q[len] = _T('\0'); + if (expand_wildcards && _T('/') != *start && + (NULL != _tcschr(q, _T('*')) || NULL != _tcschr(q, _T('?')))) + { + if (! expand(&ac, &arg, q)) + { + free (q); + freep (arg); + return NULL; + } + } + else + { + if (! add_entry(&ac, &arg, q)) + { + free (q); + freep (arg); + return NULL; + } + } + free (q); + } + + /* adjust string pointer if quoted (") */ + if (bQuoted) + { + /* Check to make sure if there is no ending " + * we dont run over the null char */ + if(*s == _T('\0')) + { + break; + } + ++s; + bQuoted = FALSE; + } + } + + *args = ac; + + return arg; +} + + +/* + * freep -- frees memory used for a call to split + * + */ +VOID freep (LPTSTR *p) +{ + LPTSTR *q; + + if (!p) + return; + + q = p; + while (*q) + free(*q++); + + free(p); +} + + +LPTSTR _stpcpy (LPTSTR dest, LPCTSTR src) +{ + _tcscpy (dest, src); + return (dest + _tcslen (src)); +} + + + +/* + * Checks if a path is valid (accessible) + */ + +BOOL IsValidPathName (LPCTSTR pszPath) +{ + TCHAR szOldPath[MAX_PATH]; + BOOL bResult; + + GetCurrentDirectory (MAX_PATH, szOldPath); + bResult = SetCurrentDirectory (pszPath); + + SetCurrentDirectory (szOldPath); + + return bResult; +} + + +/* + * Checks if a file exists (accessible) + */ + +BOOL IsExistingFile (LPCTSTR pszPath) +{ + DWORD attr = GetFileAttributes (pszPath); + return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) ); +} + + +BOOL IsExistingDirectory (LPCTSTR pszPath) +{ + DWORD attr = GetFileAttributes (pszPath); + return (attr != 0xFFFFFFFF && (attr & FILE_ATTRIBUTE_DIRECTORY) ); +} + + +BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength) +{ + LPSTR lpString; + CHAR ch; + DWORD dwRead; + INT len; +#ifdef _UNICODE + lpString = malloc(nBufferLength); +#else + lpString = lpBuffer; +#endif + len = 0; + while ((--nBufferLength > 0) && + ReadFile(hFile, &ch, 1, &dwRead, NULL) && dwRead) + { + lpString[len++] = ch; + if ((ch == _T('\n')) || (ch == _T('\r'))) + { + /* break at new line*/ + break; + } + } + + if (!dwRead && !len) + return FALSE; + + lpString[len++] = _T('\0'); +#ifdef _UNICODE + MultiByteToWideChar(CP_ACP, 0, lpString, len, lpBuffer, len); + free(lpString); +#endif + return TRUE; +} + +INT PagePrompt (VOID) +{ + INPUT_RECORD ir; + + ConOutResPuts(STRING_MISC_HELP1); + + RemoveBreakHandler (); + ConInDisable (); + + do + { + ConInKey (&ir); + } + while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)); + + AddBreakHandler (); + ConInEnable (); + + if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + ((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) && + (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + { + bCtrlBreak = TRUE; + return PROMPT_BREAK; + } + + return PROMPT_YES; +} + + +INT FilePromptYN (LPTSTR szFormat, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szOut[512]; + va_list arg_ptr; +// TCHAR cKey = 0; +// LPTSTR szKeys = _T("yna"); + + TCHAR szIn[10]; + LPTSTR p; + + va_start (arg_ptr, szFormat); + _vstprintf (szOut, szFormat, arg_ptr); + va_end (arg_ptr); + + ConOutPrintf (szFormat); + + /* preliminary fix */ + ConInString (szIn, 10); + ConOutPrintf (_T("\n")); + + _tcsupr (szIn); + for (p = szIn; _istspace (*p); p++) + ; + + LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, szMsg, RC_STRING_MAX_SIZE); + + if (_tcsncmp(p, &szMsg[0], 1) == 0) + return PROMPT_YES; + else if (_tcsncmp(p, &szMsg[1], 1) == 0) + return PROMPT_NO; +#if 0 + else if (*p == _T('\03')) + return PROMPT_BREAK; +#endif + + return PROMPT_NO; + + + /* unfinished sollution */ +#if 0 + RemoveBreakHandler (); + ConInDisable (); + + do + { + ConInKey (&ir); + cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar); + if (_tcschr (szKeys, cKey[0]) == NULL) + cKey = 0; + + + } + while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)); + + AddBreakHandler (); + ConInEnable (); + + if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + ((ir.Event.KeyEvent.wVirtualKeyCode == 'C') && + (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + return PROMPT_BREAK; + + return PROMPT_YES; +#endif +} + + +INT FilePromptYNA (LPTSTR szFormat, ...) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szOut[512]; + va_list arg_ptr; +// TCHAR cKey = 0; +// LPTSTR szKeys = _T("yna"); + + TCHAR szIn[10]; + LPTSTR p; + + va_start (arg_ptr, szFormat); + _vstprintf (szOut, szFormat, arg_ptr); + va_end (arg_ptr); + + ConOutPrintf (szFormat); + + /* preliminary fix */ + ConInString (szIn, 10); + ConOutPrintf (_T("\n")); + + _tcsupr (szIn); + for (p = szIn; _istspace (*p); p++) + ; + + LoadString( CMD_ModuleHandle, STRING_COPY_OPTION, szMsg, RC_STRING_MAX_SIZE); + + if (_tcsncmp(p, &szMsg[0], 1) == 0) + return PROMPT_YES; + else if (_tcsncmp(p, &szMsg[1], 1) == 0) + return PROMPT_NO; + else if (_tcsncmp(p, &szMsg[2], 1) == 0) + return PROMPT_ALL; + +#if 0 + else if (*p == _T('\03')) + return PROMPT_BREAK; +#endif + + return PROMPT_NO; + + +/* unfinished sollution */ +#if 0 + RemoveBreakHandler (); + ConInDisable (); + + do + { + ConInKey (&ir); + cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar); + if (_tcschr (szKeys, cKey[0]) == NULL) + cKey = 0; + } + while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) || + (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL)); + + AddBreakHandler (); + ConInEnable (); + + if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + ((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) && + (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + return PROMPT_BREAK; + + return PROMPT_YES; +#endif +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/move.c b/reactos/base/shell/cmd/move.c new file mode 100644 index 00000000000..fe3e942f81a --- /dev/null +++ b/reactos/base/shell/cmd/move.c @@ -0,0 +1,556 @@ +/* +* MOVE.C - move internal command. +* +* +* History: +* +* 14-Dec-1998 (Eric Kohl ) +* Started. +* +* 18-Jan-1999 (Eric Kohl ) +* Unicode safe! +* Preliminary version!!! +* +* 20-Jan-1999 (Eric Kohl ) +* Redirection safe! +* +* 27-Jan-1999 (Eric Kohl ) +* Added help text ("/?"). +* Added more error checks. +* +* 03-Feb-1999 (Eric Kohl ) +* Added "/N" option. +* +* 30-Apr-2005 (Magnus Olsen) ) +* Remove all hardcode string to En.rc +* +* 24-Jun-2005 (Brandon Turner) ) +* Fixed bug to allow MS style wildcards + code clean up +* added /y and /-y +*/ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_MOVE + +enum +{ + MOVE_NOTHING = 0x001, /* /N */ + MOVE_OVER_YES = 0x002, /* /Y */ + MOVE_OVER_NO = 0x004, /* /-Y */ +}; + +enum +{ /* Move status flags */ + MOVE_SOURCE_IS_DIR = 0x001, + MOVE_SOURCE_IS_FILE = 0x002, + MOVE_DEST_IS_DIR = 0x004, + MOVE_DEST_IS_FILE = 0x008, + MOVE_SOURCE_HAS_WILD = 0x010, /* source has wildcard */ + MOVE_SRC_CURRENT_IS_DIR = 0x020, /* source is file but at the current round we found a directory */ + MOVE_DEST_EXISTS = 0x040, + MOVE_PATHS_ON_DIF_VOL = 0x080 /* source and destination paths are on different volume */ +}; + +static INT MoveOverwrite (LPTSTR fn) +{ + /*ask the user if they want to override*/ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT res; + LoadString(CMD_ModuleHandle, STRING_MOVE_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,fn); + res = FilePromptYNA (_T("")); + return res; +} + +void GetDirectory (LPTSTR wholepath, LPTSTR directory, BOOL CheckExisting) +{ + /* returns only directory part of path with backslash */ + /* TODO: make code unc aware */ + /* Is there a better alternative to this? */ + LPTSTR last; + if (CheckExisting && IsExistingDirectory(wholepath)) + { + _tcscpy(directory, wholepath); + } + else if ((last = _tcsrchr(wholepath,_T('\\'))) != NULL) + { + _tcsncpy(directory, wholepath, last - wholepath + 1); + directory[last - wholepath + 1] = 0; + } + else + { + GetRootPath(wholepath,directory, MAX_PATH); + } +} + + +INT cmd_move (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT argc, i, nFiles; + TCHAR szDestPath[MAX_PATH]; + TCHAR szFullDestPath[MAX_PATH]; + TCHAR szSrcDirPath[MAX_PATH]; + TCHAR szSrcPath[MAX_PATH]; + TCHAR szFullSrcPath[MAX_PATH]; + DWORD dwFlags = 0; + INT nOverwrite = 0; + WIN32_FIND_DATA findBuffer; + HANDLE hFile; + + /* used only when source and destination directories are on different volume*/ + HANDLE hDestFile; + WIN32_FIND_DATA findDestBuffer; + TCHAR szMoveDest[MAX_PATH]; + TCHAR szMoveSrc[MAX_PATH]; + LPTSTR pszDestDirPointer; + LPTSTR pszSrcDirPointer; + INT nDirLevel = 0; + + LPTSTR pszFile; + BOOL OnlyOneFile; + BOOL FoundFile; + BOOL MoveStatus; + DWORD dwMoveFlags = 0; + DWORD dwMoveStatusFlags = 0; + + + if (!_tcsncmp (param, _T("/?"), 2)) + { +#if 0 + ConOutPuts (_T("Moves files and renames files and directories.\n\n" + "To move one or more files:\n" + "MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n" + "\n" + "To rename a directory:\n" + "MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n" + "\n" + " [drive:][path]filename1 Specifies the location and name of the file\n" + " or files you want to move.\n" + " /N Nothing. Don everthing but move files or direcories.\n" + " /Y\n" + " /-Y\n" + "...")); +#else + ConOutResPaging(TRUE,STRING_MOVE_HELP2); +#endif + return 0; + } + + nErrorLevel = 0; + arg = split (param, &argc, FALSE); + nFiles = argc; + + /* read options */ + for (i = 0; i < argc; i++) + { + if (*arg[i] == _T('/')) + { + if (_tcslen(arg[i]) >= 2) + { + switch (_totupper(arg[i][1])) + { + case _T('N'): + dwFlags |= MOVE_NOTHING; + break; + + case _T('Y'): + dwFlags |= MOVE_OVER_YES; + break; + + case _T('-'): + dwFlags |= MOVE_OVER_NO; + break; + } + } + nFiles--; + } + } + + if (nFiles < 2) + { + /* there must be at least two pathspecs */ + error_req_param_missing (); + return 1; + } + + /* check for wildcards in source and destination */ + if (_tcschr (arg[argc - 1], _T('*')) != NULL || _tcschr (arg[argc - 1], _T('?')) != NULL) + { + /* '*'/'?' in dest, this doesnt happen. give folder name instead*/ + error_invalid_parameter_format(arg[argc - 1]); + return 1; + } + if (_tcschr (arg[argc - 2], _T('*')) != NULL || _tcschr (arg[argc - 2], _T('?')) != NULL) + { + dwMoveStatusFlags |= MOVE_SOURCE_HAS_WILD; + } + + + /* get destination */ + GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL); +#ifdef _DEBUG + DebugPrintf (_T("Destination: %s\n"), szDestPath); +#endif + + /* get source folder */ + GetDirectory(arg[argc - 2], szSrcDirPath, 1); + GetFullPathName(szSrcDirPath, MAX_PATH, szSrcPath, &pszFile); + _tcscpy(szSrcDirPath,szSrcPath); + /* we need following check to see if source happens to be directly given directory + and if it is then rip off last directory part so that there won't be any clashes with codes after this point */ + GetFullPathName(arg[argc - 2], MAX_PATH, szSrcPath, &pszFile); + if (_tcscmp(szSrcDirPath,szSrcPath) == 0) + szSrcDirPath[pszFile - szSrcPath] = _T('\0'); +#ifdef _DEBUG + DebugPrintf (_T("Source Folder: %s\n"), szSrcDirPath); +#endif + + hFile = FindFirstFile (arg[argc - 2], &findBuffer); + if (hFile == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), arg[argc - 2]); + freep (arg); + return 1; + + } + + /* check for special cases "." and ".." and if found skip them */ + FoundFile = TRUE; + while(FoundFile && + (_tcscmp(findBuffer.cFileName,_T(".")) == 0 || + _tcscmp(findBuffer.cFileName,_T("..")) == 0)) + FoundFile = FindNextFile (hFile, &findBuffer); + + if (!FoundFile) + { + /* what? we don't have anything to move? */ + error_file_not_found(); + FindClose(hFile); + freep(arg); + return 1; + } + + OnlyOneFile = TRUE; + _tcscpy(szSrcPath,szSrcDirPath); + /*check to see if there is an ending slash, if not add one*/ + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\')) + _tcscat (szSrcPath, _T("\\")); + _tcscat(szSrcPath,findBuffer.cFileName); +#ifdef _DEBUG + DebugPrintf (_T("Source Path: %s\n"), szSrcPath); +#endif + /* check if there can be found files as files have first priority */ + if (IsExistingFile(szSrcPath)) dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE; + else dwMoveStatusFlags |= MOVE_SOURCE_IS_DIR; + while(OnlyOneFile && FindNextFile(hFile,&findBuffer)) + { + _tcscpy(szSrcPath,szSrcDirPath); + if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\')) + _tcscat (szSrcPath, _T("\\")); + _tcscat(szSrcPath,findBuffer.cFileName); + if (IsExistingFile(szSrcPath)) + { + ConOutPrintf(_T("")); + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) OnlyOneFile = FALSE; + else + { /* this has been done this way so that we don't disturb other settings if they have been set before this */ + dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE; + dwMoveStatusFlags &= ~MOVE_SOURCE_IS_DIR; + } + } + } + FindClose(hFile); + +#ifdef _DEBUG + DebugPrintf(_T("Do we have only one file: %s\n"), OnlyOneFile ? _T("TRUE") : _T("FALSE")); +#endif + + /* we have to start again to be sure we don't miss any files or folders*/ + hFile = FindFirstFile (arg[argc - 2], &findBuffer); + if (hFile == INVALID_HANDLE_VALUE) + { + ErrorMessage (GetLastError (), arg[argc - 2]); + freep (arg); + return 1; + + } + + /* check for special cases "." and ".." and if found skip them */ + FoundFile = TRUE; + while(FoundFile && + (_tcscmp(findBuffer.cFileName,_T(".")) == 0 || + _tcscmp(findBuffer.cFileName,_T("..")) == 0)) + FoundFile = FindNextFile (hFile, &findBuffer); + + if (!FoundFile) + { + /* huh? somebody removed files and/or folders which were there */ + error_file_not_found(); + FindClose(hFile); + freep(arg); + return 1; + } + + /* check if source and destination paths are on different volumes */ + if (szSrcPath[0] != szDestPath[0]) + dwMoveStatusFlags |= MOVE_PATHS_ON_DIF_VOL; + + /* move it */ + do + { +#ifdef _DEBUG + DebugPrintf (_T("Found file/directory: %s\n"), findBuffer.cFileName); +#endif + nOverwrite = 1; + dwMoveFlags = 0; + dwMoveStatusFlags &= ~MOVE_DEST_IS_FILE & + ~MOVE_DEST_IS_DIR & + ~MOVE_SRC_CURRENT_IS_DIR & + ~MOVE_DEST_EXISTS; + _tcscpy(szFullSrcPath,szSrcDirPath); + if(szFullSrcPath[_tcslen(szFullSrcPath) - 1] != _T('\\')) + _tcscat (szFullSrcPath, _T("\\")); + _tcscat(szFullSrcPath,findBuffer.cFileName); + _tcscpy(szSrcPath, szFullSrcPath); + + if (IsExistingDirectory(szSrcPath)) + { + /* source is directory */ + + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) + { + dwMoveStatusFlags |= MOVE_SRC_CURRENT_IS_DIR; /* source is file but at the current round we found a directory */ + continue; + } +#ifdef _DEBUG + DebugPrintf (_T("Source is dir: %s\n"), szSrcPath); +#endif + dwMoveFlags = MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + } + + /* if source is file we don't need to do anything special */ + + if (IsExistingDirectory(szDestPath)) + { + /* destination is existing directory */ +#ifdef _DEBUG + DebugPrintf (_T("Destination is directory: %s\n"), szDestPath); +#endif + + dwMoveStatusFlags |= MOVE_DEST_IS_DIR; + + /*build the dest string(accounts for *)*/ + _tcscpy (szFullDestPath, szDestPath); + /*check to see if there is an ending slash, if not add one*/ + if(szFullDestPath[_tcslen(szFullDestPath) - 1] != _T('\\')) + _tcscat (szFullDestPath, _T("\\")); + _tcscat (szFullDestPath, findBuffer.cFileName); + + if (IsExistingFile(szFullDestPath) || IsExistingDirectory(szFullDestPath)) + dwMoveStatusFlags |= MOVE_DEST_EXISTS; + + dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + + } + if (IsExistingFile(szDestPath)) + { + /* destination is a file */ +#ifdef _DEBUG + DebugPrintf (_T("Destination is file: %s\n"), szDestPath); +#endif + + dwMoveStatusFlags |= MOVE_DEST_IS_FILE | MOVE_DEST_EXISTS; + _tcscpy (szFullDestPath, szDestPath); + + dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + + } + +#ifdef _DEBUG + DebugPrintf(_T("Move Status Flags: 0x%X\n"),dwMoveStatusFlags); +#endif + + if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR && + dwMoveStatusFlags & MOVE_DEST_IS_DIR && + dwMoveStatusFlags & MOVE_SOURCE_HAS_WILD) + { + /* We are not allowed to have existing source and destination dir when there is wildcard in source */ + error_syntax(NULL); + FindClose(hFile); + freep(arg); + return 1; + } + + if (!(dwMoveStatusFlags & (MOVE_DEST_IS_FILE | MOVE_DEST_IS_DIR))) + { + /* destination doesn't exist */ + _tcscpy (szFullDestPath, szDestPath); + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) dwMoveStatusFlags |= MOVE_DEST_IS_FILE; + if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) dwMoveStatusFlags |= MOVE_DEST_IS_DIR; + + dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED; + } + + if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE && + dwMoveStatusFlags & MOVE_DEST_IS_FILE && + !OnlyOneFile) + { + /*source has many files but there is only one destination file*/ + error_invalid_parameter_format(arg[argc - 1]); + FindClose(hFile); + freep (arg); + return 1; + } + + /*checks to make sure user wanted/wants the override*/ + if((dwFlags & MOVE_OVER_NO) && + (dwMoveStatusFlags & MOVE_DEST_EXISTS)) + continue; + if(!(dwFlags & MOVE_OVER_YES) && + (dwMoveStatusFlags & MOVE_DEST_EXISTS)) + nOverwrite = MoveOverwrite (szFullDestPath); + if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK) + continue; + if (nOverwrite == PROMPT_ALL) + dwFlags |= MOVE_OVER_YES; + + + ConOutPrintf (_T("%s => %s "), szSrcPath, szFullDestPath); + + /* are we really supposed to do something */ + if (dwFlags & MOVE_NOTHING) + continue; + + /*move the file*/ + if (!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR && + dwMoveStatusFlags & MOVE_PATHS_ON_DIF_VOL)) + /* we aren't moving source folder to different drive */ + MoveStatus = MoveFileEx (szSrcPath, szFullDestPath, dwMoveFlags); + else + { /* we are moving source folder to different drive */ + _tcscpy(szMoveDest, szFullDestPath); + _tcscpy(szMoveSrc, szSrcPath); + DeleteFile(szMoveDest); + MoveStatus = CreateDirectory(szMoveDest, NULL); /* we use default security settings */ + if (MoveStatus) + { + _tcscat(szMoveDest,_T("\\")); + _tcscat(szMoveSrc,_T("\\")); + nDirLevel = 0; + pszDestDirPointer = szMoveDest + _tcslen(szMoveDest); + pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc); + _tcscpy(pszSrcDirPointer,_T("*.*")); + hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer); + if (hDestFile == INVALID_HANDLE_VALUE) + MoveStatus = FALSE; + else + { + BOOL FirstTime = TRUE; + FoundFile = TRUE; + MoveStatus = FALSE; + while(FoundFile) + { + if (FirstTime) + FirstTime = FALSE; + else + FoundFile = FindNextFile (hDestFile, &findDestBuffer); + + if (!FoundFile) + { /* Nothing to do in this folder so we stop working on it */ + FindClose(hDestFile); + (pszSrcDirPointer)--; + (pszDestDirPointer)--; + _tcscpy(pszSrcDirPointer,_T("")); + _tcscpy(pszDestDirPointer,_T("")); + if (nDirLevel > 0) + { + TCHAR szTempPath[MAX_PATH]; + INT nDiff; + + FoundFile = TRUE; /* we need to continue our seek for files */ + nDirLevel--; + RemoveDirectory(szMoveSrc); + GetDirectory(szMoveSrc,szTempPath,0); + nDiff = _tcslen(szMoveSrc) - _tcslen(szTempPath); + pszSrcDirPointer = pszSrcDirPointer - nDiff; + _tcscpy(pszSrcDirPointer,_T("")); + GetDirectory(szMoveDest,szTempPath,0); + nDiff = _tcslen(szMoveDest) - _tcslen(szTempPath); + pszDestDirPointer = pszDestDirPointer - nDiff; + _tcscpy(pszDestDirPointer,_T("")); + if(szMoveSrc[_tcslen(szMoveSrc) - 1] != _T('\\')) + _tcscat (szMoveSrc, _T("\\")); + if(szMoveDest[_tcslen(szMoveDest) - 1] != _T('\\')) + _tcscat (szMoveDest, _T("\\")); + pszDestDirPointer = szMoveDest + _tcslen(szMoveDest); + pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc); + _tcscpy(pszSrcDirPointer,_T("*.*")); + hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer); + if (hDestFile == INVALID_HANDLE_VALUE) + continue; + FirstTime = TRUE; + } + else + { + MoveStatus = TRUE; /* we moved everything so lets tell user about it */ + RemoveDirectory(szMoveSrc); + } + continue; + } + + /* if we find "." or ".." we'll skip them */ + if (_tcscmp(findDestBuffer.cFileName,_T(".")) == 0 || + _tcscmp(findDestBuffer.cFileName,_T("..")) == 0) + continue; + + _tcscpy(pszSrcDirPointer, findDestBuffer.cFileName); + _tcscpy(pszDestDirPointer, findDestBuffer.cFileName); + if (IsExistingFile(szMoveSrc)) + { + FoundFile = CopyFile(szMoveSrc, szMoveDest, FALSE); + if (!FoundFile) continue; + DeleteFile(szMoveSrc); + } + else + { + FindClose(hDestFile); + CreateDirectory(szMoveDest, NULL); + _tcscat(szMoveDest,_T("\\")); + _tcscat(szMoveSrc,_T("\\")); + nDirLevel++; + pszDestDirPointer = szMoveDest + _tcslen(szMoveDest); + pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc); + _tcscpy(pszSrcDirPointer,_T("*.*")); + hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer); + if (hDestFile == INVALID_HANDLE_VALUE) + { + FoundFile = FALSE; + continue; + } + FirstTime = TRUE; + } + } + } + } + } + if (MoveStatus) + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + else + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + + ConOutPrintf(szMsg); + } + while ((!OnlyOneFile || dwMoveStatusFlags & MOVE_SRC_CURRENT_IS_DIR ) && + !(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) && + FindNextFile (hFile, &findBuffer)); + FindClose (hFile); + + freep (arg); + return 0; +} + +#endif /* INCLUDE_CMD_MOVE */ diff --git a/reactos/base/shell/cmd/msgbox.c b/reactos/base/shell/cmd/msgbox.c new file mode 100644 index 00000000000..f512bb7cf0f --- /dev/null +++ b/reactos/base/shell/cmd/msgbox.c @@ -0,0 +1,158 @@ +/* + * MSGBOX.C - msgbox internal command. + * + * clone from 4nt msgbox command + * + * 25 Aug 1999 + * started - Paolo Pantaleo + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_MSGBOX + + +#define U_TYPE_INIT 0 + +//undefine it to allow to omit arguments +//that will be replaced by default ones +#define _SYNTAX_CHECK + + +INT CommandMsgbox (LPTSTR cmd, LPTSTR param) +{ + + //used to parse command line + LPTSTR tmp; + + //used to find window title (used as messagebox title) + //and to find window handle to pass to MessageBox + HWND hWnd; + TCHAR buff[128]; + + //these are MessabeBox() parameters + LPTSTR title, prompt = ""; + UINT uType = U_TYPE_INIT; + + /* set default title to window title */ + GetConsoleTitle(buff, 128); + title = buff; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_MSGBOX_HELP); + return 0; + } + + //yes here things are quite massed up :) + + //skip spaces + while(_istspace(*param)) + param++; + + //search for type of messagebox (ok, okcancel, ...) + if (_tcsnicmp(param, _T("ok "), 3) == 0) + { + uType |= MB_ICONEXCLAMATION | MB_OK; + param += 3; + } + else if (_tcsnicmp(param, _T("okcancel "), 9) == 0) + { + uType |= MB_ICONQUESTION | MB_OKCANCEL; + param += 9; + } + else if (_tcsnicmp(param, _T("yesno "), 6) == 0) + { + uType |= MB_ICONQUESTION | MB_YESNO; + param += 6; + } + else if (_tcsnicmp(param, _T("yesnocancel "), 12) == 0) + { + uType |= MB_ICONQUESTION | MB_YESNOCANCEL; + param += 12; + } + else + { +#ifdef _SYNTAX_CHECK + error_req_param_missing (); + return 1; +#else + uType |= MB_ICONEXCLAMATION | MB_OK; +#endif + } + + + //skip spaces + while(_istspace(*param)) + param++; + +#ifdef _SYNTAX_CHECK + //if reached end of string + //it is an error becuase we do not yet have prompt + if (*param == 0) + { + error_req_param_missing (); + return 1; + } +#endif + + //search for "title" + tmp = param; + + if (*param == '"') + { + tmp = _tcschr(param + 1, '"'); + if (tmp) + { + *tmp = 0; + title = param + 1; + tmp++; + param = tmp; + } + } + + //skip spaces + while(_istspace(*param)) + param++; + +#ifdef _SYNTAX_CHECK + //get prompt + if (*param == 0) + { + error_req_param_missing (); + return 1; + } +#endif + + prompt = param; + + hWnd=GetConsoleWindow (); +// DebugPrintf("FindWindow hWnd = %d\n",hWnd); +// ConErrPrintf("FindWindow hWnd = %d\n",hWnd); + + switch (MessageBox(hWnd, prompt, title, uType)) + { + case IDYES: + case IDOK: + nErrorLevel = 10; + break; + + case IDNO: + nErrorLevel = 11; + break; + + case IDCANCEL: + nErrorLevel = 12; + break; + } + + return 0; +} + +#endif /* INCLUDE_CMD_MSGBOX */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/path.c b/reactos/base/shell/cmd/path.c new file mode 100644 index 00000000000..601863a1dfa --- /dev/null +++ b/reactos/base/shell/cmd/path.c @@ -0,0 +1,91 @@ +/* + * PATH.C - path internal command. + * + * + * History: + * + * 17 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 09-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 18-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 18-Jan-1999 (Eric Kohl ) + * Redirection safe! + * + * 24-Jan-1999 (Eric Kohl ) + * Fixed Win32 environment handling. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_PATH + +/* size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + + +INT cmd_path (LPTSTR cmd, LPTSTR param) +{ + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_PATH_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* if param is empty, display the PATH environment variable */ + if (!param || !*param) + { + DWORD dwBuffer; + LPTSTR pszBuffer; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer == 0) + { + LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, _T("PATH")); + return 0; + } + else if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + } + + ConOutPrintf (_T("PATH=%s\n"), pszBuffer); + free (pszBuffer); + + return 0; + } + + /* skip leading '=' */ + if (*param == _T('=')) + param++; + + /* set PATH environment variable */ + if (!SetEnvironmentVariable (_T("PATH"), param)) + { + nErrorLevel = 1; + return 1; + } + + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/pause.c b/reactos/base/shell/cmd/pause.c new file mode 100644 index 00000000000..20024476d05 --- /dev/null +++ b/reactos/base/shell/cmd/pause.c @@ -0,0 +1,63 @@ +/* + * PAUSE.C - pause internal command. + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Seperated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 18-Jan-1999 (Eric Kohl ) + * Unicode ready! + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_PAUSE + +/* + * Perform PAUSE command. + * + * FREEDOS extension : If parameter is specified use that as the pause + * message. + * + * ?? Extend to include functionality of CHOICE if switch chars + * specified. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +INT cmd_pause (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("cmd_pause: \'%s\' : \'%s\')\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_PAUSE_HELP1); + return 0; + } + + if (*param) + ConOutPrintf (param); + else + msg_pause (); + + cgetchar (); + + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/precomp.h b/reactos/base/shell/cmd/precomp.h new file mode 100644 index 00000000000..3fd7e6b22df --- /dev/null +++ b/reactos/base/shell/cmd/precomp.h @@ -0,0 +1,29 @@ +#ifdef _MSC_VER +#pragma warning ( disable : 4103 ) /* use #pragma pack to change alignment */ +#undef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif//_MSC_VER + +#include +#define WIN32_NO_STATUS +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#define NTOS_MODE_USER +#include + +#include "cmd.h" +#include "config.h" +#include "batch.h" + diff --git a/reactos/base/shell/cmd/prompt.c b/reactos/base/shell/cmd/prompt.c new file mode 100644 index 00000000000..4ef8814a779 --- /dev/null +++ b/reactos/base/shell/cmd/prompt.c @@ -0,0 +1,235 @@ +/* + * PROMPT.C - prompt handling. + * + * + * History: + * + * 14/01/95 (Tim Normal) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * 01/06/96 (Tim Norman) + * added day of the week printing (oops, forgot about that!) + * + * 08/07/96 (Steffan Kaiser) + * small changes for speed + * + * 20-Jul-1998 (John P Price ) + * removed redundant day strings. Use ones defined in date.c. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28-Jul-1998 (John P Price ) + * moved cmd_prompt from internal.c to here + * + * 09-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 14-Dec-1998 (Eric Kohl ) + * Added "$+" option. + * + * 09-Jan-1999 (Eric Kohl ) + * Added "$A", "$C" and "$F" option. + * Added locale support. + * Fixed "$V" option. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 24-Jan-1999 (Eric Kohl ) + * Fixed Win32 environment handling. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ +#include +#include "resource.h" + +/* + * print the command-line prompt + */ +VOID PrintPrompt(VOID) +{ + static TCHAR default_pr[] = _T("$P$G"); + TCHAR szPrompt[256]; + LPTSTR pr; + + if (GetEnvironmentVariable (_T("PROMPT"), szPrompt, 256)) + pr = szPrompt; + else + pr = default_pr; + + while (*pr) + { + if (*pr != _T('$')) + { + ConOutChar (*pr); + } + else + { + pr++; + + switch (_totupper (*pr)) + { + case _T('A'): + ConOutChar (_T('&')); + break; + + case _T('B'): + ConOutChar (_T('|')); + break; + + case _T('C'): + ConOutChar (_T('(')); + break; + + case _T('D'): + PrintDate (); + break; + + case _T('E'): + ConOutChar (_T('\x1B')); + break; + + case _T('F'): + ConOutChar (_T(')')); + break; + + case _T('G'): + ConOutChar (_T('>')); + break; + + case _T('H'): + ConOutChar (_T('\x08')); + ConOutChar (_T(' ')); + ConOutChar (_T('\x08')); + break; + + case _T('L'): + ConOutChar (_T('<')); + break; + + case _T('N'): + { + TCHAR szPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szPath); + ConOutChar (szPath[0]); + } + break; + + case _T('P'): + { + TCHAR szPath[MAX_PATH]; + GetCurrentDirectory (MAX_PATH, szPath); + ConOutPrintf (_T("%s"), szPath); + } + break; + + case _T('Q'): + ConOutChar (_T('=')); + break; + + case _T('S'): + ConOutChar (_T(' ')); + break; + + case _T('T'): + { + SYSTEMTIME t; + GetSystemTime(&t); + ConOutPrintf(_T("%02d%c%02d%c%02d%c%02d\n"),t.wHour, cTimeSeparator,t.wMinute , cTimeSeparator, + t.wSecond , cDecimalSeparator, t.wMilliseconds ); + } + break; + + case _T('V'): + switch (osvi.dwPlatformId) + { + case VER_PLATFORM_WIN32_WINDOWS: + if (osvi.dwMajorVersion == 4 && + osvi.dwMinorVersion == 1) + ConOutPrintf (_T("Windows 98")); + else + ConOutPrintf (_T("Windows 95")); + break; + + + case VER_PLATFORM_WIN32_NT: + ConOutPrintf (_T("Windows NT Version %lu.%lu"), + osvi.dwMajorVersion, osvi.dwMinorVersion); + break; + } + break; + + case _T('_'): + ConOutChar (_T('\n')); + break; + + case '$': + ConOutChar (_T('$')); + break; + +#ifdef FEATURE_DIRECTORY_STACK + case '+': + { + INT i; + for (i = 0; i < GetDirectoryStackDepth (); i++) + ConOutChar (_T('+')); + } + break; +#endif + } + } + pr++; + } +} + + +#ifdef INCLUDE_CMD_PROMPT + +INT cmd_prompt (LPTSTR cmd, LPTSTR param) +{ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_PROMPT_HELP1); + +#ifdef FEATURE_DIRECTORY_STACK + ConOutResPaging(FALSE,STRING_PROMPT_HELP2); +#endif + ConOutResPaging(FALSE,STRING_PROMPT_HELP3); + return 0; + } + + /* if it is null, then it needs to set to default, + because that means the user entered "prompt" only. + so even if param is null you _must_ still set prompt + to the default. There seems to be some kinda difference + between winxp and 2k in this matter and this way will + cover both. Do not use fixed size of szParam for param the buffer are 8192bytes + and will later change to dymatic buffer */ + + /* set PROMPT environment variable */ + if (param[0] != _T('\0')) + { + if (!SetEnvironmentVariable (_T("PROMPT"), param)) + return 1; + } + else + { + TCHAR szParam[5]; + _tcscpy(szParam,_T("$P$G")); + if (!SetEnvironmentVariable (_T("PROMPT"),szParam)) + return 1; + } + + + + return 0; +} +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/readme.txt b/reactos/base/shell/cmd/readme.txt new file mode 100644 index 00000000000..5ac23049b41 --- /dev/null +++ b/reactos/base/shell/cmd/readme.txt @@ -0,0 +1,55 @@ +ReactOS command line interpreter CMD +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ReactOS command line interpreter CMD is derived from FreeCOM, the +FreeDOS command line interpreter. + +We are shooting mainly to be just like 2000/XP cmd.exe. They are very close and only a small number(none that i can recall off the top of my head, so maybe 0) differences have been found between those two. It has been reported that ROS cmd.exe does not work on nt4 because of a missing api. I'm hoping to fix this at some point. + + +Compiling +~~~~~~~~~ +ROS cmd used to depend on __REACTOS__ to provide two different ways to build cmd. There is still code left in it for this but... The __REACTOS__ = 0 has not been develped, maintained. And therefore it does not even compile anymore. __REACTOS__ = 1 works fine on both windows(nt). and someday i plan to remove all the __REACTOS__ = 0. + +Using rbuild you can compile cmd seperatly by "make cmd_install". Also you can compile cmd using MSVC 6 and soon 7/8 hopefully. + + +Current Features +~~~~~~~~~~~~~~~~ + - environment handling with prompt and path support. + - directory utilities. + - command-line history with doskey-like features. + - batch file processing. + - input/output redirection and piping. + - alias support. + - filename completion (use TAB), both unix and windows style. + + +Credits +~~~~~~~ +FreeDOS developers: + normat@rpi.edu (Tim Norman) + mrains@apanix.apana.org.au (Matt Rains) + ejeffrey@iastate.edu (Evan Jeffrey) + Steffen.Kaiser@Informatik.TU-Chemnitz.DE (Steffen Kaiser) + Svante Frey (sfrey@kuai.se) + Oliver Mueller (ogmueller@t-online.de) + Aaron Kaufman (morgan@remarque.berkeley.edu) + Marc Desrochers (bitzero@hotmail.com) + Rob Lake (rlake@cs.mun.ca) + John P. Price + Hans B Pufal + +ReactOS developers: + Eric Kohl + Emanuele Aliberti + Paolo Pantaleo + Brandon Turner + + + +Bugs +~~~~ +There is still many bugs ;) +Please report bugs to ReactOS team or to bugzilla at www.reactos.org + diff --git a/reactos/base/shell/cmd/readme2.txt b/reactos/base/shell/cmd/readme2.txt new file mode 100644 index 00000000000..a7e7dfe9c1e --- /dev/null +++ b/reactos/base/shell/cmd/readme2.txt @@ -0,0 +1,19 @@ +General Overview of How THings Work +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +First it comes into _main in cmd.c(1811). The command line params are taking in and if it is unicode it uses CommandLineToArgvW. This can cause a problem on older machines and that is why we have our own custom _CommandLineToArgvW to help this along. We pull in the launch directory as the inital dir and set that in _tchdir. We make a handle to the default console out using CreateFile. + +Then we call Initialize(). Here we need to load ntdll.dll if it isnt loaded(windows 9x machines). We also setup some gloabl vars like default io handles and nErrorLevel and set %prompt% to $P$G. This is where all command lines switches given to cmd on startup are done. + +From here main calls ProcessInput(). This is where cmd loops for getting input and doing the commands. First it checks to see if there is a batch file(note: there is agolbal struct "bc" which is NULL when not processing a batch file) and if there is it will pull a new line from that file. If not, thne it will wait for input. Currently there is some stuff for set /a in there, which might stay there or see if we can find a better spot. + +Once there is input taken in from the command line it is sent into ParseCommandLine(). In here we fist check for aliases and convert if need be. THen we look for redirections using GetRedirection() which will remove any redirection symbols. and pass back info about where to redirect. from this info it will do some switching around with the handles for where things go and send them as need be. personally i dont like this code and i tried to chnage it before but failed. it is confusing to me and i dont understand why a lot of it is there but apparently it is needed. + +It sends the new string without any redirection info into DoCommand(). In this function we just look to see what should be done. There is one of 2 things that could happen. 1) we fnd the matching command and send it off to that commands little section. 2) we dont find it so we send it to Execute() and see if it is a file that we can do something. + +Execute will try to launch the file using createprocess and falls back on shellexecute. It calls a function called SearchForExecuteable() to find the full path name and looks in all the correct locations like PATH, curreent folder, windows folder. If it cant find it, just fails and prints out a message. + +Some useful functions that are used a lot: +split() - splits a string into an array of string on spaces that arent inside quotes. which you need to call freep() on later t clean up. +IsValidPathName(), IsExistingFile(), IsExistingDirectory() - all do what you would expect. +PagePrompt() - ask them to hit a key to continue +FilePromptYN[A]() - ask them a yes or no question diff --git a/reactos/base/shell/cmd/redir.c b/reactos/base/shell/cmd/redir.c new file mode 100644 index 00000000000..21848c320b3 --- /dev/null +++ b/reactos/base/shell/cmd/redir.c @@ -0,0 +1,279 @@ +/* + * REDIR.C - redirection handling. + * + * + * History: + * + * 12/15/95 (Tim Norman) + * started. + * + * 12 Jul 98 (Hans B Pufal) + * Rewrote to make more efficient and to conform to new command.c + * and batch.c processing. + * + * 27-Jul-1998 (John P Price ) + * Added config.h include + * + * 22-Jan-1999 (Eric Kohl ) + * Unicode safe! + * Added new error redirection "2>" and "2>>". + * + * 26-Jan-1999 (Eric Kohl ) + * Added new error AND output redirection "&>" and "&>>". + * + * 24-Jun-2005 (Brandon Turner ) + * simple check to fix > and | bug with 'rem' + */ + +#include + +#ifdef FEATURE_REDIRECTION + + +static BOOL +IsRedirection (TCHAR c) +{ + return (c == _T('<')) || (c == _T('>')) || (c == _T('|')); +} + + +/* + * Gets the redirection info from the command line and copies the + * file names into ifn, ofn and efn removing them from the command + * line. + * + * Converts remaining command line into a series of null terminated + * strings defined by the pipe char '|'. Each string corresponds + * to a single executable command. A double null terminates the + * command strings. + * + * Return number of command strings found. + * + */ + +INT GetRedirection (LPTSTR s, LPTSTR ifn, LPTSTR ofn, LPTSTR efn, LPINT lpnFlags) +{ + INT num = 1; + LPTSTR dp = s; + LPTSTR sp = s; + +#ifdef INCLUDE_CMD_REM + + TCHAR * line = s; + + + while (_istspace (*line)) + line++; + + /*first thing first. check to see if this is "rem" and hope out*/ + if(!_tcsncmp (line, _T("rem "), 4)) + { + lpnFlags = 0; + *ifn=('\0'); + *ofn=('\0'); + *efn=_T('\0'); + return 1; + } +#endif + /* find and remove all the redirections first */ + while (*sp) + { + if (*sp == _T('^')) + { + *dp++ = *sp++; + *dp++ = *sp++; + continue; + } + if ((*sp == _T('"')) || (*sp == _T('\''))) + { + /* No redirects inside quotes */ + TCHAR qc = *sp; + + do + *dp++ = *sp++; + while (*sp && *sp != qc); + + *dp++ = *sp++; + } + else if ((*sp == _T('<')) || (*sp == _T('>')) || + (*sp == _T('1')) || (*sp == _T('2')) || (*sp == _T('&'))) + { + /* MS-DOS ignores multiple redirection symbols and uses the last */ + /* redirection, so we'll emulate that and not check */ + + if (*sp == _T('<')) + { + /* input redirection */ + *lpnFlags |= INPUT_REDIRECTION; + do sp++; + while( _istspace (*sp) ); + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ifn++ = *sp++; + *ifn = _T('\0'); + } + else if (*sp == _T('>')) + { + /* output redirection */ + *lpnFlags |= OUTPUT_REDIRECTION; + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= OUTPUT_APPEND; + sp++; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ofn++ = *sp++; + *ofn = _T('\0'); + } + + else if (*sp == _T('1')) + { + /* output redirection */ + sp++; + + if (*sp == _T('>')) + { + /* output redirection */ + *lpnFlags |= OUTPUT_REDIRECTION; + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= OUTPUT_APPEND; + sp++; + } + } + else + { + /* no redirection!! copy the '1' character! */ + sp--; + *dp++ = *sp++; + continue; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ofn++ = *sp++; + *ofn = _T('\0'); + } + + else if (*sp == _T('2')) + { + /* error redirection */ + sp++; + + if (*sp == _T('>')) + { + *lpnFlags |= ERROR_REDIRECTION; + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= ERROR_APPEND; + sp++; + } + } + else + { + /* no redirection!! copy the '2' character! */ + sp--; + *dp++ = *sp++; + continue; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *efn++ = *sp++; + *efn = _T('\0'); + } + else if (*sp == _T('&')) + { + /* output AND error redirection */ + sp++; + + if (*sp == _T('>')) + { + *lpnFlags |= (ERROR_REDIRECTION | OUTPUT_REDIRECTION); + sp++; + + /* append request ? */ + if (*sp == _T('>')) + { + *lpnFlags |= (ERROR_APPEND | OUTPUT_APPEND); + sp++; + } + } + else + { + /* no redirection!! copy the '&' character! */ + sp--; + *dp++ = *sp++; + continue; + } + + while (_istspace (*sp)) + sp++; + + /* copy file name */ + while (*sp && !IsRedirection (*sp) && !_istspace (*sp)) + *ofn++ = *efn++ = *sp++; + *ofn = *efn = _T('\0'); + } + } + else + *dp++ = *sp++; + } + + *dp++ = _T('\0'); + *dp = _T('\0'); + + /* now go for the pipes */ + sp = s; + while (*sp) + { + if (*sp == _T('^')) + { + sp++; + sp++; + continue; + } + else if ((*sp == _T('"')) || (*sp == _T('\''))) + { + TCHAR qc = *sp; + + do + sp++; + while (*sp && *sp != qc); + + sp++; + } + else if (*sp == _T('|')) + { + *sp++ = _T('\0'); + num++; + } + else + sp++; + } + + return num; +} + +#endif /* FEATURE_REDIRECTION */ diff --git a/reactos/base/shell/cmd/ren.c b/reactos/base/shell/cmd/ren.c new file mode 100644 index 00000000000..b096fc8f876 --- /dev/null +++ b/reactos/base/shell/cmd/ren.c @@ -0,0 +1,268 @@ +/* + * REN.C - rename internal command. + * + * + * History: + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 18-Dec-1998 (Eric Kohl + * Added support for quoted long file names with spaces. + * + * 20-Jan-1999 (Eric Kohl + * Unicode and redirection safe! + * + * 17-Oct-2001 (Eric Kohl + * Implemented basic rename code. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_RENAME + +enum +{ + REN_ATTRIBUTES = 0x001, /* /A : not implemented */ + REN_ERROR = 0x002, /* /E */ + REN_NOTHING = 0x004, /* /N */ + REN_PROMPT = 0x008, /* /P : not implemented */ + REN_QUIET = 0x010, /* /Q */ + REN_SUBDIR = 0x020, /* /S */ + REN_TOTAL = 0x040, /* /T */ +}; + + +/* + * file rename internal command. + * + */ +INT cmd_rename (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg = NULL; + INT args = 0; + INT nEvalArgs = 0; /* nunber of evaluated arguments */ + DWORD dwFlags = 0; + DWORD dwFiles = 0; /* number of renamedd files */ + INT i; + LPTSTR srcPattern = NULL; + LPTSTR dstPattern = NULL; + TCHAR dstFile[MAX_PATH]; + BOOL bDstWildcard = FALSE; + + LPTSTR p,q,r; + + HANDLE hFile; + WIN32_FIND_DATA f; + + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_REN_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* split the argument list */ + arg = split(param, &args, FALSE); + + if (args < 2) + { + if (!(dwFlags & REN_ERROR)) + error_req_param_missing(); + freep(arg); + return 1; + } + + /* read options */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + { + if (_tcslen(arg[i]) >= 2) + { + switch (_totupper(arg[i][1])) + { + case _T('E'): + dwFlags |= REN_ERROR; + break; + + case _T('N'): + dwFlags |= REN_NOTHING; + break; + + case _T('P'): + dwFlags |= REN_PROMPT; + break; + + case _T('Q'): + dwFlags |= REN_QUIET; + break; + + case _T('S'): + dwFlags |= REN_SUBDIR; + break; + + case _T('T'): + dwFlags |= REN_TOTAL; + break; + } + } + nEvalArgs++; + } + } + + /* keep quiet within batch files */ + if (bc != NULL) + dwFlags |= REN_QUIET; + + /* there are only options on the command line --> error!!! */ + if (args < nEvalArgs + 2) + { + if (!(dwFlags & REN_ERROR)) + error_req_param_missing(); + freep(arg); + return 1; + } + + /* get destination pattern */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/')) + continue; + dstPattern = arg[i]; + } + + if (_tcschr(dstPattern, _T('*')) || _tcschr(dstPattern, _T('?'))) + bDstWildcard = TRUE; + + /* enumerate source patterns */ + for (i = 0; i < args; i++) + { + if (*arg[i] == _T('/') || arg[i] == dstPattern) + continue; + + srcPattern = arg[i]; + +#ifdef _DEBUG + ConErrPrintf(_T("\n\nSourcePattern: %s\n"), srcPattern); + ConErrPrintf(_T("DestinationPattern: %s\n"), dstPattern); +#endif + + hFile = FindFirstFile(srcPattern, &f); + if (hFile == INVALID_HANDLE_VALUE) + { + if (!(dwFlags & REN_ERROR)) + error_file_not_found(); + continue; + } + + do + { + /* ignore "." and ".." */ + if (!_tcscmp (f.cFileName, _T(".")) || + !_tcscmp (f.cFileName, _T(".."))) + continue; + + /* do not rename hidden or system files */ + if (f.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) + continue; + + /* do not rename directories when the destination pattern contains + * wildcards, unless option /S is used */ + if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + && bDstWildcard + && !(dwFlags & REN_SUBDIR)) + continue; + +#ifdef _DEBUG + ConErrPrintf(_T("Found source name: %s\n"), f.cFileName); +#endif + + /* build destination file name */ + p = f.cFileName; + q = dstPattern; + r = dstFile; + while(*q != 0) + { + if (*q == '*') + { + q++; + while (*p != 0 && *p != *q) + { + *r = *p; + p++; + r++; + } + } + else if (*q == '?') + { + q++; + if (*p != 0) + { + *r = *p; + p++; + r++; + } + } + else + { + *r = *q; + if (*p != 0) + p++; + q++; + r++; + } + } + *r = 0; + +#ifdef _DEBUG + ConErrPrintf(_T("DestinationFile: %s\n"), dstFile); +#endif + + if (!(dwFlags & REN_QUIET) && !(dwFlags & REN_TOTAL)) + ConOutPrintf(_T("%s -> %s\n"), f.cFileName, dstFile); + + /* rename the file */ + if (!(dwFlags & REN_NOTHING)) + { + if (MoveFile(f.cFileName, dstFile)) + { + dwFiles++; + } + else + { + if (!(dwFlags & REN_ERROR)) + { + LoadString(CMD_ModuleHandle, STRING_REN_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, GetLastError()); + } + } + } + } + while (FindNextFile(hFile, &f)); + FindClose(hFile); + } + + if (!(dwFlags & REN_QUIET)) + { + if (dwFiles == 1) + LoadString( CMD_ModuleHandle, STRING_REN_HELP2, szMsg, RC_STRING_MAX_SIZE); + else + LoadString( CMD_ModuleHandle, STRING_REN_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,dwFiles); + } + + freep(arg); + + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/res/terminal.ico b/reactos/base/shell/cmd/res/terminal.ico new file mode 100644 index 0000000000000000000000000000000000000000..f3252f6cb0164534953734289f7027ea16677bdb GIT binary patch literal 50534 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%0D2!8`Jyuz6s#ENq! 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 + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + * + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_SCREEN + + +INT CommandScreen (LPTSTR cmd, LPTSTR param) +{ + SHORT x,y; + BOOL bSkipText = FALSE; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_SCREEN_HELP); + return 0; + } + + nErrorLevel = 0; + + //get row + while(_istspace(*param)) + param++; + + if(!(*param)) + { + error_req_param_missing (); + return 1; + } + + y = _ttoi(param); + if (y<0 || y>(maxy-1)) + { + ConOutResPuts(STRING_SCREEN_ROW); + + return 1; + } + + //get col + if(!(param = _tcschr(param,_T(' ')))) + { + error_req_param_missing (); + return 1; + } + + while(_istspace(*param)) + param++; + + if(!(*param)) + { + error_req_param_missing (); + return 1; + } + + x = _ttoi(param); + if (x<0 || x>(maxx-1)) + { + ConErrResPuts(STRING_SCREEN_COL); + return 1; + } + + //get text + if(!(param = _tcschr(param,_T(' ')))) + { + bSkipText = TRUE; + } + else + { + while(_istspace(*param)) + param++; + + if(!(*param)) + { + bSkipText = TRUE; + } + } + + bIgnoreEcho = TRUE; + + if(bSkipText) + x=0; + + + SetCursorXY(x,y); + + if(!(bSkipText)) + ConOutPuts(param); + + return 0; +} + +#endif /* INCLUDE_CMD_SCREEN */ diff --git a/reactos/base/shell/cmd/set.c b/reactos/base/shell/cmd/set.c new file mode 100644 index 00000000000..e3453602e65 --- /dev/null +++ b/reactos/base/shell/cmd/set.c @@ -0,0 +1,494 @@ +/* + * SET.C - set internal command. + * + * + * History: + * + * 06/14/97 (Tim Norman) + * changed static var in set() to a malloc'd space to pass to putenv. + * need to find a better way to do this, since it seems it is wasting + * memory when variables are redefined. + * + * 07/08/1998 (John P. Price) + * removed call to show_environment in set command. + * moved test for syntax before allocating memory in set command. + * misc clean up and optimization. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 28-Jul-1998 (John P Price ) + * added set_env function to set env. variable without needing set command + * + * 09-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 24-Jan-1999 (Eric Kohl ) + * Fixed Win32 environment handling. + * Unicode and redirection safe! + * + * 25-Feb-1999 (Eric Kohl ) + * Fixed little bug. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_SET + + +/* initial size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + +static BOOL +seta_eval ( LPCTSTR expr ); + +static LPCTSTR +skip_ws ( LPCTSTR p ) +{ + return p + _tcsspn ( p, _T(" \t") ); +} + +INT cmd_set (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + INT i; + LPTSTR p; + + if ( !_tcsncmp (param, _T("/?"), 2) ) + { + ConOutResPaging(TRUE,STRING_SET_HELP); + return 0; + } + + /* remove escapes */ + if ( param[0] ) for ( i = 0; param[i+1]; i++ ) + { + if ( param[i] == _T('^') ) + { + memmove ( ¶m[i], ¶m[i+1], _tcslen(¶m[i]) * sizeof(TCHAR) ); + } + } + + /* if no parameters, show the environment */ + if (param[0] == _T('\0')) + { + LPTSTR lpEnv; + LPTSTR lpOutput; + INT len; + + lpEnv = (LPTSTR)GetEnvironmentStrings (); + if (lpEnv) + { + lpOutput = lpEnv; + while (*lpOutput) + { + len = _tcslen(lpOutput); + if (len) + { + if (*lpOutput != _T('=')) + ConOutPuts (lpOutput); + lpOutput += (len + 1); + } + } + FreeEnvironmentStrings (lpEnv); + } + + return 0; + } + + /* the /A does *NOT* have to be followed by a whitespace */ + if ( !_tcsnicmp (param, _T("/A"), 2) ) + { + BOOL Success = seta_eval ( skip_ws(param+2) ); + if(!Success) + { + /*might seem random but this is what windows xp does */ + nErrorLevel = 9165; + } + /* TODO FIXME - what are we supposed to return? */ + return Success; + } + + p = _tcschr (param, _T('=')); + if (p) + { + /* set or remove environment variable */ + *p = _T('\0'); + p++; + if (*p == _T('\0')) + { + p = NULL; + } + SetEnvironmentVariable (param, p); + } + else + { + /* display environment variable */ + LPTSTR pszBuffer; + DWORD dwBuffer; + + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (param, pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer == 0) + { + LoadString(CMD_ModuleHandle, STRING_PATH_ERROR, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf (szMsg, param); + return 0; + } + else if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (param, pszBuffer, dwBuffer); + } + ConOutPrintf (_T("%s\n"), pszBuffer); + + free (pszBuffer); + + return 0; + } + + return 0; +} + +static INT +ident_len ( LPCTSTR p ) +{ + LPCTSTR p2 = p; + if ( __iscsymf(*p) ) + { + ++p2; + while ( __iscsym(*p2) ) + ++p2; + } + return p2-p; +} + +#define PARSE_IDENT(ident,identlen,p) \ + identlen = ident_len(p); \ + ident = (LPTSTR)alloca ( ( identlen + 1 ) * sizeof(TCHAR) ); \ + memmove ( ident, p, identlen * sizeof(TCHAR) ); \ + ident[identlen] = 0; \ + p += identlen; + +static BOOL +seta_identval ( LPCTSTR ident, INT* result ) +{ + LPCTSTR identVal = GetEnvVarOrSpecial ( ident ); + if ( !identVal ) + { + /* TODO FIXME - what to do upon failure? */ + *result = 0; + return FALSE; + } + *result = _ttoi ( identVal ); + return TRUE; +} + +static BOOL +calc ( INT* lval, TCHAR op, INT rval ) +{ + switch ( op ) + { + case '*': + *lval *= rval; + break; + case '/': + *lval /= rval; + break; + case '%': + *lval %= rval; + break; + case '+': + *lval += rval; + break; + case '-': + *lval -= rval; + break; + case '&': + *lval &= rval; + break; + case '^': + *lval ^= rval; + break; + case '|': + *lval |= rval; + break; + default: + ConErrResPuts ( STRING_INVALID_OPERAND ); + return FALSE; + } + return TRUE; +} + +static BOOL +seta_stmt ( LPCTSTR* p_, INT* result ); + +static BOOL +seta_unaryTerm ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + if ( *p == _T('(') ) + { + INT rval; + p = skip_ws ( p + 1 ); + if ( !seta_stmt ( &p, &rval ) ) + return FALSE; + if ( *p != _T(')') ) + { + ConErrResPuts ( STRING_EXPECTED_CLOSE_PAREN ); + return FALSE; + } + *result = rval; + p = skip_ws ( p + 1 ); + } + else if ( isdigit(*p) ) + { + *result = _ttoi ( p ); + p = skip_ws ( p + _tcsspn ( p, _T("1234567890") ) ); + } + else if ( __iscsymf(*p) ) + { + LPTSTR ident; + INT identlen; + PARSE_IDENT(ident,identlen,p); + if ( !seta_identval ( ident, result ) ) + return FALSE; + } + else + { + ConErrResPuts ( STRING_EXPECTED_NUMBER_OR_VARIABLE ); + return FALSE; + } + *p_ = p; + return TRUE; +} + +static BOOL +seta_mulTerm ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + TCHAR op = 0; + INT rval; + if ( _tcschr(_T("!~-"),*p) ) + { + op = *p; + p = skip_ws ( p + 1 ); + } + if ( !seta_unaryTerm ( &p, &rval ) ) + return FALSE; + switch ( op ) + { + case '!': + rval = !rval; + break; + case '~': + rval = ~rval; + break; + case '-': + rval = -rval; + break; + } + + *result = rval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_ltorTerm ( LPCTSTR* p_, INT* result, LPCTSTR ops, BOOL (*subTerm)(LPCTSTR*,INT*) ) +{ + LPCTSTR p = *p_; + INT lval; + if ( !subTerm ( &p, &lval ) ) + return FALSE; + while ( *p && _tcschr(ops,*p) ) + { + INT rval; + TCHAR op = *p; + + p = skip_ws ( p+1 ); + + if ( !subTerm ( &p, &rval ) ) + return FALSE; + + if ( !calc ( &lval, op, rval ) ) + return FALSE; + } + + *result = lval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_addTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("*/%"), seta_mulTerm ); +} + +static BOOL +seta_logShiftTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("+-"), seta_addTerm ); +} + +static BOOL +seta_bitAndTerm ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + INT lval; + if ( !seta_logShiftTerm ( &p, &lval ) ) + return FALSE; + while ( *p && _tcschr(_T("<>"),*p) && p[0] == p[1] ) + { + INT rval; + TCHAR op = *p; + + p = skip_ws ( p+2 ); + + if ( !seta_logShiftTerm ( &p, &rval ) ) + return FALSE; + + switch ( op ) + { + case '<': + lval <<= rval; + break; + case '>': + lval >>= rval; + break; + default: + ConErrResPuts ( STRING_INVALID_OPERAND ); + return FALSE; + } + } + + *result = lval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_bitExclOrTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("&"), seta_bitAndTerm ); +} + +static BOOL +seta_bitOrTerm ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("^"), seta_bitExclOrTerm ); +} + +static BOOL +seta_expr ( LPCTSTR* p_, INT* result ) +{ + return seta_ltorTerm ( p_, result, _T("|"), seta_bitOrTerm ); +} + +static BOOL +seta_assignment ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + LPTSTR ident; + TCHAR op = 0; + INT identlen, exprval; + + PARSE_IDENT(ident,identlen,p); + if ( identlen ) + { + if ( *p == _T('=') ) + op = *p, p = skip_ws(p+1); + else if ( _tcschr ( _T("*/%+-&^|"), *p ) && p[1] == _T('=') ) + op = *p, p = skip_ws(p+2); + else if ( _tcschr ( _T("<>"), *p ) && *p == p[1] && p[2] == _T('=') ) + op = *p, p = skip_ws(p+3); + } + + /* allow to chain multiple assignments, such as: a=b=1 */ + if ( ident && op ) + { + INT identval; + LPTSTR buf; + + if ( !seta_assignment ( &p, &exprval ) ) + return FALSE; + + if ( !seta_identval ( ident, &identval ) ) + identval = 0; + switch ( op ) + { + case '=': + identval = exprval; + break; + case '<': + identval <<= exprval; + break; + case '>': + identval >>= exprval; + break; + default: + if ( !calc ( &identval, op, exprval ) ) + return FALSE; + } + buf = (LPTSTR)alloca ( 32 * sizeof(TCHAR) ); + _sntprintf ( buf, 32, _T("%i"), identval ); + SetEnvironmentVariable ( ident, buf ); // TODO FIXME - check return value + exprval = identval; + } + else + { + /* restore p in case we found an ident but not an op */ + p = *p_; + if ( !seta_expr ( &p, &exprval ) ) + return FALSE; + } + + *result = exprval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_stmt ( LPCTSTR* p_, INT* result ) +{ + LPCTSTR p = *p_; + INT rval; + + if ( !seta_assignment ( &p, &rval ) ) + return FALSE; + while ( *p == _T(',') ) + { + p = skip_ws ( p+1 ); + + if ( !seta_assignment ( &p, &rval ) ) + return FALSE; + } + + *result = rval; + *p_ = p; + return TRUE; +} + +static BOOL +seta_eval ( LPCTSTR p ) +{ + INT rval; + if ( !*p ) + { + ConErrResPuts ( STRING_SYNTAX_COMMAND_INCORRECT ); + return FALSE; + } + if ( !seta_stmt ( &p, &rval ) ) + return FALSE; + ConOutPrintf ( _T("%i"), rval ); + return TRUE; +} + +#endif diff --git a/reactos/base/shell/cmd/seta_test.cmd b/reactos/base/shell/cmd/seta_test.cmd new file mode 100644 index 00000000000..bb26e59f41b --- /dev/null +++ b/reactos/base/shell/cmd/seta_test.cmd @@ -0,0 +1,116 @@ +@echo off + +@rem the next line reexecutes the script without params if it was called with params, else we'll get false failures +@if not "%1"=="" seta_test.cmd + +@rem the next two lines illustrate bug in existing if code +if not "=="=="==" goto failure +if "=="=="==" goto next1 +goto failure +:next1 +if "1"=="2" goto failure +if not "1"=="1" goto failure +set /a a=1 +echo. +if not "%a%"=="1" goto failure +set /a b=a +echo. +if not "%b%"=="1" goto failure +set /a a=!5 +echo. +if not "%a%"=="0" goto failure +set /a a=!a +echo. +if not "%a%"=="1" goto failure +set /a a=~5 +echo. +if not "%a%"=="-6" goto failure +set /a a=5,a=-a +echo. +if not "%a%"=="-5" goto failure +set /a a=5*7 +echo. +if not "%a%"=="35" goto failure +set /a a=2000/10 +echo. +if not "%a%"=="200" goto failure +set /a a=42%%9 +echo. +if not "%a%"=="6" goto failure +set /a a=5%2 +echo. +if not "%a%"=="5" goto failure +set /a a=42^%13 +echo. +if not "%a%"=="423" goto failure +set /a a=7+9 +echo. +if not "%a%"=="16" goto failure +set /a a=9-7 +echo. +if not "%a%"=="2" goto failure +set /a a=9^<^<2 +echo. +if not "%a%"=="36" goto failure +set /a a=36^>^>2 +echo. +if not "%a%"=="9" goto failure +set /a a=42^&9 +echo. +if not "%a%"=="8" goto failure +set /a a=32^9 +echo. +if not "%a%"=="329" goto failure +set /a a=32^^9 +echo. +if not "%a%"=="41" goto failure +set /a a=10^|22 +echo. +if not "%a%"=="30" goto failure +set /a a=2,a*=3 +echo. +if not "%a%"=="6" goto failure +set /a a=11,a/=2 +echo. +if not "%a%"=="5" goto failure +set /a a=42,a%%=9 +echo. +if not "%a%"=="6" goto failure +set /a a=7,a+=9 +echo. +if not "%a%"=="16" goto failure +set /a a=9,a-=7 +echo. +if not "%a%"=="2" goto failure +set /a a=42,a^&=9 +echo. +if not "%a%"=="8" goto failure +set /a a=32,a^^=9 +echo. +if not "%a%"=="41" goto failure +set /a a=10,a^|=22 +echo. +if not "%a%"=="30" goto failure +set /a a=9,a^<^<=2 +echo. +if not "%a%"=="36" goto failure +set /a a=36,a^>^>=2 +echo. +if not "%a%"=="9" goto failure +set /a a=1,2 +echo. +if not "%a%"=="1" goto failure +set /a a=(a=1,a+2) +echo. +if "%a%"=="3" goto success +goto failure + +:success +echo SUCCESS! +echo. +goto done + +:failure +echo FAILURE! remove the echo off and see the last formula that executed before this line +echo. +:done diff --git a/reactos/base/shell/cmd/shift.c b/reactos/base/shell/cmd/shift.c new file mode 100644 index 00000000000..82c1f39d51b --- /dev/null +++ b/reactos/base/shell/cmd/shift.c @@ -0,0 +1,73 @@ +/* + * SHIFT.C - shift internal batch command + * + * + * History: + * + * 16 Jul 1998 (Hans B Pufal) + * started. + * + * 16 Jul 1998 (John P Price) + * Separated commands into individual files. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 07-Jan-1999 (Eric Kohl ) + * Added help text ("shift /?") and cleaned up. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + + +/* + * Perform the SHIFT command. + * + * Only valid inside batch files. + * + * FREEDOS extension : optional parameter DOWN to allow shifting + * parameters backwards. + * + */ + +INT cmd_shift (LPTSTR cmd, LPTSTR param) +{ + +#ifdef _DEBUG + DebugPrintf (_T("cmd_shift: (\'%s\', \'%s\')\n"), cmd, param); +#endif + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_SHIFT_HELP); + return 0; + } + + nErrorLevel = 0; + + if (bc == NULL) + { + /* not in batch - error!! */ + nErrorLevel = 1; + return 1; + } + + if (!_tcsicmp (param, _T("down"))) + { + if (bc->shiftlevel) + bc->shiftlevel--; + } + else /* shift up */ + bc->shiftlevel++; + + return 0; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/start.c b/reactos/base/shell/cmd/start.c new file mode 100644 index 00000000000..4899aa94384 --- /dev/null +++ b/reactos/base/shell/cmd/start.c @@ -0,0 +1,279 @@ +/* + * START.C - start internal command. + * + * + * History: + * + * 24-Jul-1999 (Eric Kohl ) + * Started. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_START + + +INT cmd_start (LPTSTR First, LPTSTR Rest) +{ + TCHAR szFullName[CMDLINE_LENGTH]; + TCHAR first[CMDLINE_LENGTH]; + TCHAR *rest = NULL; + TCHAR *param = NULL; + INT size; + LPTSTR comspec; + BOOL bWait = FALSE; + BOOL bBat = FALSE; + BOOL bCreate = FALSE; + TCHAR szFullCmdLine [CMDLINE_LENGTH]; + PROCESS_INFORMATION prci; + STARTUPINFO stui; + + + + if (_tcsncmp (Rest, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_START_HELP1); + return 0; + } + + /* get comspec */ + comspec = malloc ( MAX_PATH * sizeof(TCHAR)); + if (comspec == NULL) + { + error_out_of_memory(); + return 1; + } + SetLastError(0); + size = GetEnvironmentVariable (_T("COMSPEC"), comspec, 512); + if(GetLastError() == ERROR_ENVVAR_NOT_FOUND) + { + Rest = _T("cmd"); + } + else + { + if (size > MAX_PATH) + { + comspec = realloc(comspec,size * sizeof(TCHAR) ); + if (comspec==NULL) + { + return 1; + } + size = GetEnvironmentVariable (_T("COMSPEC"), comspec, size); + } + } + + nErrorLevel = 0; + + if( !*Rest ) + { + _tcscpy(Rest,_T("\"")); + _tcscat(Rest,comspec); + _tcscat(Rest,_T("\"")); + } + + rest = malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR)); + if (rest == NULL) + { + if(comspec != NULL) + free(comspec); + error_out_of_memory(); + return 1; + } + + param =malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR)); + if (rest == NULL) + { + if(comspec != NULL) + free(comspec); + free(rest); + error_out_of_memory(); + return 1; + } + + param[0] = _T('\0'); + + + _tcscpy(rest,Rest); + + /* Parsing the command that gets called by start, and it's parameters */ + if(!_tcschr(rest,_T('\"'))) + { + INT i = 0; + INT count = _tcslen(rest); + + /* find the end of the command and start of the args */ + for(i = 0; i < count; i++) + { + if(rest[i] == _T(' ')) + { + + _tcscpy(param,&rest[i]); + rest[i] = _T('\0'); + break; + } + } + } + else + { + INT i = 0; + INT count = _tcslen(rest); + BOOL bInside = FALSE; + + /* find the end of the command and put the arguments in param */ + for(i = 0; i < count; i++) + { + if(rest[i] == _T('\"')) + bInside = !bInside; + if((rest[i] == _T(' ')) && !bInside) + { + _tcscpy(param,&rest[i]); + rest[i] = _T('\0'); + break; + } + } + i = 0; + /* remove any slashes */ + while(i < count) + { + if(rest[i] == _T('\"')) + memmove(&rest[i],&rest[i + 1], _tcslen(&rest[i]) * sizeof(TCHAR)); + else + i++; + } + } + + /* check for a drive change */ + + if (!_tcscmp (first + 1, _T(":")) && _istalpha (*first)) + { + TCHAR szPath[CMDLINE_LENGTH]; + + _tcscpy (szPath, _T("A:")); + szPath[0] = _totupper (*first); + SetCurrentDirectory (szPath); + GetCurrentDirectory (CMDLINE_LENGTH, szPath); + if (szPath[0] != (TCHAR)_totupper (*first)) + ConErrResPuts (STRING_FREE_ERROR1); + + if (rest != NULL) + free(rest); + + if (param != NULL) + free(param); + if (comspec != NULL) + free(comspec); + return 0; + } + + /* get the PATH environment variable and parse it */ + /* search the PATH environment variable for the binary */ + if (!SearchForExecutable (rest, szFullName)) + { + error_bad_command (); + + if (rest != NULL) + free(rest); + + if (param != NULL) + free(param); + + if (comspec != NULL) + free(comspec); + return 1; + } + + + /* check if this is a .BAT or .CMD file */ + if (!_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".bat")) || + !_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".cmd"))) + { + bBat = TRUE; + memset(szFullCmdLine,0,CMDLINE_LENGTH * sizeof(TCHAR)); + + + _tcscpy(szFullCmdLine,comspec); + + memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)],_T("\" /K \""), 6 * sizeof(TCHAR)); + memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)], szFullName, _tcslen(szFullName) * sizeof(TCHAR)); + memcpy(&szFullCmdLine[1], &szFullCmdLine[0], _tcslen(szFullCmdLine) * sizeof(TCHAR)); + szFullCmdLine[0] = _T('\"'); + szFullCmdLine[_tcslen(szFullCmdLine)] = _T('\"'); + } + +#ifdef _DEBUG + DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest); +#endif + + +#ifdef _DEBUG + DebugPrintf (_T("[EXEC: %s %s]\n"), szFullName, rest); +#endif + /* build command line for CreateProcess() */ + if (bBat == FALSE) + { + _tcscpy (szFullCmdLine, first); + if( param != NULL ) + { + + _tcscat(szFullCmdLine, _T(" ") ); + _tcscat (szFullCmdLine, param); + } + } + + /* fill startup info */ + memset (&stui, 0, sizeof (STARTUPINFO)); + stui.cb = sizeof (STARTUPINFO); + stui.dwFlags = STARTF_USESHOWWINDOW; + stui.wShowWindow = SW_SHOWDEFAULT; + + if (bBat == TRUE) + { + bCreate = CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE, + CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci); + } + else + { + bCreate = CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE, + CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci); + } + + if (bCreate) + { + if (bWait) + { + DWORD dwExitCode; + WaitForSingleObject (prci.hProcess, INFINITE); + GetExitCodeProcess (prci.hProcess, &dwExitCode); + nErrorLevel = (INT)dwExitCode; + } + CloseHandle (prci.hThread); + CloseHandle (prci.hProcess); + /* Get New code page if it has change */ + InputCodePage= GetConsoleCP(); + OutputCodePage = GetConsoleOutputCP(); + } + else + { + ErrorMessage(GetLastError (), + _T("Error executing CreateProcess()!!\n")); + } + + + if (rest != NULL) + free(rest); + + if (param != NULL) + free(param); + + if (comspec != NULL) + free(comspec); + return 0; +} + +#endif + +/* EOF */ diff --git a/reactos/base/shell/cmd/strtoclr.c b/reactos/base/shell/cmd/strtoclr.c new file mode 100644 index 00000000000..b4601a508af --- /dev/null +++ b/reactos/base/shell/cmd/strtoclr.c @@ -0,0 +1,284 @@ +/* + * STRTOCLR.C - read color (for color command and other) + * + * + * History: + * + * 07-Oct-1999 (Paolo Pantaleo) + * Started. + * + * + */ + +/*only +BOOL StringToColor(LPWORD lpColor, LPTSTR*str) +is to be called +other are internal service functions*/ + + +#include + +#define _B FOREGROUND_BLUE +#define _G FOREGROUND_GREEN +#define _R FOREGROUND_RED +#define _I FOREGROUND_INTENSITY + + +/*return values for chop_blank*/ +#define CP_OK 0 +#define CP_BLANK_NOT_FOUND 1 +#define CP_END_OF_STRING 2 + +#define SC_HEX 0x0100 +#define SC_TXT 0x0200 + + + +typedef struct _CLRTABLE +{ + LPTSTR name; + WORD val; +} CLRTABLE; + + +CLRTABLE clrtable[] = +{ + {_T("bla") ,0 }, + {_T("blu") ,_B }, + {_T("gre") ,_G }, + {_T("cya") ,_B|_G }, + {_T("red") ,_R }, + {_T("mag") ,_B|_R }, + {_T("yel") ,_R|_G }, + {_T("whi") ,_R|_G|_B }, + {_T("gra") ,_I }, + + + {_T("0") ,0 }, + {_T("2") ,_G }, + {_T("3") ,_B|_G }, + {_T("4") ,_R }, + {_T("5") ,_B|_R }, + {_T("6") ,_R|_G }, + {_T("7") ,_R|_G|_B }, + + {_T("8") ,_I }, + {_T("9") ,_I|_B }, + {_T("10") ,_I|_G }, + {_T("11") ,_I|_B|_G }, + {_T("12") ,_I|_R }, + {_T("13") ,_I|_B|_R }, + {_T("14") ,_I|_R|_G }, + {_T("15") ,_I|_R|_G|_B }, + + + /* note that 1 is at the end of list + to avoid to confuse it with 10-15*/ + {_T("1") ,_B }, + + /*cyan synonimous*/ + {_T("aqu") ,_B|_G }, + /*magenta synonimous*/ + {_T("pur") ,_B|_R }, + + + {_T("") ,0}, +}; + + + +/* +move string pointer to next word (skip all spaces) +on erro retunr nonzero value +*/ +static +INT chop_blank(LPTSTR *arg_str) +{ + + LPTSTR str; + str = _tcschr(*arg_str,_T(' ')); + if(!str) + { + str = _tcschr (*arg_str, _T('\0')); + if(str != NULL) + *arg_str=str; + return CP_BLANK_NOT_FOUND; + } + + + + while(_istspace(*str)) + str++; + + if (*str == _T('\0')) + { + *arg_str=str; + return CP_END_OF_STRING; + } + + *arg_str = str; + + return CP_OK; +} + + + +/* +read a color value in hex (like win nt's cmd syntax) +if an error occurs return -1 +*/ +static +WORD hex_clr(LPTSTR str) +{ + WORD ret= (WORD)-1; + TCHAR ch; + + ch = str[1]; + + if(_istdigit(ch)) + ret = ch-_T('0'); + else + { + ch=_totupper(ch); + + if( ch >= _T('A') && ch <= _T('F') ) + ret = ch-_T('A')+10; + else + return (WORD)-1; + } + + + ch = str[0]; + + if(_istdigit(ch)) + ret |= (ch-_T('0')) << 4; + else + { + ch=_totupper(ch); + + if( ch >= _T('A') && ch <= _T('F') ) + ret |= (ch-_T('A')+10) <<4; + else + return (WORD)-1; + } + + return ret; +} + + +/* +read a color value from a string (like 4nt's syntax) +if an error occurs return -1 +*/ +static +WORD txt_clr(LPTSTR str) +{ + INT i; + + for(i = 0; *(clrtable[i].name); i++) + if (_tcsnicmp(str, clrtable[i].name, _tcslen(clrtable[i].name)) == 0) + return clrtable[i].val; + + return (WORD)-1; +} + + + +/*search for x on y*/ +static +WORD str_to_color(LPTSTR* arg_str) +{ + LPTSTR str; + BOOL bBri; + + WORD tmp_clr,ret_clr; + + str = *arg_str; + + if (!(*str)) + return (WORD)-1; + + + /*foreground*/ + bBri = FALSE; + + if (_tcsnicmp(str,_T("bri"),3) == 0) + { + bBri = TRUE; + + if (chop_blank(&str)) + return (WORD)-1; + } + + if ((tmp_clr = txt_clr(str)) == (WORD)-1) + { + return (WORD)-1; + } + + /*skip spaces and "on"*/ + if (chop_blank(&str) || chop_blank(&str)) + return (WORD)-1; + + ret_clr = tmp_clr | (bBri << 3); + + /*background*/ + bBri = FALSE; + + if(_tcsnicmp(str,_T("bri"),3) == 0 ) + { + bBri = TRUE; + + if(chop_blank(&str)) + return (WORD)-1; + } + + + if( (tmp_clr = txt_clr(str)) == (WORD)-1 ) + return (WORD)-1; + + chop_blank(&str); + + *arg_str = str; + + return SC_HEX | ret_clr | tmp_clr << 4 | bBri << 7; +} + + + +/****main function****/ +/* +the only parameter is arg_str, a pointer to a string. +the string is modified so it will begin to first word after +color specification +(only the char* is moved, no chars in the string are modfied) + + +it returns the color in the l.o. byte, plus two flags in the +h.o. byte, they are: +SC_HEX win nt's cmd syntax (for exampl a0) +SC_TXT 4nt's syntax ( "bri gre on bla" or "10 on 0") + +if succedes also move the LPTSTR to end of +string that specify color +*/ + + +BOOL StringToColor(LPWORD lpColor, LPTSTR*str) +{ + WORD wRet; + + wRet = str_to_color (str); + if (wRet == (WORD)-1) + { + wRet=hex_clr (*str); + chop_blank (str); + if (wRet == (WORD)-1) + return FALSE; + } + + *lpColor = wRet; + + return TRUE; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/tests/cmd_test.xml b/reactos/base/shell/cmd/tests/cmd_test.xml new file mode 100644 index 00000000000..13a420111e7 --- /dev/null +++ b/reactos/base/shell/cmd/tests/cmd_test.xml @@ -0,0 +1,15 @@ + + . + include/wine + . + + + 0x0501 + rtshared + regtests + cmd_base + pseh + ntdll + setup.c + + diff --git a/reactos/base/shell/cmd/tests/setup.c b/reactos/base/shell/cmd/tests/setup.c new file mode 100644 index 00000000000..66e28a8c8c8 --- /dev/null +++ b/reactos/base/shell/cmd/tests/setup.c @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2005 Casper S. Hornstrup + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include "regtests.h" + +_SetupOnce() +{ +} diff --git a/reactos/base/shell/cmd/tests/stubs.xml b/reactos/base/shell/cmd/tests/stubs.xml new file mode 100644 index 00000000000..1c964b3eb62 --- /dev/null +++ b/reactos/base/shell/cmd/tests/stubs.xml @@ -0,0 +1,84 @@ + + FindFirstFileA@8 + GetLastError@0 + FindNextFileA@8 + FindClose@4 + GetFileAttributesA@4 + GetCurrentDirectoryA@8 + GetFullPathNameA@16 + CloseHandle@4 + CreateFileA@28 + Beep@8 + LoadStringA@16 + SetConsoleCP@4 + SetConsoleOutputCP@4 + WaitForSingleObject@8 + ReadConsoleInputA@16 + GetTickCount@0 + GetConsoleScreenBufferInfo@8 + FillConsoleOutputAttribute@20 + FillConsoleOutputCharacterA@20 + SetConsoleCursorPosition@8 + LoadLibraryA@4 + GetProcAddress@8 + SetCurrentDirectoryA@4 + SetConsoleMode@8 + CreateProcessA@40 + GetExitCodeProcess@8 + GetConsoleOutputCP@0 + GetTempPathA@8 + GetTempFileNameA@16 + GetCurrentProcess@0 + DuplicateHandle@28 + GetFileType@4 + SetFilePointer@16 + GetTimeFormatA@24 + GetDateFormatA@24 + GetEnvironmentVariableA@12 + GenerateConsoleCtrlEvent@8 + SetConsoleCtrlHandler@8 + GetVersionExA@4 + ExitProcess@4 + GetModuleFileNameA@12 + SetEnvironmentVariableA@8 + SetConsoleTextAttribute@8 + FlushConsoleInputBuffer@4 + WriteFile@20 + FormatMessageA@28 + LocalFree@4 + GetConsoleCP@0 + GetStdHandle@4 + FreeLibrary@4 + SetLastError@4 + SetStdHandle@8 + DeleteFileA@4 + FileTimeToLocalFileTime@8 + GetVolumeInformationA@32 + RemoveDirectoryA@4 + CreateDirectoryA@8 + GetLocaleInfoA@16 + GlobalMemoryStatus@4 + GetEnvironmentStrings@0 + FreeEnvironmentStringsA@4 + LocalFree + SetLocalTime@4 + GetLocalTime@4 + SetFileAttributesA@8 + SetFileApisToOEM@0 + GetConsoleMode@8 + SetConsoleCursorInfo@8 + ReadFile@20 + SetFileTime@16 + FileTimeToSystemTime@8 + GetDiskFreeSpaceA@20 + SetVolumeLabelA@8 + SetConsoleTitleA@4 + MoveFileExA@12 + GetFileTime@16 + Sleep@4 + MoveFileA@8 + CreateSemaphoreA@16 + InterlockedIncrement@4 + InterlockedDecrement@4 + ReleaseSemaphore@12 + diff --git a/reactos/base/shell/cmd/time.c b/reactos/base/shell/cmd/time.c new file mode 100644 index 00000000000..13ef34b431d --- /dev/null +++ b/reactos/base/shell/cmd/time.c @@ -0,0 +1,215 @@ +/* + * TIME.C - time internal command. + * + * + * History: + * + * 07/08/1998 (John P. Price) + * started. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 09-Jan-1999 (Eric Kohl ) + * Added locale support. + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * Added "/t" option. + * + * 04-Feb-1999 (Eric Kohl ) + * Fixed time input bug. + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc. + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TIME + + +static BOOL ParseTime (LPTSTR s) +{ + SYSTEMTIME t; + LPTSTR p = s; + + if (!*s) + return TRUE; + + GetLocalTime (&t); + t.wHour = 0; + t.wMinute = 0; + t.wSecond = 0; + t.wMilliseconds = 0; + + // first get hour + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { + t.wHour = t.wHour * 10 + *p - _T('0'); + p++; + } + } + else + return FALSE; + + // get time separator + if (*p != cTimeSeparator) + return FALSE; + p++; + + // now get minutes + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { + t.wMinute = t.wMinute * 10 + *p - _T('0'); + p++; + } + } + else + return FALSE; + + // get time separator + if (*p != cTimeSeparator) + return FALSE; + p++; + + // now get seconds + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { + t.wSecond = t.wSecond * 10 + *p - _T('0'); + p++; + } + } + else + return FALSE; + + // get decimal separator + if (*p == cDecimalSeparator) + { + p++; + + // now get hundreths + if (_istdigit(*p)) + { + while (_istdigit(*p)) + { +// t.wMilliseconds = t.wMilliseconds * 10 + *p - _T('0'); + p++; + } +// t.wMilliseconds *= 10; + } + } + + /* special case: 12 hour format */ + if (nTimeFormat == 0) + { + if (_totupper(*s) == _T('P')) + { + t.wHour += 12; + } + + if ((_totupper(*s) == _T('A')) && (t.wHour == 12)) + { + t.wHour = 0; + } + } + + if (t.wHour > 23 || t.wMinute > 60 || t.wSecond > 60 || t.wMilliseconds > 999) + return FALSE; + + SetLocalTime (&t); + + return TRUE; +} + + +INT cmd_time (LPTSTR cmd, LPTSTR param) +{ + LPTSTR *arg; + INT argc; + INT i; + BOOL bPrompt = TRUE; + INT nTimeString = -1; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_TIME_HELP1); + return 0; + } + + nErrorLevel = 0; + + /* build parameter array */ + arg = split (param, &argc, FALSE); + + /* check for options */ + for (i = 0; i < argc; i++) + { + if (_tcsicmp (arg[i], _T("/t")) == 0) + bPrompt = FALSE; + + if ((*arg[i] != _T('/')) && (nTimeString == -1)) + nTimeString = i; + } + + if (nTimeString == -1) + PrintTime (); + + if (!bPrompt) + { + freep (arg); + return 0; + } + + while (1) + { + if (nTimeString == -1) + { + TCHAR s[40]; + + ConOutResPuts(STRING_TIME_HELP2); + + ConInString (s, 40); + +#ifdef _DEBUG + DebugPrintf (_T("\'%s\'\n"), s); +#endif + + while (*s && s[_tcslen (s) - 1] < _T(' ')) + s[_tcslen(s) - 1] = _T('\0'); + + if (ParseTime (s)) + { + freep (arg); + return 0; + } + } + else + { + if (ParseTime (arg[nTimeString])) + { + freep (arg); + return 0; + } + + /* force input the next time around. */ + nTimeString = -1; + } + + ConErrResPuts(STRING_TIME_ERROR1); + nErrorLevel = 1; + } + + freep (arg); + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/timer.c b/reactos/base/shell/cmd/timer.c new file mode 100644 index 00000000000..34567dafa40 --- /dev/null +++ b/reactos/base/shell/cmd/timer.c @@ -0,0 +1,233 @@ +/* + * TIMER.C - timer internal command. + * + * clone from 4nt timer command + * + * 20 Aug 1999 + * started - Paolo Pantaleo + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TIMER + + +#define NCS_NOT_SPECIFIED -1 +#define NCS_ON 1 +#define NCS_OFF 0 + + + + + +//print timer value +#define PT(format) PrintElapsedTime(GetTickCount()-cT,format) + + +//current timer Time (at wich started to count) +#define cT clksT[clk_n] + +//current timer status +#define cS clksS[clk_n] + + +static VOID +PrintElapsedTime (DWORD time,INT format) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + DWORD h,m,s,ms; + +#ifdef _DEBUG + DebugPrintf(_T("PrintTime(%d,%d)"),time,format); +#endif + + switch (format) + { + case 0: + LoadString(CMD_ModuleHandle, STRING_TIMER_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, time); + break; + + case 1: + ms = time % 1000; + time /= 1000; + s = time % 60; + time /=60; + m = time % 60; + h = time / 60; + LoadString( CMD_ModuleHandle, STRING_TIMER_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, + h, cTimeSeparator, + m, cTimeSeparator, + s, cDecimalSeparator, ms/10); + break; + } +} + + +INT CommandTimer (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + // all timers are kept + static DWORD clksT[10]; + + // timers status + // set all the clocks off by default + static BOOL clksS[10]={FALSE,FALSE,FALSE,FALSE, + FALSE,FALSE,FALSE,FALSE,FALSE,FALSE}; + + // TRUE if /S in command line + BOOL bS = FALSE; + + // avoid to set clk_n more than once + BOOL bCanNSet = TRUE; + + INT NewClkStatus = NCS_NOT_SPECIFIED; + + // the clock number specified on the command line + // 1 by default + INT clk_n=1; + + // output format + INT iFormat=1; + + + // command line parsing variables + INT argc; + LPTSTR *p; + + INT i; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + LoadString(CMD_ModuleHandle, STRING_TIMER_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, cTimeSeparator, cTimeSeparator, cDecimalSeparator); + return 0; + } + + nErrorLevel = 0; + + LoadString( CMD_ModuleHandle, STRING_TIMER_TIME, szMsg, RC_STRING_MAX_SIZE); + + p = split (param, &argc, FALSE); + + //read options + for (i = 0; i < argc; i++) + { + //set timer on + if (!(_tcsicmp(&p[i][0],_T("on"))) && NewClkStatus == NCS_NOT_SPECIFIED) + { + NewClkStatus = NCS_ON; + continue; + } + + //set timer off + if (!(_tcsicmp(&p[i][0],_T("off"))) && NewClkStatus == NCS_NOT_SPECIFIED) + { + NewClkStatus = NCS_OFF; + continue; + } + + // other options + if (p[i][0] == _T('/')) + { + // set timer number + if (_istdigit(p[i][1]) && bCanNSet) + { + clk_n = p[i][1] - _T('0'); + bCanNSet = FALSE; + continue; + } + + // set s(plit) option + if (_totupper(p[i][1]) == _T('S')) + { + bS = TRUE; + continue; + } + + // specify format + if (_totupper(p[i][1]) == _T('F')) + { + iFormat = p[i][2] - _T('0'); + continue; + } + } + } + + // do stuff (start/stop/read timer) + if(NewClkStatus == NCS_ON) + { + cT=GetTickCount(); + cS=TRUE; + + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + if(bS) + { + if(cS) + { + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + PrintElapsedTime(GetTickCount()-cT, iFormat); + freep(p); + return 0; + } + + cT=GetTickCount(); + cS=TRUE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + if (NewClkStatus == NCS_NOT_SPECIFIED) + { + if (cS) + { + cS=FALSE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + PrintElapsedTime(GetTickCount()-cT, iFormat); + freep(p); + return 0; + } + + cT=GetTickCount(); + cS=TRUE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + + if (NewClkStatus == NCS_OFF) + { + if (cS) + { + cS=FALSE; + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + PrintElapsedTime(GetTickCount()-cT, iFormat); + freep(p); + return 0; + } + ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF")); + PrintTime(); + freep(p); + return 0; + } + + freep(p); + return 0; +} + +#endif /* INCLUDE_CMD_TIMER */ diff --git a/reactos/base/shell/cmd/title.c b/reactos/base/shell/cmd/title.c new file mode 100644 index 00000000000..a82bb3c21b5 --- /dev/null +++ b/reactos/base/shell/cmd/title.c @@ -0,0 +1,37 @@ +/* + * title.c - title internal command. + * + * + * History: + * 1999-02-11 Emanuele Aliberti + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TITLE + + +INT cmd_title (LPTSTR cmd, LPTSTR param) +{ + + /* Do nothing if no args */ + if (*param == _T('\0')) + return 0; + + /* Asking help? */ + if (!_tcsncmp(param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_TITLE_HELP); + return 0; + } + + return SetConsoleTitle (param); +} + +#endif /* def INCLUDE_CMD_TITLE */ + +/* EOF */ diff --git a/reactos/base/shell/cmd/todo.txt b/reactos/base/shell/cmd/todo.txt new file mode 100644 index 00000000000..b9895bdd6d5 --- /dev/null +++ b/reactos/base/shell/cmd/todo.txt @@ -0,0 +1,24 @@ +Things to do +~~~~~~~~~~~~ +*Implmenet Set /P +This is pretty straight forward. When doing this make sure to take into account the way MS handles "set /A /P foo=5" compared to "set /P /A foo=5". + +*Compile as unicode +Not sure what is wrong with it, put probably more then just one thing blocking this. For sure pipes break when it is compiled as unicode. + +*Move.c code clean up +It works, but it needs to be cleaned up, the code is long and overly complex for what it needs to do. Also, we can remove the hack to cover for MoveFileEx bug as it isnt a bug anymore. + +*If rewrite +It works decent but looks _awful_. Very hard to maintain and/or understand what the hell is going on. + +*Remove Hardcoded buffers +This is mostly done thanks to Greatlord(cmd.c is the hardest spot that is left). ANytime when you are handling a string that is taken from the commandline there should be no limit to the size. + +*Implment & and && +& runs two commands no matter what. +&& runs the 2nd command only if the first was a success +Not sure where to put this code even + +*Reg Testing +We need more batch files like the one Royce made for "set /a". What out for if bugs when doing this... could lead to in the wrong direction when looking for a regression. \ No newline at end of file diff --git a/reactos/base/shell/cmd/type.c b/reactos/base/shell/cmd/type.c new file mode 100644 index 00000000000..f0eca0f68ad --- /dev/null +++ b/reactos/base/shell/cmd/type.c @@ -0,0 +1,136 @@ +/* + * TYPE.C - type internal command. + * + * History: + * + * 07/08/1998 (John P. Price) + * started. + * + * 07/12/98 (Rob Lake) + * Changed error messages + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 07-Jan-1999 (Eric Kohl ) + * Added support for quoted arguments (type "test file.dat"). + * Cleaned up. + * + * 19-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 19-Jan-1999 (Paolo Pantaleo ) + * Added multiple file support (copied from y.c) + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_TYPE + + +INT cmd_type (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR buff[256]; + HANDLE hFile, hConsoleOut; + BOOL bRet; + INT argc,i; + LPTSTR *argv; + LPTSTR errmsg; + BOOL bPaging = FALSE; + BOOL bFirstTime = TRUE; + + hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE); + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_TYPE_HELP1); + return 0; + } + + if (!*param) + { + error_req_param_missing (); + return 1; + } + + argv = split (param, &argc, TRUE); + + for(i = 0; i < argc; i++) + { + if(*argv[i] == _T('/') && _tcslen(argv[i]) >= 2 && _totupper(argv[i][1]) == _T('P')) + { + bPaging = TRUE; + } + } + + for (i = 0; i < argc; i++) + { + if (_T('/') == argv[i][0] && _totupper(argv[i][1]) != _T('P')) + { + LoadString(CMD_ModuleHandle, STRING_TYPE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConErrPrintf(szMsg, argv[i] + 1); + continue; + } + + nErrorLevel = 0; + + hFile = CreateFile(argv[i], + GENERIC_READ, + FILE_SHARE_READ,NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL,NULL); + + if(hFile == INVALID_HANDLE_VALUE) + { + FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &errmsg, + 0, + NULL); + ConErrPrintf (_T("%s - %s"), argv[i], errmsg); + LocalFree (errmsg); + nErrorLevel = 1; + continue; + } + + do + { + bRet = FileGetString (hFile, buff, sizeof(buff) / sizeof(TCHAR)); + if(bPaging) + { + if(bRet) + { + if (ConOutPrintfPaging(bFirstTime, buff) == 1) + { + bCtrlBreak = FALSE; + return 0; + } + } + } + else + { + if(bRet) + ConOutPrintf(buff); + } + bFirstTime = FALSE; + + } while(bRet); + + CloseHandle(hFile); + } + + freep (argv); + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/ver.c b/reactos/base/shell/cmd/ver.c new file mode 100644 index 00000000000..3216f7a94e4 --- /dev/null +++ b/reactos/base/shell/cmd/ver.c @@ -0,0 +1,135 @@ +/* + * VER.C - ver internal command. + * + * + * History: + * + * 06/30/98 (Rob Lake) + * rewrote ver command to accept switches, now ver alone prints + * copyright notice only. + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 30-Jul-1998 (John P Price ) + * added text about where to send bug reports and get updates. + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection safe! + * + * 26-Feb-1999 (Eric Kohl ) + * New version info and some output changes. + */ + +#include +#include "resource.h" +#include + + +VOID ShortVersion (VOID) +{ + OSVERSIONINFO VersionInfo; + unsigned RosVersionLen; + LPTSTR RosVersion; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + ConOutResPuts (STRING_CMD_SHELLINFO ); + VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + ConOutPrintf(_T("Version %s %s"), _T(KERNEL_RELEASE_STR), _T(KERNEL_VERSION_BUILD_STR)); + + memset(VersionInfo.szCSDVersion, 0, sizeof(VersionInfo.szCSDVersion)); + if (GetVersionEx(&VersionInfo)) + { + RosVersion = VersionInfo.szCSDVersion + _tcslen(VersionInfo.szCSDVersion) + 1; + RosVersionLen = sizeof(VersionInfo.szCSDVersion) / sizeof(VersionInfo.szCSDVersion[0]) - + (RosVersion - VersionInfo.szCSDVersion); + if (7 <= RosVersionLen && 0 == _tcsnicmp(RosVersion, _T("ReactOS"), 7)) + { + LoadString( CMD_ModuleHandle, STRING_VERSION_RUNVER, (LPTSTR) szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf (szMsg, RosVersion); + } + } + ConOutPuts (_T("\n")); +} + + +#ifdef INCLUDE_CMD_VER + +/* + * display shell version info internal command. + * + * + */ +INT cmd_ver (LPTSTR cmd, LPTSTR param) +{ + INT i; + + nErrorLevel = 0; + + if (_tcsstr (param, _T("/?")) != NULL) + { + ConOutResPaging(TRUE,STRING_VERSION_HELP1); + return 0; + } + + ShortVersion(); + ConOutPuts (_T("Copyright (C) 1994-1998 Tim Norman and others.")); + ConOutPuts (_T(RES_STR_LEGAL_COPYRIGHT)); + + /* Basic copyright notice */ + if (param[0] == _T('\0')) + { + ConOutResPuts (STRING_CMD_SHELLINFO ); + ConOutResPuts(STRING_VERSION_HELP2); + } + else + { + for (i = 0; param[i]; i++) + { + /* skip spaces */ + if (param[i] == _T(' ')) + continue; + + if (param[i] == _T('/')) + { + /* is this a lone '/' ? */ + if (param[i + 1] == 0) + { + error_invalid_switch (_T(' ')); + return 1; + } + continue; + } + + if (_totupper (param[i]) == _T('W')) + { + /* Warranty notice */ + ConOutResPuts(STRING_VERSION_HELP3); + } + else if (_totupper (param[i]) == _T('R')) + { + /* Redistribution notice */ + ConOutResPuts(STRING_VERSION_HELP4); + } + else if (_totupper (param[i]) == _T('C')) + { + /* Developer listing */ + ConOutResPuts(STRING_VERSION_HELP6); + ConOutResPuts(STRING_FREEDOS_DEV); + ConOutResPuts(STRING_VERSION_HELP7); + ConOutResPuts(STRING_REACTOS_DEV); + } + else + { + error_invalid_switch ((TCHAR)_totupper (param[i])); + return 1; + } + } + } + + ConOutResPuts(STRING_VERSION_HELP5); + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/verify.c b/reactos/base/shell/cmd/verify.c new file mode 100644 index 00000000000..371993d2612 --- /dev/null +++ b/reactos/base/shell/cmd/verify.c @@ -0,0 +1,60 @@ +/* + * VERIFY.C - verify internal command. + * + * + * History: + * + * 31 Jul 1998 (John P Price) + * started. + * + * 18-Jan-1999 (Eric Kohl ) + * VERIFY is just a dummy under Win32; it only exists + * for compatibility!!! + * + * 20-Jan-1999 (Eric Kohl ) + * Unicode and redirection ready! + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_VERIFY + + +/* global verify flag */ +static BOOL bVerify = FALSE; + + +INT cmd_verify (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_VERIFY_HELP1); + return 0; + } + + nErrorLevel = 0; + + if (!*param) + { + LoadString(CMD_ModuleHandle, STRING_VERIFY_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, bVerify ? D_ON : D_OFF); + } + else if (_tcsicmp (param, D_OFF) == 0) + bVerify = FALSE; + else if (_tcsicmp (param, D_ON) == 0) + bVerify = TRUE; + else + { + ConOutResPuts(STRING_VERIFY_HELP3); + } + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/vol.c b/reactos/base/shell/cmd/vol.c new file mode 100644 index 00000000000..ac8a11af466 --- /dev/null +++ b/reactos/base/shell/cmd/vol.c @@ -0,0 +1,117 @@ +/* + * VOL.C - vol internal command. + * + * + * History: + * + * 03-Dec-1998 (Eric Kohl ) + * Replaced DOS calls by Win32 calls. + * + * 08-Dec-1998 (Eric Kohl ) + * Added help text ("/?"). + * + * 07-Jan-1999 (Eric Kohl ) + * Cleanup. + * + * 18-Jan-1999 (Eric Kohl ) + * Unicode ready! + * + * 20-Jan-1999 (Eric Kohl ) + * Redirection ready! + */ + +#include +#include "resource.h" + +#ifdef INCLUDE_CMD_VOL + + +static INT +PrintVolumeHeader (LPTSTR pszRootPath) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szVolName[80]; + DWORD dwSerialNr; + + /* get the volume information of the drive */ + if(!GetVolumeInformation (pszRootPath, + szVolName, + 80, + &dwSerialNr, + NULL, + NULL, + NULL, + 0)) + { + ErrorMessage (GetLastError (), _T("")); + return 1; + } + + /* print drive info */ + if (szVolName[0] != '\0') + { + LoadString(CMD_ModuleHandle, STRING_VOL_HELP1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, pszRootPath[0],szVolName); + } + else + { + LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, pszRootPath[0]); + } + + /* print the volume serial number */ + LoadString(CMD_ModuleHandle, STRING_VOL_HELP3, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr)); + return 0; +} + + +INT cmd_vol (LPTSTR cmd, LPTSTR param) +{ + TCHAR szRootPath[] = _T("A:\\"); + TCHAR szPath[MAX_PATH]; + + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_VOL_HELP4); + return 0; + } + + nErrorLevel = 0; + + if (param[0] == _T('\0')) + { + GetCurrentDirectory (MAX_PATH, szPath); + szRootPath[0] = szPath[0]; + } + else + { + _tcsupr (param); + if (param[1] == _T(':')) + szRootPath[0] = param[0]; + else + { + error_invalid_drive (); + nErrorLevel = 1; + return 1; + } + } + + if (!IsValidPathName (szRootPath)) + { + error_invalid_drive (); + nErrorLevel = 1; + return 1; + } + + /* print the header */ + if (!PrintVolumeHeader (szRootPath)) + { + nErrorLevel = 1; + return 1; + } + + return 0; +} + +#endif diff --git a/reactos/base/shell/cmd/where.c b/reactos/base/shell/cmd/where.c new file mode 100644 index 00000000000..3136f46e842 --- /dev/null +++ b/reactos/base/shell/cmd/where.c @@ -0,0 +1,273 @@ +/* + * WHERE.C - file search functions. + * + * + * History: + * + * 07/15/95 (Tim Norman) + * started. + * + * 08/08/95 (Matt Rains) + * i have cleaned up the source code. changes now bring this source + * into guidelines for recommended programming practice. + * + * 12/12/95 (Steffan Kaiser & Tim Norman) + * added some patches to fix some things and make more efficient + * + * 1/6/96 (Tim Norman) + * fixed a stupid pointer mistake... + * Thanks to everyone who noticed it! + * + * 8/1/96 (Tim Norman) + * fixed a bug when getenv returns NULL + * + * 8/7/96 (Steffan Kaiser and Tim Norman) + * speed improvements and bug fixes + * + * 8/27/96 (Tim Norman) + * changed code to use pointers directly into PATH environment + * variable rather than making our own copy. This saves some memory, + * but requires we write our own function to copy pathnames out of + * the variable. + * + * 12/23/96 (Aaron Kaufman) + * Fixed a bug in get_paths() that did not point to the first PATH + * in the environment variable. + * + * 7/12/97 (Tim Norman) + * Apparently, Aaron's bugfix got lost, so I fixed it again. + * + * 16 July 1998 (John P. Price) + * Added stand alone code. + * + * 17 July 1998 (John P. Price) + * Rewrote find_which to use searchpath function + * + * 24-Jul-1998 (John P Price ) + * fixed bug where didn't check all extensions when path was specified + * + * 27-Jul-1998 (John P Price ) + * added config.h include + * + * 30-Jul-1998 (John P Price ) + * fixed so that it find_which returns NULL if filename is not + * executable (does not have .bat, .com, or .exe extention). + * Before command would to execute any file with any extension (opps!) + * + * 03-Dec-1998 (Eric Kohl ) + * Changed find_which(). + * + * 07-Dec-1998 (Eric Kohl ) + * Added ".CMD" extension. + * Replaced numeric constant by _NR_OF_EXTENSIONS. + * + * 26-Feb-1999 (Eric Kohl ) + * Replaced find_which() by SearchForExecutable(). + * Now files are searched using the right extension order. + * + * 20-Apr-1999 (Eric Kohl ) + * Some minor changes and improvements. + * + + * 10-Jul-2004 (Jens Collin ) + * Fixed searxhing for files with specific extensions in PATHEXT order.. + * + */ + +#include + + +/* initial size of environment variable buffer */ +#define ENV_BUFFER_SIZE 1024 + + +/* searches for file using path info. */ + +BOOL +SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension) +{ + TCHAR szPathBuffer[CMDLINE_LENGTH]; + LPTSTR pszBuffer = NULL; + DWORD dwBuffer, len; + LPTSTR s,f; + /* initialize full name buffer */ + *pFullName = _T('\0'); + +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension); +#endif + + /* Check if valid directly on specified path */ + if (_tcschr (pFileName, _T('\\')) != NULL) + { + LPTSTR pFilePart; +#ifdef _DEBUG + DebugPrintf (_T("Absolute or relative path is given.\n")); +#endif + + if (GetFullPathName (pFileName, + CMDLINE_LENGTH, + szPathBuffer, + &pFilePart) ==0) + return FALSE; + + if(pFilePart == 0) + return FALSE; + /* Add extension and test file: */ + if (pExtension) + _tcscat(szPathBuffer, pExtension); + + if (IsExistingFile (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + return FALSE; + } + + /* search in current directory */ + len = GetCurrentDirectory (CMDLINE_LENGTH, szPathBuffer); + if (szPathBuffer[len - 1] != _T('\\')) + { + szPathBuffer[len] = _T('\\'); + szPathBuffer[len + 1] = _T('\0'); + } + _tcscat (szPathBuffer, pFileName); + + if (pExtension) + _tcscat (szPathBuffer, pExtension); + + if (IsExistingFile (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + + + + /* load environment varable PATH into buffer */ + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer); + } + + + /* search in PATH */ + s = pszBuffer; + while (s && *s) + { + f = _tcschr (s, _T(';')); + + if (f) + { + _tcsncpy (szPathBuffer, s, (size_t)(f-s)); + szPathBuffer[f-s] = _T('\0'); + s = f + 1; + } + else + { + _tcscpy (szPathBuffer, s); + s = NULL; + } + + len = _tcslen(szPathBuffer); + if (szPathBuffer[len - 1] != _T('\\')) + { + szPathBuffer[len] = _T('\\'); + szPathBuffer[len + 1] = _T('\0'); + } + _tcscat (szPathBuffer, pFileName); + + if (pExtension) + _tcscat (szPathBuffer, pExtension); + + if (IsExistingFile (szPathBuffer)) + { +#ifdef _DEBUG + DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer); +#endif + free (pszBuffer); + _tcscpy (pFullName, szPathBuffer); + return TRUE; + } + } + free (pszBuffer); + return FALSE; +} + + +BOOL +SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName) +{ + static TCHAR pszDefaultPathExt[] = _T(".COM;.EXE;.BAT;.CMD"); + LPTSTR pszBuffer = NULL; + LPTSTR pCh; + LPTSTR pExt; + DWORD dwBuffer; +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName); +#endif + /* load environment varable PATHEXT */ + pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR)); + dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE); + if (dwBuffer > ENV_BUFFER_SIZE) + { + pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); + GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer); + } + else if (0 == dwBuffer) + { + _tcscpy(pszBuffer, pszDefaultPathExt); + } + +#ifdef _DEBUG + DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer); +#endif + + pExt = _tcsrchr(pFileName, _T('.')); + if (pExt != NULL) + { + LPTSTR pszBuffer2; + pszBuffer2 = _tcsdup(pszBuffer); + if (pszBuffer2) + { + pCh = _tcstok(pszBuffer2, _T(";")); + while (pCh) + { + if (0 == _tcsicmp(pCh, pExt)) + { + free(pszBuffer); + free(pszBuffer2); + return SearchForExecutableSingle(pFileName, pFullName, NULL); + } + pCh = _tcstok(NULL, _T(";")); + } + free(pszBuffer2); + } + } + + pCh = _tcstok(pszBuffer, _T(";")); + while (pCh) + { + if (SearchForExecutableSingle(pFileName, pFullName, pCh)) + { + free(pszBuffer); + return TRUE; + } + pCh = _tcstok(NULL, _T(";")); + } + + free(pszBuffer); + return FALSE; +} + +/* EOF */ diff --git a/reactos/base/shell/cmd/window.c b/reactos/base/shell/cmd/window.c new file mode 100644 index 00000000000..10ac14c1bf3 --- /dev/null +++ b/reactos/base/shell/cmd/window.c @@ -0,0 +1,231 @@ +/* $Id$ + * + * WINDOW.C - activate & window internal commands. + * + * clone from 4nt activate command + * + * 10 Sep 1999 (Paolo Pantaleo) + * started (window command in WINDOW.c) + * + * 29 Sep 1999 (Paolo Pantaleo) + * activate and window in a single file using mainly the same code + * (nice size optimization :) + * + * 30-Apr-2005 (Magnus Olsen) ) + * Remove all hardcode string to En.rc + */ + + +#include +#include "resource.h" + +#if ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) ) + + +#define A_MIN 0x01 +#define A_MAX 0x02 +#define A_RESTORE 0x04 +#define A_POS 0x08 +#define A_SIZE 0x10 +#define A_CLOSE 0x20 + + +/*service funciton to perform actions on windows + + param is a string to parse for options/actions + hWnd is the handle of window on wich perform actions + +*/ + +static INT ServiceActivate (LPTSTR param, HWND hWnd) +{ + LPTSTR *p = 0, p_tmp; + INT argc = 0, i; + INT iAction = 0; + LPTSTR title = 0; + WINDOWPLACEMENT wp; + RECT pos; + LPTSTR tmp; + + + if (*param) + p = split(param, &argc, FALSE); + + for (i = 0; i < argc; i++) + { + p_tmp = p[i]; + if (*p_tmp == _T('/')) + p_tmp++; + + if (_tcsicmp(p_tmp, _T("min")) == 0) + { + iAction |= A_MIN; + continue; + } + + if (_tcsicmp(p_tmp, _T("max")) == 0) + { + iAction |= A_MAX; + continue; + } + + if (_tcsicmp(p_tmp, _T("restore")) == 0) + { + iAction |= A_RESTORE; + continue; + } + + if (_tcsicmp(p_tmp, _T("close")) == 0) + { + iAction |= A_CLOSE; + continue; + } + + if (_tcsnicmp(p_tmp, _T("pos"), 3) == 0) + { + iAction |= A_POS; + tmp = p_tmp+3; + if (*tmp == _T('=')) + tmp++; + + pos.left= _ttoi(tmp); + if(!(tmp=_tcschr(tmp, _T(',')))) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + + pos.top = _ttoi (++tmp); + if(!(tmp=_tcschr(tmp, _T(',')))) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + + pos.right = _ttoi(++tmp) + pos.left; + if (!(tmp = _tcschr(tmp, _T(',')))) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + pos.bottom = _ttoi(++tmp) + pos.top; + continue; + } + + if (_tcsnicmp(p_tmp, _T("size"), 4)==0) + { + iAction |=A_SIZE; + continue; + } + + /* none of them=window title */ + if (title) + { + error_invalid_parameter_format(p[i]); + freep(p); + return 1; + } + + if (p_tmp[0] == _T('"')) + { + title = (p_tmp + 1); + *_tcschr(p_tmp + 1, _T('"')) = 0; + continue; + } + title = p_tmp; + } + + if (title) + SetWindowText(hWnd, title); + + wp.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(hWnd, &wp); + + if (iAction & A_POS) + wp.rcNormalPosition = pos; + + if (iAction & A_MIN) + wp.showCmd = SW_MINIMIZE; + + if (iAction & A_MAX) + wp.showCmd = SW_SHOWMAXIMIZED; + + /*if no actions are specified default is SW_RESTORE*/ + if ((iAction & A_RESTORE) || (!iAction)) + wp.showCmd = SW_RESTORE; + + if (iAction & A_CLOSE) + { +#ifdef _DEBUG + ConErrPrintf(_T("!!!FIXME: CLOSE Not implemented!!!\n")); +#endif + } + + wp.length = sizeof(WINDOWPLACEMENT); + SetWindowPlacement(hWnd, &wp); + + if (p) + freep(p); + + return 0; +} + + + + +INT CommandWindow (LPTSTR cmd, LPTSTR param) +{ + HWND hwnd; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_WINDOW_HELP1); + return 0; + } + + hwnd = GetConsoleWindow(); + Sleep(0); + return ServiceActivate(param, hwnd); +} + + +INT CommandActivate (LPTSTR cmd, LPTSTR param) +{ + HWND hwnd; + LPTSTR *arg; + INT argc; + + if (_tcsncmp (param, _T("/?"), 2) == 0) + { + ConOutResPaging(TRUE,STRING_WINDOW_HELP2); + return 0; + } + + if(!(*param)) + return 1; + + /*Split the user input into array*/ + arg = split (param, &argc, FALSE); + if(argc < 2) + { + if(arg != NULL) + freep(arg); + } + hwnd = FindWindow(NULL, arg[0]); + if (hwnd == NULL) + { + if(arg != NULL) + freep(arg); + ConErrResPuts(STRING_WINDOW_ERROR1); + return 1; + } + if(arg != NULL) + freep(arg); + + return ServiceActivate(param, hwnd); +} + +#endif /* ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) ) */ diff --git a/reactos/base/shell/explorer/Doxyfile b/reactos/base/shell/explorer/Doxyfile new file mode 100644 index 00000000000..1ffba219694 --- /dev/null +++ b/reactos/base/shell/explorer/Doxyfile @@ -0,0 +1,1169 @@ +# Doxyfile 1.3.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "ROS Explorer" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxy-doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = YES + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = NO + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . \ + desktop \ + dialogs \ + shell \ + taskbar \ + utility + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.cpp \ + *.c \ + *.hpp \ + *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = doxy-footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = YES + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 240 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = YES + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = YES + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __cplusplus + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = NO + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = YES diff --git a/reactos/base/shell/explorer/Doxyfile-all b/reactos/base/shell/explorer/Doxyfile-all new file mode 100644 index 00000000000..42b61db9f85 --- /dev/null +++ b/reactos/base/shell/explorer/Doxyfile-all @@ -0,0 +1,1169 @@ +# Doxyfile 1.3.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "ROS Explorer" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxy-doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = YES + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. + +SHOW_DIRECTORIES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = NO + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = . \ + desktop \ + dialogs \ + shell \ + taskbar \ + utility + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.cpp \ + *.c \ + *.hpp \ + *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = doxy-footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = YES + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 240 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = YES + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = YES + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __cplusplus + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = NO + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = YES diff --git a/reactos/base/shell/explorer/Jamfile b/reactos/base/shell/explorer/Jamfile new file mode 100644 index 00000000000..0938167f781 --- /dev/null +++ b/reactos/base/shell/explorer/Jamfile @@ -0,0 +1,60 @@ +# +# Jamfile for Explorer to be used with Boost Build V2 +# + + +# import rc ; +import rc-mingw ; + + +EXPAT_INC = [ modules.peek : EXPAT_INC ] ; + +exe explorer : + explorer.cpp + explorer_intres.rc + shell/entries.cpp + shell/filechild.cpp + shell/mainframe.cpp + shell/pane.cpp + shell/shellbrowser.cpp + shell/shellfs.cpp + shell/unixfs.cpp + shell/winfs.cpp + shell/ntobjfs.cpp + shell/regfs.cpp + shell/fatfs.cpp + shell/webchild.cpp + services/startup.c + services/shellservices.cpp + taskbar/desktopbar.cpp + taskbar/quicklaunch.cpp + taskbar/startmenu.cpp + taskbar/taskbar.cpp + taskbar/traynotify.cpp + taskbar/favorites.cpp + desktop/desktop.cpp +# utility/splitpath.c + utility/dragdropimpl.cpp + utility/shellbrowserimpl.cpp + utility/shellclasses.cpp + utility/utility.cpp + utility/window.cpp + utility/xmlstorage.cpp + dialogs/searchprogram.cpp + dialogs/settings.cpp + i386-stub-win32.c + : WIN32 _WIN32_IE=0x0600 _WIN32_WINNT=0x0501 WINVER=0x0500 + . $(EXPAT_INC) +# only for GCC: -fexceptions -Wall -Wno-unused-value + gdi32 + ole32 + comctl32 + uuid + wsock32 + oleaut32 + msimg32 +# expat + notifyhook.dll + libexpat.dll + ; + diff --git a/reactos/base/shell/explorer/Make-rosshell.MinGW b/reactos/base/shell/explorer/Make-rosshell.MinGW new file mode 100644 index 00000000000..6d20a9c2678 --- /dev/null +++ b/reactos/base/shell/explorer/Make-rosshell.MinGW @@ -0,0 +1,92 @@ +# +# ReactOS shell +# +# Makefile.PCH +# +# MinGW Makefile with precompiled header support +# + +CC = gcc +CXX = g++ +LINK = g++ + +CFLAGS = -DWIN32 -DROSSHELL -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC) +RCFLAGS = -DWIN32 -DROSSHELL -D__WINDRES__ +LFLAGS = -Wl,--subsystem,windows + +ifdef DEBUG +CFLAGS += -D_DEBUG -g +RCFLAGS += -D_DEBUG +LFLAGS += -g +else +CFLAGS += -DNDEBUG -Os #-march=pentium4 +RCFLAGS += -DNDEBUG +LFLAGS += -s +endif + +ifndef UNICODE +UNICODE = 1 +endif + +ifeq ($(UNICODE),1) +CFLAGS += -DUNICODE +# LFLAGS+= -Wl,--entry,_wWinMain@16 +RCFLAGS += -DUNICODE +endif + +CXXFLAGS = $(CFLAGS) + +EXEC_SUFFIX = .exe +RES_SUFFIX = .coff + +VPATH = shell utility taskbar desktop dialogs services + +PROGRAM = rosshell + +TARGET = $(PROGRAM)$(EXEC_SUFFIX) + +OBJECTS = \ + startup.o \ + shellclasses.o \ + utility.o \ + window.o \ + dragdropimpl.o \ + shellbrowserimpl.o \ + explorer.o \ + entries.o \ + winfs.o \ + shellfs.o \ + pane.o \ + desktop.o \ + desktopbar.o \ + taskbar.o \ + startmenu.o \ + shellservices.o \ + traynotify.o \ + quicklaunch.o \ + favorites.o \ + searchprogram.o \ + settings.o \ + i386-stub-win32.o \ + xmlstorage.o + +LIBS = gdi32 comctl32 msimg32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 + +all: precomp.h.gch $(TARGET) + +precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h + $(CXX) $(CFLAGS) precomp.h + +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) + +$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico + windres $(RCFLAGS) -o $@ explorer_intres.rc + +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + +clean: + rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \ + desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o diff --git a/reactos/base/shell/explorer/Make-rosshell.mak b/reactos/base/shell/explorer/Make-rosshell.mak new file mode 100644 index 00000000000..fa428b1acc1 --- /dev/null +++ b/reactos/base/shell/explorer/Make-rosshell.mak @@ -0,0 +1,68 @@ +# +# ReactOS shell +# +# Makefile +# + +PATH_TO_TOP := ../../.. + +TARGET_TYPE := program + +TARGET_APPTYPE := windows + +TARGET_NAME := rosshell + +TARGET_INSTALLDIR := . + +TARGET_CFLAGS := \ + -D__USE_W32API -DWIN32 -D_ROS_ \ + -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 \ + -DUNICODE -fexceptions -Wall -g \ + -I../../../include/expat + +TARGET_CPPFLAGS := $(TARGET_CFLAGS) + +TARGET_RCFLAGS := -D__USE_W32API -DWIN32 -D_ROS_ -D__WINDRES__ + +TARGET_SDKLIBS := \ + gdi32.a user32.a comctl32.a ole32.a oleaut32.a shell32.a expat.a \ + notifyhook.a ws2_32.a msimg32.a + +TARGET_GCCLIBS := stdc++ uuid + +TARGET_OBJECTS := \ + explorer.o \ + i386-stub-win32.o \ + desktop/desktop.o \ + dialogs/searchprogram.o \ + dialogs/settings.o \ + shell/entries.o \ + shell/shellfs.o \ + shell/pane.o \ + shell/winfs.o \ + services/startup.o \ + services/shellservices.o \ + taskbar/desktopbar.o \ + taskbar/taskbar.o \ + taskbar/startmenu.o \ + taskbar/traynotify.o \ + taskbar/quicklaunch.o \ + taskbar/favorites.o \ + utility/shellclasses.o \ + utility/utility.o \ + utility/window.o \ + utility/dragdropimpl.o \ + utility/shellbrowserimpl.o \ + utility/xmlstorage.o + +TARGET_CPPAPP := yes + +TARGET_PCH := precomp.h + +SUBDIRS := notifyhook + +DEP_OBJECTS := $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak +include $(TOOLS_PATH)/helper.mk +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/base/shell/explorer/Makefile.MinGW b/reactos/base/shell/explorer/Makefile.MinGW new file mode 100644 index 00000000000..678fe28ae8d --- /dev/null +++ b/reactos/base/shell/explorer/Makefile.MinGW @@ -0,0 +1,96 @@ +# +# ReactOS explorer +# +# Makefile.MinGW +# + +CC = gcc +CXX = g++ +LINK = g++ + +# -D_NO_ALPHABLEND for builds without msimg32.dll dependency +CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC) +RCFLAGS = -DWIN32 -D__WINDRES__ +LFLAGS = -Wl,--subsystem,windows + +ifdef DEBUG +CFLAGS += -D_DEBUG -g +RCFLAGS += -D_DEBUG +LFLAGS += -g +else +CFLAGS += -DNDEBUG -Os +RCFLAGS += -DNDEBUG +LFLAGS += -s +endif + +ifndef UNICODE +UNICODE = 1 +endif + +ifeq ($(UNICODE),1) +CFLAGS += -DUNICODE +# LFLAGS+= -Wl,--entry,_wWinMain@16 +RCFLAGS += -DUNICODE +endif + +CXXFLAGS = $(CFLAGS) + +EXEC_SUFFIX = .exe +RES_SUFFIX = .coff + +VPATH = shell utility taskbar desktop dialogs services + +PROGRAM = explorer + +TARGET = $(PROGRAM)$(EXEC_SUFFIX) + +OBJECTS = \ + startup.o \ + shellclasses.o \ + utility.o \ + window.o \ + dragdropimpl.o \ + shellbrowserimpl.o \ + shellservices.o \ + explorer.o \ + entries.o \ + winfs.o \ + unixfs.o \ + shellfs.o \ + ntobjfs.o \ + regfs.o \ + fatfs.o \ + webchild.o \ + mainframe.o \ + filechild.o \ + pane.o \ + shellbrowser.o \ + desktop.o \ + desktopbar.o \ + taskbar.o \ + startmenu.o \ + traynotify.o \ + quicklaunch.o \ + favorites.o \ + searchprogram.o \ + settings.o \ + i386-stub-win32.o \ + xmlstorage.o + +LIBS = gdi32 comctl32 msimg32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 + +all: $(TARGET) + +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) + +$(PROGRAM)$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico + windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc + +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + +clean: + rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) \ + desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o diff --git a/reactos/base/shell/explorer/Makefile.PCH b/reactos/base/shell/explorer/Makefile.PCH new file mode 100644 index 00000000000..a301d6ae7ee --- /dev/null +++ b/reactos/base/shell/explorer/Makefile.PCH @@ -0,0 +1,100 @@ +# +# ReactOS explorer +# +# Makefile.PCH +# +# MinGW Makefile with precompiled header support +# + +CC = gcc +CXX = g++ +LINK = g++ + +CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC) +RCFLAGS = -DWIN32 -D__WINDRES__ +LFLAGS = -Wl,--subsystem,windows + +ifdef DEBUG +CFLAGS += -D_DEBUG -g +RCFLAGS += -D_DEBUG +LFLAGS += -g +else +CFLAGS += -DNDEBUG -Os #-march=pentium4 +RCFLAGS += -DNDEBUG +LFLAGS += -s +endif + +ifndef UNICODE +UNICODE = 1 +endif + +ifeq ($(UNICODE),1) +CFLAGS += -DUNICODE +# LFLAGS+= -Wl,--entry,_wWinMain@16 +RCFLAGS += -DUNICODE +endif + +CXXFLAGS = $(CFLAGS) + +EXEC_SUFFIX = .exe +RES_SUFFIX = .coff + +VPATH = shell utility taskbar desktop dialogs services + +PROGRAM = explorer + +TARGET = $(PROGRAM)$(EXEC_SUFFIX) + +OBJECTS = \ + startup.o \ + shellclasses.o \ + utility.o \ + window.o \ + dragdropimpl.o \ + shellbrowserimpl.o \ + shellservices.o \ + explorer.o \ + entries.o \ + winfs.o \ + unixfs.o \ + shellfs.o \ + ntobjfs.o \ + regfs.o \ + fatfs.o \ + webchild.o \ + mainframe.o \ + filechild.o \ + pane.o \ + shellbrowser.o \ + desktop.o \ + desktopbar.o \ + taskbar.o \ + startmenu.o \ + traynotify.o \ + quicklaunch.o \ + favorites.o \ + searchprogram.o \ + settings.o \ + i386-stub-win32.o \ + xmlstorage.o + +LIBS = gdi32 comctl32 msimg32 ole32 uuid +DELAYIMPORTS = oleaut32 wsock32 + +all: precomp.h.gch $(TARGET) + +precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h + $(CXX) $(CFLAGS) precomp.h + +$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll + $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS)) + +$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico + windres $(RCFLAGS) -o $@ explorer_intres.rc + +notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h + $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@ + +clean: + rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \ + desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o diff --git a/reactos/base/shell/explorer/Makefile.Wine b/reactos/base/shell/explorer/Makefile.Wine new file mode 100644 index 00000000000..c4d51b3f6e0 --- /dev/null +++ b/reactos/base/shell/explorer/Makefile.Wine @@ -0,0 +1,400 @@ +TOPSRCDIR = ../.. +TOPOBJDIR = ../.. +SRCDIR = . + +MODULE = explorer.exe +APPMODE = gui +IMPORTS = shell32 comctl32 msimg32 ole32 user32 gdi32 kernel32 advapi32 oleaut32 +EXTRADEFS = -D__WINE__ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -D__MINGW32__ -DCINTERFACE +EXTRA_OBJS = notifyhook.dll libexpat.dll +EXTRALIBS = $(LIBUUID) + +C_SRCS = \ + services/startup.c \ + utility/splitpath.c + +CPP_SRCS = \ + explorer.cpp \ + desktop/desktop.cpp \ + utility/shellclasses.cpp \ + utility/utility.cpp \ + utility/window.cpp \ + utility/dragdropimpl.cpp \ + utility/shellbrowserimpl.cpp \ + utility/xmlstorage.cpp \ + shell/entries.cpp \ + shell/winfs.cpp \ + shell/unixfs.cpp \ + shell/shellfs.cpp \ + shell/mainframe.cpp \ + shell/filechild.cpp \ + shell/pane.cpp \ + shell/shellbrowser.cpp \ + shell/ntobjfs.cpp \ + shell/regfs.cpp \ + shell/fatfs.cpp \ + shell/webchild.cpp \ + services/shellservices.cpp \ + taskbar/desktopbar.cpp \ + taskbar/taskbar.cpp \ + taskbar/startmenu.cpp \ + taskbar/traynotify.cpp \ + taskbar/quicklaunch.cpp \ + taskbar/favorites.cpp \ + dialogs/searchprogram.cpp \ + dialogs/settings.cpp + +RC_SRCS = explorer_intres.rc +EXTRARCFLAGS = -D__WRC__ -D_WIN32 + + +# Global rules for building a Winelib program -*-Makefile-*- +# +# Each individual makefile should define the following variables: +# MODULE : name of the main module being built +# APPMODE : program mode (cui,gui,cuiw,guiw) +# EXTRALIBS : extra libraries to link in (optional) +# EXTRADEFS : extra symbol definitions, like -DWINELIB (optional) +# +# plus all variables required by the global Make.rules.in +# + +DEFS = -D_REENTRANT -fPIC $(EXTRADEFS) +LDDLLFLAGS = -Wl,-Bsymbolic,-z,defs +ALL_OBJS = $(OBJS) $(MODULE).dbg.o +ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS) +BASEMODULE = $(MODULE:.exe=) +TESTIMPORTS = $(DELAYIMPORTS) $(IMPORTS) +RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR) $(PLTESTPROGRAM:%=-p %) + + +# Global rules shared by all makefiles -*-Makefile-*- +# +# Each individual makefile must define the following variables: +# TOPSRCDIR : top-level source directory +# TOPOBJDIR : top-level object directory +# SRCDIR : source directory for this module +# MODULE : name of the module being built +# +# Each individual makefile may define the following additional variables: +# C_SRCS : C sources for the module +# CPP_SRCS : C++ sources for the module +# C_SRCS16 : 16-bit C sources for the module +# RC_SRCS : resource source files +# EXTRA_SRCS : extra source files for make depend +# EXTRA_OBJS : extra object files +# IMPORTS : dlls to import +# DELAYIMPORTS : dlls to import in delayed mode +# SUBDIRS : subdirectories that contain a Makefile +# EXTRASUBDIRS : subdirectories that do not contain a Makefile +# INSTALLSUBDIRS : subdirectories to run make install/uninstall into + +# First some useful definitions + +SHELL = /bin/sh +CC = gcc +CXX = g++ +CPP = gcc -E +#CFLAGS = -g -O2 +CFLAGS = -g +CPPFLAGS = +LIBS = -lm -lstdc++ +YACC = bison -y +LEX = flex +LEXLIB = -lfl +EXEEXT = +OBJEXT = o +LIBEXT = so +DLLEXT = .so +IMPLIBEXT = def +LDSHARED = $(CC) -shared $(SONAME:%=-Wl,-soname,%) +DLLTOOL = false +DLLWRAP = +AR = ar rc +RANLIB = ranlib +STRIP = strip +WINDRES = mingw32-windres +LN = ln +LN_S = ln -s +TOOLSDIR = $(TOPOBJDIR) +AS = as +LD = ld +LDFLAGS = +LDCOMBINE = $(LD) -r +RM = rm -f +MV = mv +LINT = +LINTFLAGS = +INCLUDES = -I$(SRCDIR) -I. -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include $(EXTRAINCL) +EXTRACFLAGS = -mpreferred-stack-boundary=2 -fno-strict-aliasing -gstabs+ -Wpointer-arith +ALLCFLAGS = $(INCLUDES) $(DEFS) $(EXTRACFLAGS) $(CPPFLAGS) $(CFLAGS) +ALLLINTFLAGS = $(INCLUDES) $(DEFS) $(LINTFLAGS) +MKINSTALLDIRS= $(TOPSRCDIR)/tools/mkinstalldirs -m 755 +WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi_check/winapi_check +WINEWRAPPER = $(TOPSRCDIR)/tools/winewrapper +C2MAN = $(TOPSRCDIR)/tools/c2man.pl +RUNTEST = $(TOPSRCDIR)/tools/runtest +WINEBUILD = $(TOOLSDIR)/tools/winebuild/winebuild +MAKEDEP = $(TOOLSDIR)/tools/makedep +WRC = $(TOOLSDIR)/tools/wrc/wrc +WMC = $(TOOLSDIR)/tools/wmc/wmc +WIDL = $(TOOLSDIR)/tools/widl/widl +RC = $(WRC) +RC16 = $(WRC) +RCFLAGS = --nostdinc $(INCLUDES) $(EXTRARCFLAGS) +RC16FLAGS = -O res16 $(RCFLAGS) +LDPATH = LD_LIBRARY_PATH="$(TOOLSDIR)/libs/unicode:$$LD_LIBRARY_PATH" +DLLDIR = $(TOPOBJDIR)/dlls +LIBDIR = $(TOPOBJDIR)/libs +LIBPORT = -L$(TOPOBJDIR)/libs/port -lwine_port +LIBUNICODE = -L$(TOPOBJDIR)/libs/unicode -lwine_unicode +LIBUUID = -L$(TOPOBJDIR)/libs/uuid -lwine_uuid +LIBWINE = -L$(TOPOBJDIR)/libs/wine -lwine + + + +# Installation infos + +INSTALL = /usr/bin/install -c $(INSTALL_FLAGS) +INSTALL_PROGRAM = ${INSTALL} $(INSTALL_PROGRAM_FLAGS) +INSTALL_SCRIPT = ${INSTALL} $(INSTALL_SCRIPT_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 $(INSTALL_DATA_FLAGS) +prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +libdir = ${exec_prefix}/lib +datadir = ${prefix}/share +infodir = ${prefix}/info +mandir = ${prefix}/man +sysconfdir = ${prefix}/etc +includedir = ${prefix}/include/wine +dlldir = ${exec_prefix}/lib/wine +prog_manext = 1 +api_manext = 3w +conf_manext = 5 +CLEAN_FILES = *.o *.a *.so *.ln *.$(LIBEXT) \\\#*\\\# *~ *% .\\\#* *.bak *.orig *.rej \ + *.flc *.spec.c *.spec.def *.dbg.c y.tab.c y.tab.h lex.yy.c core */*.o + +OBJS = $(C_SRCS:.c=.o) $(CPP_SRCS:.cpp=.o) $(EXTRA_OBJS) + +RCOBJS = $(RC_SRCS:.rc=.res.o) +LINTS = $(C_SRCS:.c=.ln) $(CPP_SRCS:.cpp=.ln) + +# Implicit rules + +.SUFFIXES: .mc .rc .mc.rc .res .res.o .coff .spec .spec.c .spec.def .ok + +.c.o: + $(CC) -c $(ALLCFLAGS) -o $@ $< + +.cpp.o: + $(CXX) -c $(ALLCFLAGS) -o $@ $< + +.s.o: + $(AS) -o $@ $< + +.mc.mc.rc: + $(LDPATH) $(WMC) -i -U -H /dev/null -o $@ $< + +.rc.res: + $(LDPATH) $(RC) $(RCFLAGS) -fo$@ $< + +.res.res.o: + $(WINDRES) -i $< -o $@ + +.rc.coff: + $(WINDRES) -i $< -o $@ + +.spec.spec.c: + $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --spec $< + +.spec.spec.def: + $(WINEBUILD) $(DEFS) -o $@ --def $< + +.c.ln: + $(LINT) -c $(ALLLINTFLAGS) $< || ( $(RM) $@ && exit 1 ) + +.c.ok: + $(RUNTEST) $(RUNTESTFLAGS) $< && touch $@ + +# 'all' target first in case the enclosing Makefile didn't define any target + +all: Makefile + +filter: + @$(TOPSRCDIR)/tools/winapi/make_filter --make $(MAKE) all + +.PHONY: all filter + +# Rule for main module debug channels + +$(MODULE).dbg.c: $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) $(WINEBUILD) + $(WINEBUILD) $(DEFS) -o $@ --debug -C$(SRCDIR) $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) + +# Rule to rebuild the tools + +$(MAKEDEP): + cd $(TOOLSDIR)/tools && $(MAKE) `basename $@` + +# Rules for makefile + +Makefile: Makefile.in $(TOPSRCDIR)/configure + @echo Makefile is older than $?, please rerun $(TOPSRCDIR)/configure + @exit 1 + +# Rule for linting + +$(MODULE).ln : $(LINTS) + if test "$(LINTS)" ; \ + then \ + $(LINT) $(ALLLINTFLAGS) -o$(MODULE) $(LINTS) ; \ + $(MV) llib-l$(MODULE).ln $(MODULE).ln ; \ + else \ + $(LINT) $(ALLLINTFLAGS) -C$(MODULE) /dev/null ; \ + fi + +lint:: $(MODULE).ln + +# Rules for Windows API checking + +winapi_check:: dummy + $(WINAPI_CHECK) $(WINAPI_CHECK_FLAGS) $(WINAPI_CHECK_EXTRA_FLAGS) . + +.PHONY: winapi_check + +# Rules for dependencies + +$(SUBDIRS:%=%/__depend__): $(MAKEDEP) dummy + cd `dirname $@` && $(MAKE) depend + +depend: $(MAKEDEP) $(SUBDIRS:%=%/__depend__) + $(MAKEDEP) $(INCLUDES) -C$(SRCDIR) $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) $(RC_SRCS) $(RC_SRCS16) $(MC_SRCS) $(IDL_SRCS) $(EXTRA_SRCS) + +.PHONY: depend $(SUBDIRS:%=%/__depend__) + +# Rules for cleaning + +$(SUBDIRS:%=%/__clean__): dummy + cd `dirname $@` && $(MAKE) clean + +$(SUBDIRS:%=%/__testclean__): dummy + cd `dirname $@` && $(MAKE) testclean + +$(EXTRASUBDIRS:%=%/__clean__): dummy + -cd `dirname $@` && $(RM) $(CLEAN_FILES) + +testclean:: $(SUBDIRS:%=%/__testclean__) + +clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__) + $(RM) $(CLEAN_FILES) $(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res) $(MC_SRCS:.mc=.mc.rc) $(PROGRAMS) + +.PHONY: clean testclean $(SUBDIRS:%=%/__clean__) $(SUBDIRS:%=%/__testclean__) $(EXTRASUBDIRS:%=%/__clean__) + +# Rules for installing + +$(SUBDIRS:%=%/__install__): dummy + cd `dirname $@` && $(MAKE) install + +$(SUBDIRS:%=%/__install-lib__): dummy + cd `dirname $@` && $(MAKE) install-lib + +$(SUBDIRS:%=%/__install-dev__): dummy + cd `dirname $@` && $(MAKE) install-dev + +$(SUBDIRS:%=%/__uninstall__): dummy + cd `dirname $@` && $(MAKE) uninstall + +install:: $(INSTALLSUBDIRS:%=%/__install__) + +uninstall:: $(INSTALLSUBDIRS:%=%/__uninstall__) + +.PHONY: install install-lib install-dev uninstall \ + $(SUBDIRS:%=%/__install__) $(SUBDIRS:%=%/__uninstall__) \ + $(SUBDIRS:%=%/__install-lib__) $(SUBDIRS:%=%/__install-dev__) + +# Rules for checking that no imports are missing + +$(SUBDIRS:%=%/__checklink__): dummy + @cd `dirname $@` && $(MAKE) checklink + +.PHONY: checklink $(SUBDIRS:%=%/__checklink__) + +# Rules for testing + +$(SUBDIRS:%=%/__test__): dummy + @cd `dirname $@` && $(MAKE) test + +$(SUBDIRS:%=%/__crosstest__): dummy + @cd `dirname $@` && $(MAKE) crosstest + +.PHONY: check test crosstest $(SUBDIRS:%=%/__test__) $(SUBDIRS:%=%/__crosstest__) + +# Misc. rules + +$(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res): $(WRC) + +$(MC_SRCS:.mc=.mc.rc): $(WMC) + +$(IDL_SRCS:.idl=.h): $(WIDL) + +$(SUBDIRS): dummy + @cd $@ && $(MAKE) + +dummy: + +.PHONY: dummy $(SUBDIRS) + +# End of global rules + +all: $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT) + +# Rule for main module spec file + +$(MODULE).spec.c: $(RC_SRCS:.rc=.res) $(ALL_OBJS) $(WINEBUILD) + $(WINEBUILD) $(DEFS) -o $@ --exe $(MODULE) $(APPMODE:%=--exe-mode %) $(RC_SRCS:.rc=.res) $(ALL_OBJS) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%) + +# Rules for .so main module + +$(MODULE).so: $(MODULE).spec.o $(ALL_OBJS) Makefile.in + $(LDSHARED) $(LDDLLFLAGS) $(MODULE).spec.o $(ALL_OBJS) -o $@ $(ALL_LIBS) -lc + +$(BASEMODULE): $(WINEWRAPPER) + $(RM) $@ && $(LN_S) $(WINEWRAPPER) $@ + +# Rules for .exe main module + +$(MODULE): $(ALL_OBJS) $(RCOBJS) Makefile.in + $(CC) $(ALL_OBJS) $(RCOBJS) -o $@ $(DELAYIMPORTS:%=-l%) $(IMPORTS:%=-l%) $(ALL_LIBS) + +# Rules for testing + +check test:: $(SUBDIRS:%=%/__test__) + +$(TESTRESULTS): $(MODULE)$(DLLEXT) + +# Rules for installation + +.PHONY: install_prog install_prog.so uninstall_prog uninstall_prog.so + +install_prog.so: $(MODULE).so dummy + $(MKINSTALLDIRS) $(dlldir) + $(INSTALL_PROGRAM) $(MODULE).so $(dlldir)/$(MODULE).so + +install_prog: $(MODULE) dummy + $(MKINSTALLDIRS) $(bindir) + $(INSTALL_PROGRAM) $(MODULE) $(bindir)/$(MODULE) + +uninstall_prog.so: dummy + $(RM) $(dlldir)/$(MODULE).so + +uninstall_prog: dummy + $(RM) $(bindir)/$(MODULE) + +install:: install_prog$(DLLEXT) + +uninstall:: uninstall_prog$(DLLEXT) + +clean:: + $(RM) $(BASEMODULE) $(MODULE) + +### Dependencies: diff --git a/reactos/base/shell/explorer/desktop/desktop.cpp b/reactos/base/shell/explorer/desktop/desktop.cpp new file mode 100644 index 00000000000..a3d0215e522 --- /dev/null +++ b/reactos/base/shell/explorer/desktop/desktop.cpp @@ -0,0 +1,840 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // desktop.cpp + // + // Martin Fuchs, 09.08.2003 + // + + +#include + +#include "../resource.h" + +#include "../taskbar/desktopbar.h" +#include "../taskbar/taskbar.h" // for PM_GET_LAST_ACTIVE + + +static BOOL (WINAPI*SetShellWindow)(HWND); +static BOOL (WINAPI*SetShellWindowEx)(HWND, HWND); + + +#ifdef _USE_HDESK + +Desktop::Desktop(HDESK hdesktop/*, HWINSTA hwinsta*/) + : _hdesktop(hdesktop) +// _hwinsta(hwinsta) +{ +} + +Desktop::~Desktop() +{ + if (_hdesktop) + CloseDesktop(_hdesktop); + +// if (_hwinsta) +// CloseWindowStation(_hwinsta); + + if (_pThread.get()) { + _pThread->Stop(); + _pThread.release(); + } +} + +#endif + + +Desktops::Desktops() + : _current_desktop(0) +{ +} + +Desktops::~Desktops() +{ + // show all hidden windows + for(iterator it_dsk=begin(); it_dsk!=end(); ++it_dsk) + for(WindowSet::iterator it=it_dsk->_windows.begin(); it!=it_dsk->_windows.end(); ++it) + ShowWindowAsync(*it, SW_SHOW); +} + +void Desktops::init() +{ + resize(DESKTOP_COUNT); + +#ifdef _USE_HDESK + DesktopPtr& desktop = (*this)[0]; + + desktop = DesktopPtr(new Desktop(OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP))); +#endif +} + +#ifdef _USE_HDESK + +void Desktops::SwitchToDesktop(int idx) +{ + if (_current_desktop == idx) + return; + + DesktopPtr& desktop = (*this)[idx]; + + DesktopThread* pThread = NULL; + + if (desktop.get()) { + if (desktop->_hdesktop) + if (!SwitchDesktop(desktop->_hdesktop)) + return; + } else { + FmtString desktop_name(TEXT("Desktop %d"), idx); + + SECURITY_ATTRIBUTES saAttr = {sizeof(SECURITY_ATTRIBUTES), 0, TRUE}; +/* + HWINSTA hwinsta = CreateWindowStation(TEXT("ExplorerWinStation"), 0, GENERIC_ALL, &saAttr); + + if (!SetProcessWindowStation(hwinsta)) + return; +*/ + HDESK hdesktop = CreateDesktop(desktop_name, NULL, NULL, 0, GENERIC_ALL, &saAttr); + if (!hdesktop) + return; + + desktop = DesktopPtr(new Desktop(hdesktop/*, hwinsta*/)); + + pThread = new DesktopThread(*desktop); + } + + _current_desktop = idx; + + if (pThread) { + desktop->_pThread = DesktopThreadPtr(pThread); + pThread->Start(); + } +} + +int DesktopThread::Run() +{ + if (!SetThreadDesktop(_desktop._hdesktop)) + return -1; + + HDESK hDesk_old = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP); + + if (!SwitchDesktop(_desktop._hdesktop)) + return -1; + + if (!_desktop._hwndDesktop) + _desktop._hwndDesktop = DesktopWindow::Create(); + + int ret = Window::MessageLoop(); + + SwitchDesktop(hDesk_old); + + return ret; +} + +#else // _USE_HDESK + +static BOOL CALLBACK SwitchDesktopEnumFct(HWND hwnd, LPARAM lparam) +{ + WindowSet& windows = *(WindowSet*)lparam; + + if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop) + if (IsWindowVisible(hwnd)) + windows.insert(hwnd); + + return TRUE; +} + +void Desktops::SwitchToDesktop(int idx) +{ + if (_current_desktop == idx) + return; + + Desktop& old_desktop = (*this)[_current_desktop]; + WindowSet& windows = old_desktop._windows; + Desktop& desktop = (*this)[idx]; + + windows.clear(); + + // collect window handles of all other desktops + WindowSet other_wnds; + for(const_iterator it1=begin(); it1!=end(); ++it1) + for(WindowSet::const_iterator it2=it1->_windows.begin(); it2!=it1->_windows.end(); ++it2) + other_wnds.insert(*it2); + + // save currently visible application windows + EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows); + + old_desktop._hwndForeground = (HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_LAST_ACTIVE, 0, 0); + + // hide all windows of the previous desktop + for(WindowSet::iterator it=windows.begin(); it!=windows.end(); ++it) + ShowWindowAsync(*it, SW_HIDE); + + // show all windows of the new desktop + for(WindowSet::iterator it=desktop._windows.begin(); it!=desktop._windows.end(); ++it) + ShowWindowAsync(*it, SW_SHOW); + + if (desktop._hwndForeground) + SetForegroundWindow(desktop._hwndForeground); + + // remove the window handles of the other desktops from what we found on the previous desktop + for(WindowSet::const_iterator it=other_wnds.begin(); it!=other_wnds.end(); ++it) + windows.erase(*it); + + // We don't need to store the window handles of what's now visible the now current desktop. + desktop._windows.clear(); + + _current_desktop = idx; +} + +#endif // _USE_HDESK + + +static BOOL CALLBACK MinimizeDesktopEnumFct(HWND hwnd, LPARAM lparam) +{ + list& minimized = *(list*)lparam; + + if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop) + if (IsWindowVisible(hwnd) && !IsIconic(hwnd)) { + RECT rect; + + if (GetWindowRect(hwnd,&rect)) + if (rect.right>0 && rect.bottom>0 && + rect.right>rect.left && rect.bottom>rect.top) { + minimized.push_back(MinimizeStruct(hwnd, GetWindowStyle(hwnd))); + ShowWindowAsync(hwnd, SW_MINIMIZE); + } + } + + return TRUE; +} + + /// minimize/restore all windows on the desktop +void Desktops::ToggleMinimize() +{ + list& minimized = (*this)[_current_desktop]._minimized; + + if (minimized.empty()) { + EnumWindows(MinimizeDesktopEnumFct, (LPARAM)&minimized); + } else { + for(list::const_iterator it=minimized.begin(); it!=minimized.end(); ++it) + ShowWindowAsync(it->first, it->second&WS_MAXIMIZE? SW_MAXIMIZE: SW_RESTORE); + + minimized.clear(); + } +} + + +BOOL IsAnyDesktopRunning() +{ + HINSTANCE hUser32 = GetModuleHandle(TEXT("user32")); + + SetShellWindow = (BOOL(WINAPI*)(HWND)) GetProcAddress(hUser32, "SetShellWindow"); + SetShellWindowEx = (BOOL(WINAPI*)(HWND,HWND)) GetProcAddress(hUser32, "SetShellWindowEx"); + + return GetShellWindow() != 0; +} + + +BackgroundWindow::BackgroundWindow(HWND hwnd) + : super(hwnd) +{ + // set background brush for the short moment of displaying the + // background color while moving foreground windows + SetClassLong(hwnd, GCL_HBRBACKGROUND, COLOR_BACKGROUND+1); + + _display_version = RegGetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), 1); +} + +LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_ERASEBKGND: + DrawDesktopBkgnd((HDC)wparam); + return TRUE; + + case WM_MBUTTONDBLCLK: + /* Imagelist icons are missing if MainFrame::Create() is called directly from here! + explorer_show_frame(SW_SHOWNORMAL); */ + PostMessage(g_Globals._hwndDesktop, nmsg, wparam, lparam); + break; + + case PM_DISPLAY_VERSION: + if (lparam || wparam) { + DWORD or_mask = wparam; + DWORD reset_mask = LOWORD(lparam); + DWORD xor_mask = HIWORD(lparam); + _display_version = ((_display_version&~reset_mask) | or_mask) ^ xor_mask; + RegSetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), _display_version); + ///@todo Changing the PaintDesktopVersion-Flag needs a restart of the shell -> display a message box + InvalidateRect(_hwnd, NULL, TRUE); + } + return _display_version; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +void BackgroundWindow::DrawDesktopBkgnd(HDC hdc) +{ + PaintDesktop(hdc); + +/* special solid background + HBRUSH bkgndBrush = CreateSolidBrush(RGB(0,32,160)); // dark blue + FillRect(hdc, &rect, bkgndBrush); + DeleteBrush(bkgndBrush); +*/ +} + + +DesktopWindow::DesktopWindow(HWND hwnd) + : super(hwnd) +{ + _pShellView = NULL; +} + +DesktopWindow::~DesktopWindow() +{ + if (_pShellView) + _pShellView->Release(); +} + + +HWND DesktopWindow::Create() +{ + static IconWindowClass wcDesktop(TEXT("Progman"), IDI_REACTOS, CS_DBLCLKS); + /* (disabled because of small ugly temporary artefacts when hiding start menu) + wcDesktop.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1); */ + + int width = GetSystemMetrics(SM_CXSCREEN); + int height = GetSystemMetrics(SM_CYSCREEN); + + HWND hwndDesktop = Window::Create(WINDOW_CREATOR(DesktopWindow), + WS_EX_TOOLWINDOW, wcDesktop, TEXT("Program Manager"), WS_POPUP|WS_VISIBLE, //|WS_CLIPCHILDREN for SDI frames + 0, 0, width, height, 0); + + // work around to display desktop bar in Wine + ShowWindow(GET_WINDOW(DesktopWindow, hwndDesktop)->_desktopBar, SW_SHOW); + + // work around for Windows NT, Win 98, ... + // Without this the desktop has mysteriously only a size of 800x600 pixels. + MoveWindow(hwndDesktop, 0, 0, width, height, TRUE); + + return hwndDesktop; +} + + +LRESULT DesktopWindow::Init(LPCREATESTRUCT pcs) +{ + if (super::Init(pcs)) + return 1; + + HRESULT hr = GetDesktopFolder()->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView); +/* also possible: + SFV_CREATE sfv_create; + + sfv_create.cbSize = sizeof(SFV_CREATE); + sfv_create.pshf = GetDesktopFolder(); + sfv_create.psvOuter = NULL; + sfv_create.psfvcb = NULL; + + HRESULT hr = SHCreateShellFolderView(&sfv_create, &_pShellView); +*/ + HWND hWndView = 0; + + if (SUCCEEDED(hr)) { + FOLDERSETTINGS fs; + + fs.ViewMode = FVM_ICON; + fs.fFlags = FWF_DESKTOP|FWF_NOCLIENTEDGE|FWF_NOSCROLL|FWF_BESTFITWINDOW|FWF_SNAPTOGRID; //|FWF_AUTOARRANGE; + + ClientRect rect(_hwnd); + + hr = _pShellView->CreateViewWindow(NULL, &fs, this, &rect, &hWndView); + + ///@todo use IShellBrowser::GetViewStateStream() to restore previous view state -> see SHOpenRegStream() + + if (SUCCEEDED(hr)) { + g_Globals._hwndShellView = hWndView; + + // subclass shellview window + new DesktopShellView(hWndView, _pShellView); + + _pShellView->UIActivate(SVUIA_ACTIVATE_FOCUS); + + /* + IShellView2* pShellView2; + + hr = _pShellView->QueryInterface(IID_IShellView2, (void**)&pShellView2); + + SV2CVW2_PARAMS params; + params.cbSize = sizeof(SV2CVW2_PARAMS); + params.psvPrev = _pShellView; + params.pfs = &fs; + params.psbOwner = this; + params.prcView = ▭ + params.pvid = params.pvid;//@@ + + hr = pShellView2->CreateViewWindow2(¶ms); + params.pvid; + */ + + /* + IFolderView* pFolderView; + + hr = _pShellView->QueryInterface(IID_IFolderView, (void**)&pFolderView); + + if (SUCCEEDED(hr)) { + hr = pFolderView->GetAutoArrange(); + hr = pFolderView->SetCurrentViewMode(FVM_DETAILS); + } + */ + } + } + + if (hWndView && SetShellWindowEx) + SetShellWindowEx(_hwnd, hWndView); + else if (SetShellWindow) + SetShellWindow(_hwnd); + + // create the explorer bar + _desktopBar = DesktopBar::Create(); + g_Globals._hwndDesktopBar = _desktopBar; + + return 0; +} + + +LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + explorer_show_frame(SW_SHOWNORMAL); + break; + + case WM_GETISHELLBROWSER: + return (LRESULT)static_cast(this); + + case WM_DESTROY: + + ///@todo use IShellBrowser::GetViewStateStream() and _pShellView->SaveViewState() to store view state + + if (SetShellWindow) + SetShellWindow(0); + break; + + case WM_CLOSE: + ShowExitWindowsDialog(_hwnd); + break; + + case WM_SYSCOMMAND: + if (wparam == SC_TASKLIST) { + if (_desktopBar) + SendMessage(_desktopBar, nmsg, wparam, lparam); + } + goto def; + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + + +HRESULT DesktopWindow::OnDefaultCommand(LPIDA pida) +{ +#ifndef ROSSHELL // in shell-only-mode fall through and let shell32 handle the command + if (MainFrameBase::OpenShellFolders(pida, 0)) + return S_OK; +#endif + + return E_NOTIMPL; +} + + +DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView) + : super(hwnd), + _pShellView(pShellView) +{ + _hwndListView = ::GetNextWindow(hwnd, GW_CHILD); + + SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE); + + // work around for Windows NT, Win 98, ... + // Without this the desktop has mysteriously only a size of 800x600 pixels. + ClientRect rect(hwnd); + MoveWindow(_hwndListView, 0, 0, rect.right, rect.bottom, TRUE); + + // subclass background window + new BackgroundWindow(_hwndListView); + + _icon_algo = 1; // default icon arrangement + + PositionIcons(); + InitDragDrop(); +} + +bool DesktopShellView::InitDragDrop() +{ + CONTEXT("DesktopShellView::InitDragDrop()"); + + _pDropTarget = new DesktopDropTarget(_hwnd); + + if (!_pDropTarget) + return false; + + _pDropTarget->AddRef(); + + if (FAILED(RegisterDragDrop(_hwnd, _pDropTarget))) { + _pDropTarget->Release(); + _pDropTarget = NULL; + return false; + } + else + _pDropTarget->Release(); + + FORMATETC ftetc; + + ftetc.dwAspect = DVASPECT_CONTENT; + ftetc.lindex = -1; + ftetc.tymed = TYMED_HGLOBAL; + ftetc.cfFormat = CF_HDROP; + + _pDropTarget->AddSuportedFormat(ftetc); + + return true; +} + +LRESULT DesktopShellView::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_CONTEXTMENU: + if (!DoContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam))) + DoDesktopContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); + break; + + case PM_SET_ICON_ALGORITHM: + _icon_algo = wparam; + PositionIcons(); + break; + + case PM_GET_ICON_ALGORITHM: + return _icon_algo; + + case PM_DISPLAY_VERSION: + return SendMessage(_hwndListView, nmsg, wparam, lparam); + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +int DesktopShellView::Command(int id, int code) +{ + return super::Command(id, code); +} + +int DesktopShellView::Notify(int id, NMHDR* pnmh) +{ + return super::Notify(id, pnmh); +} + +bool DesktopShellView::DoContextMenu(int x, int y) +{ + IDataObject* selection; + + HRESULT hr = _pShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (void**)&selection); + if (FAILED(hr)) + return false; + + PIDList pidList; + + hr = pidList.GetData(selection); + if (FAILED(hr)) { + selection->Release(); + //CHECKERROR(hr); + return false; + } + + LPIDA pida = pidList; + if (!pida->cidl) { + selection->Release(); + return false; + } + + LPCITEMIDLIST parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); + + LPCITEMIDLIST* apidl = (LPCITEMIDLIST*) alloca(pida->cidl*sizeof(LPCITEMIDLIST)); + + for(int i=pida->cidl; i>0; --i) + apidl[i-1] = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i]); + + hr = ShellFolderContextMenu(ShellFolder(parent_pidl), _hwnd, pida->cidl, apidl, x, y, _cm_ifs); + + selection->Release(); + + CHECKERROR(hr); + + return true; +} + +HRESULT DesktopShellView::DoDesktopContextMenu(int x, int y) +{ + IContextMenu* pcm; + + HRESULT hr = DesktopFolder()->GetUIObjectOf(_hwnd, 0, NULL, IID_IContextMenu, NULL, (LPVOID*)&pcm); + + if (SUCCEEDED(hr)) { + pcm = _cm_ifs.query_interfaces(pcm); + + HMENU hmenu = CreatePopupMenu(); + + if (hmenu) { + hr = pcm->QueryContextMenu(hmenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST-1, CMF_NORMAL|CMF_EXPLORE); + + if (SUCCEEDED(hr)) { + AppendMenu(hmenu, MF_SEPARATOR, 0, NULL); + AppendMenu(hmenu, 0, FCIDM_SHVIEWLAST-1, ResString(IDS_ABOUT_EXPLORER)); + + UINT idCmd = TrackPopupMenu(hmenu, TPM_LEFTALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON, x, y, 0, _hwnd, NULL); + + _cm_ifs.reset(); + + if (idCmd == FCIDM_SHVIEWLAST-1) { + explorer_about(_hwnd); + } else if (idCmd) { + CMINVOKECOMMANDINFO cmi; + + cmi.cbSize = sizeof(CMINVOKECOMMANDINFO); + cmi.fMask = 0; + cmi.hwnd = _hwnd; + cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - FCIDM_SHVIEWFIRST); + cmi.lpParameters = NULL; + cmi.lpDirectory = NULL; + cmi.nShow = SW_SHOWNORMAL; + cmi.dwHotKey = 0; + cmi.hIcon = 0; + + hr = pcm->InvokeCommand(&cmi); + } + } else + _cm_ifs.reset(); + } + + pcm->Release(); + } + + return hr; +} + + +#define ARRANGE_BORDER_DOWN 8 +#define ARRANGE_BORDER_HV 9 +#define ARRANGE_ROUNDABOUT 10 + +static const POINTS s_align_start[] = { + {0, 0}, // left/top + {0, 0}, + {1, 0}, // right/top + {1, 0}, + {0, 1}, // left/bottom + {0, 1}, + {1, 1}, // right/bottom + {1, 1}, + + {0, 0}, // left/top + {0, 0}, + {0, 0} +}; + +static const POINTS s_align_dir1[] = { + { 0, +1}, // down + {+1, 0}, // right + {-1, 0}, // left + { 0, +1}, // down + { 0, -1}, // up + {+1, 0}, // right + {-1, 0}, // left + { 0, -1}, // up + + { 0, +1}, // down + {+1, 0}, // right + {+1, 0} // right +}; + +static const POINTS s_align_dir2[] = { + {+1, 0}, // right + { 0, +1}, // down + { 0, +1}, // down + {-1, 0}, // left + {+1, 0}, // right + { 0, -1}, // up + { 0, -1}, // up + {-1, 0}, // left + + {+1, 0}, // right + { 0, +1}, // down + { 0, +1} // down +}; + +typedef pair IconPos; +typedef map IconMap; + +void DesktopShellView::PositionIcons(int dir) +{ + DWORD spacing = ListView_GetItemSpacing(_hwndListView, FALSE); + + RECT work_area; + SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0); + + const POINTS& dir1 = s_align_dir1[_icon_algo]; + const POINTS& dir2 = s_align_dir2[_icon_algo]; + const POINTS& start_pos = s_align_start[_icon_algo]; + + int dir_x1 = dir1.x; + int dir_y1 = dir1.y; + int dir_x2 = dir2.x; + int dir_y2 = dir2.y; + + int cx = LOWORD(spacing); + int cy = HIWORD(spacing); + + int dx1 = dir_x1 * cx; + int dy1 = dir_y1 * cy; + int dx2 = dir_x2 * cx; + int dy2 = dir_y2 * cy; + + int xoffset = (cx-32)/2; + int yoffset = 4/*(cy-32)/2*/; + + int start_x = start_pos.x * (work_area.right - cx) + xoffset; + int start_y = start_pos.y * (work_area.bottom - cy) + yoffset; + + int x = start_x; + int y = start_y; + + int all = ListView_GetItemCount(_hwndListView); + int i1, i2; + + if (dir > 0) { + i1 = 0; + i2 = all; + } else { + i1 = all-1; + i2 = -1; + } + + IconMap pos_idx; + int cnt = 0; + int xhv = start_x; + int yhv = start_y; + + for(int idx=i1; idx!=i2; idx+=dir) { + pos_idx[IconPos(y, x)] = idx; + + if (_icon_algo == ARRANGE_BORDER_DOWN) { + if (++cnt & 1) + x = work_area.right - x - cx + 2*xoffset; + else { + y += dy1; + + if (y + cy - 2 * yoffset > work_area.bottom) { + y = start_y; + start_x += dx2; + x = start_x; + } + } + + continue; + } + else if (_icon_algo == ARRANGE_BORDER_HV) { + if (++cnt & 1) + x = work_area.right - x - cx + 2*xoffset; + else if (cnt & 2) { + yhv += cy; + y = yhv; + x = start_x; + + if (y + cy - 2 * yoffset > work_area.bottom) { + start_x += cx; + xhv = start_x; + x = xhv; + start_y += cy; + yhv = start_y; + y = yhv; + } + } else { + xhv += cx; + x = xhv; + y = start_y; + + if (x + cx - 2 * xoffset > work_area.right) { + start_x += cx; + xhv = start_x; + x = xhv; + start_y += cy; + yhv = start_y; + y = yhv; + } + } + + continue; + } + else if (_icon_algo == ARRANGE_ROUNDABOUT) { + + ///@todo + + } + + x += dx1; + y += dy1; + + if (x<0 || x+cx-2*xoffset>work_area.right) { + x = start_x; + y += dy2; + } else if (y<0 || y+cy-2*yoffset>work_area.bottom) { + y = start_y; + x += dx2; + } + } + + // use a little trick to get the icons where we want them to be... + + for(IconMap::const_iterator it=pos_idx.end(); --it!=pos_idx.begin(); ) { + const IconPos& pos = it->first; + + ListView_SetItemPosition32(_hwndListView, it->second, pos.second, pos.first); + } + + for(IconMap::const_iterator it=pos_idx.begin(); it!=pos_idx.end(); ++it) { + const IconPos& pos = it->first; + + ListView_SetItemPosition32(_hwndListView, it->second, pos.second, pos.first); + } +} diff --git a/reactos/base/shell/explorer/desktop/desktop.h b/reactos/base/shell/explorer/desktop/desktop.h new file mode 100644 index 00000000000..00e9dca75cb --- /dev/null +++ b/reactos/base/shell/explorer/desktop/desktop.h @@ -0,0 +1,190 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // desktop.h + // + // Martin Fuchs, 09.08.2003 + // + + +#define PM_SET_ICON_ALGORITHM (WM_APP+0x19) +#define PM_GET_ICON_ALGORITHM (WM_APP+0x1A) +#define PM_DISPLAY_VERSION (WM_APP+0x24) + + + /// subclassed Background window behind the visible desktop window +struct BackgroundWindow : public SubclassedWindow +{ + typedef SubclassedWindow super; + + BackgroundWindow(HWND hwnd); + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + void DrawDesktopBkgnd(HDC hdc); + + int _display_version; +}; + + + /// Implementation of the Explorer desktop window +struct DesktopWindow : public Window, public IShellBrowserImpl +{ + typedef Window super; + + DesktopWindow(HWND hwnd); + ~DesktopWindow(); + + static HWND Create(); + + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd) + { + *lphwnd = _hwnd; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView** ppshv) + { + _pShellView->AddRef(); + *ppshv = _pShellView; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND* lphwnd) + { + return E_NOTIMPL; + } + + virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret) + { + return E_NOTIMPL; + } + +protected: + LRESULT Init(LPCREATESTRUCT pcs); + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + IShellView* _pShellView; + WindowHandle _desktopBar; + + virtual HRESULT OnDefaultCommand(LPIDA pida); +}; + + + /// OLE drop target for the desktop window +class DesktopDropTarget : public IDropTargetImpl +{ + typedef IDropTargetImpl super; + +public: + DesktopDropTarget(HWND hTargetWnd) : super(hTargetWnd) {} + + virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) + { + if (pFmtEtc->cfFormat==CF_HDROP && medium.tymed==TYMED_HGLOBAL) { + HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal); + + if (hDrop) { + TCHAR szFileName[MAX_PATH]; + + UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); + + for(UINT i=0; i +{ + typedef ExtContextMenuHandlerT super; + + DesktopShellView(HWND hwnd, IShellView* pShellView); + + bool InitDragDrop(); + +protected: + IShellView* _pShellView; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Command(int id, int code); + int Notify(int id, NMHDR* pnmh); + + bool DoContextMenu(int x, int y); + HRESULT DoDesktopContextMenu(int x, int y); + void PositionIcons(int dir=1); + + DesktopDropTarget* _pDropTarget; + HWND _hwndListView; + int _icon_algo; +}; diff --git a/reactos/base/shell/explorer/dialogs/searchprogram.cpp b/reactos/base/shell/explorer/dialogs/searchprogram.cpp new file mode 100644 index 00000000000..55c8c03cc9d --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/searchprogram.cpp @@ -0,0 +1,418 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/searchprogram.cpp + // + // Explorer dialogs + // + // Martin Fuchs, 02.10.2003 + // + + +#include + +#include "../resource.h" + +#include "searchprogram.h" + + +int CollectProgramsThread::Run() +{ + try { + collect_programs(SpecialFolderPath(CSIDL_COMMON_PROGRAMS, _hwnd)); + } catch(COMException&) { + } + + if (_alive) + try { + collect_programs(SpecialFolderPath(CSIDL_PROGRAMS, _hwnd)); + } catch(COMException&) { + } + + if (_alive) + _cache_valid = true; + + return 0; +} + +void CollectProgramsThread::collect_programs(const ShellPath& path) +{ + ShellDirectory* dir = new ShellDirectory(GetDesktopFolder(), path, 0); + _dirs.push(dir); + + dir->smart_scan(SORT_NONE); + + for(Entry*entry=dir->_down; _alive && entry; entry=entry->_next) { + if (entry->_shell_attribs & SFGAO_HIDDEN) + continue; + + if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + collect_programs(entry->create_absolute_pidl()); + else if (entry->_shell_attribs & SFGAO_LINK) + if (_alive) + _callback(entry, _para); + } +} + +void CollectProgramsThread::free_dirs() +{ + while(!_dirs.empty()) { + ShellDirectory* dir = _dirs.top(); + dir->free_subentries(); + _dirs.pop(); + } +} + + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + +FindProgramDlg::FindProgramDlg(HWND hwnd) + : super(hwnd), + _list_ctrl(GetDlgItem(hwnd, IDC_PROGRAMS_FOUND)), + _thread(collect_programs_callback, hwnd, this), + _sort(_list_ctrl, CompareFunc/*, (LPARAM)this*/) +{ + SetWindowIcon(hwnd, IDI_SEARCH); + + _resize_mgr.Add(IDC_FILTER, RESIZE_X); + _resize_mgr.Add(IDC_CHECK_ENTRIES, MOVE_X); + _resize_mgr.Add(IDC_PROGRAMS_FOUND, RESIZE); + + _resize_mgr.Resize(+520, +300); + + _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_SEARCH_PROGRAM)); + + (void)ListView_SetImageList(_list_ctrl, g_Globals._icon_cache.get_sys_imagelist(), LVSIL_SMALL); + + LV_COLUMN column = {LVCF_FMT|LVCF_WIDTH|LVCF_TEXT, LVCFMT_LEFT, 250}; + + column.pszText = _T("Name"); + ListView_InsertColumn(_list_ctrl, 0, &column); + + column.cx = 300; + column.pszText = _T("Path"); + ListView_InsertColumn(_list_ctrl, 1, &column); + + column.cx = 400; + column.pszText = _T("Menu Path"); + ListView_InsertColumn(_list_ctrl, 2, &column); + + ListView_SetExtendedListViewStyleEx(_list_ctrl, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); + + _common_programs = SpecialFolderFSPath(CSIDL_COMMON_PROGRAMS, hwnd); + if (!_common_programs.empty()) + _common_programs.append(_T("\\")); + + _user_programs = SpecialFolderFSPath(CSIDL_PROGRAMS, hwnd); + if (!_user_programs.empty()) + _user_programs.append(_T("\\")); + + CenterWindow(hwnd); + + Refresh(); + + register_pretranslate(hwnd); +} + +FindProgramDlg::~FindProgramDlg() +{ + _thread.Stop(); + + unregister_pretranslate(_hwnd); +} + + +void FindProgramDlg::Refresh(bool delete_cache) +{ + WaitCursor wait; + + _thread.Stop(); + + TCHAR buffer[1024]; + GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, COUNTOF(buffer)); + CharLower(buffer); + _lwr_filter = buffer; + + HiddenWindow hide_listctrl(_list_ctrl); + + ListView_DeleteAllItems(_list_ctrl); + + if (delete_cache || !_thread._cache_valid) { + _thread.free_dirs(); + _thread.Start(); + } else { + for(FPDCache::const_iterator it=_cache.begin(); it!=_cache.end(); ++it) + add_entry(*it); + } +} + +void FindProgramDlg::collect_programs_callback(Entry* entry, void* param) +{ + FindProgramDlg* pThis = (FindProgramDlg*) param; + + IShellLink* pShellLink; + HRESULT hr = entry->GetUIObjectOf(pThis->_hwnd, IID_IShellLink, (LPVOID*)&pShellLink); + + if (SUCCEEDED(hr)) { + ShellLinkPtr shell_link(pShellLink); + + shell_link->Release(); + + /*hr = pShellLink->Resolve(pThis->_hwnd, SLR_NO_UI); + if (SUCCEEDED(hr))*/ { + WIN32_FIND_DATA wfd; + TCHAR path[MAX_PATH]; + + hr = pShellLink->GetPath(path, COUNTOF(path)-1, &wfd, SLGP_UNCPRIORITY); + + if (SUCCEEDED(hr)) { + TCHAR entry_path[MAX_PATH]; + + entry->get_path(entry_path, COUNTOF(entry_path)); + + String menu_path; + + int len = pThis->_common_programs.size(); + + if (len && !_tcsnicmp(entry_path, pThis->_common_programs, len)) + menu_path = ResString(IDS_ALL_USERS) + (String(entry_path)+len); + else if ((len=pThis->_user_programs.size()) && !_tcsnicmp(entry_path, pThis->_user_programs, len)) + menu_path = String(entry_path)+len; + + // store info in cache + FPDEntry new_entry; + + new_entry._entry = entry; + new_entry._menu_path = menu_path; + new_entry._path = path; + new_entry._idxIcon = I_IMAGECALLBACK; + + pThis->_cache.push_front(new_entry); + FPDEntry& cache_entry = pThis->_cache.front(); + + Lock lock(pThis->_thread._crit_sect); + + // resolve deadlocks while executing Thread::Stop() + if (!pThis->_thread.is_alive()) + return; + + pThis->add_entry(cache_entry); + } + } + } +} + +void FindProgramDlg::add_entry(const FPDEntry& cache_entry) +{ + String lwr_path = cache_entry._path; + String lwr_name = cache_entry._entry->_display_name; + + lwr_path.toLower(); + lwr_name.toLower(); + + if (_lwr_filter.empty()) + if (_tcsstr(lwr_name, _T("uninstal")) || _tcsstr(lwr_name, _T("deinstal"))) // filter out deinstallation links + return; + + if (!_tcsstr(lwr_path, _lwr_filter) && !_tcsstr(lwr_name, _lwr_filter)) + return; + + LV_ITEM item = {LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM, INT_MAX}; + + item.pszText = cache_entry._entry->_display_name; + item.iImage = cache_entry._idxIcon; + item.lParam = (LPARAM) &cache_entry; + item.iItem = ListView_InsertItem(_list_ctrl, &item); // We could use the information in _sort to enable manual sorting while populating the list. + + item.mask = LVIF_TEXT; + + item.iSubItem = 1; + item.pszText = (LPTSTR)(LPCTSTR)cache_entry._path; + ListView_SetItem(_list_ctrl, &item); + + item.iSubItem = 2; + item.pszText = (LPTSTR)(LPCTSTR)cache_entry._menu_path; + ListView_SetItem(_list_ctrl, &item); +} + +LRESULT FindProgramDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_CLOSE: + (void)ListView_SetImageList(_list_ctrl, 0, LVSIL_SMALL); // detach system image list + goto def; + + case PM_TRANSLATE_MSG: { + MSG* pmsg = (MSG*) lparam; + + if (TranslateAccelerator(_hwnd, _haccel, pmsg)) + return TRUE; + + return FALSE;} + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; +} + +int FindProgramDlg::Command(int id, int code) +{ + if (code == BN_CLICKED) { + switch(id) { + case ID_REFRESH: + Refresh(true); + break; + + case IDOK: + LaunchSelected(); + break; + + case IDC_CHECK_ENTRIES: + CheckEntries(); + break; + + default: + return super::Command(id, code); + } + + return 0; + } + else if (code == EN_CHANGE) { + switch(id) { + case IDC_FILTER: + Refresh(); + break; + } + + return 0; + } + + return 1; +} + +void FindProgramDlg::LaunchSelected() +{ + Lock lock(_thread._crit_sect); + + int count = ListView_GetSelectedCount(_list_ctrl); + + if (count > 1) + if (MessageBox(_hwnd, ResString(IDS_LAUNCH_MANY_PROGRAMS), ResString(IDS_TITLE), MB_OKCANCEL) != IDOK) + return; + + for(int idx=-1; (idx=ListView_GetNextItem(_list_ctrl, idx, LVNI_SELECTED))!=-1; ) { + LPARAM lparam = ListView_GetItemData(_list_ctrl, idx); + + if (lparam) { + FPDEntry& cache_entry = *(FPDEntry*)lparam; + cache_entry._entry->launch_entry(_hwnd); + } + } +} + +int FindProgramDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case LVN_GETDISPINFO: { + LV_DISPINFO* pDispInfo = (LV_DISPINFO*) pnmh; + + if (pnmh->hwndFrom == _list_ctrl) { + if (pDispInfo->item.mask & LVIF_IMAGE) { + FPDEntry& cache_entry = *(FPDEntry*)pDispInfo->item.lParam; + Entry* entry = cache_entry._entry; + + if (entry->_icon_id == ICID_UNKNOWN) + entry->_icon_id = entry->extract_icon(ICF_SYSCACHE); + + pDispInfo->item.iImage = g_Globals._icon_cache.get_icon(entry->_icon_id).get_sysiml_idx(); + pDispInfo->item.mask |= LVIF_DI_SETITEM; + + return 1; + } + }} + break; + + case NM_DBLCLK: + if (pnmh->hwndFrom == _list_ctrl) + LaunchSelected(); + /*{ + Lock lock(_thread._crit_sect); + + LPNMLISTVIEW pnmv = (LPNMLISTVIEW) pnmh; + LPARAM lparam = ListView_GetItemData(pnmh->hwndFrom, pnmv->iItem); + + if (lparam) { + FPDEntry& cache_entry = *(FPDEntry*)lparam; + cache_entry._entry->launch_entry(_hwnd); + } + }*/ + break; + + case HDN_ITEMCLICK: { + WaitCursor wait; + NMHEADER* phdr = (NMHEADER*)pnmh; + + if (GetParent(pnmh->hwndFrom) == _list_ctrl) { + if (_thread._cache_valid) { // disable manual sorting while populating the list + _sort.toggle_sort(phdr->iItem); + _sort.sort(); + } + } + break;} + } + + return 0; +} + +int CALLBACK FindProgramDlg::CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort) +{ + ListSort* sort = (ListSort*)lparamSort; + + FPDEntry& a = *(FPDEntry*)lparam1; + FPDEntry& b = *(FPDEntry*)lparam2; + + int cmp = 0; + + switch(sort->_sort_crit) { + case 0: + cmp = _tcsicoll(a._entry->_display_name, b._entry->_display_name); + break; + + case 1: + cmp = _tcsicoll(a._path, b._path); + break; + + case 2: + cmp = _tcsicoll(a._menu_path, b._menu_path); + } + + return sort->_direction? -cmp: cmp; +} + +void FindProgramDlg::CheckEntries() +{ + ///@todo check all entries for existing targets, display a list of not working entries and ask the user for permission to delete them +} diff --git a/reactos/base/shell/explorer/dialogs/searchprogram.h b/reactos/base/shell/explorer/dialogs/searchprogram.h new file mode 100644 index 00000000000..bc39b3b2f03 --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/searchprogram.h @@ -0,0 +1,108 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/searchprogram.h + // + // Explorer dialogs + // + // Martin Fuchs, 02.10.2003 + // + + +typedef void (*COLLECT_CALLBACK)(Entry* entry, void* param); +typedef stack ShellDirectoryStack; + + /// Thread for collecting start menu entries +struct CollectProgramsThread : public Thread +{ + CollectProgramsThread(COLLECT_CALLBACK callback, HWND hwnd, void* para) + : _cache_valid(false), + _callback(callback), + _hwnd(hwnd), + _para(para) + { + } + + ~CollectProgramsThread() + { + free_dirs(); + } + + int Run(); + void free_dirs(); + + bool _cache_valid; + +protected: + COLLECT_CALLBACK _callback; + HWND _hwnd; + void* _para; + ShellDirectoryStack _dirs; + + void collect_programs(const ShellPath& path); +}; + + + /// entry for the list in "find program" dialogs +struct FPDEntry +{ + Entry* _entry; + int _idxIcon; + String _menu_path; + String _path; +}; + +typedef list FPDCache; + + + /// Dialog to work with the complete list of start menu entries +struct FindProgramDlg : public ResizeController

+{ + typedef ResizeController super; + + FindProgramDlg(HWND hwnd); + ~FindProgramDlg(); + +protected: + HWND _list_ctrl; + HACCEL _haccel; + String _lwr_filter; + + CollectProgramsThread _thread; + FPDCache _cache; + + String _common_programs, _user_programs; + + ListSort _sort; + + virtual LRESULT WndProc(UINT, WPARAM, LPARAM); + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); + + void Refresh(bool delete_cache=false); + void add_entry(const FPDEntry& cache_entry); + void LaunchSelected(); + void CheckEntries(); + + static void collect_programs_callback(Entry* entry, void* param); + static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort); +}; diff --git a/reactos/base/shell/explorer/dialogs/settings.cpp b/reactos/base/shell/explorer/dialogs/settings.cpp new file mode 100644 index 00000000000..0b80458c5ba --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/settings.cpp @@ -0,0 +1,273 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/settings.cpp + // + // Explorer dialogs + // + // Martin Fuchs, 18.01.2004 + // + + +#include + +#include "../resource.h" + +#include "../taskbar/traynotify.h" +#include "settings.h" + + +void ExplorerPropertySheet(HWND hparent) +{ + PropertySheetDialog ps(hparent); + + ps.dwFlags |= PSH_USEICONID | PSH_PROPTITLE; + ps.pszIcon = MAKEINTRESOURCE(IDI_REACTOS); + ps.pszCaption = TEXT("Explorer"); + + PropSheetPage psp1(IDD_DESKBAR_DESKTOP, WINDOW_CREATOR(DesktopSettingsDlg)); + psp1.dwFlags |= PSP_USETITLE; + psp1.pszTitle = MAKEINTRESOURCE(IDS_DESKTOP); + ps.add(psp1); + + PropSheetPage psp2(IDD_DESKBAR_TASKBAR, WINDOW_CREATOR(TaskbarSettingsDlg)); + psp2.dwFlags |= PSP_USETITLE; + psp2.pszTitle = MAKEINTRESOURCE(IDS_TASKBAR); + ps.add(psp2); + + PropSheetPage psp3(IDD_DESKBAR_STARTMENU, WINDOW_CREATOR(StartmenuSettingsDlg)); + psp3.dwFlags |= PSP_USETITLE; + psp3.pszTitle = MAKEINTRESOURCE(IDS_STARTMENU); + ps.add(psp3); + + ps.DoModal(); +} + + +DesktopSettingsDlg::DesktopSettingsDlg(HWND hwnd) + : super(hwnd), + _bmp0(IDB_ICON_ALIGN_0), + _bmp1(IDB_ICON_ALIGN_1), + _bmp2(IDB_ICON_ALIGN_2), + _bmp3(IDB_ICON_ALIGN_3), + _bmp4(IDB_ICON_ALIGN_4), + _bmp5(IDB_ICON_ALIGN_5), + _bmp6(IDB_ICON_ALIGN_6), + _bmp7(IDB_ICON_ALIGN_7), + _bmp8(IDB_ICON_ALIGN_8), + _bmp9(IDB_ICON_ALIGN_9), + _bmp10(IDB_ICON_ALIGN_10) +{ + new PictureButton(_hwnd, IDC_ICON_ALIGN_0, _bmp0); + new PictureButton(_hwnd, IDC_ICON_ALIGN_1, _bmp1); + new PictureButton(_hwnd, IDC_ICON_ALIGN_2, _bmp2); + new PictureButton(_hwnd, IDC_ICON_ALIGN_3, _bmp3); + new PictureButton(_hwnd, IDC_ICON_ALIGN_4, _bmp4); + new PictureButton(_hwnd, IDC_ICON_ALIGN_5, _bmp5); + new PictureButton(_hwnd, IDC_ICON_ALIGN_6, _bmp6); + new PictureButton(_hwnd, IDC_ICON_ALIGN_7, _bmp7); + new PictureButton(_hwnd, IDC_ICON_ALIGN_8, _bmp8); + new PictureButton(_hwnd, IDC_ICON_ALIGN_9, _bmp9); + new PictureButton(_hwnd, IDC_ICON_ALIGN_10, _bmp10); + + _alignment_cur = SendMessage(g_Globals._hwndShellView, PM_GET_ICON_ALGORITHM, 0, 0); + _alignment_tmp = _alignment_cur; + + _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0)); + CheckDlgButton(hwnd, ID_DESKTOP_VERSION, _display_version_org? BST_CHECKED: BST_UNCHECKED); +} + +#ifndef PSN_QUERYINITIALFOCUS // currently (as of 18.01.2004) missing in MinGW headers +#define PSN_QUERYINITIALFOCUS (-213) +#endif + +int DesktopSettingsDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case PSN_QUERYINITIALFOCUS: + SetWindowLong(_hwnd, DWL_MSGRESULT, (LPARAM)GetDlgItem(_hwnd, IDC_ICON_ALIGN_0+_alignment_cur)); + break; + + case PSN_APPLY: + _alignment_cur = _alignment_tmp; + _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0)); + break; + + case PSN_RESET: + if (_alignment_tmp != _alignment_cur) + SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, _alignment_cur, 0); + SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, _display_version_org, MAKELONG(1,0)); + break; + + default: + return super::Notify(id, pnmh); + } + + return 0; +} + +int DesktopSettingsDlg::Command(int id, int code) +{ + if (id>=IDC_ICON_ALIGN_0 && id<=IDC_ICON_ALIGN_10) { + int alignment = id - IDC_ICON_ALIGN_0; + + if (alignment != _alignment_tmp) { + _alignment_tmp = alignment; + + PropSheet_Changed(GetParent(_hwnd), _hwnd); + + SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, alignment, 0); + } + + return 0; + } + + switch(id) { + case ID_DESKTOP_VERSION: + SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,1)); // toggle version display flag + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break; + + default: + return 1; + } + + return 0; +} + + +TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd) + : super(hwnd), + _cfg_org(g_Globals._cfg) +{ + XMLPos options = g_Globals.get_cfg("desktopbar/options"); + + CheckDlgButton(hwnd, ID_SHOW_CLOCK, XMLBool(options, "show-clock", true)? BST_CHECKED: BST_UNCHECKED); + CheckDlgButton(hwnd, ID_HIDE_INACTIVE_ICONS, XMLBool(options, "hide-inactive", true)? BST_CHECKED: BST_UNCHECKED); +} + +int TaskbarSettingsDlg::Notify(int id, NMHDR* pnmh) +{ + switch(pnmh->code) { + case PSN_APPLY: + _cfg_org = g_Globals._cfg; + break; + + case PSN_RESET: + g_Globals._cfg = _cfg_org; + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + break; + + default: + return super::Notify(id, pnmh); + } + + return 0; +} + +int TaskbarSettingsDlg::Command(int id, int code) +{ + switch(id) { + case ID_CONFIG_NOTIFYAREA: + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); + break; + + case ID_SHOW_CLOCK: { + XMLBoolRef boolRef1(XMLPos(g_Globals.get_cfg("desktopbar/options")), "show-clock", true); + boolRef1.toggle(); + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break;} + + case ID_HIDE_INACTIVE_ICONS: { + XMLBoolRef boolRef2(XMLPos(g_Globals.get_cfg("notify-icons/options")), "hide-inactive", true); + boolRef2.toggle(); + SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0); + PropSheet_Changed(GetParent(_hwnd), _hwnd); + break;} + + default: + return 1; + } + + return 0; +} + + +StartmenuSettingsDlg::StartmenuSettingsDlg(HWND hwnd) + : super(hwnd) +{ +} + +int StartmenuSettingsDlg::Command(int id, int code) +{ +/* + switch(id) { + case ID_CONFIG_NOTIFYAREA: + Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); + return 0; + } +*/ + return 1; +} + + +MdiSdiDlg::MdiSdiDlg(HWND hwnd) + : super(hwnd) +{ + CenterWindow(hwnd); + + XMLPos explorer_options = g_Globals.get_cfg("general/explorer"); + bool mdi = XMLBool(explorer_options, "mdi", true); + bool separateFolders = XMLBool(explorer_options, "separate-folders", true); + + int id = mdi? IDC_MDI: IDC_SDI; + CheckDlgButton(hwnd, id, BST_CHECKED); + SetFocus(GetDlgItem(hwnd, id)); + + CheckDlgButton(hwnd, IDC_SEPARATE_SUBFOLDERS, separateFolders?BST_CHECKED:BST_UNCHECKED); +} + +int MdiSdiDlg::Command(int id, int code) +{ + if (code == BN_CLICKED) { + switch(id) { + case IDOK: { + bool mdi = IsDlgButtonChecked(_hwnd, IDC_MDI)==BST_CHECKED; + bool separateFolders = IsDlgButtonChecked(_hwnd, IDC_SEPARATE_SUBFOLDERS)==BST_CHECKED; + + XMLPos explorer_options = g_Globals.get_cfg("general/explorer"); + + XMLBoolRef(explorer_options, "mdi") = mdi; + XMLBoolRef(explorer_options, "separate-folders") = separateFolders; + } // fall through + + case IDCANCEL: + EndDialog(_hwnd, id); + break; + } + + return 0; + } + + return 1; +} diff --git a/reactos/base/shell/explorer/dialogs/settings.h b/reactos/base/shell/explorer/dialogs/settings.h new file mode 100644 index 00000000000..a71710139a4 --- /dev/null +++ b/reactos/base/shell/explorer/dialogs/settings.h @@ -0,0 +1,99 @@ +/* + * Copyright 2004, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // dialogs/settings.h + // + // Explorer dialogs + // + // Martin Fuchs, 18.01.2004 + // + + +void ExplorerPropertySheet(HWND hparent); + + + /// "Desktopbar Settings" Property Sheet Dialog +struct DesktopSettingsDlg : public OwnerDrawParent +{ + typedef OwnerDrawParent super; + + DesktopSettingsDlg(HWND hwnd); + +protected: + ResBitmap _bmp0; + ResBitmap _bmp1; + ResBitmap _bmp2; + ResBitmap _bmp3; + ResBitmap _bmp4; + ResBitmap _bmp5; + ResBitmap _bmp6; + ResBitmap _bmp7; + ResBitmap _bmp8; + ResBitmap _bmp9; + ResBitmap _bmp10; + + int _alignment_cur; + int _alignment_tmp; + + int _display_version_org; + + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); +}; + + + /// "Taskbar Settings" Property Sheet Dialog +struct TaskbarSettingsDlg : public PropSheetPageDlg +{ + typedef PropSheetPageDlg super; + + TaskbarSettingsDlg(HWND hwnd); + + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); + +protected: + XMLDoc _cfg_org; +}; + + + /// "Startmenu Settings" Property Sheet Dialog +struct StartmenuSettingsDlg : public PropSheetPageDlg +{ + typedef PropSheetPageDlg super; + + StartmenuSettingsDlg(HWND hwnd); + + virtual int Command(int id, int code); +}; + + + /// configuration dialog to choose between MDI and SDI mode +struct MdiSdiDlg : public ResizeController +{ + typedef ResizeController super; + + MdiSdiDlg(HWND hwnd); + +protected: + virtual int Command(int id, int code); +}; diff --git a/reactos/base/shell/explorer/doc/TODO.txt b/reactos/base/shell/explorer/doc/TODO.txt new file mode 100644 index 00000000000..ef35cabb975 --- /dev/null +++ b/reactos/base/shell/explorer/doc/TODO.txt @@ -0,0 +1,34 @@ +- rewrite autostart code and include all possible autostart locations +- read "DESCRIPT.ION" files to display file descriptions +- detect display mode changes and adjust desktop bar size +- handling of full screen applications +- implement additional deskbands +- Drag Drop and file renaming on the desktop does not work. +- implement Drag Drop from the tree view. +- activate accelerator keys like in shell view folders +- program manager "progman" DDE server +- Windows-key combos +- Application Desktop Toolbars +- hide CVS subdirectories, may be even implement a CVS managment plugin +- printer and RAS connection icons in desktop notification area +- use multi threading for launching of programs and filling start menu subdirectories +- close start start menu when resizing explorer bar +- adjust already open windows of all running applications when resizing explorer bar +- implement blink effect in task bar for SetForegoundWindow() requests +- Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field) +- switch background images with desktop switcher +- Desktop Manager: Desktop Names; Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops -> config file +- autostart doesn't work on NT4 ? +- hide desktop bar when showing full screen applications +- new start menu entry "Filemanager" close to "Explore" -> display C: and D: drive in MDI window +- Startmenu: You can open the start menu by pressing Win-key, but can't close with another hit of Win-key. +- Export von Bookmarks fr IE (+ Mozilla) + +- Search Programs -> performance monitor.msc -> Abort + + + Martin, I would have a whish concerning explorer: I often want to start a program and give it some parameters. So nice featue: "Start with param..." + Nonvo: shell extension + tinus: we should think about installing some default shell extensions + m-fuchs: perhaps, but it'd be nice if they actually were shell extensions + diff --git a/reactos/base/shell/explorer/doc/changes.txt b/reactos/base/shell/explorer/doc/changes.txt new file mode 100644 index 00000000000..372642f99f6 --- /dev/null +++ b/reactos/base/shell/explorer/doc/changes.txt @@ -0,0 +1,170 @@ +You will find only major changes in this file. +Small bug fixes and developments steps are not listet here. +If you search for more information, look into the Subversion repository. + +14.10.2002 m. fuchs Korrektur der Anpassungen durch bernahme in wine: Anzeige der Verzeichnisnamen in Tree Pane + m. fuchs Wieder-Anpassung an natives bersetzen unter WIN32 mit VC++ + +15.10.2002 m. fuchs Entfernung der Warnungsmeldung durch SetWindowText(0, ...) + m. fuchs korrekte Anzeige der Header Control-Texte (nicht Unicode -> dlls/comctl32/header.c) + +15.10.2002 m. fuchs sofortige Anzeige der Dateiliste beim Starten und ffnen neuer Fenster +15.10.2002 m. fuchs Programmaufruf ber Doppelklick in der Dateiliste + +07.06.2003 m. fuchs integration with ROS desktop window +21.07.2003 m. fuchs extension of winefile for shell namespace +04.08.2003 m. fuchs C++ explorer with architecture like MS Explorer: + usage of IShellView C++, implementation of IShellBrowser, ... +09.08.2003 m. fuchs class DesktopWindow for shell view on the desktop +11.08.2003 m. fuchs class BackgroundWindow for painting of desktop background + open child folders by double click in ShellBrowserChild +13.08.2003 m. fuchs make explorer bar look more like windows taskbar bar +16.08.2003 m. fuchs first draft of working task bar +18.08.2003 m. fuchs first draft of explorer start menu +21.08.2003 m. fuchs working start menu; beginning of tray notification area + Start menu popup is now closed when clicking in another window. +22.08.2003 m. fuchs implemented clock display in tray notification area + implemented quick launch bar +23.08.2003 m. fuchs implemented "Run..." dialog by calling shell32.dll + fixed memory and GDI handle leaks + implemented context menus for task bar + tool tips for quick launch bar +24.08.2003 m. fuchs added reactos logo to startmenu + added romanian translation of Ciobanu Alexander +26.08.2003 m. fuchs implemented tooltips and launching of date/time control panel applet for clock display +27.08.2003 m. fuchs partly implemented control panel window +28.08.2003 m. fuchs control panel window in cabinet view mode +29.09.2003 m. fuchs Now we handle start menu popups via StartMenuRoot::TrackStartmenu(). +30.09.2003 m. fuchs compatibility to building as Winelib application +10.09.2003 m. fuchs compatibility changes for correct desktop windows size on Windows NT +19.09.2003 m. fuchs compatibility changes for correct start menu subentries on Windows 9x +27.09.2003 m. fuchs moved start menu entries for control panel, etc. into new settings submenu + created a Makefile for compiling as standalone project using MinGW + eliminated all warnings displayed when using -Wall + activated option for compiling as UNICODE version + merged start menus of the same name (e.g. "All Users\Startup" with "\Startup") +28.09.2003 m. fuchs open cabinet windows then clicking on desktop folders +18.10.2003 m. fuchs Program search dialog with interactive filtering and sorting does now work. +19.10.2003 m. fuchs implemented floating start menus +29.11.2003 m. fuchs implemented GDB stub for remote debugging +06.12.2003 m. fuchs basic support to display NTFS streams in winefile windows +20.12.2003 m. fuchs context menu implementation for desktop window +01.01.2004 m. fuchs integrated icons of Everaldo (http://www.everaldo.com) into the start menu. +02.01.2004 m. fuchs reimplemented start menu as light weight version +03.01.2004 m. fuchs lazy icon extraction for start menu + direct file system access for start menu +04.01.2004 m. fuchs implemented icon cache +11.01.2004 m. fuchs keyboard navigation in start menu +14.01.2004 m. fuchs automatically adjusted size of notification area and quicklaunch bar in desktop bar +18.01.2004 m. fuchs explorer/desktop settings property sheet +31.01.2004 m. fuchs included NT Object namespace as virtual file system +31.01.2004 m. fuchs included Registry as virtual file system +02.02.2004 m. fuchs reading of FAT image files +07.02.2004 m. fuchs included IE/Mozilla as Active X control +08.02.2004 m. fuchs desktop switching +16.02.2004 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer" +23.02.2004 m. fuchs start menu navigation using first characters of entry names + fixes for leaking GDI handles +25.02.2004 m. fuchs rebar control for desktop bar +28.02.2004 m. fuchs "minimize all" functionality + various fixes for notification icons, task bar and desktop switching +12.03.2004 m. fuchs automatic adjustment start button to text size +15.03.2004 m. fuchs implementation of volume control tray icon +20.03.2004 m. fuchs context menu for notification area +21.03.2004 m. fuchs configuration dialog for notification icons + XML storage for configuration options +28.03.2004 m. fuchs configuration options for showing/hiding clock, ... +04.04.2004 m. fuchs import of IE bookmarks; explorer sidebar with bookmark display +09.04.2004 m. fuchs changed favorites start menu implementation to work with internal bookmarks + +12.04.2004 m. fuchs ShellBrowserChild: jump to addressbar target +17.05.2004 m. fuchs use precompiled headers for VC++ builds +01.06.2004 m. fuchs integrate optional SDI mode into main explorer branch +15.07.2004 m. fuchs fix root path for folders opened from the desktop +18.07.2004 m. fuchs precompiled header support for GCC 3.4.1 +31.07.2004 m. fuchs use same startmenu entries height as MS explorer +02.08.2004 m. fuchs context menus for start menus and quick launch bar +03.08.2004 m. fuchs get version number to display from RES_STR_PRODUCT_VERSION +16.08.2004 m. fuchs display version information in about dialog and on the desktop +15.09.2004 m. fuchs remove direct version output from desktop; instead store the activation flag into the registry +17.09.2004 m. fuchs handle "." and ".." as special direcory names and move them at the very first beginning of directory listings +23.09.2004 m. fuchs configuration dialog to choose between MDI and SDI mode with persistent storage +20.11.2004 m. fuchs display notification icon change times + notification area button to toggle hidden icons + m. fuchs alpha-blend hidden notification icons + m. fuchs fix UTF8 conversion for the bookmarks list + m. fuchs decode HTML-encoded bookmark names + m. fuchs work around GCC's wide string constant bug when compiling inline functions +27.12.2004 m. fuchs fix GPF for clicks in the favorites folder +09.01.2005 frik85 update for german resource scripts +10.01.2005 m. fuchs new _NO_ALPHABLEND compiler switch +21.01.2005 tamlin Fix crashing browsing NT object namespace with non-zero-terminated UNICODE_STRING. +27.01.2005 m. fuchs fixes for command line handling +06.02.2005 m. fuchs support for owner drawn context menus at various places +08.02.2005 gvg Prefer SEE_MASK_IDLIST, since that one is actually implemented in shell32 +20.02.2005 m. fuchs updates for Expat and XMLStorage files +21.02.2005 m. fuchs move public expat headers into common include folder +27.02.2005 frik85 Add support for explorer to load the desk.cpl when right clicking on background. +04.03.2005 fireball New StartMenu and ReactOS icons by Mindflyer +05.03.2005 m. fuchs case insensitive startmenu merging + m. fuchs update ROS icon in about dialog and start menu side bar +14.03.2005 gvg tinus: Use RegisterShellHookWindow() +19.03.2005 m. fuchs register ourselves as task manager window to make the RegisterShellHookWindow() call working [thanks to Filip :)] +21.03.2005 fireball Nice "About Explorer" icon by Mindflyer +27.03.2005 m. fuchs hide login screen to make the login on XP faster + m. fuchs launch shell DDE server + m. fuchs make Shell Hook Messages really work in Windows +27.03.2005 greatlrd New Explorer icon from Mindflyer +28.03.2005 m. fuchs launch all registered Shell Service Objects (Systray, network icons, ...) + m. fuchs enable multiline tooltips +01.04.2005 greatlrd David Nordenberg: fixed minor things in swedish translation +02.04.2005 m. fuchs terminate shell service objects thread if there is nothing to do + m. fuchs switch to search icon in search dialog + m. fuchs fix tray icon config dialog for the first icon + m. fuchs "minimize all": only minimize windows with valid positions + m. fuchs fix termination of "search program" dialog +03.04.2005 m. fuchs fix SDI shell browser + m. fuchs display "log off" dialog, add "terminate" menu entry + m. fuchs show logoff dialog in lean explorer + m. fuchs activate printer folder menu +14.04.2005 m. fuchs charn: step-wise taskbar resizing +01.05.2005 m. fuchs merge ROS Shell without integrated explorer part into trunk +03.05.2005 m. fuchs display custom folders in start menu root +03.05.2005 m. fuchs rosshell: printer and network folder in start menu +04.05.2005 greatlrd Fixes for Swedish resource script +20.05.2005 navaraf Luk "denzil" Frolka: partial Czech translation of Explorer +02.06.2005 fireball First version of Explorer's translation into Russian. Done by Dmitry Philippov, checked by me, DarkHobbit and others +03.06.2005 m. fuchs split the big explorer resource file into smaller language specific rescource scripts +05.06.2005 hpoussin Include French resources in explorer +15.07.2005 greatlrd update swedish .rc and rename it from sw to sv, remove the german part in swedish rc +16.07.2005 greatlrd crop the startmenu side bar logo to 30x280 +17.07.2005 m. fuchs add explorer-ro.rc +26.08.2005 navaraf Make the explorer taskbar look a bit nicer +12.09.2005 royce security audit of explorer code: strcpy -> lstrcpyn, ... +19.09.2005 navaraf Fix the taskbar button resizing to account for button spacing. +21.09.2005 m. fuchs XMLStorage update, Bugfix for UTF-8 strings + m. fuchs use size_t for buffer/string lengths instead of int, define COUNTOF if not defined already +25.09.2005 navaraf Patricio Martnez Ros: Update spanish translation +25.09.2005 m. fuchs new tool bar icons for the drive bar + m. fuchs refactor all IUnknown implementations using IComSrvBase +30.09.2005 m. fuchs Fix of Bugzilla Bug 676: dynamic explorer start menu sidebar size +01.10.2005 greatlrd new, smaller startmenu pictures using the dynamic explorer start menu sidebar feature +01.10.2005 m. fuchs MDI/SDI option dialog: pictures for illustration, remove resizable flag +02.10.2005 m. fuchs new option to open explorer subfolders in separate windows + m. fuchs fix enabling of split border + m. fuchs fix directory traversing in explorer SDI windows + m. fuchs fix tree list image loading: work around GCC's wide string constant bug +04.10.2005 m. fuchs complete german resources for explorer +04.10.2005 m. fuchs "execute" menu entry + m. fuchs activate execution from command bar +05.10.2005 m. fuchs fix UNICODE control panel calls to handle double clicks on the task bar clock + m. fuchs one-click activation of "Start" button + m. fuchs use GET_X_LPARAM macro in WM_MOUSEMOVE handlers + m. fuchs leave TrackStartmenu() function when executing any start menu command +06.10.2005 m. fuchs implemented command line parser for Explorer +09.10.2005 m. fuchs Fix for Bugzilla Entry 330: Correctly handle WM_COMMAND messages in web windows without web control + m. fuchs replace "search computer" start menu entry by a "not yet implemented" message +01.11.2005 m. fuchs String::str(), String::toLower() to allow conventient and WINE compatible string conversions +29.11.2005 m. fuchs Adjustments for Visual Studio 2005: use new secure CT functions, COUNTOF for buffer sizes +28.12.2005 m. fuchs display icon overlays in Explorer tree view +31.12.2005 m. fuchs handle "/root" command line parameter diff --git a/reactos/base/shell/explorer/doc/readme.txt b/reactos/base/shell/explorer/doc/readme.txt new file mode 100644 index 00000000000..0324dd1d4f3 --- /dev/null +++ b/reactos/base/shell/explorer/doc/readme.txt @@ -0,0 +1,45 @@ + +For information on how to compile and install the ReactOS Explorer please look at the FAQ web page: + +http://www.sky.franken.de/explorer/ + + + +Desktop Example +--------------- + +This program doesn't do much, apart from create a window which could be +used as a desktop. + +It's pretty straightforward. It creates a window the size of the screen, +displays some text in the corner, and then disables ALT+F4. + +Ideally, this would be incorporated into some other part of ReactOS, where +it could be closed in a controlled manner (ie, when the user wishes to exit +the GUI.) + +Hope someone finds it of some use. I think it should run before the +explorer clone (taskbar) to get the wallpaper displayed (since when +explorer crashes on Windows, the wallpaper is always displayed, and there +is always a desktop, even with no icons, when the login window is shown.) + +It obviously is in need of some improvement, such as wallpaper actually +being drawn (stretch, center/centre and tile...) + +So, feel free to play around with it. + +Andrew "Silver Blade" Greenwood +silverblade_uk@hotmail.com + + +Explorer Bar Example +-------------------- + +I have merged in Alexander Ciobanu's Explorer bar code as a example starting +for the start menu. Its very simple at this point and just loads a window with +buttons. + +The loading of this module was based on a patch by Martin Fuchs. + +Steven Edwards +Steven_Ed4153@yahoo.com diff --git a/reactos/base/shell/explorer/doxy-footer.html b/reactos/base/shell/explorer/doxy-footer.html new file mode 100644 index 00000000000..1ed7376a03a --- /dev/null +++ b/reactos/base/shell/explorer/doxy-footer.html @@ -0,0 +1,16 @@ +
+ + + + + +
+ROS Explorer Source Code Documentation +
generated on 21.11.2004 by +doxygen +
+
+

ROS Explorer Homepage +

+ + diff --git a/reactos/base/shell/explorer/doxy-footer.htmt b/reactos/base/shell/explorer/doxy-footer.htmt new file mode 100644 index 00000000000..53f33c8a274 --- /dev/null +++ b/reactos/base/shell/explorer/doxy-footer.htmt @@ -0,0 +1,16 @@ +
+ + + + + +
+ROS Explorer Source Code Documentation +
@GEN@ by +doxygen +
+
+

ROS Explorer Homepage +

+ + diff --git a/reactos/base/shell/explorer/expat.license b/reactos/base/shell/explorer/expat.license new file mode 100644 index 00000000000..5c5d524a1f8 --- /dev/null +++ b/reactos/base/shell/explorer/expat.license @@ -0,0 +1,22 @@ +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/reactos/base/shell/explorer/explorer-cfg-template.xml b/reactos/base/shell/explorer/explorer-cfg-template.xml new file mode 100644 index 00000000000..9597e1230d3 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-cfg-template.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/explorer-cn.rc b/reactos/base/shell/explorer/explorer-cn.rc new file mode 100644 index 0000000000000000000000000000000000000000..7b36104aba2510b6f654a1e22e6feb60e6981183 GIT binary patch literal 24334 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/explorer-cz.rc b/reactos/base/shell/explorer/explorer-cz.rc new file mode 100644 index 00000000000..42c129d1250 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-cz.rc @@ -0,0 +1,401 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Czech resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY) +#ifdef _WIN32 +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Soubor" + BEGIN + MENUITEM "&Spustit...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ukonit", ID_FILE_EXIT + END + POPUP "&Zobrazen" + BEGIN + MENUITEM "&Lita nstroj", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "L&ita disk", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Bon lita", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualizovat\tF5", ID_REFRESH + MENUITEM "&Cel obrazovka\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Okno" + BEGIN + MENUITEM "&Nov Okno", ID_WINDOW_NEW + MENUITEM "&Kaskdovat\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&Uspodat vodorovn", ID_WINDOW_TILE_HORZ + MENUITEM "U&spodat svisle\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Us&podat automaticky", ID_WINDOW_AUTOSORT + MENUITEM "Usp&odat symboly", ID_WINDOW_ARRANGE + END + POPUP "&Nstroje" + BEGIN + MENUITEM "&Nastaven", ID_TOOLS_OPTIONS + END + POPUP "&Pomoc" + BEGIN + MENUITEM "&Przkumnk &FAQ...", ID_EXPLORER_FAQ + MENUITEM "O p&rzkumnku...", ID_ABOUT_EXPLORER + MENUITEM "&O OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nastaven...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Sprvce loh...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&O Exploreru...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Otevt ovldn hlasitosti", ID_TRAY_VOLUME + MENUITEM "&Upravit vlastnosti zvuku", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Zobrazit skryt ikony", ID_SHOW_HIDDEN_ICONS + MENUITEM "Z&obrazit ikonu tlatka", ID_SHOW_ICON_BUTTON + MENUITEM "&Nastavit upozornn...", ID_CONFIG_NOTIFYAREA + MENUITEM "N&astavit datum a as...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&O przkunku...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU PRELOAD DISCARDABLE +BEGIN + POPUP "&Soubor" + BEGIN + MENUITEM "&Spustit...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ukonit", ID_FILE_EXIT + END + POPUP "&Zobrazen" + BEGIN + MENUITEM "&Lita nstroj", ID_VIEW_TOOL_BAR + MENUITEM "&Bon lita", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Status lita", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualizovat\tF5", ID_REFRESH + MENUITEM "Cel obrazovka\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Nstroje" + BEGIN + MENUITEM "&Nastaven", ID_TOOLS_OPTIONS + END + POPUP "&Pomoc" + BEGIN + MENUITEM "Przkumnk &FAQ...", ID_EXPLORER_FAQ + MENUITEM "O &przkumnku...", ID_ABOUT_EXPLORER + MENUITEM "O &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Spustit" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&Spustit",1,158,6,47,14 + PUSHBUTTON "&Zruit",2,158,23,47,14 + PUSHBUTTON "&Pomoc",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Hledat program v nabdce Start" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Vyhledat",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Vlastnosti plochy" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Prosm zvolte si zpsob zarovnn ikon:",IDC_STATIC,7,7, + 166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Zobrazit verzi",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Vlastnosti panelu loh" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "&Zobrazit as",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Skrt neaktivn ikony",ID_HIDE_INACTIVE_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Upozornn...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Vlastnosti nabdky Start" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Nastaven ikon v oblasti upozorovn" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&Nastavit",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Zruit",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Volba MDI / SDI mdu" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Prosm zvolte si Vmi upednostovan zpsob zobrazen oken przkumnka:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Mnoho dokumentov interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,121,10 + CONTROL "&SDI (Jedno dokumentov interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,115,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Toto nastaven bude pouito jako implicitn pro vechny okna przkumnka.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&Nastavit",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Zruit",IDCANCEL,106,136,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos przkumnk" + IDS_START "Start" + IDS_LOGOFF "Odhlsit se..." + IDS_SHUTDOWN "Vypnout..." + IDS_LAUNCH "Spustit..." + IDS_START_HELP "Pomoc" + IDS_SEARCH_FILES "Hledat..." + IDS_DOCUMENTS "Dokumenty" + IDS_FAVORITES "Oblben" + IDS_PROGRAMS "Programy" + IDS_SETTINGS "Nastaven" + IDS_EXPLORE "Prozkoumat" + IDS_EMPTY "(Przdn)" + IDS_RECENT "Nedvn dokumenty" + IDS_ADMIN "Administrace" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Nabdka Start" + IDS_MINIMIZE_ALL "minimalizovat vechna okna" + IDS_DESKTOP_NUM "Plocha %d" + IDS_VOLUME "Hlasitost" + IDS_ITEMS_CUR "souasn poloky" + IDS_ITEMS_CONFIGURED "nastaven" + IDS_ITEMS_VISIBLE "viditeln" + IDS_ITEMS_HIDDEN "skryt" + IDS_NOTIFY_SHOW "zobrazit" + IDS_NOTIFY_HIDE "skrt" + IDS_NOTIFY_AUTOHIDE "skrvat automaticky" + IDS_SHOW_HIDDEN_ICONS "Zobrazit skryt ikony" + IDS_HIDE_ICONS "Skrt ikony" + IDS_TERMINATE "Ukonit ReactOS przkumnk" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "S" + IDS_CONNECTIONS "Sov spojen" + IDS_DRIVES "Disky" + IDS_SEARCH_COMPUTER "Hledat..." + IDS_SETTINGS_MENU "Nastaven" + IDS_CONTROL_PANEL "Ovldac panel" + IDS_PRINTERS "Tiskrny" + IDS_BROWSE "Prohlet soubory" + IDS_SEARCH_PRG "Search Program..." + IDS_ALL_USERS "Vichni uivatel\\" + IDS_SEARCH "Hledat" + IDS_ABOUT_EXPLORER "&O przkumnku..." + IDS_LAUNCH_MANY_PROGRAMS + "Spustili jste vce ne jeden program.\nJste si jisti, e je chcete spustit vechny?" + IDS_DESKTOPBAR_SETTINGS "Nastaven plochy" + IDS_DESKTOP "Plocha" + IDS_TASKBAR "Panel loh" +END + +#endif // Czech resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-de.rc b/reactos/base/shell/explorer/explorer-de.rc new file mode 100644 index 00000000000..34ab5f608a1 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-de.rc @@ -0,0 +1,405 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Ausfhren...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Beenden", ID_FILE_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Fenster" + BEGIN + MENUITEM "Neues &Fenster", ID_WINDOW_NEW + MENUITEM "ber&lappend\tUmschalt+F5", ID_WINDOW_CASCADE + MENUITEM "&Untereinander", ID_WINDOW_TILE_HORZ + MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT + MENUITEM "au&tomatisch anordnen", ID_WINDOW_AUTOSORT + MENUITEM "&Symbole anordnen", ID_WINDOW_ARRANGE + END + POPUP "&Extras" + BEGIN + MENUITEM "&Optionen", ID_TOOLS_OPTIONS + END + POPUP "&Hilfe" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&ber ReactOS Explorer...", ID_ABOUT_EXPLORER + MENUITEM "ber React&OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Ausfhren...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Schliessen", ID_FILE_EXIT + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Aktualisieren\tF5", ID_REFRESH + MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Extras" + BEGIN + MENUITEM "&Optionen", ID_TOOLS_OPTIONS + END + POPUP "&Hilfe" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&ber Explorer...", ID_ABOUT_EXPLORER + MENUITEM "ber &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Einstellungen...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&ber Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Zeige versteckte Icons", ID_SHOW_HIDDEN_ICONS + MENUITEM "Zeige Icon-&Button", ID_SHOW_ICON_BUTTON + MENUITEM "&Konfiguriere Benachrichtigungen...", ID_CONFIG_NOTIFYAREA + MENUITEM "Einstellen von &Datum/Zeit...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&ber Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "ffne &Lautstrkeregler", ID_TRAY_VOLUME + MENUITEM "Editieren der Audio-&Einstellungen", ID_VOLUME_PROPERTIES + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ausfhren" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "Befehls&zeile:",-1,"Static",SS_LEFTNOWORDWRAP | + WS_GROUP,3,18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Als &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "A&bbrechen",2,158,23,47,14 + PUSHBUTTON "&Hilfe",254,158,43,47,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ber ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 204 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Desktop-Einstellungen" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Bitte whlen Sie den gewnschten Platzierungs-Algorithmus fr die Desktop-Icons aus:", + IDC_STATIC,7,7,197,23 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,35,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,35,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,35,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,35,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,83,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,83,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,83,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,83,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,131,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,131,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,131,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,131,46,44 + CONTROL "Anzeige der &Versionsnummer",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,187,107,10 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 204 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmen-Einstellungen" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 204 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Taskbar-Einstellungen" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Anzeigen der &Uhr",ID_SHOW_CLOCK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,152,71,10 + CONTROL "&verstecke inaktive Notification-Icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,131,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Auswahl des Explorerfenster-Modus" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Please select your prefered explorer user interface:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "ffne Unterverzeichnisses in &neuen Fenstern", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,157,10 + LTEXT "Diese Auswahl wird knftig fr alle Explorer-Fenster verwendet werden.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "A&bbrechen",IDCANCEL,106,136,50,14 +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Konfiguration der Benachrichtigungs-Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip-Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "&Fenster-Titel:",IDC_LABEL2,7,63,42,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Modulpfad:",IDC_LABEL3,7,81,36,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Anzeigemodus",IDC_LABEL4,7,96,157,28 + CONTROL "&zeigen",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,37,10 + CONTROL "&verstecken",IDC_NOTIFY_HIDE,"Button", + BS_AUTORADIOBUTTON,55,108,51,10 + CONTROL "a&utomatisch",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,110,108,54,10 + ICON "",IDC_PICTURE,173,101,20,20 + LTEXT "&Letzte nderung:",IDC_LABEL6,7,132,55,8 + EDITTEXT IDC_LAST_CHANGE,66,129,98,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "zei&ge versteckte",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,68,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "A&bbrechen",IDCANCEL,151,153,50,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Programmsuche im Startmen" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,96,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "Alle ber&prfen",IDC_CHECK_ENTRIES,138,7,55,14 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Abmelden..." + IDS_SHUTDOWN "Herunterfahren..." + IDS_LAUNCH "Starten..." + IDS_START_HELP "Hilfe" + IDS_SEARCH_FILES "Suche Dateien..." + IDS_DOCUMENTS "Dokumente" + IDS_FAVORITES "Bookmarks" + IDS_PROGRAMS "Programme" + IDS_SETTINGS "Einstellungen" + IDS_EXPLORE "Explore" + IDS_EMPTY "(Empty)" + IDS_RECENT "Aktuelle Dokumente" + IDS_ADMIN "Verwaltung" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmen" + IDS_MINIMIZE_ALL "alle Fenster minimieren" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Lautstrke" + IDS_ITEMS_CUR "aktuelle Icons" + IDS_ITEMS_CONFIGURED "Konfiguratrion" + IDS_ITEMS_VISIBLE "sichtbar" + IDS_ITEMS_HIDDEN "unsichtbar" + IDS_NOTIFY_SHOW "sichtbar" + IDS_NOTIFY_HIDE "versteckt" + IDS_NOTIFY_AUTOHIDE "automatisch" + IDS_SHOW_HIDDEN_ICONS "Zeige versteckte Icons" + IDS_HIDE_ICONS "Verstecke Icons" + IDS_TERMINATE "ROS Explorer beenden" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Netzwerk" + IDS_CONNECTIONS "Netzwerk-Verbindungen" + IDS_DRIVES "Verzeichnisse" + IDS_SEARCH_COMPUTER "Suche Computer..." + IDS_SETTINGS_MENU "Einstellungen-Menu" + IDS_CONTROL_PANEL "Systemsteuerung" + IDS_PRINTERS "Drucker" + IDS_BROWSE "Dateien" + IDS_SEARCH_PRG "Suche Programm..." + IDS_ALL_USERS "Alle Benutzer\\" + IDS_SEARCH "Suche" + IDS_ABOUT_EXPLORER "&ber Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Sie haben mehrere Programme ausgewhlt.\nSind Sie sicher, da sie diese alle starten wollen?" + IDS_DESKTOPBAR_SETTINGS "Desktop-Einstellungen" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-en.rc b/reactos/base/shell/explorer/explorer-en.rc new file mode 100644 index 00000000000..1324948e7b7 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-en.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "E&xit", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Window" + BEGIN + MENUITEM "New &Window", ID_WINDOW_NEW + MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Help" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Open Volume Control", ID_TRAY_VOLUME + MENUITEM "Adjust Audio Properties", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Show hidden icons", ID_SHOW_HIDDEN_ICONS + MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON + MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Adjust Date/&Time...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Close", ID_FILE_EXIT + END + POPUP "&View" + BEGIN + MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Status Bar", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Refresh\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Help" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER + MENUITEM "About &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancel",2,158,23,47,14 + PUSHBUTTON "&Help",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Search Program in Startmenu" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Desktop Properties" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Taskbar Properties" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&hide inactive notification icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenu Properties" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configure Notification Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Choose Explorer window mode" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Please select your prefered explorer user interface:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "This setting will be used as default for all explorer windows in the future.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Log Off..." + IDS_SHUTDOWN "Turn Off..." + IDS_LAUNCH "Run..." + IDS_START_HELP "Help" + IDS_SEARCH_FILES "Search..." + IDS_DOCUMENTS "My Documents" + IDS_FAVORITES "Favorites" + IDS_PROGRAMS "Programs" + IDS_SETTINGS "Settings" + IDS_EXPLORE "Explore" + IDS_EMPTY "(Empty)" + IDS_RECENT "Recent Documents" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "minimize all windows" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Terminate ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Network" + IDS_CONNECTIONS "Network Connections" + IDS_DRIVES "Drives" + IDS_SEARCH_COMPUTER "Search Computer..." + IDS_SETTINGS_MENU "Settings Menu" + IDS_CONTROL_PANEL "Control Panel" + IDS_PRINTERS "Printers" + IDS_BROWSE "Browse Files" + IDS_SEARCH_PRG "Search Program..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Search" + IDS_ABOUT_EXPLORER "&About Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Desktop Settings" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-es.rc b/reactos/base/shell/explorer/explorer-es.rc new file mode 100644 index 00000000000..07220b93768 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-es.rc @@ -0,0 +1,384 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Spanish (Castilian) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESP) +#ifdef _WIN32 +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "E&jecutar...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Salir", ID_FILE_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Herramientas", ID_VIEW_TOOL_BAR + MENUITEM "Barra &Extra", ID_VIEW_EXTRA_BAR + MENUITEM "Barra de &Unidades", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR + MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_REFRESH + MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI + END + POPUP "&Ventana" + BEGIN + MENUITEM "Nueva &Ventana", ID_WINDOW_NEW + MENUITEM "Cascada\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Mosaico &Horizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaico &Vertical\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Agrupar Automaticamente", ID_WINDOW_AUTOSORT + MENUITEM "Agrupar &Smbolos", ID_WINDOW_ARRANGE + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "A&yuda" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Configuracion...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Administrador de Tareas...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Abrir Control de Volumen", ID_TRAY_VOLUME + MENUITEM "Ajustar Propiedades de Audio", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Mostrar iconos ocultos", ID_SHOW_HIDDEN_ICONS + MENUITEM "Mostrar &Botn de Icono", ID_SHOW_ICON_BUTTON + MENUITEM "&Configurar Notificaciones...", ID_CONFIG_NOTIFYAREA + MENUITEM "Ajustar Fecha/&Hora...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Archivo" + BEGIN + MENUITEM "E&jecutar...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "S&alir", ID_FILE_EXIT + END + POPUP "&Ver" + BEGIN + MENUITEM "&Barra de Herramientas", ID_VIEW_TOOL_BAR + MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Actualizar\tF5", ID_REFRESH + MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "Herramientas" + BEGIN + MENUITEM "&Opciones", ID_TOOLS_OPTIONS + END + POPUP "&Ayuda" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Ejecutar" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "Orden:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,18, + 60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Como &Smbolo",214,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,45,71,12 + DEFPUSHBUTTON "&Aceptar",1,158,6,47,14 + PUSHBUTTON "&Cancelar",2,158,23,47,14 + PUSHBUTTON "&Ayuda",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Buscar Programa en el menu Inicio" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtro:",IDC_STATIC,7,9,23,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Marcar Entradas",IDC_CHECK_ENTRIES,136,7,57,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades de Pantalla" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Por favor seleccione su algoritmo de alineamiento preferido:", + IDC_STATIC,7,7,195,8 + CONTROL "izquierda/arriba abajo",IDC_ICON_ALIGN_0,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "izquierda/arriba derecha",IDC_ICON_ALIGN_1,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "derecha/arriba izquierda",IDC_ICON_ALIGN_2,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "derecha/arriba abajo",IDC_ICON_ALIGN_3,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "derecha/abajo arriba",IDC_ICON_ALIGN_4,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "izquierda/abajo derecha",IDC_ICON_ALIGN_5,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "derecha/abajo izquierda",IDC_ICON_ALIGN_6,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "derecha/abajo",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "borde inferior",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "borde H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "aproximado",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Mostrar &Version",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades de la Barra de Tareas" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Mostrar &Reloj",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,56,10 + CONTROL "&Ocultar iconos de notificacion inactivos", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,136,10 + PUSHBUTTON "&Notificaciones...",ID_CONFIG_NOTIFYAREA,145,173,64,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Propiedades del Men Inicio" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configurar Iconos de Notificaciones" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Texto de Info:",IDC_LABEL1,8,44,51,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,82,42,117,14,ES_AUTOHSCROLL + LTEXT "Ttulo de la V&entana:",IDC_LABEL2,8,63,70,8 + EDITTEXT IDC_NOTIFY_TITLE,82,60,117,14,ES_AUTOHSCROLL + LTEXT "&Parche del Mdulo:",IDC_LABEL3,8,81,65,8 + EDITTEXT IDC_NOTIFY_MODULE,82,78,117,14,ES_AUTOHSCROLL + GROUPBOX "Modo de &Display",IDC_LABEL4,7,96,157,28 + CONTROL "&Mostrar",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,38,10 + CONTROL "&Ocultar",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON, + 66,108,36,10 + CONTROL "A&utoocultar",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,50,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "ltimo cambio:",IDC_LABEL6,7,132,50,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Mostrar Ocu<os",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,64,10 + DEFPUSHBUTTON "&Aceptar",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Cancelar",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Elegir modo MDI / SDI" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Por favor, seleccione su interfaz de usuario preferida para el explorador:", + IDC_STATIC,7,7,170,18 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,123,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,116,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Esta configuracin se usar por defecto y apartir de ahora para todas las ventanas del explorador.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&Aceptar",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Cancelar",IDCANCEL,106,136,50,14 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "Iniciar" + IDS_LOGOFF "Salir..." + IDS_SHUTDOWN "Apagar..." + IDS_LAUNCH "Ejecutar..." + IDS_START_HELP "Ayuda" + IDS_SEARCH_FILES "Buscar..." + IDS_DOCUMENTS "Documentos" + IDS_FAVORITES "Favoritos" + IDS_PROGRAMS "Programas" + IDS_SETTINGS "Configuracin" + IDS_EXPLORE "Explorar" + IDS_EMPTY "(Vaco)" + IDS_RECENT "Documentos Recientes" + IDS_ADMIN "Administracion" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Men Inicio" + IDS_MINIMIZE_ALL "mimimizar todas las ventanas" + IDS_DESKTOP_NUM "Escritorio %d" + IDS_VOLUME "Volumen" + IDS_ITEMS_CUR "Objetos Actuales" + IDS_ITEMS_CONFIGURED "configuracin" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "oculto" + IDS_NOTIFY_SHOW "mostrar" + IDS_NOTIFY_HIDE "ocultar" + IDS_NOTIFY_AUTOHIDE "autoocultar" + IDS_SHOW_HIDDEN_ICONS "Mostrar iconos ocultos" + IDS_HIDE_ICONS "Ocultar iconos" + IDS_TERMINATE "Finalizar ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Red" + IDS_CONNECTIONS "Conexiones de Red" + IDS_DRIVES "Unidades" + IDS_SEARCH_COMPUTER "Buscar PC..." + IDS_SETTINGS_MENU "Mens de Configuracin" + IDS_CONTROL_PANEL "Panel de Control" + IDS_PRINTERS "Impresoras" + IDS_BROWSE "Explorar Archivos" + IDS_SEARCH_PRG "Buscar Programas..." + IDS_ALL_USERS "Todos los Usuarios\\" + IDS_SEARCH "Buscar" + IDS_ABOUT_EXPLORER "&Acerca de Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Ha seleccionado ms de un programa.\nEst seguro de que desea ejecutarlos todos?" + IDS_DESKTOPBAR_SETTINGS "Configuracion del Escritorio" + IDS_DESKTOP "Escritorio" + IDS_TASKBAR "Barra de Tareas" +END + +#endif // Spanish (Castilian) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-fr.rc b/reactos/base/shell/explorer/explorer-fr.rc new file mode 100644 index 00000000000..4ef5f3e5394 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-fr.rc @@ -0,0 +1,416 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// French (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "E&xcuter...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Barre des lecteurs", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "Barre d'&tat", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "A&ctualiser\tF5", ID_REFRESH + MENUITEM "&Plein cran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Fentre" + BEGIN + MENUITEM "Nouvelle &fentre", ID_WINDOW_NEW + MENUITEM "Cascade\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Mosaque &horizontale", ID_WINDOW_TILE_HORZ + MENUITEM "Mosaque &verticale\tCtrl+Shift+S", ID_WINDOW_TILE_VERT + MENUITEM "Organisation automatique", ID_WINDOW_AUTOSORT + MENUITEM "&Organisation des symboles", ID_WINDOW_ARRANGE + END + POPUP "&Outils" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Aide" + BEGIN + MENUITEM "&FAQ de l'explorateur...", ID_EXPLORER_FAQ + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + MENUITEM "A propos de l'&OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Paramtres...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Gestionnaire de tches...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Ouvrir le contrle du volume", ID_TRAY_VOLUME + MENUITEM "Ajuster les proprits audio", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Afficher les icnes cachs", ID_SHOW_HIDDEN_ICONS + MENUITEM "Afficher l'icne &Boutton", ID_SHOW_ICON_BUTTON + MENUITEM "&Configurer les Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Ajuster Date/&Heure...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Excuter...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Fermer", ID_FILE_EXIT + END + POPUP "&Affichage" + BEGIN + MENUITEM "&Barre d'outils", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Barre d'tat", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "A&ctualiser\tF5", ID_REFRESH + MENUITEM "&Plein cran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Outils" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Aide" + BEGIN + MENUITEM "&FAQ de l'explorateur...", ID_EXPLORER_FAQ + MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER + MENUITEM "A propos de l'&OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Excuter" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Commande:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Comme &Symbole",214,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Annuler",2,158,23,47,14 + PUSHBUTTON "&Aide",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Rechercher un programme dans le menu dmarrer" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtre:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Vrifier les entres",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Proprits du bureau" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "gauche/haut descend",IDC_ICON_ALIGN_0,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "gauche/haut droite",IDC_ICON_ALIGN_1,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "droite/haut left",IDC_ICON_ALIGN_2,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "droite/haut descend",IDC_ICON_ALIGN_3,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "gauche/fond monte",IDC_ICON_ALIGN_4,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "gauche/fond right",IDC_ICON_ALIGN_5,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "droite/fond gauche",IDC_ICON_ALIGN_6,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rdroite/fond. descend",IDC_ICON_ALIGN_7,"Button", + BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "bord descend",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "bord H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "faire le tour",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Afficher le numro de la &version",ID_DESKTOP_VERSION, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Proprits de la barre de tches" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "afficher l'&heure",ID_SHOW_CLOCK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,152,52,10 + CONTROL "&masquer les icnes inactives",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Proprits du menu dmarrer" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configurer Icnes de Notification" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Texte conseil:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "Titre de la &fentre:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Repertoire du module:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Mode d'affichage",IDC_LABEL4,7,96,157,28 + CONTROL "&afficher",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&cacher",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "&cacher automatiquement",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Dernier changement:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "afficher les cac&hs",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Annuler",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Veuillez choisir un mode de fentres pour explorateur" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Veuillez slectionner l'interface que vous prfrez pour l'explorateur:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Ouvrir les sous-dossiers dans des fentres s&parres", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Ce paramtre sera utilis par dfaut.",IDC_STATIC,7,111, + 174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Annuler",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "A propos de ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Dmarrer" + IDS_LOGOFF "Se dconnecter..." + IDS_SHUTDOWN "Arrter..." + IDS_LAUNCH "Excuter..." + IDS_START_HELP "Aide" + IDS_SEARCH_FILES "Rechercher..." + IDS_DOCUMENTS "Documents" + IDS_FAVORITES "Favoris" + IDS_PROGRAMS "Programmes" + IDS_SETTINGS "Paramtres" + IDS_EXPLORE "Explorer" + IDS_EMPTY "(Vide)" + IDS_RECENT "Documents rcents" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Menu dmarrer" + IDS_MINIMIZE_ALL "mimimiser toutes les fentres" + IDS_DESKTOP_NUM "Bureau %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "abjets actuels" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "cach" + IDS_NOTIFY_SHOW "afficher" + IDS_NOTIFY_HIDE "cacher" + IDS_NOTIFY_AUTOHIDE "cacher automatiquement" + IDS_SHOW_HIDDEN_ICONS "Afficher les icones cachs" + IDS_HIDE_ICONS "Cacher les icones" + IDS_TERMINATE "Fermer ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Rseaux" + IDS_CONNECTIONS "Connections Rseaux" + IDS_DRIVES "Drives" + IDS_SEARCH_COMPUTER "Rechercher un ordinateur..." + IDS_SETTINGS_MENU "Paramtres du menu" + IDS_CONTROL_PANEL "Panneau de configuration" + IDS_PRINTERS "Imprimantes" + IDS_BROWSE "Parcourir" + IDS_SEARCH_PRG "Rechercher un programme..." + IDS_ALL_USERS "Tous les utilisateurs\\" + IDS_SEARCH "Rechercher" + IDS_ABOUT_EXPLORER "&A propos de l'explorateur..." + IDS_LAUNCH_MANY_PROGRAMS + "Vous avez selectionn plus d'un programme.\nEtes vous sur de vouloir tous les lancer?" + IDS_DESKTOPBAR_SETTINGS "Paramtres du bureau" + IDS_DESKTOP "Bureau" + IDS_TASKBAR "Barre de tches" +END + +#endif // French (France) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-hu.rc b/reactos/base/shell/explorer/explorer-hu.rc new file mode 100644 index 00000000000..74eefb96757 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-hu.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Hungarian (unknown sub-lang: 0x0) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HUN) +#ifdef _WIN32 +LANGUAGE LANG_HUNGARIAN, 0x0 +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Futtats...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Kilps", ID_FILE_EXIT + END + POPUP "&Nzet" + BEGIN + MENUITEM "&Eszkztr", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR + MENUITEM "&llapot sor", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Frisst\tF5", ID_REFRESH + MENUITEM "T&eljes kperny\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Ablak" + BEGIN + MENUITEM "j &Ablak", ID_WINDOW_NEW + MENUITEM "Lpcszetes\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ + MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT + MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE + END + POPUP "&Eszkzk" + BEGIN + MENUITEM "&Belltsok", ID_TOOLS_OPTIONS + END + POPUP "&Sg" + BEGIN + MENUITEM "Explorer &GYIK...", ID_EXPLORER_FAQ + MENUITEM "Explorer &nvjegye...", ID_ABOUT_EXPLORER + MENUITEM "Az &OS nvjegye...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Belltsok...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Feladatkezel...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Explorer nvjegye...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Hanger belltsok", ID_TRAY_VOLUME + MENUITEM "Hangrendszer tulajdonsgai", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Rejtett ikonok megjelentse", ID_SHOW_HIDDEN_ICONS + MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON + MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA + MENUITEM "Dtum s id belltsai...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Explorer nvjegye...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Futtats...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Bezrs", ID_FILE_EXIT + END + POPUP "&Nzet" + BEGIN + MENUITEM "&Eszkztr", ID_VIEW_TOOL_BAR + MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&llapot sor", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Frissts\tF5", ID_REFRESH + MENUITEM "T&eljes kperny\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Eszkzk" + BEGIN + MENUITEM "&Belltsok", ID_TOOLS_OPTIONS + END + POPUP "&Sg" + BEGIN + MENUITEM "Explorer &GYIK...", ID_EXPLORER_FAQ + MENUITEM "&Az Explorer nvjegye...", ID_ABOUT_EXPLORER + MENUITEM "Az &OS nvjegye...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Futtats" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Parancs:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Mgse",2,158,23,47,14 + PUSHBUTTON "&Sg",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Search Program in Startmenu" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Asztal belltsai" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Please select your prefered icon alignment algorithm:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Taskbar Properties" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&hide inactive notification icons", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenu Properties" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Configure Notification Icons" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28 + CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Mgse",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Choose Explorer window mode" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Please select your prefered explorer user interface:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "This setting will be used as default for all explorer windows in the future.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Mgse",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About ReactOS Explorer" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Kijelentkezs..." + IDS_SHUTDOWN "Kikapcsols..." + IDS_LAUNCH "Futtats..." + IDS_START_HELP "Sg" + IDS_SEARCH_FILES "Keress..." + IDS_DOCUMENTS "Dokumentumok" + IDS_FAVORITES "Kedvencek" + IDS_PROGRAMS "Programok" + IDS_SETTINGS "Belltsok" + IDS_EXPLORE "Bngszs" + IDS_EMPTY "(res)" + IDS_RECENT "Recent Documents" + IDS_ADMIN "Felgyelet" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "%d. asztal" + IDS_VOLUME "Hanger" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "Rejtett" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Kilps a ROS Explorerbl" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Hlzat" + IDS_CONNECTIONS "Hlzati kapcsolatok" + IDS_DRIVES "Meghajtk" + IDS_SEARCH_COMPUTER "Szmtgp keresse..." + IDS_SETTINGS_MENU "Settings Menu" + IDS_CONTROL_PANEL "Vezrlpult" + IDS_PRINTERS "Nyomtatk" + IDS_BROWSE "llomnyok bngszse" + IDS_SEARCH_PRG "Search Program..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Keress" + IDS_ABOUT_EXPLORER "Az &Explorer nvjegye..." + IDS_LAUNCH_MANY_PROGRAMS + "Tbb programot vlasztottl ki.\nBiztosan szeretnd mindegyiket futtatni?" + IDS_DESKTOPBAR_SETTINGS "Asztal belltsai" + IDS_DESKTOP "Asztal" + IDS_TASKBAR "Taskbar" +END + +#endif // Hungarian (unknown sub-lang: 0x0) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-jp.rc b/reactos/base/shell/explorer/explorer-jp.rc new file mode 100644 index 00000000000..37a728dbac1 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-jp.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Japanese resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "t@C(&F)" + BEGIN + MENUITEM "s(&E)...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "I(&X)", ID_FILE_EXIT + END + POPUP "\\(&V)" + BEGIN + MENUITEM "c[ o[(&T)", ID_VIEW_TOOL_BAR + MENUITEM "GLXg o[(&E)", ID_VIEW_EXTRA_BAR + MENUITEM "hCuo[(&D)", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "TCh o[(&I)", ID_VIEW_SIDE_BAR + MENUITEM "Xe[^X o[(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "ŐV̏ɍXV(&R)\tF5", ID_REFRESH + MENUITEM "Sʕ\\(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "EBhE(&W)" + BEGIN + MENUITEM "VEBhE(&W)", ID_WINDOW_NEW + MENUITEM "d˂ĕ\\\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "ɕׂĕ\\(&H)", ID_WINDOW_TILE_HORZ + MENUITEM "ɕׂĕ\\(&V)\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "", ID_WINDOW_AUTOSORT + MENUITEM "ŏꂽqEBhE𐮗(&S)", ID_WINDOW_ARRANGE + END + POPUP "c[(&T)" + BEGIN + MENUITEM "IvV(&O)", ID_TOOLS_OPTIONS + END + POPUP "wv(&H)" + BEGIN + MENUITEM "Explorer FAQ (&F)...", ID_EXPLORER_FAQ + MENUITEM "Explorer ɂ‚(&A)...", ID_ABOUT_EXPLORER + MENUITEM "OS ɂ‚(&O)...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "ݒ(&S)...", ID_DESKTOPBAR_SETTINGS + MENUITEM "^XN }l[W(&T)...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "Explorer ɂ‚(&A)...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "{[ Rg[J", ID_TRAY_VOLUME + MENUITEM "I[fBI vpeB̒", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "BꂽACR\\(&S)", ID_SHOW_HIDDEN_ICONS + MENUITEM "ACR {^\\(&B)", ID_SHOW_ICON_BUTTON + MENUITEM "ʒm̃JX^}CY(&C)...", ID_CONFIG_NOTIFYAREA + MENUITEM "tƎ̒(&T)...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "Explorer ɂ‚(&A)...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "t@C(&F)" + BEGIN + MENUITEM "s(&E)...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "‚(&C)", ID_FILE_EXIT + END + POPUP "\\(&V)" + BEGIN + MENUITEM "c[ o[(&T)", ID_VIEW_TOOL_BAR + MENUITEM "TCh o[(&I)", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "Xe[^X o[(&S)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "ŐV̏ɍXV(&R)\tF5", ID_REFRESH + MENUITEM "Sʕ\\(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "MDI (&M)", ID_VIEW_MDI + END + POPUP "c[(&T)" + BEGIN + MENUITEM "IvV(&O)", ID_TOOLS_OPTIONS + END + POPUP "wv(&H)" + BEGIN + MENUITEM "Explorer FAQ (&F)...", ID_EXPLORER_FAQ + MENUITEM "Explorer ɂ‚(&A)...", ID_ABOUT_EXPLORER + MENUITEM "OS ɂ‚(&O)...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "s" +FONT 9, "MS UI Gothic" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "R}h(&C):",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "ŏԂŎs(&S)",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "OK (&O)",1,158,6,47,14 + PUSHBUTTON "LZ(&C)",2,158,23,47,14 + PUSHBUTTON "wv(&H)",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "X^[gj[vO" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + LTEXT "tB^(&F):",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "o^`FbN(&C)",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "fXNgbṽvpeB" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "gpACR̔zuIĂ:", + IDC_STATIC,7,7,166,8 + CONTROL "ォ牺",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "ォE",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "Eォ獶",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "Eォ牺",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "E",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "E獶",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "E牺",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "E",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "ƍE̒[",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "ւɂȂ悤",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "fXNgbvɃo[W\\(&V)",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "^XN o[̃vpeB" +FONT 9, "MS UI Gothic" +BEGIN + CONTROL "v\\(&C)",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "ANeBułȂʒmACRB(&H)", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "ʒmACR(&N)...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "X^[gj[̃vpeB" +FONT 9, "MS UI Gothic" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "ʒmACR̐ݒ" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "c[ `bv̓e(&T):",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "EBhẼ^Cg(&I):",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "W[̏ꏊ(&M):",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "\\[h(&D)",IDC_LABEL4,7,96,157,28 + CONTROL "\\(&S)",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "B(&H)",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "IɉB(&U)",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "ŏIύX(&L):",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "BꂽACR\\(&W)",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "OK (&O)",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "LZ(&C)",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 138 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "GNXv[̃EBhE [h̑I" +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + LTEXT "gp[U[ C^[tF[XIĂ:", + IDC_STATIC,7,7,160,8 + CONTROL "MDI (Multiple Document Interface)(&M)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "SDI (Single Document Interface)(&S)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "TutH_VEBhEŊJ(&E)", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "肱̐ݒ肪AׂĂ Explorer EBhẼftHgɂȂ܂B", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "OK (&O)",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "LZ(&C)",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Explorer ɂ‚" +FONT 10, "MS UI Gothic" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "OK (&O)",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "" + IDS_LOGOFF "OIt..." + IDS_SHUTDOWN "Vbg_E..." + IDS_LAUNCH "t@Cw肵Ďs..." + IDS_START_HELP "wv" + IDS_SEARCH_FILES "t@CtH_..." + IDS_DOCUMENTS "}ChLg" + IDS_FAVORITES "Cɓ" + IDS_PROGRAMS "vO" + IDS_SETTINGS "ݒ" + IDS_EXPLORE "GNXv[" + IDS_EMPTY "(Ȃ)" + IDS_RECENT "ŋߎgt@C" + IDS_ADMIN "Ǘc[" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "X^[gj[" + IDS_MINIMIZE_ALL "SEBhEŏ" + IDS_DESKTOP_NUM "fXNgbv %d" + IDS_VOLUME "" + IDS_ITEMS_CUR "݂̃ACR" + IDS_ITEMS_CONFIGURED "ݒ" + IDS_ITEMS_VISIBLE "\\" + IDS_ITEMS_HIDDEN "\\" + IDS_NOTIFY_SHOW "\\" + IDS_NOTIFY_HIDE "B" + IDS_NOTIFY_AUTOHIDE "IɉB" + IDS_SHOW_HIDDEN_ICONS "BĂACR\\" + IDS_HIDE_ICONS "ACRB" + IDS_TERMINATE "ROS Explorer I" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "lbg[N" + IDS_CONNECTIONS "lbg[Nڑ" + IDS_DRIVES "[JfBXN" + IDS_SEARCH_COMPUTER "Rs[^̌..." + IDS_SETTINGS_MENU "ݒ胁j[" + IDS_CONTROL_PANEL "Rg[ pl" + IDS_PRINTERS "v^" + IDS_BROWSE "t@C̃uEY" + IDS_SEARCH_PRG "vO..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "" + IDS_ABOUT_EXPLORER "Explorer ɂ‚(&A)..." + IDS_LAUNCH_MANY_PROGRAMS + "ˆȏ̃vOI܂B\nׂẴvOs܂?" + IDS_DESKTOPBAR_SETTINGS "fXNgbv̐ݒ" + IDS_DESKTOP "fXNgbv" + IDS_TASKBAR "^XNo[" +END + +#endif // Japanese resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-pl.rc b/reactos/base/shell/explorer/explorer-pl.rc new file mode 100644 index 00000000000..591f0d75b34 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-pl.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Polish (PL) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_POLISH, SUBLANG_NEUTRAL +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Plik" + BEGIN + MENUITEM "Urucho&m...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Za&kocz", ID_FILE_EXIT + END + POPUP "&Widok" + BEGIN + MENUITEM "Przyciski &standardowe", ID_VIEW_TOOL_BAR + MENUITEM "P&rzyciski dodatkowe", ID_VIEW_EXTRA_BAR + MENUITEM "Pasek &dyskw", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "Pasek &boczny", ID_VIEW_SIDE_BAR + MENUITEM "Pasek sta&nu", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Odwie\tF5", ID_REFRESH + MENUITEM "P&eny ekran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Okna" + BEGIN + MENUITEM "Nowe &okno", ID_WINDOW_NEW + MENUITEM "&Kaskada\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&Ssiadujco poziomo", ID_WINDOW_TILE_HORZ + MENUITEM "Ssiadujco &pionowo\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "&Autorozmieszczenie", ID_WINDOW_AUTOSORT + MENUITEM "Rozmie wedug &nazwy", ID_WINDOW_ARRANGE + END + POPUP "&Narzdzia" + BEGIN + MENUITEM "&Opcje", ID_TOOLS_OPTIONS + END + POPUP "Pomo&c" + BEGIN + MENUITEM "Explorer &FAQ", ID_EXPLORER_FAQ + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + MENUITEM "ReactOS - I&nformacje", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Waciwoci", ID_DESKTOPBAR_SETTINGS + MENUITEM "Meneder &zada", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Otwrz regulacje gonoci", ID_TRAY_VOLUME + MENUITEM "&Ustaw waciwoci audio", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Poka ukryte ikony", ID_SHOW_HIDDEN_ICONS + MENUITEM "&Ukrywaj nieuywane ikony", ID_SHOW_ICON_BUTTON + MENUITEM "&Konfiguruj powiadomienia", ID_CONFIG_NOTIFYAREA + MENUITEM "Ustaw &dat/godzin", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Plik" + BEGIN + MENUITEM "Urucho&m...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "Za&kocz", ID_FILE_EXIT + END + POPUP "&Widok" + BEGIN + MENUITEM "Przyciski &standardowe", ID_VIEW_TOOL_BAR + MENUITEM "Pasek &boczny", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "Pasek sta&nu", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Odwie\tF5", ID_REFRESH + MENUITEM "P&eny ekran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Narzdzia" + BEGIN + MENUITEM "&Opcje", ID_TOOLS_OPTIONS + END + POPUP "Pomo&c" + BEGIN + MENUITEM "Explorer &FAQ", ID_EXPLORER_FAQ + MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER + MENUITEM "ReactOS - I&nformacje", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Uruchom" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&Polecenie:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Jako &symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Anuluj",2,158,23,47,14 + PUSHBUTTON "Pomo&c",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Szukaj programu w menu start" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filtry:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Szukaj nazwy",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Waciwoci pulpitu" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Wybierz sposb ukadania ikon:", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Wywietlaj &numer wersji",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Waciwoci paska zada" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Poka &zegar",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Ukrywaj nieaktywne ikony", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Dostosuj",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Waciwoci Menu Start" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Konfiguracja ikon powiadomie" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Podpowied:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "&Tytu okna:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "cieka:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Sposb wywietlania",IDC_LABEL4,7,96,157,28 + CONTROL "&widoczny",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&ukryty",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "&autoukrywanie",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Zmodyfikowany:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "Po&ka wszystkie",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Anuluj",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Tryb wywietlania okien" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Wybierz tryb wywietlania okien:", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI (Otwieraj w jednym oknie)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI (Otwieraj we wasnym oknie)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "&Otwieraj podkatalogi w nowych oknach", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Te opcje bd stosowane w przyszoci do wszystkich okien.", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Anuluj",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Explorer - &Informacje" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Wyloguj..." + IDS_SHUTDOWN "Zamknij system..." + IDS_LAUNCH "Uruchom..." + IDS_START_HELP "Pomoc" + IDS_SEARCH_FILES "Szukaj..." + IDS_DOCUMENTS "Dokumenty" + IDS_FAVORITES "Ulubione" + IDS_PROGRAMS "Programy" + IDS_SETTINGS "Ustawienia" + IDS_EXPLORE "Eksploruj" + IDS_EMPTY "(pusty)" + IDS_RECENT "Ostatnio otwarte" + IDS_ADMIN "Administracja" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Menu start" + IDS_MINIMIZE_ALL "Minimalizuj wszystko" + IDS_DESKTOP_NUM "Pulpit %d" + IDS_VOLUME "Gono" + IDS_ITEMS_CUR "Aktualne pozycje" + IDS_ITEMS_CONFIGURED "ustawienia" + IDS_ITEMS_VISIBLE "widoczne" + IDS_ITEMS_HIDDEN "ukryte" + IDS_NOTIFY_SHOW "poka" + IDS_NOTIFY_HIDE "ukryj" + IDS_NOTIFY_AUTOHIDE "autoukrywanie" + IDS_SHOW_HIDDEN_ICONS "Poka ukryte ikony" + IDS_HIDE_ICONS "Ukryj ikony" + IDS_TERMINATE "Zakocz dziaanie ROS Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Sie" + IDS_CONNECTIONS "Poczenia sieciowe" + IDS_DRIVES "Dysk" + IDS_SEARCH_COMPUTER "Znajd komputar..." + IDS_SETTINGS_MENU "Settings menu" + IDS_CONTROL_PANEL "Panel sterowania" + IDS_PRINTERS "Drukarki" + IDS_BROWSE "Przegldaj" + IDS_SEARCH_PRG "Znajd progarm..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Szukaj" + IDS_ABOUT_EXPLORER "ReactOS Explorer - &Informacje" + IDS_LAUNCH_MANY_PROGRAMS + "Zaznaczye wicej ni jeden program.\nCzy chcesz uruchomi je jednoczenie?" + IDS_DESKTOPBAR_SETTINGS "Waciwoci pulpitu" + IDS_DESKTOP "Pulpit" + IDS_TASKBAR "Pasek zada" +END + +#endif // Polish (PL) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-pt.rc b/reactos/base/shell/explorer/explorer-pt.rc new file mode 100644 index 00000000000..bf482733ac3 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-pt.rc @@ -0,0 +1,167 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Portuguese (Portugal) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTG) +#ifdef _WIN32 +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Executar" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "Co&mando:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Como &Smbolo",214,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Cancelar",2,158,23,47,14 + PUSHBUTTON "&Ajuda",254,158,43,47,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Explorador do Reactos" + IDS_START "Iniciar" + IDS_LOGOFF "Terminar sesso..." + IDS_SHUTDOWN "Desligar..." + IDS_LAUNCH "Executar..." + IDS_START_HELP "Ajuda" + IDS_SEARCH_FILES "Procurar..." + IDS_DOCUMENTS "Documentos" + IDS_FAVORITES "Favoritos" + IDS_PROGRAMS "Programas" + IDS_SETTINGS "Definies" + IDS_EXPLORE "Explorar" + IDS_EMPTY "(Vazio)" + IDS_RECENT "Documentos recentes" + IDS_ADMIN "Administrar" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "Terminar ROS Explorador" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Rede" + IDS_CONNECTIONS "Coneces da rede" + IDS_DRIVES "Drives" + IDS_SEARCH_COMPUTER "Procurar computador..." + IDS_SETTINGS_MENU "Menu das definies" + IDS_CONTROL_PANEL "Painel de controle" + IDS_PRINTERS "Impressora" + IDS_BROWSE "Vasculhar Ficheiros" + IDS_SEARCH_PRG "Procurar programa..." + IDS_ALL_USERS "Todos utilizadores\\" + IDS_SEARCH "Procurar" + IDS_ABOUT_EXPLORER "Sobre o Explorador..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Desktop Settings" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // Portuguese (Portugal) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-ro.rc b/reactos/base/shell/explorer/explorer-ro.rc new file mode 100644 index 00000000000..f14141e5727 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-ro.rc @@ -0,0 +1,244 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Romanian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ROM) +#ifdef _WIN32 +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL +#pragma code_page(1250) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fiier" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ieire", ID_FILE_EXIT + END + POPUP "&Prezentare" + BEGIN + MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR + MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR + MENUITEM SEPARATOR + MENUITEM "&Resetare\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&SDI", ID_VIEW_SDI + END + POPUP "&Fereastr" + BEGIN + MENUITEM "&Fereastr Nou", ID_WINDOW_NEW + MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Aliniaz &Orizontal", ID_WINDOW_TILE_HORZ + MENUITEM "Aliniaz &Vertical\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Aranjeaz automat", ID_WINDOW_AUTOSORT + MENUITEM "Aranjeaz &Simbolurile", ID_WINDOW_ARRANGE + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Fiier" + BEGIN + MENUITEM "&Execute...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Ieire", ID_FILE_EXIT + END + POPUP "&Prezentare" + BEGIN + MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR + MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Resetare\tF5", ID_REFRESH + MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Tools" + BEGIN + MENUITEM "&Options", ID_TOOLS_OPTIONS + END + POPUP "&Ajutor" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Comanda:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "Ca &Simbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "A&nulare",2,158,23,47,14 + PUSHBUTTON "&Ajutor",254,158,43,47,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "ReactOS Explorer" + IDS_START "ncepe" + IDS_LOGOFF "nchide sesiunea ..." + IDS_SHUTDOWN "Oprire calculator ..." + IDS_LAUNCH "Pornire ..." + IDS_START_HELP "Ajutor" + IDS_SEARCH_FILES "Cutare Files..." + IDS_DOCUMENTS "Documente" + IDS_FAVORITES "Preferine" + IDS_PROGRAMS "Programe" + IDS_SETTINGS "Setri" + IDS_EXPLORE "Explorare" + IDS_EMPTY "(Empty)" + IDS_RECENT "Documente Recente" + IDS_ADMIN "Administrare" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmenu" + IDS_MINIMIZE_ALL "mimimize all windows" + IDS_DESKTOP_NUM "Desktop %d" + IDS_VOLUME "Volume" + IDS_ITEMS_CUR "current items" + IDS_ITEMS_CONFIGURED "configuration" + IDS_ITEMS_VISIBLE "visible" + IDS_ITEMS_HIDDEN "hidden" + IDS_NOTIFY_SHOW "show" + IDS_NOTIFY_HIDE "hide" + IDS_NOTIFY_AUTOHIDE "autohide" + IDS_SHOW_HIDDEN_ICONS "Show hidden icons" + IDS_HIDE_ICONS "Hide icons" + IDS_TERMINATE "nchide sesiunea" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Reea" + IDS_CONNECTIONS "Conecii" + IDS_DRIVES "Discuri" + IDS_SEARCH_COMPUTER "Search Computer..." + IDS_SETTINGS_MENU "Settings Menu" + IDS_CONTROL_PANEL "Control Panel" + IDS_PRINTERS "Printers" + IDS_BROWSE "Browse Files" + IDS_SEARCH_PRG "Search Programm..." + IDS_ALL_USERS "All Users\\" + IDS_SEARCH "Cutare..." + IDS_ABOUT_EXPLORER "&Despre Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "You have selected more than one program.\nAre you sure you want to launch all of them?" + IDS_DESKTOPBAR_SETTINGS "Desktop Settings" + IDS_DESKTOP "Desktop" + IDS_TASKBAR "Taskbar" +END + +#endif // Romanian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-ru.rc b/reactos/base/shell/explorer/explorer-ru.rc new file mode 100644 index 00000000000..4771a717699 --- /dev/null +++ b/reactos/base/shell/explorer/explorer-ru.rc @@ -0,0 +1,416 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "resource.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&...", ID_DESKTOPBAR_SETTINGS + MENUITEM "& ...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "& ...", ID_ABOUT_EXPLORER + END +END + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&" + BEGIN + MENUITEM "&...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&", ID_FILE_EXIT + END + POPUP "&" + BEGIN + MENUITEM "& ", ID_VIEW_TOOL_BAR + MENUITEM "& ", ID_VIEW_EXTRA_BAR + MENUITEM "&", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&", ID_VIEW_SIDE_BAR + MENUITEM "& ", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&\tF5", ID_REFRESH + MENUITEM "& \tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&" + BEGIN + MENUITEM " &", ID_WINDOW_NEW + MENUITEM " \tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&", ID_WINDOW_TILE_HORZ + MENUITEM "&\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM " ", ID_WINDOW_AUTOSORT + MENUITEM " &", ID_WINDOW_ARRANGE + END + POPUP "&" + BEGIN + MENUITEM "&", ID_TOOLS_OPTIONS + END + POPUP "&" + BEGIN + MENUITEM "&FAQ() ...", ID_EXPLORER_FAQ + MENUITEM " &...", ID_ABOUT_EXPLORER + MENUITEM " &...", ID_ABOUT_WINDOWS + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "& ", ID_SHOW_HIDDEN_ICONS + MENUITEM " &", ID_SHOW_ICON_BUTTON + MENUITEM "& ...", ID_CONFIG_NOTIFYAREA + MENUITEM " /&", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "& ...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&" + BEGIN + MENUITEM "&...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&", ID_FILE_EXIT + END + POPUP "&" + BEGIN + MENUITEM "& ", ID_VIEW_TOOL_BAR + MENUITEM "&", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "& ", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&\tF5", ID_REFRESH + MENUITEM "& \tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&" + BEGIN + MENUITEM "&", ID_TOOLS_OPTIONS + END + POPUP "&" + BEGIN + MENUITEM "&FAQ() ...", ID_EXPLORER_FAQ + MENUITEM " &...", ID_ABOUT_EXPLORER + MENUITEM " &...", ID_ABOUT_WINDOWS + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "", ID_TRAY_VOLUME + MENUITEM " ", ID_VOLUME_PROPERTIES + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUT_EXPLORER DIALOGEX 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION " ReactOS" +FONT 10, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT " ReactOS",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + +IDD_DESKBAR_DESKTOP DIALOGEX 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT ", , \n ", + IDC_STATIC,7,7,195,18 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL " &",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,109,10 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION " " +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_DESKBAR_TASKBAR DIALOGEX 0, 0, 227, 202 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL " &",ID_SHOW_CLOCK,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,17,161,76,10 + CONTROL "& ",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,178,135,10 + PUSHBUTTON "&...",ID_CONFIG_NOTIFYAREA,156,174,63,14 +END + +IDD_EXECUTE DIALOGEX 15, 13, 210, 63 +STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&",2,158,24,47,14 + PUSHBUTTON "&",254,158,42,47,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION " MDI / SDI" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT " \n :", + IDC_STATIC,7,7,171,17 + CONTROL "&MDI ( )",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,136,10 + CONTROL "&SDI ( )",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,134,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT " , .", + IDC_STATIC,7,107,174,26 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14 +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "& :",IDC_LABEL1,7,44,62,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,76,42,125,14,ES_AUTOHSCROLL + LTEXT " &:",IDC_LABEL2,7,63,58,8 + EDITTEXT IDC_NOTIFY_TITLE,76,60,125,14,ES_AUTOHSCROLL + LTEXT "& :",IDC_LABEL3,7,81,54,8 + EDITTEXT IDC_NOTIFY_MODULE,76,78,125,14,ES_AUTOHSCROLL + GROUPBOX "& ",IDC_LABEL4,7,96,169,28 + CONTROL "&",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,47,10 + CONTROL "&",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,41,10 + CONTROL "&",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,60,10 + ICON "",IDC_PICTURE,181,101,20,20 + LTEXT "&\n",IDC_LABEL6,7,129,40,19 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "& ",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,78,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&",IDCANCEL,151,153,50,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&:",IDC_STATIC,7,9,30,8 + EDITTEXT IDC_FILTER,40,7,94,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&",IDC_CHECK_ENTRIES,143,7,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE " Reactos" + IDS_START "" + IDS_LOGOFF " ..." + IDS_SHUTDOWN "..." + IDS_LAUNCH "..." + IDS_START_HELP "" + IDS_SEARCH_FILES "..." + IDS_DOCUMENTS "" + IDS_FAVORITES "" + IDS_PROGRAMS "" + IDS_SETTINGS "" + IDS_EXPLORE "" + IDS_EMPTY "()" + IDS_RECENT " " + IDS_ADMIN "" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "" + IDS_CONNECTIONS " " + IDS_DRIVES "" + IDS_SEARCH_COMPUTER " ..." + IDS_SETTINGS_MENU " " + IDS_CONTROL_PANEL " " + IDS_PRINTERS "" + IDS_BROWSE " " + IDS_SEARCH_PRG " ..." + IDS_ALL_USERS " \\" + IDS_SEARCH "" + IDS_ABOUT_EXPLORER "& ..." + IDS_LAUNCH_MANY_PROGRAMS + " .\n , ?" + IDS_DESKTOPBAR_SETTINGS " " + IDS_DESKTOP " " + IDS_TASKBAR " " +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU " " + IDS_MINIMIZE_ALL " " + IDS_DESKTOP_NUM " %d" + IDS_VOLUME "" + IDS_ITEMS_CUR " " + IDS_ITEMS_CONFIGURED "" + IDS_ITEMS_VISIBLE "" + IDS_ITEMS_HIDDEN "" + IDS_NOTIFY_SHOW "" + IDS_NOTIFY_HIDE "" + IDS_NOTIFY_AUTOHIDE "" + IDS_SHOW_HIDDEN_ICONS " " + IDS_HIDE_ICONS " " + IDS_TERMINATE " " +END + +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""resource.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-sv.rc b/reactos/base/shell/explorer/explorer-sv.rc new file mode 100644 index 00000000000..cb82147b4bc --- /dev/null +++ b/reactos/base/shell/explorer/explorer-sv.rc @@ -0,0 +1,394 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Swedish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE) +#ifdef _WIN32 +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&Kr...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Avsluta", ID_FILE_EXIT + END + POPUP "&Visa" + BEGIN + MENUITEM "&Verktygsflt", ID_VIEW_TOOL_BAR + MENUITEM "&Extraflt", ID_VIEW_EXTRA_BAR + MENUITEM "E&nhetsflt", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "S&idflt", ID_VIEW_SIDE_BAR + MENUITEM "&Statusflt", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Uppdatera\tF5", ID_REFRESH + MENUITEM "F&ullskrm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&Fnster" + BEGIN + MENUITEM "Nytt &fnster", ID_WINDOW_NEW + MENUITEM "verlappande\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "Ordna &horizontellt", ID_WINDOW_TILE_HORZ + MENUITEM "Ordna &vertikalt\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM "Ordna automatiskt", ID_WINDOW_AUTOSORT + MENUITEM "Ordna &symboler", ID_WINDOW_ARRANGE + END + POPUP "&Verktyg" + BEGIN + MENUITEM "&Alternativ", ID_TOOLS_OPTIONS + END + POPUP "&Hjlp" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "Om &Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Om &OS...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Instllningar...", ID_DESKTOPBAR_SETTINGS + MENUITEM "&Aktivitetshanteraren...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "ppna volymkontroll", ID_TRAY_VOLUME + MENUITEM "Justera ljudinstllningar", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Visa dolda ikoner", ID_SHOW_HIDDEN_ICONS + MENUITEM "Visa &ikonknapp", ID_SHOW_ICON_BUTTON + MENUITEM "&Konfigurera meddelanden...", ID_CONFIG_NOTIFYAREA + MENUITEM "Justera &datum och &tid...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&Arkiv" + BEGIN + MENUITEM "&Kr...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&Avsluta", ID_FILE_EXIT + END + POPUP "&Visa" + BEGIN + MENUITEM "&Verktygsflt", ID_VIEW_TOOL_BAR + MENUITEM "&Sidflt", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "&Statusflt", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Uppdatera\tF5", ID_REFRESH + MENUITEM "&Fullskrm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&Verktyg" + BEGIN + MENUITEM "&Alternativ", ID_TOOLS_OPTIONS + END + POPUP "&Hjlp" + BEGIN + MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER + MENUITEM "Om &operativsystemet...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Kr" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10 + CONTROL "&Kommando:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "&Som symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 3,45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&Avbryt",2,158,23,47,14 + PUSHBUTTON "&Hjlp",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Sk program p startmenyn" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Filter:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&Kontrollera poster",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Skrivbordsinstllningar" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Vlj frn vilket hrn och t vilket hll du fredrar att rada upp ikonerna:", + IDC_STATIC,7,7,166,8 + CONTROL "v. och nert",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "vre t h.",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "vre t v.",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "h. och nert",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "v. och uppt",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "nedre t h.",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "nedre t v.",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "h. och uppt",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "sidor och ner",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "kanter",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "runt om",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "Visa &versionsnummer",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Aktivitetsfltsinstllningar" +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "visa &klockan",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "&Gm inaktiva meddelandeikoner",ID_HIDE_INACTIVE_ICONS, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&Meddelanden...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Startmenyinstllningar" +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION "Instllningar fr meddelandeikoner" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "&Hjlptext:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT "&Fnstertitel:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "&Modulskvg:",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "&Visningslge",IDC_LABEL4,7,96,157,28 + CONTROL "v&isa",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&dlj",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "dlj a&utomatiskt",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "&Senast ndrad:",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "visa d&olda",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&Avbryt",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "Vlj MDI / SDI Lge" +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "Vlj det grnssnitt du fredrar:",IDC_STATIC,7,7,160,8 + CONTROL "&MDI (multiple document interface)",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,121,10 + CONTROL "&SDI (single document interface)",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,115,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "Open Subfolders in s&eparate windows", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "Den hr instllningen kommer att glla som standard i alla nya explorer-fnster.", + IDC_STATIC,7,107,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&Avbryt",IDCANCEL,106,136,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE "Reactos Explorer" + IDS_START "Start" + IDS_LOGOFF "Logga ut..." + IDS_SHUTDOWN "Stng av..." + IDS_LAUNCH "Kr..." + IDS_START_HELP "Hjlp" + IDS_SEARCH_FILES "Sk..." + IDS_DOCUMENTS "Dokument" + IDS_FAVORITES "Favoriter" + IDS_PROGRAMS "Program" + IDS_SETTINGS "Instllningar" + IDS_EXPLORE "Utforska" + IDS_EMPTY "(tom)" + IDS_RECENT "Senaste dokumenten" + IDS_ADMIN "Administration" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU "Startmeny" + IDS_MINIMIZE_ALL "minimera alla fnster" + IDS_DESKTOP_NUM "Skrivbord %d" + IDS_VOLUME "Volym" + IDS_ITEMS_CUR "aktuella meddelanden" + IDS_ITEMS_CONFIGURED "konfiguration" + IDS_ITEMS_VISIBLE "synlig" + IDS_ITEMS_HIDDEN "dold" + IDS_NOTIFY_SHOW "visa" + IDS_NOTIFY_HIDE "dlj" + IDS_NOTIFY_AUTOHIDE "dlj automatiskt" + IDS_SHOW_HIDDEN_ICONS "Visa dolda ikoner" + IDS_HIDE_ICONS "Dlj ikoner" + IDS_TERMINATE "Avsluta Explorer" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "Ntverk" + IDS_CONNECTIONS "Ntverksanslutningar" + IDS_DRIVES "Enheter" + IDS_SEARCH_COMPUTER "Sk dator..." + IDS_SETTINGS_MENU "Instllningsmeny" + IDS_CONTROL_PANEL "Kontrollpanelen" + IDS_PRINTERS "Skrivare" + IDS_BROWSE "Utforska filer" + IDS_SEARCH_PRG "Sk program..." + IDS_ALL_USERS "Alla anvndare\\" + IDS_SEARCH "Sk" + IDS_ABOUT_EXPLORER "&Om Explorer..." + IDS_LAUNCH_MANY_PROGRAMS + "Du har valt fler n ett program.\nr du sker p att du vill ppna dem alla?" + IDS_DESKTOPBAR_SETTINGS "Skrivbordsinstllningar" + IDS_DESKTOP "Skrivbord" + IDS_TASKBAR "Aktivitetsflt" +END + +#endif // Swedish resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer-uk.rc b/reactos/base/shell/explorer/explorer-uk.rc new file mode 100644 index 00000000000..482bbfe221d --- /dev/null +++ b/reactos/base/shell/explorer/explorer-uk.rc @@ -0,0 +1,399 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Ukrainian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR) +#ifdef _WIN32 +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDM_MDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&" + BEGIN + MENUITEM "&...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&", ID_FILE_EXIT + END + POPUP "&" + BEGIN + MENUITEM "& ", ID_VIEW_TOOL_BAR + MENUITEM "& ", ID_VIEW_EXTRA_BAR + MENUITEM "&", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&", ID_VIEW_SIDE_BAR + MENUITEM "& ", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&\tF5", ID_REFRESH + MENUITEM " &\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "SDI", ID_VIEW_SDI + END + POPUP "&" + BEGIN + MENUITEM "& ", ID_WINDOW_NEW + MENUITEM "&\tShift+F5", ID_WINDOW_CASCADE + MENUITEM "&", ID_WINDOW_TILE_HORZ + MENUITEM "&\tShift+F4", ID_WINDOW_TILE_VERT + MENUITEM " ", ID_WINDOW_AUTOSORT + MENUITEM " &", ID_WINDOW_ARRANGE + END + POPUP "&" + BEGIN + MENUITEM "&", ID_TOOLS_OPTIONS + END + POPUP "&" + BEGIN + MENUITEM "&FAQ() ...", ID_EXPLORER_FAQ + MENUITEM " &...", ID_ABOUT_EXPLORER + MENUITEM " &...", ID_ABOUT_WINDOWS + END +END + +IDM_DESKTOPBAR MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&...", ID_DESKTOPBAR_SETTINGS + MENUITEM "& ...", ID_TASKMGR + MENUITEM SEPARATOR + MENUITEM "& ...", ID_ABOUT_EXPLORER + END +END + +IDM_VOLUME MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "", ID_TRAY_VOLUME + MENUITEM "& ", ID_VOLUME_PROPERTIES + END +END + +IDM_NOTIFYAREA MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&³ ", ID_SHOW_HIDDEN_ICONS + MENUITEM "³ &", ID_SHOW_ICON_BUTTON + MENUITEM "&& ...", ID_CONFIG_NOTIFYAREA + MENUITEM "& ...", ID_CONFIG_TIME + MENUITEM SEPARATOR + MENUITEM "& ...", ID_ABOUT_EXPLORER + END +END + +IDM_SDIFRAME MENU DISCARDABLE +BEGIN + POPUP "&" + BEGIN + MENUITEM "&...", ID_EXECUTE + MENUITEM SEPARATOR + MENUITEM "&", ID_FILE_EXIT + END + POPUP "&" + BEGIN + MENUITEM "& ", ID_VIEW_TOOL_BAR + MENUITEM "&", ID_VIEW_SIDE_BAR, GRAYED + MENUITEM "& ", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&\tF5", ID_REFRESH + MENUITEM " &\tCtrl+Shift+S", ID_VIEW_FULLSCREEN + MENUITEM "&MDI", ID_VIEW_MDI + END + POPUP "&" + BEGIN + MENUITEM "&", ID_TOOLS_OPTIONS + END + POPUP "&" + BEGIN + MENUITEM "&FAQ() ...", ID_EXPLORER_FAQ + MENUITEM " &...", ID_ABOUT_EXPLORER + MENUITEM " &...", ID_ABOUT_WINDOWS + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10 + CONTROL "&:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3, + 18,60,10 + EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL + CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3, + 45,71,12 + DEFPUSHBUTTON "&OK",1,158,6,47,14 + PUSHBUTTON "&",2,158,23,47,14 + PUSHBUTTON "&",254,158,43,47,14 +END + +IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT "&Գ:",IDC_STATIC,7,9,18,8 + EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL + CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | + WS_TABSTOP,7,25,186,33 + PUSHBUTTON "&",IDC_CHECK_ENTRIES,143,7,50,14 +END + +IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION " " +FONT 8, "MS Sans Serif" +BEGIN + LTEXT " :", + IDC_STATIC,7,7,166,8 + CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,25,46,44 + CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,25,46,44 + CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,25,46,44 + CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,25,46,44 + CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,73,46,44 + CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,73,46,44 + CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,73,46,44 + CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,159,73,46,44 + CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,7,121,46,44 + CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,57,121,46,44 + CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + BS_BOTTOM | WS_TABSTOP,110,121,46,44 + CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | + WS_TABSTOP,159,121,46,44 + CONTROL "³ &",ID_DESKTOP_VERSION,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10 +END + +IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION " " +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "³& ",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,152,52,10 + CONTROL "& ", + ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,174,111,10 + PUSHBUTTON "&...",ID_CONFIG_NOTIFYAREA,153,173,50,14 +END + +IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194 +STYLE WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION " " +FONT 8, "MS Sans Serif" +BEGIN +END + +IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_APPWINDOW +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | + TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31 + LTEXT "& ϳ:",IDC_LABEL1,7,44,40,8 + EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL + LTEXT " &:",IDC_LABEL2,7,63,44,8 + EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL + LTEXT "& :",IDC_LABEL3,7,81,43,8 + EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL + GROUPBOX "& ³",IDC_LABEL4,7,96,157,28 + CONTROL "&",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,15,108,33,10 + CONTROL "&",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66, + 108,29,10 + CONTROL "&",IDC_NOTIFY_AUTOHIDE,"Button", + BS_AUTORADIOBUTTON,112,108,43,10 + ICON "",IDC_PICTURE,173,101,21,20 + LTEXT "& :",IDC_LABEL6,7,132,43,8 + EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | + ES_READONLY + CONTROL "& ",ID_SHOW_HIDDEN_ICONS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10 + DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP + PUSHBUTTON "&",IDCANCEL,151,153,50,14 +END + +IDD_MDI_SDI DIALOGEX 0, 0, 194, 157 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION " " +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + LTEXT " :", + IDC_STATIC,7,7,160,8 + CONTROL "&MDI ( )",IDC_MDI,"Button", + BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10 + CONTROL "&SDI ( )",IDC_SDI,"Button", + BS_AUTORADIOBUTTON,7,62,118,10 + CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13 + CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13 + CONTROL "³ & ", + IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,90,135,10 + LTEXT "ֳ .", + IDC_STATIC,7,111,174,22 + DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP + PUSHBUTTON "&",IDCANCEL,106,136,50,14 +END + +IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION " ReactOS" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT " ReactOS",IDC_ROS_EXPLORER,91,13,104,11 + LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8 + LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8 + LTEXT "",IDC_WIN_VERSION,91,58,98,22 + LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129, + 8 + CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP, + 154,90,38,12 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_TITLE " Reactos" + IDS_START "" + IDS_LOGOFF " ..." + IDS_SHUTDOWN "..." + IDS_LAUNCH "..." + IDS_START_HELP "" + IDS_SEARCH_FILES "..." + IDS_DOCUMENTS "" + IDS_FAVORITES "" + IDS_PROGRAMS "" + IDS_SETTINGS "" + IDS_EXPLORE "" + IDS_EMPTY "()" + IDS_RECENT " " + IDS_ADMIN "" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STARTMENU " " + IDS_MINIMIZE_ALL " " + IDS_DESKTOP_NUM " %d" + IDS_VOLUME "" + IDS_ITEMS_CUR " " + IDS_ITEMS_CONFIGURED "" + IDS_ITEMS_VISIBLE "" + IDS_ITEMS_HIDDEN "" + IDS_NOTIFY_SHOW "" + IDS_NOTIFY_HIDE "" + IDS_NOTIFY_AUTOHIDE "" + IDS_SHOW_HIDDEN_ICONS " " + IDS_HIDE_ICONS " " + IDS_TERMINATE " " +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NETWORK "" + IDS_CONNECTIONS " " + IDS_DRIVES "" + IDS_SEARCH_COMPUTER " ..." + IDS_SETTINGS_MENU " " + IDS_CONTROL_PANEL " " + IDS_PRINTERS "" + IDS_BROWSE " " + IDS_SEARCH_PRG " ..." + IDS_ALL_USERS " \\" + IDS_SEARCH "" + IDS_ABOUT_EXPLORER "& ..." + IDS_LAUNCH_MANY_PROGRAMS + " .\n , ?" + IDS_DESKTOPBAR_SETTINGS " " + IDS_DESKTOP " " + IDS_TASKBAR " " +END + +#endif // Ukrainian resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/explorer.cpp b/reactos/base/shell/explorer/explorer.cpp new file mode 100644 index 00000000000..eb386bed614 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.cpp @@ -0,0 +1,1150 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // explorer.cpp + // + // Martin Fuchs, 23.07.2003 + // + // Credits: Thanks to Leon Finker for his explorer cabinet window example + // + + +#include // instead of "precomp.h" because the ROS build system needs this to find the precompiled header file (*.gch) in the output directory tree + +#include "resource.h" + +#include // for setlocale() + +#ifndef __WINE__ +#include // for dup2() +#include // for _O_RDONLY +#endif + +#include "dialogs/settings.h" // for MdiSdiDlg + +#include "services/shellservices.h" + + +extern "C" int initialize_gdb_stub(); // start up GDB stub + + +DynamicLoadLibFct g_SHDOCVW_ShellDDEInit(TEXT("SHDOCVW"), 118); + + +ExplorerGlobals g_Globals; + + +ExplorerGlobals::ExplorerGlobals() +{ + _hInstance = 0; + _cfStrFName = 0; + +#ifndef ROSSHELL + _hframeClass = 0; + _hMainWnd = 0; + _desktop_mode = false; + _prescan_nodes = false; +#endif + + _log = NULL; +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + _SHRestricted = 0; +#endif + _hwndDesktopBar = 0; + _hwndShellView = 0; + _hwndDesktop = 0; +} + + +void ExplorerGlobals::init(HINSTANCE hInstance) +{ + _hInstance = hInstance; + +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + _SHRestricted = (DWORD(STDAPICALLTYPE*)(RESTRICTIONS)) GetProcAddress(GetModuleHandle(TEXT("SHELL32")), "SHRestricted"); +#endif + + _icon_cache.init(); +} + + +void ExplorerGlobals::read_persistent() +{ + // read configuration file + _cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0)); + _cfg_path.printf(TEXT("%s\\ros-explorer-cfg.xml"), _cfg_dir.c_str()); + + if (!_cfg.read(_cfg_path)) { + if (_cfg._last_error != XML_ERROR_NO_ELEMENTS) + MessageBox(g_Globals._hwndDesktop, String(_cfg._last_error_msg.c_str()), + TEXT("ROS Explorer - reading user settings"), MB_OK); + + _cfg.read(TEXT("explorer-cfg-template.xml")); + } + + // read bookmarks + _favorites_path.printf(TEXT("%s\\ros-explorer-bookmarks.xml"), _cfg_dir.c_str()); + + if (!_favorites.read(_favorites_path)) { + _favorites.import_IE_favorites(0); + _favorites.write(_favorites_path); + } +} + +void ExplorerGlobals::write_persistent() +{ + // write configuration file + RecursiveCreateDirectory(_cfg_dir); + + _cfg.write(_cfg_path); + _favorites.write(_favorites_path); +} + + +XMLPos ExplorerGlobals::get_cfg() +{ + XMLPos cfg_pos(&_cfg); + + cfg_pos.smart_create("explorer-cfg"); + + return cfg_pos; +} + +XMLPos ExplorerGlobals::get_cfg(const char* path) +{ + XMLPos cfg_pos(&_cfg); + + cfg_pos.smart_create("explorer-cfg"); + cfg_pos.create_relative(path); + + return cfg_pos; +} + + +void _log_(LPCTSTR txt) +{ + FmtString msg(TEXT("%s\n"), txt); + + if (g_Globals._log) + _fputts(msg, g_Globals._log); + + OutputDebugString(msg); +} + + +bool FileTypeManager::is_exe_file(LPCTSTR ext) +{ + static const LPCTSTR s_executable_extensions[] = { + TEXT("COM"), + TEXT("EXE"), + TEXT("BAT"), + TEXT("CMD"), + TEXT("CMM"), + TEXT("BTM"), + TEXT("AWK"), + 0 + }; + + TCHAR ext_buffer[_MAX_EXT]; + const LPCTSTR* p; + LPCTSTR s; + LPTSTR d; + + for(s=ext+1,d=ext_buffer; (*d=toupper(*s)); s++) + ++d; + + for(p=s_executable_extensions; *p; p++) + if (!lstrcmp(ext_buffer, *p)) + return true; + + return false; +} + + +const FileTypeInfo& FileTypeManager::operator[](String ext) +{ + ext.toLower(); + + iterator found = find(ext); + if (found != end()) + return found->second; + + FileTypeInfo& ftype = super::operator[](ext); + + ftype._neverShowExt = false; + + HKEY hkey; + TCHAR value[MAX_PATH], display_name[MAX_PATH]; + LONG valuelen = sizeof(value); + + if (!RegQueryValue(HKEY_CLASSES_ROOT, ext, value, &valuelen)) { + ftype._classname = value; + + valuelen = sizeof(display_name); + if (!RegQueryValue(HKEY_CLASSES_ROOT, ftype._classname, display_name, &valuelen)) + ftype._displayname = display_name; + + if (!RegOpenKey(HKEY_CLASSES_ROOT, ftype._classname, &hkey)) { + if (!RegQueryValueEx(hkey, TEXT("NeverShowExt"), 0, NULL, NULL, NULL)) + ftype._neverShowExt = true; + + RegCloseKey(hkey); + } + } + + return ftype; +} + +LPCTSTR FileTypeManager::set_type(Entry* entry, bool dont_hide_ext) +{ + LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.')); + + if (ext) { + const FileTypeInfo& type = (*this)[ext]; + + if (!type._displayname.empty()) + entry->_type_name = _tcsdup(type._displayname); + + // hide some file extensions + if (type._neverShowExt && !dont_hide_ext) { + int len = ext - entry->_data.cFileName; + entry->_display_name = (LPTSTR) malloc((len+1)*sizeof(TCHAR)); + lstrcpyn(entry->_display_name, entry->_data.cFileName, len + 1); + } + + if (is_exe_file(ext)) + entry->_data.dwFileAttributes |= ATTRIBUTE_EXECUTABLE; + } + + return ext; +} + + +Icon::Icon() + : _id(ICID_UNKNOWN), + _itype(IT_STATIC), + _hicon(0) +{ +} + +Icon::Icon(ICON_ID id, UINT nid) //, int cx, int cy + : _id(id), + _itype(IT_STATIC), + _hicon(ResIcon(nid)) // ResIconEx(nid, cx, cy) +{ +} + +Icon::Icon(ICON_ID id, UINT nid, int icon_size) + : _id(id), + _itype(IT_STATIC), + _hicon(ResIconEx(nid, icon_size, icon_size)) +{ +} + +Icon::Icon(ICON_TYPE itype, int id, HICON hIcon) + : _id((ICON_ID)id), + _itype(itype), + _hicon(hIcon) +{ +} + +Icon::Icon(ICON_TYPE itype, int id, int sys_idx) + : _id((ICON_ID)id), + _itype(itype), + _sys_idx(sys_idx) +{ +} + +void Icon::draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const +{ + if (_itype == IT_SYSCACHE) + ImageList_DrawEx(g_Globals._icon_cache.get_sys_imagelist(), _sys_idx, hdc, x, y, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + else + DrawIconEx(hdc, x, y, _hicon, cx, cy, 0, bk_brush, DI_NORMAL); +} + +HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const +{ + if (_itype == IT_SYSCACHE) { + HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); + + int cx, cy; + ImageList_GetIconSize(himl, &cx, &cy); + + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + HDC hdc = CreateCompatibleDC(hdc_wnd); + HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); + ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + SelectBitmap(hdc, hbmp_old); + DeleteDC(hdc); + + return hbmp; + } else + return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd); +} + + +int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const +{ + int ret; + + if (_itype == IT_SYSCACHE) { + HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist(); + + int cx, cy; + ImageList_GetIconSize(himl, &cx, &cy); + + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + HDC hdc = CreateCompatibleDC(hdc_wnd); + HBITMAP hbmp_old = SelectBitmap(hdc, hbmp); + ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL); + SelectBitmap(hdc, hbmp_old); + DeleteDC(hdc); + + ret = ImageList_Add(himl, hbmp, 0); + + DeleteObject(hbmp); + } else + ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd); + + return ret; +} + +HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/) +{ + int cx = ICON_SIZE_SMALL; + int cy = ICON_SIZE_SMALL; + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + + MemCanvas canvas; + BitmapSelection sel(canvas, hbmp); + + RECT rect = {0, 0, cx, cy}; + FillRect(canvas, &rect, hbrush_bkgnd); + + DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL); + + return hbmp; +} + +HBITMAP create_small_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) +{ + int cx = GetSystemMetrics(SM_CXSMICON); + int cy = GetSystemMetrics(SM_CYSMICON); + HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy); + + MemCanvas canvas; + BitmapSelection sel(canvas, hbmp); + + RECT rect = {0, 0, cx, cy}; + FillRect(canvas, &rect, hbrush_bkgnd); + + DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL); + + return hbmp; +} + +int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd) +{ + HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd); + + int ret = ImageList_Add(himl, hbmp, 0); + + DeleteObject(hbmp); + + return ret; +} + + +int IconCache::s_next_id = ICID_DYNAMIC; + + +void IconCache::init() +{ + int icon_size = STARTMENUROOT_ICON_SIZE; + + _icons[ICID_NONE] = Icon(IT_STATIC, ICID_NONE, (HICON)0); + + _icons[ICID_FOLDER] = Icon(ICID_FOLDER, IDI_FOLDER); + //_icons[ICID_DOCUMENT] = Icon(ICID_DOCUMENT, IDI_DOCUMENT); + _icons[ICID_EXPLORER] = Icon(ICID_EXPLORER, IDI_EXPLORER); +// _icons[ICID_APP] = Icon(ICID_APP, IDI_APPICON); + + _icons[ICID_CONFIG] = Icon(ICID_CONFIG, IDI_CONFIG, icon_size); + _icons[ICID_DOCUMENTS] = Icon(ICID_DOCUMENTS, IDI_DOCUMENTS, icon_size); + _icons[ICID_FAVORITES] = Icon(ICID_FAVORITES, IDI_FAVORITES, icon_size); + _icons[ICID_INFO] = Icon(ICID_INFO, IDI_INFO, icon_size); + _icons[ICID_APPS] = Icon(ICID_APPS, IDI_APPS, icon_size); + _icons[ICID_SEARCH] = Icon(ICID_SEARCH, IDI_SEARCH, icon_size); + _icons[ICID_ACTION] = Icon(ICID_ACTION, IDI_ACTION, icon_size); + _icons[ICID_SEARCH_DOC] = Icon(ICID_SEARCH_DOC, IDI_SEARCH_DOC, icon_size); + _icons[ICID_PRINTER] = Icon(ICID_PRINTER, IDI_PRINTER, icon_size); + _icons[ICID_NETWORK] = Icon(ICID_NETWORK, IDI_NETWORK, icon_size); + _icons[ICID_COMPUTER] = Icon(ICID_COMPUTER, IDI_COMPUTER, icon_size); + _icons[ICID_LOGOFF] = Icon(ICID_LOGOFF, IDI_LOGOFF, icon_size); + _icons[ICID_SHUTDOWN] = Icon(ICID_SHUTDOWN, IDI_SHUTDOWN, icon_size); + _icons[ICID_BOOKMARK] = Icon(ICID_BOOKMARK, IDI_DOT_TRANS, icon_size); + _icons[ICID_MINIMIZE] = Icon(ICID_MINIMIZE, IDI_MINIMIZE, icon_size); + _icons[ICID_CONTROLPAN] = Icon(ICID_CONTROLPAN, IDI_CONTROLPAN, icon_size); + _icons[ICID_DESKSETTING]= Icon(ICID_DESKSETTING,IDI_DESKSETTING,icon_size); + _icons[ICID_NETCONNS] = Icon(ICID_NETCONNS, IDI_NETCONNS, icon_size); + _icons[ICID_ADMIN] = Icon(ICID_ADMIN, IDI_ADMIN, icon_size); + _icons[ICID_RECENT] = Icon(ICID_RECENT, IDI_RECENT, icon_size); +} + + +const Icon& IconCache::extract(LPCTSTR path, ICONCACHE_FLAGS flags) +{ + // search for matching icon with unchanged flags in the cache + CacheKey mapkey(path, flags); + PathCacheMap::iterator found = _pathCache.find(mapkey); + + if (found != _pathCache.end()) + return _icons[found->second]; + + // search for matching icon with handle + CacheKey mapkey_hicon(path, flags|ICF_HICON); + if (flags != mapkey_hicon.second) { + found = _pathCache.find(mapkey_hicon); + + if (found != _pathCache.end()) + return _icons[found->second]; + } + + // search for matching icon in the system image list cache + CacheKey mapkey_syscache(path, flags|ICF_SYSCACHE); + if (flags != mapkey_syscache.second) { + found = _pathCache.find(mapkey_syscache); + + if (found != _pathCache.end()) + return _icons[found->second]; + } + + SHFILEINFO sfi; + + int shgfi_flags = 0; + + if (flags & ICF_OPEN) + shgfi_flags |= SHGFI_OPENICON; + + if ((flags&(ICF_LARGE|ICF_MIDDLE|ICF_OVERLAYS|ICF_HICON)) && !(flags&ICF_SYSCACHE)) { + shgfi_flags |= SHGFI_ICON; + + if (!(flags & (ICF_LARGE|ICF_MIDDLE))) + shgfi_flags |= SHGFI_SMALLICON; + + if (flags & ICF_OVERLAYS) + shgfi_flags |= SHGFI_ADDOVERLAYS; + + // get small/big icons with/without overlays + if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), shgfi_flags)) { + const Icon& icon = add(sfi.hIcon, IT_CACHED); + + ///@todo limit cache size + _pathCache[mapkey_hicon] = icon; + + return icon; + } + } else { + assert(!(flags&ICF_OVERLAYS)); + + shgfi_flags |= SHGFI_SYSICONINDEX|SHGFI_SMALLICON; + + // use system image list - the "search program dialog" needs it + HIMAGELIST himlSys_small = (HIMAGELIST) SHGetFileInfo(path, 0, &sfi, sizeof(sfi), shgfi_flags); + + if (himlSys_small) { + _himlSys_small = himlSys_small; + + const Icon& icon = add(sfi.iIcon/*, IT_SYSCACHE*/); + + ///@todo limit cache size + _pathCache[mapkey_syscache] = icon; + + return icon; + } + } + + return _icons[ICID_NONE]; +} + +const Icon& IconCache::extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags) +{ + IdxCacheKey key(path, make_pair(icon_idx, (flags|ICF_HICON)&~ICF_SYSCACHE)); + + key.first.toLower(); + + IdxCacheMap::iterator found = _idxCache.find(key); + + if (found != _idxCache.end()) + return _icons[found->second]; + + HICON hIcon; + + if ((int)ExtractIconEx(path, icon_idx, NULL, &hIcon, 1) > 0) { + const Icon& icon = add(hIcon, IT_CACHED); + + _idxCache[key] = icon; + + return icon; + } else { + + ///@todo retreive "http://.../favicon.ico" format icons + + return _icons[ICID_NONE]; + } +} + +const Icon& IconCache::extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags) +{ + HICON hIconLarge = 0; + HICON hIcon; + + int icon_size = ICON_SIZE_FROM_ICF(flags); + HRESULT hr = pExtract->Extract(path, icon_idx, &hIconLarge, &hIcon, MAKELONG(GetSystemMetrics(SM_CXICON), icon_size)); + + if (hr == NOERROR) { //@@ oder SUCCEEDED(hr) ? + if (icon_size > ICON_SIZE_SMALL) { //@@ OK? + if (hIcon) + DestroyIcon(hIcon); + + hIcon = hIconLarge; + } else { + if (hIconLarge) + DestroyIcon(hIconLarge); + } + + if (hIcon) + return add(hIcon); //@@ When do we want not to free this icons? + } + + return _icons[ICID_NONE]; +} + +const Icon& IconCache::add(HICON hIcon, ICON_TYPE type) +{ + int id = ++s_next_id; + + return _icons[id] = Icon(type, id, hIcon); +} + +const Icon& IconCache::add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/) +{ + int id = ++s_next_id; + + return _icons[id] = SysCacheIcon(id, sys_idx); +} + +const Icon& IconCache::get_icon(int id) +{ + return _icons[id]; +} + +void IconCache::free_icon(int icon_id) +{ + IconMap::iterator found = _icons.find(icon_id); + + if (found != _icons.end()) { + Icon& icon = found->second; + + if (icon.destroy()) + _icons.erase(found); + } +} + + +ResString::ResString(UINT nid) +{ + TCHAR buffer[BUFFER_LEN]; + + int len = LoadString(g_Globals._hInstance, nid, buffer, sizeof(buffer)/sizeof(TCHAR)); + + super::assign(buffer, len); +} + + +ResIcon::ResIcon(UINT nid) +{ + _hicon = LoadIcon(g_Globals._hInstance, MAKEINTRESOURCE(nid)); +} + +SmallIcon::SmallIcon(UINT nid) +{ + _hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED); +} + +ResIconEx::ResIconEx(UINT nid, int w, int h) +{ + _hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, w, h, LR_SHARED); +} + + +void SetWindowIcon(HWND hwnd, UINT nid) +{ + HICON hIcon = ResIcon(nid); + (void)Window_SetIcon(hwnd, ICON_BIG, hIcon); + + HICON hIconSmall = SmallIcon(nid); + (void)Window_SetIcon(hwnd, ICON_SMALL, hIconSmall); +} + + +ResBitmap::ResBitmap(UINT nid) +{ + _hBmp = LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(nid)); +} + + +#ifndef ROSSHELL + +void explorer_show_frame(int cmdShow, LPTSTR lpCmdLine) +{ + ExplorerCmd cmd; + + if (g_Globals._hMainWnd) { + if (IsIconic(g_Globals._hMainWnd)) + ShowWindow(g_Globals._hMainWnd, SW_RESTORE); + else + SetForegroundWindow(g_Globals._hMainWnd); + + return; + } + + g_Globals._prescan_nodes = false; + + XMLPos explorer_options = g_Globals.get_cfg("general/explorer"); + XS_String mdiStr = XMLString(explorer_options, "mdi"); + + // If there isn't yet the "mdi" setting in the configuration, display MDI/SDI dialog. + if (mdiStr.empty()) + Dialog::DoModal(IDD_MDI_SDI, WINDOW_CREATOR(MdiSdiDlg), g_Globals._hwndDesktop); + + // Now read the MDI attribute again and interpret it as boolean value. + cmd._mdi = XMLBool(explorer_options, "mdi", true); + + cmd._cmdShow = cmdShow; + + // parse command line options, which may overwrite the MDI flag + if (lpCmdLine) + cmd.ParseCmdLine(lpCmdLine); + + // create main window + MainFrameBase::Create(cmd); +} + +bool ExplorerCmd::ParseCmdLine(LPCTSTR lpCmdLine) +{ + bool ok = true; + + LPCTSTR b = lpCmdLine; + LPCTSTR p = b; + + while(*b) { + // remove leading space + while(_istspace((unsigned)*b)) + ++b; + + p = b; + + bool quote = false; + + // options are separated by ',' + for(; *p; ++p) { + if (*p == '"') // Quote characters may appear at any position in the command line. + quote = !quote; + else if (*p==',' && !quote) + break; + } + + if (p > b) { + int l = p - b; + + // remove trailing space + while(l>0 && _istspace((unsigned)b[l-1])) + --l; + + if (!EvaluateOption(String(b, l))) + ok = false; + + if (*p) + ++p; + + b = p; + } + } + + return ok; +} + +bool ExplorerCmd::EvaluateOption(LPCTSTR option) +{ + String opt_str; + + // Remove quote characters, as they are evaluated at this point. + for(; *option; ++option) + if (*option != '"') + opt_str += *option; + + option = opt_str; + + if (option[0] == '/') { + ++option; + + // option /e for windows in explorer mode + if (!_tcsicmp(option, TEXT("e"))) + _flags |= OWM_EXPLORE; + // option /root for rooted explorer windows + else if (!_tcsicmp(option, TEXT("root"))) + _flags |= OWM_ROOTED; + // non-standard options: /mdi, /sdi + else if (!_tcsicmp(option, TEXT("mdi"))) + _mdi = true; + else if (!_tcsicmp(option, TEXT("sdi"))) + _mdi = false; + else + return false; + } else { + if (!_path.empty()) + return false; + + _path = opt_str; + } + + return true; +} + +bool ExplorerCmd::IsValidPath() const +{ + if (!_path.empty()) { + DWORD attribs = GetFileAttributes(_path); + + if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) + return true; // file system path + else if (*_path==':' && _path.at(1)==':') + return true; // text encoded IDL + } + + return false; +} + +#else + +void explorer_show_frame(int cmdShow, LPTSTR lpCmdLine) +{ + if (!lpCmdLine) + lpCmdLine = TEXT("explorer.exe"); + + launch_file(GetDesktopWindow(), lpCmdLine, cmdShow); +} + +#endif + + +PopupMenu::PopupMenu(UINT nid) +{ + HMENU hMenu = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(nid)); + _hmenu = GetSubMenu(hMenu, 0); +} + + + /// "About Explorer" Dialog +struct ExplorerAboutDlg : public + CtlColorParent< + OwnerDrawParent + > +{ + typedef CtlColorParent< + OwnerDrawParent + > super; + + ExplorerAboutDlg(HWND hwnd) + : super(hwnd) + { + SetWindowIcon(hwnd, IDI_REACTOS); + + new FlatButton(hwnd, IDOK); + + _hfont = CreateFont(20, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0, TEXT("Sans Serif")); + new ColorStatic(hwnd, IDC_ROS_EXPLORER, RGB(32,32,128), 0, _hfont); + + new HyperlinkCtrl(hwnd, IDC_WWW); + + FmtString ver_txt(ResString(IDS_EXPLORER_VERSION_STR), (LPCTSTR)ResString(IDS_VERSION_STR)); + SetWindowText(GetDlgItem(hwnd, IDC_VERSION_TXT), ver_txt); + + HWND hwnd_winver = GetDlgItem(hwnd, IDC_WIN_VERSION); + SetWindowText(hwnd_winver, get_windows_version_str()); + SetWindowFont(hwnd_winver, GetStockFont(DEFAULT_GUI_FONT), FALSE); + + CenterWindow(hwnd); + } + + ~ExplorerAboutDlg() + { + DeleteObject(_hfont); + } + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case WM_PAINT: + Paint(); + break; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + + return 0; + } + + void Paint() + { + PaintCanvas canvas(_hwnd); + + HICON hicon = (HICON) LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(IDI_REACTOS_BIG), IMAGE_ICON, 0, 0, LR_SHARED); + + DrawIconEx(canvas, 20, 10, hicon, 0, 0, 0, 0, DI_NORMAL); + } + +protected: + HFONT _hfont; +}; + +void explorer_about(HWND hwndParent) +{ + Dialog::DoModal(IDD_ABOUT_EXPLORER, WINDOW_CREATOR(ExplorerAboutDlg), hwndParent); +} + + +static void InitInstance(HINSTANCE hInstance) +{ + CONTEXT("InitInstance"); + + setlocale(LC_COLLATE, ""); // set collating rules to local settings for compareName + +#ifndef ROSSHELL + // register frame window class + g_Globals._hframeClass = IconWindowClass(CLASSNAME_FRAME,IDI_EXPLORER); + + // register child window class + WindowClass(CLASSNAME_CHILDWND, CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW).Register(); + + // register tree window class + WindowClass(CLASSNAME_WINEFILETREE, CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW).Register(); +#endif + + g_Globals._cfStrFName = RegisterClipboardFormat(CFSTR_FILENAME); +} + + +int explorer_main(HINSTANCE hInstance, LPTSTR lpCmdLine, int cmdShow) +{ + CONTEXT("explorer_main"); + + // initialize Common Controls library + CommonControlInit usingCmnCtrl; + + try { + InitInstance(hInstance); + } catch(COMException& e) { + HandleException(e, GetDesktopWindow()); + return -1; + } + +#ifndef ROSSHELL + if (cmdShow != SW_HIDE) { +/* // don't maximize if being called from the ROS desktop + if (cmdShow == SW_SHOWNORMAL) + ///@todo read window placement from registry + cmdShow = SW_MAXIMIZE; +*/ + + explorer_show_frame(cmdShow, lpCmdLine); + } +#endif + + return Window::MessageLoop(); +} + + + // MinGW does not provide a Unicode startup routine, so we have to implement an own. +#if defined(__MINGW32__) && defined(UNICODE) + +#define _tWinMain wWinMain +int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); + +int main(int argc, char* argv[]) +{ + CONTEXT("main"); + + STARTUPINFO startupinfo; + int nShowCmd = SW_SHOWNORMAL; + + GetStartupInfo(&startupinfo); + + if (startupinfo.dwFlags & STARTF_USESHOWWINDOW) + nShowCmd = startupinfo.wShowWindow; + + LPWSTR cmdline = GetCommandLineW(); + + while(*cmdline && !_istspace((unsigned)*cmdline)) + ++cmdline; + + while(_istspace((unsigned)*cmdline)) + ++cmdline; + + return wWinMain(GetModuleHandle(NULL), 0, cmdline, nShowCmd); +} + +#endif // __MINGW && UNICODE + + +static bool SetShellReadyEvent(LPCTSTR evtName) +{ + HANDLE hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, evtName); + if (!hEvent) + return false; + + SetEvent(hEvent); + CloseHandle(hEvent); + + return true; +} + + +int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) +{ + CONTEXT("WinMain()"); + + BOOL any_desktop_running = IsAnyDesktopRunning(); + + BOOL startup_desktop; + + // strip extended options from the front of the command line + String ext_options; + + while(*lpCmdLine == '-') { + while(*lpCmdLine && !_istspace((unsigned)*lpCmdLine)) + ext_options += *lpCmdLine++; + + while(_istspace((unsigned)*lpCmdLine)) + ++lpCmdLine; + } + + // command line option "-install" to replace previous shell application with ROS Explorer + if (_tcsstr(ext_options,TEXT("-install"))) { + // install ROS Explorer into the registry + TCHAR path[MAX_PATH]; + + int l = GetModuleFileName(0, path, COUNTOF(path)); + if (l) { + HKEY hkey; + + if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) { + + ///@todo save previous shell application in config file + + RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)path, l*sizeof(TCHAR)); + RegCloseKey(hkey); + } + + if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) { + + ///@todo save previous shell application in config file + + RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)TEXT(""), l*sizeof(TCHAR)); + RegCloseKey(hkey); + } + } + + HWND shellWindow = GetShellWindow(); + + if (shellWindow) { + DWORD pid; + + // terminate shell process for NT like systems + GetWindowThreadProcessId(shellWindow, &pid); + HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); + + // On Win 9x it's sufficient to destroy the shell window. + DestroyWindow(shellWindow); + + if (TerminateProcess(hProcess, 0)) + WaitForSingleObject(hProcess, INFINITE); + + CloseHandle(hProcess); + } + + startup_desktop = TRUE; + } else { + // create desktop window and task bar only, if there is no other shell and we are + // the first explorer instance + // MS Explorer looks additionally into the registry entry HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell, + // to decide wether it is currently configured as shell application. + startup_desktop = !any_desktop_running; + } + + + bool autostart = !any_desktop_running; + + // disable autostart if the SHIFT key is pressed + if (GetAsyncKeyState(VK_SHIFT) < 0) + autostart = false; + +#ifdef _DEBUG //MF: disabled for debugging + autostart = false; +#endif + + // If there is given the command line option "-desktop", create desktop window anyways + if (_tcsstr(ext_options,TEXT("-desktop"))) + startup_desktop = TRUE; +#ifndef ROSSHELL + else if (_tcsstr(ext_options,TEXT("-nodesktop"))) + startup_desktop = FALSE; + + // Don't display cabinet window in desktop mode + if (startup_desktop && !_tcsstr(ext_options,TEXT("-explorer"))) + nShowCmd = SW_HIDE; +#endif + + if (_tcsstr(ext_options,TEXT("-noautostart"))) + autostart = false; + else if (_tcsstr(ext_options,TEXT("-autostart"))) + autostart = true; + +#ifndef __WINE__ + if (_tcsstr(ext_options,TEXT("-console"))) { + AllocConsole(); + + _dup2(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_RDONLY), 0); + _dup2(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 0), 1); + _dup2(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), 0), 2); + + g_Globals._log = _fdopen(1, "w"); + setvbuf(g_Globals._log, 0, _IONBF, 0); + + LOG(TEXT("starting explorer debug log\n")); + } +#endif + + + if (startup_desktop) { + // hide the XP login screen (Credit to Nicolas Escuder) + // another undocumented event: "Global\\msgina: ReturnToWelcome" + if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent"))) + SetShellReadyEvent(TEXT("Global\\msgina: ShellReadyEvent")); + } +#ifdef ROSSHELL + else + return 0; // no shell to launch, so exit immediatelly +#endif + + + if (!any_desktop_running) { + // launch the shell DDE server + if (g_SHDOCVW_ShellDDEInit) + (*g_SHDOCVW_ShellDDEInit)(TRUE); + } + + + bool use_gdb_stub = false; // !IsDebuggerPresent(); + + if (_tcsstr(ext_options,TEXT("-debug"))) + use_gdb_stub = true; + + if (_tcsstr(ext_options,TEXT("-break"))) { + LOG(TEXT("debugger breakpoint")); +#ifdef _MSC_VER + __asm int 3 +#else + asm("int3"); +#endif + } + + // activate GDB remote debugging stub if no other debugger is running + if (use_gdb_stub) { + LOG(TEXT("waiting for debugger connection...\n")); + + initialize_gdb_stub(); + } + + g_Globals.init(hInstance); + + // initialize COM and OLE before creating the desktop window + OleInit usingCOM; + + // init common controls library + CommonControlInit usingCmnCtrl; + + g_Globals.read_persistent(); + + if (startup_desktop) { + WaitCursor wait; + + g_Globals._desktops.init(); + + g_Globals._hwndDesktop = DesktopWindow::Create(); +#ifdef _USE_HDESK + g_Globals._desktops.get_current_Desktop()->_hwndDesktop = g_Globals._hwndDesktop; +#endif + } + + Thread* pSSOThread = NULL; + + if (startup_desktop) { + // launch SSO thread to allow message processing independent from the explorer main thread + pSSOThread = new SSOThread; + pSSOThread->Start(); + } + + /**TODO launching autostart programs can be moved into a background thread. */ + if (autostart) { + char* argv[] = {"", "s"}; // call startup routine in SESSION_START mode + startup(2, argv); + } + +#ifndef ROSSHELL + if (g_Globals._hwndDesktop) + g_Globals._desktop_mode = true; +#endif + + + int ret = explorer_main(hInstance, lpCmdLine, nShowCmd); + + + // write configuration file + g_Globals.write_persistent(); + + if (pSSOThread) { + pSSOThread->Stop(); + delete pSSOThread; + } + + if (!any_desktop_running) { + // shutdown the shell DDE server + if (g_SHDOCVW_ShellDDEInit) + (*g_SHDOCVW_ShellDDEInit)(FALSE); + } + + return ret; +} diff --git a/reactos/base/shell/explorer/explorer.dsp b/reactos/base/shell/explorer/explorer.dsp new file mode 100644 index 00000000000..283e5a36c72 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.dsp @@ -0,0 +1,872 @@ +# Microsoft Developer Studio Project File - Name="explorer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=explorer - Win32 WineDll +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "explorer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "explorer.mak" CFG="explorer - Win32 WineDll" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "explorer - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Debug Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Unicode Release" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 Unicode Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 WineRelease" (based on "Win32 (x86) Console Application") +!MESSAGE "explorer - Win32 WineDll" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "explorer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "DRelease" +# PROP BASE Intermediate_Dir "DRelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "DRelease" +# PROP Intermediate_Dir "DRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" /d "UNICODE" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" /d "UNICODE" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32" +# PROP Intermediate_Dir "Win32" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Win32/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 WineRelease" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "explorer___Win32_WineRelease" +# PROP BASE Intermediate_Dir "explorer___Win32_WineRelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "WineRelease" +# PROP Intermediate_Dir "WineRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c +# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"WineRelease/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "explorer - Win32 WineDll" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "explorer___Win32_WineDll" +# PROP BASE Intermediate_Dir "explorer___Win32_WineDll" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "WineDll" +# PROP Intermediate_Dir "WineDll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none /debug +# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /out:"WineDll/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "explorer - Win32 Release" +# Name "explorer - Win32 Debug" +# Name "explorer - Win32 Debug Release" +# Name "explorer - Win32 Unicode Release" +# Name "explorer - Win32 Unicode Debug" +# Name "explorer - Win32" +# Name "explorer - Win32 WineRelease" +# Name "explorer - Win32 WineDll" +# Begin Group "utility" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\utility\dragdropimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\dragdropimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.h +# End Source File +# Begin Source File + +SOURCE=.\utility\treedroptarget.h +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.h +# End Source File +# Begin Source File + +SOURCE=.\utility\window.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\window.h +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.h +# End Source File +# End Group +# Begin Group "resources" + +# PROP Default_Filter "bmp,ico" +# Begin Source File + +SOURCE=.\res\action.ico +# End Source File +# Begin Source File + +SOURCE=.\res\administration.ico +# End Source File +# Begin Source File + +SOURCE=.\res\appicon.ico +# End Source File +# Begin Source File + +SOURCE=.\res\apps.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_dwn.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_up.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrowsel.ico +# End Source File +# Begin Source File + +SOURCE=.\res\computer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\config.ico +# End Source File +# Begin Source File + +SOURCE=".\res\control-panel.ico" +# End Source File +# Begin Source File + +SOURCE=".\res\desktop-settings.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\documents.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_red.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_trans.ico +# End Source File +# Begin Source File + +SOURCE=.\res\drivebar.bmp +# End Source File +# Begin Source File + +SOURCE=".\explorer-cz.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-de.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-en.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-es.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-fr.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-hu.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-jp.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-pl.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-pt.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-ro.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-ru.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-sv.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=".\explorer-uk.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\explorer.exe.manifest +# End Source File +# Begin Source File + +SOURCE=.\res\explorer.ico +# End Source File +# Begin Source File + +SOURCE=.\explorer_intres.rc +# End Source File +# Begin Source File + +SOURCE=.\res\favorites.ico +# End Source File +# Begin Source File + +SOURCE=.\res\floating.ico +# End Source File +# Begin Source File + +SOURCE=.\res\folder.ico +# End Source File +# Begin Source File + +SOURCE=.\res\icoali10.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig0.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig1.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig2.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig3.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig4.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig5.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig6.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig7.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig8.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig9.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\images.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\info.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logoff.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logov.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov16.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov256.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\mdi.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\minimize.ico +# End Source File +# Begin Source File + +SOURCE=".\res\network-conns.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\network.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_l.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_r.ico +# End Source File +# Begin Source File + +SOURCE=.\res\printer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\reactos.ico +# End Source File +# Begin Source File + +SOURCE=".\res\recent-documents.ico" +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=".\res\ros-big.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\sdi.bmp +# End Source File +# Begin Source File + +SOURCE=".\res\search-doc.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\search.ico +# End Source File +# Begin Source File + +SOURCE=.\res\shutdown.ico +# End Source File +# Begin Source File + +SOURCE=.\res\speaker.ico +# End Source File +# Begin Source File + +SOURCE=.\res\startmenu.ico +# End Source File +# Begin Source File + +SOURCE=.\res\toolbar.bmp +# End Source File +# End Group +# Begin Group "taskbar" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\taskbar\desktopbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\desktopbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.h +# End Source File +# Begin Source File + +SOURCE=.\notifyhook\notifyhook.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.h +# End Source File +# End Group +# Begin Group "desktop" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\desktop\desktop.cpp +# End Source File +# Begin Source File + +SOURCE=.\desktop\desktop.h +# End Source File +# End Group +# Begin Group "doc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\doc\changes.txt +# End Source File +# Begin Source File + +SOURCE=.\doc\readme.txt +# End Source File +# Begin Source File + +SOURCE=.\doc\TODO.txt +# End Source File +# End Group +# Begin Group "shell" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\shell\entries.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\entries.h +# End Source File +# Begin Source File + +SOURCE=.\shell\fatfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\fatfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\filechild.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\filechild.h +# End Source File +# Begin Source File + +SOURCE=.\shell\mainframe.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\mainframe.h +# End Source File +# Begin Source File + +SOURCE=.\shell\ntobjfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\ntobjfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.h +# End Source File +# Begin Source File + +SOURCE=.\shell\regfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\regfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellbrowser.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\shellbrowser.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\unixfs.cpp +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\shell\unixfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\webchild.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\webchild.h +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.h +# End Source File +# End Group +# Begin Group "dialogs" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dialogs\searchprogram.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\searchprogram.h +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.h +# End Source File +# End Group +# Begin Group "main" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\explorer.cpp +# End Source File +# Begin Source File + +SOURCE=.\explorer.h +# End Source File +# Begin Source File + +SOURCE=.\externals.h +# End Source File +# Begin Source File + +SOURCE=.\globals.h +# End Source File +# Begin Source File + +SOURCE=".\i386-stub-win32.c" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\precomp.cpp +# ADD CPP /Yc"precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\precomp.h +# End Source File +# End Group +# Begin Group "services" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\services\shellservices.cpp +# End Source File +# Begin Source File + +SOURCE=.\services\shellservices.h +# End Source File +# Begin Source File + +SOURCE=.\services\startup.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/base/shell/explorer/explorer.dsw b/reactos/base/shell/explorer/explorer.dsw new file mode 100644 index 00000000000..d212f1818ff --- /dev/null +++ b/reactos/base/shell/explorer/explorer.dsw @@ -0,0 +1,56 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "explorer"=.\explorer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name notifyhook + End Project Dependency +}}} + +############################################################################### + +Project: "make_explorer"=.\make_explorer.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/base/shell/explorer/explorer.exe.manifest b/reactos/base/shell/explorer/explorer.exe.manifest new file mode 100644 index 00000000000..5df0dd38a2a --- /dev/null +++ b/reactos/base/shell/explorer/explorer.exe.manifest @@ -0,0 +1,22 @@ + + + +ROS Explorer + + + + + + diff --git a/reactos/base/shell/explorer/explorer.h b/reactos/base/shell/explorer/explorer.h new file mode 100644 index 00000000000..6c508ff93b3 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.h @@ -0,0 +1,122 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // explorer.h + // + // Martin Fuchs, 23.07.2003 + // + + +#define _LIGHT_STARTMENU +#define _LAZY_ICONEXTRACT +#define _SINGLE_ICONEXTRACT +//#define _NO_WIN_FS + + +#include "utility/shellclasses.h" + +#include "shell/entries.h" + +#ifndef _NO_WIN_FS +#include "shell/winfs.h" +#endif + +#include "shell/shellfs.h" + +#ifndef ROSSHELL +#include "shell/unixfs.h" +#endif + +#include "utility/window.h" + + +#define IDW_STATUSBAR 0x100 +#define IDW_TOOLBAR 0x101 +#define IDW_EXTRABAR 0x102 +#define IDW_DRIVEBAR 0x103 +#define IDW_ADDRESSBAR 0x104 +#define IDW_COMMANDBAR 0x105 +#define IDW_SIDEBAR 0x106 +#define IDW_FIRST_CHILD 0xC000 /*0x200*/ + + +#define PM_GET_FILEWND_PTR (WM_APP+0x05) +#define PM_GET_SHELLBROWSER_PTR (WM_APP+0x06) + +#define PM_GET_CONTROLWINDOW (WM_APP+0x16) + +#define PM_RESIZE_CHILDREN (WM_APP+0x17) +#define PM_GET_WIDTH (WM_APP+0x18) + +#define PM_REFRESH (WM_APP+0x1B) +#define PM_REFRESH_CONFIG (WM_APP+0x1C) + + +#define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer + +#define CLASSNAME_CHILDWND TEXT("WFS_Child") +#define CLASSNAME_WINEFILETREE TEXT("WFS_Tree") + + +#include "shell/pane.h" +#include "shell/filechild.h" +#include "shell/shellbrowser.h" + + +#ifndef ROSSHELL + + /// Explorer command line parser + // for commands like "/e,/root,c:\" + // or "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}" (launch of control panel) +struct ExplorerCmd +{ + ExplorerCmd() + : _flags(0), + _cmdShow(SW_SHOWNORMAL), + _mdi(false), + _valid_path(false) + { + } + + ExplorerCmd(LPCTSTR url, bool mdi) + : _path(url), + _flags(0), + _cmdShow(SW_SHOWNORMAL), + _mdi(mdi), + _valid_path(true) //@@ + { + } + + bool ParseCmdLine(LPCTSTR lpCmdLine); + bool EvaluateOption(LPCTSTR option); + bool IsValidPath() const; + + String _path; + int _flags; // OPEN_WINDOW_MODE + int _cmdShow; + bool _mdi; + bool _valid_path; +}; + +#include "shell/mainframe.h" + +#endif diff --git a/reactos/base/shell/explorer/explorer.rc b/reactos/base/shell/explorer/explorer.rc new file mode 100644 index 00000000000..ed273193777 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.rc @@ -0,0 +1,21 @@ +/* $Id: explorer.rc 17951 2005-09-20 19:51:27Z mf $ */ + +#include "explorer_intres.rc" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Explorer\0" +#define REACTOS_STR_INTERNAL_NAME "explorer\0" +#define REACTOS_STR_ORIGINAL_FILENAME "explorer.exe\0" +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#define IDS_VERSION_STR 5000 +#define IDS_EXPLORER_VERSION_STR 5001 + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + IDS_VERSION_STR REACTOS_STR_PRODUCT_VERSION + IDS_EXPLORER_VERSION_STR "ReactOS %s Explorer" +END diff --git a/reactos/base/shell/explorer/explorer.sln b/reactos/base/shell/explorer/explorer.sln new file mode 100644 index 00000000000..4f01e3694b2 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "explorer", "explorer.vcproj", "{BFBAE588-8C68-4303-9BF6-C830087D8F25}" + ProjectSection(ProjectDependencies) = postProject + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162} = {F28B575D-7DBA-44DE-AAEF-FA0D065E5162} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_explorer", "make_explorer.vcproj", "{E132A04B-8BC6-4D18-81F2-F0156B809871}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "notifyhook", "notifyhook\notifyhook.vcproj", "{F28B575D-7DBA-44DE-AAEF-FA0D065E5162}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + bjam|Win32 = bjam|Win32 + Debug Release|Win32 = Debug Release|Win32 + Debug|Win32 = Debug|Win32 + doxy docu|Win32 = doxy docu|Win32 + Release|Win32 = Release|Win32 + Unicode Debug|Win32 = Unicode Debug|Win32 + Unicode Release|Win32 = Unicode Release|Win32 + WineDll|Win32 = WineDll|Win32 + WineRelease|Win32 = WineRelease|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.bjam|Win32.ActiveCfg = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.bjam|Win32.Build.0 = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug Release|Win32.ActiveCfg = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug Release|Win32.Build.0 = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug|Win32.ActiveCfg = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug|Win32.Build.0 = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.doxy docu|Win32.ActiveCfg = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.doxy docu|Win32.Build.0 = Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Release|Win32.ActiveCfg = Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Release|Win32.Build.0 = Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Debug|Win32.Build.0 = Unicode Debug|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Release|Win32.Build.0 = Unicode Release|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineDll|Win32.ActiveCfg = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineDll|Win32.Build.0 = WineDll|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineRelease|Win32.ActiveCfg = WineRelease|Win32 + {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineRelease|Win32.Build.0 = WineRelease|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.bjam|Win32.ActiveCfg = bjam|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.bjam|Win32.Build.0 = bjam|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Debug Release|Win32.ActiveCfg = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Debug|Win32.ActiveCfg = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.doxy docu|Win32.ActiveCfg = doxy docu|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.doxy docu|Win32.Build.0 = doxy docu|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Release|Win32.ActiveCfg = Release|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineDll|Win32.ActiveCfg = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineDll|Win32.Build.0 = Debug|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineRelease|Win32.ActiveCfg = Release|Win32 + {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineRelease|Win32.Build.0 = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.bjam|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.bjam|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug Release|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug Release|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.doxy docu|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.doxy docu|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Release|Win32.ActiveCfg = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Release|Win32.Build.0 = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Debug|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Debug|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Release|Win32.ActiveCfg = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Release|Win32.Build.0 = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineDll|Win32.ActiveCfg = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineDll|Win32.Build.0 = Debug|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineRelease|Win32.ActiveCfg = Release|Win32 + {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineRelease|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/reactos/base/shell/explorer/explorer.vcproj b/reactos/base/shell/explorer/explorer.vcproj new file mode 100644 index 00000000000..79428d6db4c --- /dev/null +++ b/reactos/base/shell/explorer/explorer.vcproj @@ -0,0 +1,3788 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/explorer.xml b/reactos/base/shell/explorer/explorer.xml new file mode 100644 index 00000000000..0385faba4c2 --- /dev/null +++ b/reactos/base/shell/explorer/explorer.xml @@ -0,0 +1,74 @@ + + -luuid + -lstdc++ + -fexceptions + . + + + + + 0x0600 + 0x0501 + 0x0500 + + kernel32 + gdi32 + user32 + ws2_32 + msimg32 + comctl32 + ole32 + oleaut32 + shell32 + expat + notifyhook + precomp.h + + desktop.cpp + + + searchprogram.cpp + settings.cpp + + + entries.cpp + fatfs.cpp + filechild.cpp + shellfs.cpp + mainframe.cpp + ntobjfs.cpp + pane.cpp + regfs.cpp + shellbrowser.cpp + unixfs.cpp + webchild.cpp + winfs.cpp + + + shellservices.cpp + startup.c + + + desktopbar.cpp + favorites.cpp + taskbar.cpp + startmenu.cpp + traynotify.cpp + quicklaunch.cpp + + + shellclasses.cpp + utility.cpp + window.cpp + dragdropimpl.cpp + shellbrowserimpl.cpp + xmlstorage.cpp + + explorer.cpp + i386-stub-win32.c + explorer.rc + +explorer-cfg-template.xml + + + diff --git a/reactos/base/shell/explorer/explorer_intres.rc b/reactos/base/shell/explorer/explorer_intres.rc new file mode 100644 index 00000000000..06be918683a --- /dev/null +++ b/reactos/base/shell/explorer/explorer_intres.rc @@ -0,0 +1,223 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_DRIVEBAR BITMAP MOVEABLE PURE "res/drivebar.bmp" +IDB_LOGOV BITMAP MOVEABLE PURE "res/logov.bmp" +IDB_LOGOV256 BITMAP MOVEABLE PURE "res/logov256.bmp" +IDB_LOGOV16 BITMAP MOVEABLE PURE "res/logov16.bmp" +IDB_ICON_ALIGN_0 BITMAP MOVEABLE PURE "res/icoalig0.bmp" +IDB_ICON_ALIGN_1 BITMAP MOVEABLE PURE "res/icoalig1.bmp" +IDB_ICON_ALIGN_2 BITMAP MOVEABLE PURE "res/icoalig2.bmp" +IDB_ICON_ALIGN_3 BITMAP MOVEABLE PURE "res/icoalig3.bmp" +IDB_ICON_ALIGN_4 BITMAP MOVEABLE PURE "res/icoalig4.bmp" +IDB_ICON_ALIGN_5 BITMAP MOVEABLE PURE "res/icoalig5.bmp" +IDB_ICON_ALIGN_6 BITMAP MOVEABLE PURE "res/icoalig6.bmp" +IDB_ICON_ALIGN_7 BITMAP MOVEABLE PURE "res/icoalig7.bmp" +IDB_ICON_ALIGN_8 BITMAP MOVEABLE PURE "res/icoalig8.bmp" +IDB_ICON_ALIGN_9 BITMAP MOVEABLE PURE "res/icoalig9.bmp" +IDB_ICON_ALIGN_10 BITMAP MOVEABLE PURE "res/icoali10.bmp" +IDB_MDI BITMAP MOVEABLE PURE "res/mdi.bmp" +IDB_SDI BITMAP MOVEABLE PURE "res/sdi.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDA_EXPLORER ACCELERATORS MOVEABLE PURE +BEGIN + "X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT + "S", ID_VIEW_FULLSCREEN, VIRTKEY, SHIFT, CONTROL, + NOINVERT +END + +IDA_SEARCH_PROGRAM ACCELERATORS MOVEABLE PURE +BEGIN + VK_F5, ID_REFRESH, VIRTKEY, NOINVERT +END + +IDA_TRAYNOTIFY ACCELERATORS MOVEABLE PURE +BEGIN + VK_F5, ID_REFRESH, VIRTKEY, NOINVERT +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#ifndef ROSSHELL\r\n" + "IDB_IMAGES BITMAP DISCARDABLE ""res/images.bmp""\r\n" + "IDB_TOOLBAR BITMAP DISCARDABLE ""res/toolbar.bmp""\r\n" + "#endif\r\n" + "#ifndef _ROS_\r\n" + "LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\r\n" + "STRINGTABLE DISCARDABLE \r\n" + "BEGIN\r\n" + "IDS_VERSION_STR """"\r\n" + "#ifdef UNICODE\r\n" + "IDS_EXPLORER_VERSION_STR ""ROS Explorer%0s""\r\n" + "#else\r\n" + "IDS_EXPLORER_VERSION_STR ""ROS Explorer Ansi%0s""\r\n" + "#endif\r\n" + "END\r\n" + "#endif\r\n" + "#ifndef _DEBUG\r\n" + "CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST DISCARDABLE PURE ""explorer.exe.manifest""\r\n" + "#endif\r\n" + "\r\n" + "#include ""explorer-en.rc""\r\n" + "#include ""explorer-de.rc""\r\n" + "#include ""explorer-es.rc""\r\n" + "#include ""explorer-sv.rc""\r\n" + "#include ""explorer-pl.rc""\r\n" + "#include ""explorer-pt.rc""\r\n" + "#include ""explorer-cz.rc""\r\n" + "#include ""explorer-ro.rc""\r\n" + "#include ""explorer-ru.rc""\r\n" + "#include ""explorer-jp.rc""\r\n" + "#include ""explorer-hu.rc""\r\n" + "#include ""explorer-uk.rc""\r\n" + "\r\n" + "#ifndef __WINDRES__\r\n" + "#include ""explorer-cn.rc""\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_REACTOS ICON DISCARDABLE "res/reactos.ico" +IDI_EXPLORER ICON DISCARDABLE "res/explorer.ico" +IDI_STARTMENU ICON DISCARDABLE "res/startmenu.ico" +IDI_LOGOFF ICON DISCARDABLE "res/logoff.ico" +IDI_SHUTDOWN ICON DISCARDABLE "res/shutdown.ico" +IDI_ARROW ICON DISCARDABLE "res/arrow.ico" +IDI_ARROW_SELECTED ICON DISCARDABLE "res/arrowsel.ico" +IDI_APPICON ICON DISCARDABLE "res/appicon.ico" +IDI_FLOATING ICON DISCARDABLE "res/floating.ico" +IDI_REACTOS_BIG ICON DISCARDABLE "res/ros-big.ico" +IDI_CONFIG ICON DISCARDABLE "res/config.ico" +IDI_DOCUMENTS ICON DISCARDABLE "res/documents.ico" +IDI_FAVORITES ICON DISCARDABLE "res/favorites.ico" +IDI_INFO ICON DISCARDABLE "res/info.ico" +IDI_APPS ICON DISCARDABLE "res/apps.ico" +IDI_SEARCH ICON DISCARDABLE "res/search.ico" +IDI_ACTION ICON DISCARDABLE "res/action.ico" +IDI_FOLDER ICON DISCARDABLE "res/folder.ico" +IDI_SEARCH_DOC ICON DISCARDABLE "res/search-doc.ico" +IDI_PRINTER ICON DISCARDABLE "res/printer.ico" +IDI_NETWORK ICON DISCARDABLE "res/network.ico" +IDI_COMPUTER ICON DISCARDABLE "res/computer.ico" +IDI_SPEAKER ICON DISCARDABLE "res/speaker.ico" +IDI_DOT ICON DISCARDABLE "res/dot.ico" +IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico" +IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico" +IDI_ARROW_UP ICON DISCARDABLE "res/arrow_up.ico" +IDI_ARROW_DOWN ICON DISCARDABLE "res/arrow_dwn.ico" +IDI_NOTIFY_L ICON DISCARDABLE "res/notify_l.ico" +IDI_NOTIFY_R ICON DISCARDABLE "res/notify_r.ico" +IDI_MINIMIZE ICON DISCARDABLE "res/minimize.ico" +IDI_CONTROLPAN ICON DISCARDABLE "res/control-panel.ico" +IDI_DESKSETTING ICON DISCARDABLE "res/desktop-settings.ico" +IDI_NETCONNS ICON DISCARDABLE "res/network-conns.ico" +IDI_ADMIN ICON DISCARDABLE "res/administration.ico" +IDI_RECENT ICON DISCARDABLE "res/recent-documents.ico" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#ifndef ROSSHELL +IDB_IMAGES BITMAP DISCARDABLE "res/images.bmp" +IDB_TOOLBAR BITMAP DISCARDABLE "res/toolbar.bmp" +#endif +#ifndef _ROS_ +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +BEGIN +IDS_VERSION_STR "" +#ifdef UNICODE +IDS_EXPLORER_VERSION_STR "ROS Explorer%0s" +#else +IDS_EXPLORER_VERSION_STR "ROS Explorer Ansi%0s" +#endif +END +#endif +#ifndef _DEBUG +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST DISCARDABLE PURE "explorer.exe.manifest" +#endif + +#include "explorer-en.rc" +#include "explorer-de.rc" +#include "explorer-es.rc" +#include "explorer-sv.rc" +#include "explorer-pl.rc" +#include "explorer-pt.rc" +#include "explorer-cz.rc" +#include "explorer-ro.rc" +#include "explorer-ru.rc" +#include "explorer-jp.rc" +#include "explorer-hu.rc" +#include "explorer-uk.rc" + +#ifndef __WINDRES__ +#include "explorer-cn.rc" +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/explorer/externals.h b/reactos/base/shell/explorer/externals.h new file mode 100644 index 00000000000..50e7650868c --- /dev/null +++ b/reactos/base/shell/explorer/externals.h @@ -0,0 +1,52 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // externals.h + // + // Martin Fuchs, 07.06.2003 + // + + +#ifdef __cplusplus +extern "C" { +#endif + + + // explorer main routine +extern int explorer_main(HINSTANCE hinstance, LPTSTR lpCmdLine, int cmdshow); + + // display explorer/file manager window +extern void explorer_show_frame(int cmdshow, LPTSTR lpCmdLine=NULL); + + // display explorer "About" dialog +extern void explorer_about(HWND hwndParent); + + // test for already running desktop instance +extern BOOL IsAnyDesktopRunning(); + + // show shutdown dialog +extern void ShowExitWindowsDialog(HWND hwndOwner); + +#ifdef __cplusplus +} // extern "C" +#endif + diff --git a/reactos/base/shell/explorer/globals.h b/reactos/base/shell/explorer/globals.h new file mode 100644 index 00000000000..63cd3731a63 --- /dev/null +++ b/reactos/base/shell/explorer/globals.h @@ -0,0 +1,348 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // globals.h + // + // Martin Fuchs, 23.07.2003 + // + + +#include "utility/xmlstorage.h" + +using namespace XMLStorage; + +#include "taskbar/favorites.h" + + + /// management of file types +struct FileTypeInfo { + String _classname; + String _displayname; + bool _neverShowExt; +}; + +struct FileTypeManager : public map +{ + typedef map super; + + const FileTypeInfo& operator[](String ext); + + static bool is_exe_file(LPCTSTR ext); + + LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false); +}; + + +enum ICON_TYPE { + IT_STATIC, + IT_CACHED, + IT_DYNAMIC, + IT_SYSCACHE +}; + +enum ICON_ID { + ICID_UNKNOWN, + ICID_NONE, + + ICID_FOLDER, + //ICID_DOCUMENT, + ICID_APP, + ICID_EXPLORER, + + ICID_CONFIG, + ICID_DOCUMENTS, + ICID_FAVORITES, + ICID_INFO, + ICID_APPS, + ICID_SEARCH, + ICID_ACTION, + ICID_SEARCH_DOC, + ICID_PRINTER, + ICID_NETWORK, + ICID_COMPUTER, + ICID_LOGOFF, + ICID_SHUTDOWN, + ICID_BOOKMARK, + ICID_MINIMIZE, + ICID_CONTROLPAN, + ICID_DESKSETTING, + ICID_NETCONNS, + ICID_ADMIN, + ICID_RECENT, + + ICID_DYNAMIC +}; + +struct Icon { + Icon(); + Icon(ICON_ID id, UINT nid); + Icon(ICON_ID id, UINT nid, int icon_size); + Icon(ICON_TYPE itype, int id, HICON hIcon); + Icon(ICON_TYPE itype, int id, int sys_idx); + + operator ICON_ID() const {return _id;} + + void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const; + HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const; + int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const; + + int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;} + HICON get_hicon() const {return _itype!=IT_SYSCACHE? _hicon: 0;} + + bool destroy() {if (_itype == IT_DYNAMIC) {DestroyIcon(_hicon); return true;} else return false;} + +protected: + ICON_ID _id; + ICON_TYPE _itype; + HICON _hicon; + int _sys_idx; +}; + +struct SysCacheIcon : public Icon { + SysCacheIcon(int id, int sys_idx) + : Icon(IT_SYSCACHE, id, sys_idx) {} +}; + +struct IconCache { + IconCache() : _himlSys_small(0) {} + + void init(); + + const Icon& extract(LPCTSTR path, ICONCACHE_FLAGS flags=ICF_NORMAL); + const Icon& extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON); + const Icon& extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON); + + const Icon& add(HICON hIcon, ICON_TYPE type=IT_DYNAMIC); + const Icon& add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/); + + const Icon& get_icon(int icon_id); + + HIMAGELIST get_sys_imagelist() const {return _himlSys_small;} + + void free_icon(int icon_id); + +protected: + static int s_next_id; + + typedef map IconMap; + IconMap _icons; + + typedef pair CacheKey; + typedef map PathCacheMap; + PathCacheMap _pathCache; + + typedef pair > IdxCacheKey; + typedef map IdxCacheMap; + IdxCacheMap _idxCache; + + HIMAGELIST _himlSys_small; +}; + + +#define ICON_SIZE_SMALL 16 // GetSystemMetrics(SM_CXSMICON) +#define ICON_SIZE_MIDDLE 24 // special size for start menu root icons +#define ICON_SIZE_LARGE 32 // GetSystemMetrics(SM_CXICON) + +#define STARTMENUROOT_ICON_SIZE ICON_SIZE_MIDDLE // ICON_SIZE_LARGE + +#define ICON_SIZE_FROM_ICF(flags) (flags&ICF_LARGE? ICON_SIZE_LARGE: flags&ICF_MIDDLE? ICON_SIZE_MIDDLE: ICON_SIZE_SMALL) +#define ICF_FROM_ICON_SIZE(size) (size>=ICON_SIZE_LARGE? ICF_LARGE: size>=ICON_SIZE_MIDDLE? ICF_MIDDLE: ICF_NORMAL) + + + /// create a bitmap from an icon +extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/); + + /// add icon with alpha channel to imagelist using the specified background color +extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd); + + /// retrieve icon from window +extern HICON get_window_icon_small(HWND hwnd); +extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true); + + + /// desktop management +#ifdef _USE_HDESK + +typedef auto_ptr DesktopThreadPtr; + +struct Desktop +{ + HDESK _hdesktop; +// HWINSTA _hwinsta; + DesktopThreadPtr _pThread; + WindowHandle _hwndDesktop; + + Desktop(HDESK hdesktop=0/*, HWINSTA hwinsta=0*/); + ~Desktop(); +}; + +typedef auto_ptr DesktopPtr; +typedef DesktopPtr DesktopRef; + + /// Thread class for additional desktops +struct DesktopThread : public Thread +{ + DesktopThread(Desktop& desktop) + : _desktop(desktop) + { + } + + int Run(); + +protected: + Desktop& _desktop; +}; + +#else + +typedef pair MinimizeStruct; + +struct Desktop +{ + set _windows; + WindowHandle _hwndForeground; + list _minimized; +}; +typedef Desktop DesktopRef; + +#endif + + +#define DESKTOP_COUNT 4 + +struct Desktops : public vector +{ + Desktops(); + ~Desktops(); + + void init(); + void SwitchToDesktop(int idx); + void ToggleMinimize(); + +#ifdef _USE_HDESK + DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];} +#endif + + int _current_desktop; +}; + + + /// structure containing global variables of Explorer +extern struct ExplorerGlobals +{ + ExplorerGlobals(); + + void init(HINSTANCE hInstance); + + void read_persistent(); + void write_persistent(); + + XMLPos get_cfg(); + XMLPos get_cfg(const char* path); + + HINSTANCE _hInstance; + UINT _cfStrFName; + +#ifndef ROSSHELL + ATOM _hframeClass; + HWND _hMainWnd; + bool _desktop_mode; + bool _prescan_nodes; +#endif + + FILE* _log; + +#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) + DWORD(STDAPICALLTYPE* _SHRestricted)(RESTRICTIONS); +#endif + + FileTypeManager _ftype_mgr; + IconCache _icon_cache; + + HWND _hwndDesktopBar; + HWND _hwndShellView; + HWND _hwndDesktop; + + Desktops _desktops; + + XMLDoc _cfg; + String _cfg_dir; + String _cfg_path; + + Favorites _favorites; + String _favorites_path; +} g_Globals; + + + /// convenient loading of string resources +struct ResString : public String +{ + ResString(UINT nid); +}; + + /// convenient loading of standard (32x32) icon resources +struct ResIcon +{ + ResIcon(UINT nid); + + operator HICON() const {return _hicon;} + +protected: + HICON _hicon; +}; + + /// convenient loading of small (16x16) icon resources +struct SmallIcon +{ + SmallIcon(UINT nid); + + operator HICON() const {return _hicon;} + +protected: + HICON _hicon; +}; + + /// convenient loading of icon resources with specified sizes +struct ResIconEx +{ + ResIconEx(UINT nid, int w, int h); + + operator HICON() const {return _hicon;} + +protected: + HICON _hicon; +}; + + /// set big and small icons out of the resources for a window +extern void SetWindowIcon(HWND hwnd, UINT nid); + + /// convenient loading of bitmap resources +struct ResBitmap +{ + ResBitmap(UINT nid); + ~ResBitmap() {DeleteObject(_hBmp);} + + operator HBITMAP() const {return _hBmp;} + +protected: + HBITMAP _hBmp; +}; diff --git a/reactos/base/shell/explorer/i386-stub-win32.c b/reactos/base/shell/explorer/i386-stub-win32.c new file mode 100644 index 00000000000..3587612d704 --- /dev/null +++ b/reactos/base/shell/explorer/i386-stub-win32.c @@ -0,0 +1,1278 @@ +/**************************************************************************** + + THIS SOFTWARE IS NOT COPYRIGHTED + + HP offers the following for use in the public domain. HP makes no + warranty with regard to the software or it's performance and the + user accepts the software "AS IS" with all faults. + + HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD + TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +****************************************************************************/ + +/**************************************************************************** + * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $ + * + * Module name: remcom.c $ + * Revision: 1.34 $ + * Date: 91/03/09 12:29:49 $ + * Contributor: Lake Stevens Instrument Division$ + * + * Description: low level support for gdb debugger. $ + * + * Considerations: only works on target hardware $ + * + * Written by: Glenn Engel $ + * ModuleState: Experimental $ + * + * NOTES: See Below $ + * + * Modified for 386 by Jim Kingdon, Cygnus Support. + * + * To enable debugger support, two things need to happen. One, a + * call to set_debug_traps() is necessary in order to allow any breakpoints + * or error conditions to be properly intercepted and reported to gdb. + * Two, a breakpoint needs to be generated to begin communication. This + * is most easily accomplished by a call to breakpoint(). Breakpoint() + * simulates a breakpoint by executing a trap #1. + * + * The external function exceptionHandler() is + * used to attach a specific handler to a specific 386 vector number. + * It should use the same privilege level it runs at. It should + * install it as an interrupt gate so that interrupts are masked + * while the handler runs. + * + * Because gdb will sometimes write to the stack area to execute function + * calls, this program cannot rely on using the supervisor stack so it + * uses it's own stack area reserved in the int array remcomStack. + * + ************* + * + * The following gdb commands are supported: + * + * command function Return value + * + * g return the value of the CPU registers hex data or ENN + * G set the value of the CPU registers OK or ENN + * + * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN + * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN + * + * c Resume at current address SNN ( signal NN) + * cAA..AA Continue at address AA..AA SNN + * + * s Step one instruction SNN + * sAA..AA Step one instruction from AA..AA SNN + * + * k kill + * + * ? What was the last sigval ? SNN (signal NN) + * + * All commands and responses are sent with a packet which includes a + * checksum. A packet consists of + * + * $#. + * + * where + * :: + * :: < two hex digits computed as modulo 256 sum of > + * + * When a packet is received, it is first acknowledged with either '+' or '-'. + * '+' indicates a successful transfer. '-' indicates a failed transfer. + * + * Example: + * + * Host: Reply: + * $m0,10#2a +$00010203040506070809101112131415#42 + * + ****************************************************************************/ + +#include +#include + +#include "utility/utility.h" // for strcpy_s() + +/************************************************************************ + * + * external low-level support routines + */ + +extern void putDebugChar(); /* write a single character */ +extern int getDebugChar(); /* read and return a single char */ +extern void exceptionHandler(); /* assign an exception handler */ + +/************************************************************************/ +/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/ +/* at least NUMREGBYTES*2 are needed for register packets */ +#define BUFMAX 400 + +static char initialized; /* boolean flag. != 0 means we've been initialized */ + +int remote_debug; +/* debug > 0 prints ill-formed commands in valid packets & checksum errors */ + +static const char hexchars[]="0123456789abcdef"; + +/* Number of registers. */ +#define NUMREGS 16 + +/* Number of bytes of registers. */ +#define NUMREGBYTES (NUMREGS * 4) + +enum regnames {EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, + PC /* also known as eip */, + PS /* also known as eflags */, + CS, SS, DS, ES, FS, GS}; + +/* + * these should not be static cuz they can be used outside this module + */ +int registers[NUMREGS]; + +#ifndef WIN32 //MF + +#define STACKSIZE 10000 +int remcomStack[STACKSIZE/sizeof(int)]; +static int* stackPtr = &remcomStack[STACKSIZE/sizeof(int) - 1]; + +/*************************** ASSEMBLY CODE MACROS *************************/ +/* */ + +extern void +return_to_prog (); + +/* Restore the program's registers (including the stack pointer, which + means we get the right stack and don't have to worry about popping our + return address and any stack frames and so on) and return. */ +asm(".text"); +asm(".globl _return_to_prog"); +asm("_return_to_prog:"); +asm(" movw _registers+44, %ss"); +asm(" movl _registers+16, %esp"); +asm(" movl _registers+4, %ecx"); +asm(" movl _registers+8, %edx"); +asm(" movl _registers+12, %ebx"); +asm(" movl _registers+20, %ebp"); +asm(" movl _registers+24, %esi"); +asm(" movl _registers+28, %edi"); +asm(" movw _registers+48, %ds"); +asm(" movw _registers+52, %es"); +asm(" movw _registers+56, %fs"); +asm(" movw _registers+60, %gs"); +asm(" movl _registers+36, %eax"); +asm(" pushl %eax"); /* saved eflags */ +asm(" movl _registers+40, %eax"); +asm(" pushl %eax"); /* saved cs */ +asm(" movl _registers+32, %eax"); +asm(" pushl %eax"); /* saved eip */ +asm(" movl _registers, %eax"); + +asm("ret"); //MF + +/* use iret to restore pc and flags together so + that trace flag works right. */ +asm(" iret"); + + +#ifdef WIN32 //MF +asm(".data"); //MF +#endif + +/* Put the error code here just in case the user cares. */ +int gdb_i386errcode; +/* Likewise, the vector number here (since GDB only gets the signal + number through the usual means, and that's not very specific). */ +int gdb_i386vector = -1; + +/* GDB stores segment registers in 32-bit words (that's just the way + m-i386v.h is written). So zero the appropriate areas in registers. */ +#define SAVE_REGISTERS1() \ + asm ("movl %eax, _registers"); \ + asm ("movl %ecx, _registers+4"); \ + asm ("movl %edx, _registers+8"); \ + asm ("movl %ebx, _registers+12"); \ + asm ("movl %ebp, _registers+20"); \ + asm ("movl %esi, _registers+24"); \ + asm ("movl %edi, _registers+28"); \ + asm ("movw $0, %ax"); \ + asm ("movw %ds, _registers+48"); \ + asm ("movw %ax, _registers+50"); \ + asm ("movw %es, _registers+52"); \ + asm ("movw %ax, _registers+54"); \ + asm ("movw %fs, _registers+56"); \ + asm ("movw %ax, _registers+58"); \ + asm ("movw %gs, _registers+60"); \ + asm ("movw %ax, _registers+62"); +#define SAVE_ERRCODE() \ + asm ("popl %ebx"); \ + asm ("movl %ebx, _gdb_i386errcode"); +#define SAVE_REGISTERS2() \ + asm ("popl %ebx"); /* old eip */ \ + asm ("movl %ebx, _registers+32"); \ + asm ("popl %ebx"); /* old cs */ \ + asm ("movl %ebx, _registers+40"); \ + asm ("movw %ax, _registers+42"); \ + asm ("popl %ebx"); /* old eflags */ \ + asm ("movl %ebx, _registers+36"); \ + /* Now that we've done the pops, we can save the stack pointer."); */ \ + asm ("movw %ss, _registers+44"); \ + asm ("movw %ax, _registers+46"); \ + asm ("movl %esp, _registers+16"); + +/* See if mem_fault_routine is set, if so just IRET to that address. */ +#define CHECK_FAULT() \ + asm ("cmpl $0, _mem_fault_routine"); \ + asm ("jne mem_fault"); + +asm (".text"); +asm ("mem_fault:"); +/* OK to clobber temp registers; we're just going to end up in set_mem_err. */ +/* Pop error code from the stack and save it. */ +asm (" popl %eax"); +asm (" movl %eax, _gdb_i386errcode"); + +asm (" popl %eax"); /* eip */ +/* We don't want to return there, we want to return to the function + pointed to by mem_fault_routine instead. */ +asm (" movl _mem_fault_routine, %eax"); +asm (" popl %ecx"); /* cs (low 16 bits; junk in hi 16 bits). */ +asm (" popl %edx"); /* eflags */ + +/* Remove this stack frame; when we do the iret, we will be going to + the start of a function, so we want the stack to look just like it + would after a "call" instruction. */ +asm (" leave"); + +/* Push the stuff that iret wants. */ +asm (" pushl %edx"); /* eflags */ +asm (" pushl %ecx"); /* cs */ +asm (" pushl %eax"); /* eip */ + +/* Zero mem_fault_routine. */ +asm (" movl $0, %eax"); +asm (" movl %eax, _mem_fault_routine"); + +asm ("iret"); + + +#define CALL_HOOK() asm("call _remcomHandler"); + +/* This function is called when a i386 exception occurs. It saves + * all the cpu regs in the _registers array, munges the stack a bit, + * and invokes an exception handler (remcom_handler). + * + * stack on entry: stack on exit: + * old eflags vector number + * old cs (zero-filled to 32 bits) + * old eip + * + */ +extern void _catchException3(); +asm(".text"); +asm(".globl __catchException3"); +asm("__catchException3:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $3"); +CALL_HOOK(); + +/* Same thing for exception 1. */ +extern void _catchException1(); +asm(".text"); +asm(".globl __catchException1"); +asm("__catchException1:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $1"); +CALL_HOOK(); + +/* Same thing for exception 0. */ +extern void _catchException0(); +asm(".text"); +asm(".globl __catchException0"); +asm("__catchException0:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $0"); +CALL_HOOK(); + +/* Same thing for exception 4. */ +extern void _catchException4(); +asm(".text"); +asm(".globl __catchException4"); +asm("__catchException4:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $4"); +CALL_HOOK(); + +/* Same thing for exception 5. */ +extern void _catchException5(); +asm(".text"); +asm(".globl __catchException5"); +asm("__catchException5:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $5"); +CALL_HOOK(); + +/* Same thing for exception 6. */ +extern void _catchException6(); +asm(".text"); +asm(".globl __catchException6"); +asm("__catchException6:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $6"); +CALL_HOOK(); + +/* Same thing for exception 7. */ +extern void _catchException7(); +asm(".text"); +asm(".globl __catchException7"); +asm("__catchException7:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $7"); +CALL_HOOK(); + +/* Same thing for exception 8. */ +extern void _catchException8(); +asm(".text"); +asm(".globl __catchException8"); +asm("__catchException8:"); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $8"); +CALL_HOOK(); + +/* Same thing for exception 9. */ +extern void _catchException9(); +asm(".text"); +asm(".globl __catchException9"); +asm("__catchException9:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $9"); +CALL_HOOK(); + +/* Same thing for exception 10. */ +extern void _catchException10(); +asm(".text"); +asm(".globl __catchException10"); +asm("__catchException10:"); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $10"); +CALL_HOOK(); + +/* Same thing for exception 12. */ +extern void _catchException12(); +asm(".text"); +asm(".globl __catchException12"); +asm("__catchException12:"); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $12"); +CALL_HOOK(); + +/* Same thing for exception 16. */ +extern void _catchException16(); +asm(".text"); +asm(".globl __catchException16"); +asm("__catchException16:"); +SAVE_REGISTERS1(); +SAVE_REGISTERS2(); +asm ("pushl $16"); +CALL_HOOK(); + +/* For 13, 11, and 14 we have to deal with the CHECK_FAULT stuff. */ + +/* Same thing for exception 13. */ +extern void _catchException13 (); +asm (".text"); +asm (".globl __catchException13"); +asm ("__catchException13:"); +CHECK_FAULT(); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $13"); +CALL_HOOK(); + +/* Same thing for exception 11. */ +extern void _catchException11 (); +asm (".text"); +asm (".globl __catchException11"); +asm ("__catchException11:"); +CHECK_FAULT(); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $11"); +CALL_HOOK(); + +/* Same thing for exception 14. */ +extern void _catchException14 (); +asm (".text"); +asm (".globl __catchException14"); +asm ("__catchException14:"); +CHECK_FAULT(); +SAVE_REGISTERS1(); +SAVE_ERRCODE(); +SAVE_REGISTERS2(); +asm ("pushl $14"); +CALL_HOOK(); + +/* + * remcomHandler is a front end for handle_exception. It moves the + * stack pointer into an area reserved for debugger use. + */ +asm("_remcomHandler:"); +asm(" popl %eax"); /* pop off return address */ +asm(" popl %eax"); /* get the exception number */ +asm(" movl _stackPtr, %esp"); /* move to remcom stack area */ +asm(" pushl %eax"); /* push exception onto stack */ +asm(" call _handle_exception"); /* this never returns */ + + +void +_returnFromException () +{ + return_to_prog (); +} + +#endif // !WIN32 + + +#ifdef _MSC_VER //MF +#define BREAKPOINT() __asm int 3; +#else +#define BREAKPOINT() asm(" int $3"); +#endif + + +#ifdef WIN32 //MF + +#define WIN32_LEAN_AND_MEAN +#include + +void handle_exception(int exceptionVector); + +void win32_exception_handler(EXCEPTION_POINTERS* exc_info) +{ + PCONTEXT ctx = exc_info->ContextRecord; + + registers[EAX] = ctx->Eax; + registers[ECX] = ctx->Ecx; + registers[EDX] = ctx->Edx; + registers[EBX] = ctx->Ebx; + registers[ESP] = ctx->Esp; + registers[EBP] = ctx->Ebp; + registers[ESI] = ctx->Esi; + registers[EDI] = ctx->Edi; + registers[PC] = ctx->Eip; + registers[PS] = ctx->EFlags; + registers[CS] = ctx->SegCs; + registers[SS] = ctx->SegSs; + registers[DS] = ctx->SegDs; + registers[ES] = ctx->SegEs; + registers[FS] = ctx->SegFs; + registers[GS] = ctx->SegGs; + + handle_exception(exc_info->ExceptionRecord->ExceptionCode & 0xFFFF); + + ctx->Eax = registers[EAX]; + ctx->Ecx = registers[ECX]; + ctx->Edx = registers[EDX]; + ctx->Ebx = registers[EBX]; + ctx->Esp = registers[ESP]; + ctx->Ebp = registers[EBP]; + ctx->Esi = registers[ESI]; + ctx->Edi = registers[EDI]; + ctx->Eip = registers[PC]; + ctx->EFlags = registers[PS]; + ctx->SegCs = registers[CS]; + ctx->SegSs = registers[SS]; + ctx->SegDs = registers[DS]; + ctx->SegEs = registers[ES]; + ctx->SegFs = registers[FS]; + ctx->SegGs = registers[GS]; +} + +#endif // WIN32 + + +int +hex (ch) + char ch; +{ + if ((ch >= 'a') && (ch <= 'f')) + return (ch - 'a' + 10); + if ((ch >= '0') && (ch <= '9')) + return (ch - '0'); + if ((ch >= 'A') && (ch <= 'F')) + return (ch - 'A' + 10); + return (-1); +} + +static char remcomInBuffer[BUFMAX]; +static char remcomOutBuffer[BUFMAX]; + +/* scan for the sequence $# */ + +char * +getpacket (void) +{ + char *buffer = &remcomInBuffer[0]; + unsigned char checksum; + unsigned char xmitcsum; + int count; + char ch; + + while (1) + { + /* wait around for the start character, ignore all other characters */ + while ((ch = getDebugChar ()) != '$') + ; + + retry: + checksum = 0; + xmitcsum = -1; + count = 0; + + /* now, read until a # or end of buffer is found */ + while (count < BUFMAX) + { + ch = getDebugChar (); + if (ch == '$') + goto retry; + if (ch == '#') + break; + checksum = checksum + ch; + buffer[count] = ch; + count = count + 1; + } + buffer[count] = 0; + + if (ch == '#') + { + ch = getDebugChar (); + xmitcsum = hex (ch) << 4; + ch = getDebugChar (); + xmitcsum += hex (ch); + + if (checksum != xmitcsum) + { + if (remote_debug) + { + fprintf (stderr, + "bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n", + checksum, xmitcsum, buffer); + } + putDebugChar ('-'); /* failed checksum */ + } + else + { + putDebugChar ('+'); /* successful transfer */ + + /* if a sequence char is present, reply the sequence ID */ + if (buffer[2] == ':') + { + putDebugChar (buffer[0]); + putDebugChar (buffer[1]); + + return &buffer[3]; + } + + return &buffer[0]; + } + } + } +} + +/* send the packet in buffer. */ + +void +putpacket (char *buffer) +{ + unsigned char checksum; + int count; + char ch; + + /* $#. */ + do + { + putDebugChar ('$'); + checksum = 0; + count = 0; + + while ((ch = buffer[count]) != 0) + { + putDebugChar (ch); + checksum += ch; + count += 1; + } + + putDebugChar ('#'); + putDebugChar (hexchars[checksum >> 4]); + putDebugChar (hexchars[checksum % 16]); + + } + while (getDebugChar () != '+'); +} + +void debug_error (char* format/*, char* parm*/) +{ + if (remote_debug) + fprintf (stderr, format/*, parm*/); +} + +/* Address of a routine to RTE to if we get a memory fault. */ +static void (*volatile mem_fault_routine) () = NULL; + +/* Indicate to caller of mem2hex or hex2mem that there has been an + error. */ +static volatile int mem_err = 0; + +void +set_mem_err (void) +{ + mem_err = 1; +} + +/* These are separate functions so that they are so short and sweet + that the compiler won't save any registers (if there is a fault + to mem_fault, they won't get restored, so there better not be any + saved). */ +int +get_char (char *addr) +{ + return *addr; +} + +void +set_char (char *addr, int val) +{ + *addr = val; +} + +/* convert the memory pointed to by mem into hex, placing result in buf */ +/* return a pointer to the last char put in buf (null) */ +/* If MAY_FAULT is non-zero, then we should set mem_err in response to + a fault; if zero treat a fault like any other fault in the stub. */ +char * +mem2hex (mem, buf, count, may_fault) + char *mem; + char *buf; + int count; + int may_fault; +{ + int i; + unsigned char ch; + +#ifdef WIN32 //MF + if (IsBadReadPtr(mem, count)) + return mem; +#else + if (may_fault) + mem_fault_routine = set_mem_err; +#endif + for (i = 0; i < count; i++) + { + ch = get_char (mem++); + if (may_fault && mem_err) + return (buf); + *buf++ = hexchars[ch >> 4]; + *buf++ = hexchars[ch % 16]; + } + *buf = 0; +#ifndef WIN32 //MF + if (may_fault) + mem_fault_routine = NULL; +#endif + return (buf); +} + +/* convert the hex array pointed to by buf into binary to be placed in mem */ +/* return a pointer to the character AFTER the last byte written */ +char * +hex2mem (buf, mem, count, may_fault) + char *buf; + char *mem; + int count; + int may_fault; +{ + int i; + unsigned char ch; + +#ifdef WIN32 //MF + // MinGW does not support structured exception handling, so let's + // go safe and make memory writable by default + DWORD old_protect; + + VirtualProtect(mem, count, PAGE_EXECUTE_READWRITE, &old_protect); +#else + if (may_fault) + mem_fault_routine = set_mem_err; +#endif + + for (i = 0; i < count; i++) + { + ch = hex (*buf++) << 4; + ch = ch + hex (*buf++); + set_char (mem++, ch); + if (may_fault && mem_err) + return (mem); + } + +#ifndef WIN32 //MF + if (may_fault) + mem_fault_routine = NULL; +#endif + + return (mem); +} + +/* this function takes the 386 exception vector and attempts to + translate this number into a unix compatible signal value */ +int +computeSignal (int exceptionVector) +{ + int sigval; + switch (exceptionVector) + { + case 0: + sigval = 8; + break; /* divide by zero */ + case 1: + sigval = 5; + break; /* debug exception */ + case 3: + sigval = 5; + break; /* breakpoint */ + case 4: + sigval = 16; + break; /* into instruction (overflow) */ + case 5: + sigval = 16; + break; /* bound instruction */ + case 6: + sigval = 4; + break; /* Invalid opcode */ + case 7: + sigval = 8; + break; /* coprocessor not available */ + case 8: + sigval = 7; + break; /* double fault */ + case 9: + sigval = 11; + break; /* coprocessor segment overrun */ + case 10: + sigval = 11; + break; /* Invalid TSS */ + case 11: + sigval = 11; + break; /* Segment not present */ + case 12: + sigval = 11; + break; /* stack exception */ + case 13: + sigval = 11; + break; /* general protection */ + case 14: + sigval = 11; + break; /* page fault */ + case 16: + sigval = 7; + break; /* coprocessor error */ + default: + sigval = 7; /* "software generated" */ + } + return (sigval); +} + +/**********************************************/ +/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */ +/* RETURN NUMBER OF CHARS PROCESSED */ +/**********************************************/ +int +hexToInt (char **ptr, int *intValue) +{ + int numChars = 0; + int hexValue; + + *intValue = 0; + + while (**ptr) + { + hexValue = hex (**ptr); + if (hexValue >= 0) + { + *intValue = (*intValue << 4) | hexValue; + numChars++; + } + else + break; + + (*ptr)++; + } + + return (numChars); +} + +/* + * This function does all command procesing for interfacing to gdb. + */ +void +handle_exception (int exceptionVector) +{ + int sigval, stepping; + int addr, length; + char *ptr; + int newPC; + +#ifndef WIN32 //MF + gdb_i386vector = exceptionVector; +#endif + + if (remote_debug) + { + printf ("vector=%d, sr=0x%x, pc=0x%x\n", + exceptionVector, registers[PS], registers[PC]); + } + + /* reply to host that an exception has occurred */ + sigval = computeSignal (exceptionVector); + + ptr = remcomOutBuffer; + + *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ + *ptr++ = hexchars[sigval >> 4]; + *ptr++ = hexchars[sigval & 0xf]; + + *ptr++ = hexchars[ESP]; + *ptr++ = ':'; + ptr = mem2hex((char *)®isters[ESP], ptr, 4, 0); /* SP */ + *ptr++ = ';'; + + *ptr++ = hexchars[EBP]; + *ptr++ = ':'; + ptr = mem2hex((char *)®isters[EBP], ptr, 4, 0); /* FP */ + *ptr++ = ';'; + + *ptr++ = hexchars[PC]; + *ptr++ = ':'; + ptr = mem2hex((char *)®isters[PC], ptr, 4, 0); /* PC */ + *ptr++ = ';'; + + *ptr = '\0'; + + putpacket (remcomOutBuffer); + + stepping = 0; + + while (1 == 1) + { + remcomOutBuffer[0] = 0; + ptr = getpacket (); + + switch (*ptr++) + { + case '?': + remcomOutBuffer[0] = 'S'; + remcomOutBuffer[1] = hexchars[sigval >> 4]; + remcomOutBuffer[2] = hexchars[sigval % 16]; + remcomOutBuffer[3] = 0; + break; + case 'd': + remote_debug = !(remote_debug); /* toggle debug flag */ + break; + case 'g': /* return the value of the CPU registers */ + mem2hex ((char *) registers, remcomOutBuffer, NUMREGBYTES, 0); + break; + case 'G': /* set the value of the CPU registers - return OK */ + hex2mem (ptr, (char *) registers, NUMREGBYTES, 0); + strcpy_s(remcomOutBuffer, BUFMAX, "OK"); + break; + case 'P': /* set the value of a single CPU register - return OK */ + { + int regno; + + if (hexToInt (&ptr, ®no) && *ptr++ == '=') + if (regno >= 0 && regno < NUMREGS) + { + hex2mem (ptr, (char *) ®isters[regno], 4, 0); + strcpy_s(remcomOutBuffer, BUFMAX, "OK"); + break; + } + + strcpy_s(remcomOutBuffer, BUFMAX, "E01"); + break; + } + + /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ + case 'm': + /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ + if (hexToInt (&ptr, &addr)) + if (*(ptr++) == ',') + if (hexToInt (&ptr, &length)) + { + ptr = 0; + mem_err = 0; + mem2hex ((char *) addr, remcomOutBuffer, length, 1); + if (mem_err) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E03"); + debug_error ("memory fault"); + } + } + + if (ptr) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E01"); + } + break; + + /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ + case 'M': + /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ + if (hexToInt (&ptr, &addr)) + if (*(ptr++) == ',') + if (hexToInt (&ptr, &length)) + if (*(ptr++) == ':') + { + mem_err = 0; + hex2mem (ptr, (char *) addr, length, 1); + + if (mem_err) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E03"); + debug_error ("memory fault"); + } + else + { + strcpy_s(remcomOutBuffer, BUFMAX, "OK"); + } + + ptr = 0; + } + if (ptr) + { + strcpy_s(remcomOutBuffer, BUFMAX, "E02"); + } + break; + + /* cAA..AA Continue at address AA..AA(optional) */ + /* sAA..AA Step one instruction from AA..AA(optional) */ + case 's': + stepping = 1; + case 'c': + /* try to read optional parameter, pc unchanged if no parm */ + if (hexToInt (&ptr, &addr)) + registers[PC] = addr; + + newPC = registers[PC]; + + /* clear the trace bit */ + registers[PS] &= 0xfffffeff; + + /* set the trace bit if we're stepping */ + if (stepping) + registers[PS] |= 0x100; + +#ifdef WIN32 //MF + return; +#else + _returnFromException (); /* this is a jump */ +#endif + break; + + /* kill the program */ + case 'k': /* do nothing */ +#if 0 + /* Huh? This doesn't look like "nothing". + m68k-stub.c and sparc-stub.c don't have it. */ + BREAKPOINT (); +#endif + break; + } /* switch */ + + /* reply to the request */ + putpacket (remcomOutBuffer); + } +} + +/* this function is used to set up exception handlers for tracing and + breakpoints */ +void +set_debug_traps (void) +{ +#ifndef WIN32 //MF + stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1]; + + exceptionHandler (0, _catchException0); + exceptionHandler (1, _catchException1); + exceptionHandler (3, _catchException3); + exceptionHandler (4, _catchException4); + exceptionHandler (5, _catchException5); + exceptionHandler (6, _catchException6); + exceptionHandler (7, _catchException7); + exceptionHandler (8, _catchException8); + exceptionHandler (9, _catchException9); + exceptionHandler (10, _catchException10); + exceptionHandler (11, _catchException11); + exceptionHandler (12, _catchException12); + exceptionHandler (13, _catchException13); + exceptionHandler (14, _catchException14); + exceptionHandler (16, _catchException16); +#endif // WIN32 + + initialized = 1; +} + +/* This function will generate a breakpoint exception. It is used at the + beginning of a program to sync up with a debugger and can be used + otherwise as a quick means to stop program execution and "break" into + the debugger. */ + +void +breakpoint (void) +{ + if (initialized) + BREAKPOINT (); +} + + + + // + // debugger stub implementation for WIN32 applications + // M. Fuchs, 29.11.2003 + // + +#ifdef WIN32 + +#include +#include + +#include "utility/utility.h" + + +int s_initial_breakpoint = 0; + + +#ifdef DEBUG_SERIAL + +FILE* ser_port = NULL; + +int init_gdb_connect() +{ + //TODO: set up connection using serial communication port + + ser_port = fopen("COM1:", "rwb"); + + return 1; +} + +int getDebugChar() +{ + return fgetc(ser_port); +} + +void putDebugChar(int c) +{ + fputc(c, ser_port); +} + + +#else // DEBUG_SERIAL + + +static LPTOP_LEVEL_EXCEPTION_FILTER s_prev_exc_handler = 0; + + +#define I386_EXCEPTION_CNT 17 + +LONG WINAPI exc_protection_handler(EXCEPTION_POINTERS* exc_info) +{ + int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF; + + if (exc_nr < I386_EXCEPTION_CNT) { + //LOG(FmtString(TEXT("exc_protection_handler: Exception %x"), exc_nr)); + + if (exc_nr==11 || exc_nr==13 || exc_nr==14) { + if (mem_fault_routine) + mem_fault_routine(); + } + + ++exc_info->ContextRecord->Eip; + } + + return EXCEPTION_CONTINUE_EXECUTION; +} + +LONG WINAPI exc_handler(EXCEPTION_POINTERS* exc_info) +{ + int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF; + + if (exc_nr < I386_EXCEPTION_CNT) { + //LOG(FmtString("Exception %x", exc_nr)); + //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags)); + + // step over initial breakpoint + if (s_initial_breakpoint) { + s_initial_breakpoint = 0; + ++exc_info->ContextRecord->Eip; + } + + SetUnhandledExceptionFilter(exc_protection_handler); + + win32_exception_handler(exc_info); + //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags)); + + SetUnhandledExceptionFilter(exc_handler); + + return EXCEPTION_CONTINUE_EXECUTION; + } + + return EXCEPTION_CONTINUE_SEARCH; +} + +/* not needed because we use win32_exception_handler() instead of catchExceptionX() +void exceptionHandler(int exc_nr, void* exc_addr) +{ + if (exc_nr>=0 && exc_nr +#ifdef _MSC_VER +#pragma comment(lib, "wsock32") +#endif + +static int s_rem_fd = -1; + +int init_gdb_connect() +{ + SOCKADDR_IN srv_addr = {0}; + SOCKADDR_IN rem_addr; + WSADATA wsa_data; + int srv_socket, rem_len; + + s_prev_exc_handler = SetUnhandledExceptionFilter(exc_handler); + + if (WSAStartup(MAKEWORD(2,2), &wsa_data)) { + fprintf(stderr, "WSAStartup() failed"); + return 0; + } + + srv_addr.sin_family = AF_INET; + srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + srv_addr.sin_port = htons(9999); + + srv_socket = socket(PF_INET, SOCK_STREAM, 0); + if (srv_socket == -1) { + perror("socket()"); + return 0; + } + + if (bind(srv_socket, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) { + perror("bind()"); + return 0; + } + + if (listen(srv_socket, 4) == -1) { + perror("listen()"); + return 0; + } + + rem_len = sizeof(rem_addr); + + for(;;) { + s_rem_fd = accept(srv_socket, (struct sockaddr*)&rem_addr, &rem_len); + + if (s_rem_fd < 0) { + if (errno == EINTR) + continue; + + perror("accept()"); + return 0; + } + + break; + } + + return 1; +} + +#endif // DEBUG_SERIAL + + +int getDebugChar() +{ + char buffer[1024]; + int r; + + if (s_rem_fd == -1) + return EOF; + + r = recv(s_rem_fd, buffer, 1, 0); + if (r == -1) { + perror("recv()"); + LOG(TEXT("debugger connection broken")); + s_rem_fd = -1; + return EOF; + } + + if (!r) + return EOF; + + return buffer[0]; +} + +void putDebugChar(int c) +{ + if (s_rem_fd != -1) { + const char buffer[] = {c}; + + if (!send(s_rem_fd, buffer, 1, 0)) { + perror("send()"); + LOG(TEXT("debugger connection broken")); + exit(-1); + } + } +} + + + // start up GDB stub interface + +int initialize_gdb_stub() +{ + if (!init_gdb_connect()) + return 0; + + set_debug_traps(); + + s_initial_breakpoint = 1; + breakpoint(); + + return 1; +} + +#endif // WIN32 diff --git a/reactos/base/shell/explorer/make-docu.sh b/reactos/base/shell/explorer/make-docu.sh new file mode 100755 index 00000000000..7894b44d521 --- /dev/null +++ b/reactos/base/shell/explorer/make-docu.sh @@ -0,0 +1,2 @@ +sed 's/@GEN@/generated on '`date +%d.%m.%Y`/ doxy-footer.html +doxygen Doxyfile diff --git a/reactos/base/shell/explorer/make-full-docu.bat b/reactos/base/shell/explorer/make-full-docu.bat new file mode 100755 index 00000000000..e4a7b41de46 --- /dev/null +++ b/reactos/base/shell/explorer/make-full-docu.bat @@ -0,0 +1,7 @@ +doxygen Doxyfile +cmd /c start /b /low /wait hhc doxy-doc\html\index.hhp +cmd /c move /y doxy-doc\html\index.chm ros-explorer.chm + +doxygen Doxyfile-all +cmd /c start /b /low /wait hhc doxy-doc\html\index.hhp +cmd /c move /y doxy-doc\html\index.chm ros-explorer-full.chm diff --git a/reactos/base/shell/explorer/make_explorer.dsp b/reactos/base/shell/explorer/make_explorer.dsp new file mode 100644 index 00000000000..ad364110d4d --- /dev/null +++ b/reactos/base/shell/explorer/make_explorer.dsp @@ -0,0 +1,205 @@ +# Microsoft Developer Studio Project File - Name="make_explorer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=make_explorer - Win32 bjam +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "make_explorer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "make_explorer.mak" CFG="make_explorer - Win32 bjam" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "make_explorer - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 Unicode Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 Unicode Release" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 doxy docu" (based on "Win32 (x86) External Target") +!MESSAGE "make_explorer - Win32 bjam" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "make_explorer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f make_explorer.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_explorer.exe" +# PROP BASE Bsc_Name "make_explorer.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f make_explorer.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_explorer.exe" +# PROP BASE Bsc_Name "make_explorer.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.PCH UNICODE=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 doxy docu" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -java make docu" +# PROP Rebuild_Opt "full-docu" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 bjam" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "explorer.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" bjam" +# PROP Rebuild_Opt "clean&bjam release" +# PROP Target_File "explorer.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "make_explorer - Win32 Release" +# Name "make_explorer - Win32 Debug" +# Name "make_explorer - Win32 Unicode Debug" +# Name "make_explorer - Win32 Unicode Release" +# Name "make_explorer - Win32 doxy docu" +# Name "make_explorer - Win32 bjam" + +!IF "$(CFG)" == "make_explorer - Win32 Release" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Debug" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Debug" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Release" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 doxy docu" + +!ELSEIF "$(CFG)" == "make_explorer - Win32 bjam" + +!ENDIF + +# Begin Source File + +SOURCE=.\Jamfile +# End Source File +# Begin Source File + +SOURCE=.\Makefile +# End Source File +# Begin Source File + +SOURCE=.\Makefile.MinGW +# End Source File +# Begin Source File + +SOURCE=.\Makefile.PCH +# End Source File +# Begin Source File + +SOURCE=.\Makefile.Wine +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/make_explorer.vcproj b/reactos/base/shell/explorer/make_explorer.vcproj new file mode 100644 index 00000000000..bdb57eb4ae2 --- /dev/null +++ b/reactos/base/shell/explorer/make_explorer.vcproj @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/make_rosshell.dsp b/reactos/base/shell/explorer/make_rosshell.dsp new file mode 100644 index 00000000000..b6787e30993 --- /dev/null +++ b/reactos/base/shell/explorer/make_rosshell.dsp @@ -0,0 +1,155 @@ +# Microsoft Developer Studio Project File - Name="make_rosshell" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=make_rosshell - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "make_rosshell.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "make_rosshell.mak" CFG="make_rosshell - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "make_rosshell - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "make_rosshell - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_rosshell - Win32 Unicode Debug" (based on "Win32 (x86) External Target") +!MESSAGE "make_rosshell - Win32 Unicode Release" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "make_rosshell - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f make_rosshell.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_rosshell.exe" +# PROP BASE Bsc_Name "make_rosshell.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Make-rosshell.MinGW UNICODE=0" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f make_rosshell.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "make_rosshell.exe" +# PROP BASE Bsc_Name "make_rosshell.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Make-rosshell.MinGW UNICODE=0 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "rosshell.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1" +# PROP BASE Rebuild_Opt "clean all" +# PROP BASE Target_File "rosshell.exe" +# PROP BASE Bsc_Name "" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Cmd_Line "msdevfilt -gcc make -f Make-rosshell.MinGW UNICODE=1" +# PROP Rebuild_Opt "clean all" +# PROP Target_File "rosshell.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "make_rosshell - Win32 Release" +# Name "make_rosshell - Win32 Debug" +# Name "make_rosshell - Win32 Unicode Debug" +# Name "make_rosshell - Win32 Unicode Release" + +!IF "$(CFG)" == "make_rosshell - Win32 Release" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Debug" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Debug" + +!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Release" + +!ENDIF + +# Begin Source File + +SOURCE=.\Jamfile +# End Source File +# Begin Source File + +SOURCE=".\Make-rosshell.MinGW" +# End Source File +# Begin Source File + +SOURCE=.\Makefile +# End Source File +# Begin Source File + +SOURCE=.\Makefile.MinGW +# End Source File +# Begin Source File + +SOURCE=.\Makefile.Wine +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.c b/reactos/base/shell/explorer/notifyhook/notifyhook.c new file mode 100644 index 00000000000..20267b0ae02 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.c @@ -0,0 +1,116 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // NotifyHook DLL for ROS Explorer + // + // notifyhook.cpp + // + // Martin Fuchs, 17.03.2004 + // + + +#include "../utility/utility.h" + +#include "notifyhook.h" + + +static HINSTANCE s_hInstance; +static UINT WM_GETMODULEPATH; +static HHOOK s_hNotifyHook; + + +BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID param) +{ + switch(dwReason) { + case DLL_PROCESS_ATTACH: + s_hInstance = hInst; + DisableThreadLibraryCalls(hInst); + WM_GETMODULEPATH = RegisterWindowMessageA("WM_GETMODULEPATH"); + break; + } + + return TRUE; +} + + +struct COPYDATA_STRUCT { + HWND _hwnd; + int _len; + char _path[MAX_PATH]; +}; + +LRESULT CALLBACK NotifyHookProc(int code, WPARAM wparam, LPARAM lparam) +{ + MSG* pmsg = (MSG*)lparam; + + if (pmsg->message == WM_GETMODULEPATH) { + struct COPYDATA_STRUCT cds; + COPYDATASTRUCT data; + + cds._hwnd = pmsg->hwnd; + cds._len = GetWindowModuleFileNameA(pmsg->hwnd, cds._path, COUNTOF(cds._path)); + + data.dwData = WM_GETMODULEPATH; + data.cbData = sizeof(cds); + data.lpData = &cds; + + SendMessage((HWND)pmsg->wParam, WM_COPYDATA, (WPARAM)pmsg->hwnd, (LPARAM)&data); + + return 0; + } + + return CallNextHookEx(s_hNotifyHook, code, wparam, lparam); +} + + +UINT InstallNotifyHook() +{ + s_hNotifyHook = SetWindowsHookEx(WH_GETMESSAGE, NotifyHookProc, s_hInstance, 0); + + return WM_GETMODULEPATH; +} + +void DeinstallNotifyHook() +{ + UnhookWindowsHookEx(s_hNotifyHook); + s_hNotifyHook = 0; +} + + +void GetWindowModulePath(HWND hwnd) +{ + SendMessage(hwnd, WM_GETMODULEPATH, 0, 0); +} + + // retrieve module path by receiving WM_COPYDATA message +DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size) +{ + PCOPYDATASTRUCT data = (PCOPYDATASTRUCT) lparam; + + if (data->dwData == WM_GETMODULEPATH) { + struct COPYDATA_STRUCT* cds = (struct COPYDATA_STRUCT*) data->lpData; + + *phwnd = cds->_hwnd; + lstrcpyn(buffer, cds->_path, size); + + return cds->_len; + } else + return 0; +} diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.def b/reactos/base/shell/explorer/notifyhook/notifyhook.def new file mode 100644 index 00000000000..ffbd2254c38 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.def @@ -0,0 +1,5 @@ +EXPORTS +DeinstallNotifyHook +GetWindowModulePath +GetWindowModulePathCopyData +InstallNotifyHook diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.dsp b/reactos/base/shell/explorer/notifyhook/notifyhook.dsp new file mode 100644 index 00000000000..dac7f27ea31 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="notifyhook" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=notifyhook - Win32 +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "notifyhook.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "notifyhook.mak" CFG="notifyhook - Win32" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "notifyhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "notifyhook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "notifyhook - Win32" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "notifyhook - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "shellhook___Win32_Release" +# PROP BASE Intermediate_Dir "shellhook___Win32_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FD /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /machine:I386 + +!ELSEIF "$(CFG)" == "notifyhook - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "notifyhook - Win32" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Win32" +# PROP BASE Intermediate_Dir "Win32" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32" +# PROP Intermediate_Dir "Win32" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "notifyhook - Win32 Release" +# Name "notifyhook - Win32 Debug" +# Name "notifyhook - Win32" +# Begin Source File + +SOURCE=.\notifyhook.c +# End Source File +# Begin Source File + +SOURCE=.\notifyhook.h +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.h b/reactos/base/shell/explorer/notifyhook/notifyhook.h new file mode 100644 index 00000000000..11ebd8c284f --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.h @@ -0,0 +1,50 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // NotifyHook DLL for ROS Explorer + // + // notifyhook.h + // + // Martin Fuchs, 17.03.2004 + // + + +#ifdef _NOTIFYHOOK_IMPL +#define DECL_NOTIFYHOOK __declspec(dllexport) +#else +#define DECL_NOTIFYHOOK __declspec(dllimport) +#ifdef _MSC_VER +#pragma comment(lib, "notifyhook") +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +DECL_NOTIFYHOOK UINT InstallNotifyHook(); +DECL_NOTIFYHOOK void DeinstallNotifyHook(); + +DECL_NOTIFYHOOK void GetWindowModulePath(HWND hwnd); +DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size); + +#ifdef __cplusplus +}; +#endif diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.rc b/reactos/base/shell/explorer/notifyhook/notifyhook.rc new file mode 100644 index 00000000000..096ed22d9fb --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.rc @@ -0,0 +1,9 @@ +/* $Id$ */ + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "NotifyHook DLL for ROS Explorer\0" +#define REACTOS_STR_INTERNAL_NAME "notifyhook\0" +#define REACTOS_STR_ORIGINAL_FILENAME "notifyhook.dll\0" +#include + +/* EOF */ diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.vcproj b/reactos/base/shell/explorer/notifyhook/notifyhook.vcproj new file mode 100644 index 00000000000..2682748dfa0 --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.vcproj @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactos/base/shell/explorer/notifyhook/notifyhook.xml b/reactos/base/shell/explorer/notifyhook/notifyhook.xml new file mode 100644 index 00000000000..db8f81d3ded --- /dev/null +++ b/reactos/base/shell/explorer/notifyhook/notifyhook.xml @@ -0,0 +1,10 @@ + + + . + + 0x0600 + + kernel32 + notifyhook.c + notifyhook.rc + diff --git a/reactos/base/shell/explorer/precomp.cpp b/reactos/base/shell/explorer/precomp.cpp new file mode 100644 index 00000000000..f8e7255fe0e --- /dev/null +++ b/reactos/base/shell/explorer/precomp.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone - precompiled header support + // + // precomp.h + // + // Martin Fuchs, 17.05.2004 + // + +#include "precomp.h" diff --git a/reactos/base/shell/explorer/precomp.h b/reactos/base/shell/explorer/precomp.h new file mode 100644 index 00000000000..8c68b84966f --- /dev/null +++ b/reactos/base/shell/explorer/precomp.h @@ -0,0 +1,37 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone - precompiled header support + // + // precomp.h + // + // Martin Fuchs, 17.05.2004 + // + +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1 + +#include "utility/utility.h" + +#include "explorer.h" +#include "desktop/desktop.h" + +#include "globals.h" +#include "externals.h" diff --git a/reactos/base/shell/explorer/project-root.jam b/reactos/base/shell/explorer/project-root.jam new file mode 100644 index 00000000000..e69de29bb2d diff --git a/reactos/base/shell/explorer/rc-mingw.jam b/reactos/base/shell/explorer/rc-mingw.jam new file mode 100644 index 00000000000..62f8f96bc58 --- /dev/null +++ b/reactos/base/shell/explorer/rc-mingw.jam @@ -0,0 +1,53 @@ +import type ; +import generators ; +import feature ; + +type.register RC : rc ; + +rule init ( ) +{ +} + +rule resource-compile ( target : sources * : properties * ) +{ +# local OS = [ feature.get-values : $(properties) ] ; + resource-compile-mingw $(target) : $(sources[1]) ; +# switch $(OS) +# { +# case "NT" : +# resource-compile-nt $(target) : $(sources[1]) ; +# case "CYGWIN" : +# resource-compile-cygwin $(target) : $(sources[1]) ; +# case "FREEBSD" : +# create-empty-object $(target) : $(sources[1]) ; +# case "*" : +# errors.error "Cannot process RC files for OS=$(OS)" ; +# } +} + + +actions quietly resource-compile-nt +{ + rc /i "$(>:D)" /fo "$(<)" "$(>)" +} + +actions quietly resource-compile-mingw +{ + windres -D__WINDRES__ -o "$(<)" -i "$(>)" +} + +actions quietly resource-compile-cygwin +{ + windres -D__WINDRES__ --include-dir "$(>:D)" -o "$(<)" -i "$(>)" +} + +actions quietly create-empty-object +{ + as /dev/null -o "$(<)" +} + +# Since it's a common practice to write +# exe hello : hello.cpp hello.rc +# we change the name of object created from RC file, to +# avoid conflict with hello.cpp. +generators.register-standard rc-mingw.resource-compile : RC : OBJ(%_res) ; diff --git a/reactos/base/shell/explorer/res/action.ico b/reactos/base/shell/explorer/res/action.ico new file mode 100644 index 0000000000000000000000000000000000000000..233a137918717bb4dbbad25bddad4dd981ee318c GIT binary patch literal 318 zcmbVIu?>JQ409!7II*23QX3UWj8Y1OH374nRA(U* zCMw{eZ(;xwX5FYP;qG(|S|nOiMKaWq44fVL2-M6W@!zjN&0C;8_wM7l;ab6YurK5v H_5Fbxqtj>R literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/administration.ico b/reactos/base/shell/explorer/res/administration.ico new file mode 100644 index 0000000000000000000000000000000000000000..9a92baf2ea239b3e0d1f7382a3c25158b1806ca2 GIT binary patch literal 29926 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 lTmC3*?&fDEqU|L) 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/appicon.ico b/reactos/base/shell/explorer/res/appicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..233a137918717bb4dbbad25bddad4dd981ee318c GIT binary patch literal 318 zcmbVIu?>JQ409!7II*23QX3UWj8Y1OH374nRA(U* zCMw{eZ(;xwX5FYP;qG(|S|nOiMKaWq44fVL2-M6W@!zjN&0C;8_wM7l;ab6YurK5v H_5Fbxqtj>R literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/apps.ico b/reactos/base/shell/explorer/res/apps.ico new file mode 100644 index 0000000000000000000000000000000000000000..4c9cbe135fc5d1eb82e855cf62a826e5f4396ae0 GIT binary patch literal 29926 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/arrowsel.ico b/reactos/base/shell/explorer/res/arrowsel.ico new file mode 100644 index 0000000000000000000000000000000000000000..4235911bb6b13eeab64fa54abb58b74610509937 GIT binary patch literal 1078 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/config.ico b/reactos/base/shell/explorer/res/config.ico new file mode 100644 index 0000000000000000000000000000000000000000..0a131f10923688e773ec933f6a0d127a90aa17b3 GIT binary patch literal 29926 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 ==4M9_ul$*T&tt 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/control-panel.ico b/reactos/base/shell/explorer/res/control-panel.ico new file mode 100644 index 0000000000000000000000000000000000000000..e95d36073652288ba48185a3800d8bf053e88140 GIT binary patch literal 29926 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 IkOjv4A6Z;8V*mgE literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/desktop-settings.ico b/reactos/base/shell/explorer/res/desktop-settings.ico new file mode 100644 index 0000000000000000000000000000000000000000..2723c47ff0d0520d21b7560b67ec2a4df31f62ac GIT binary patch literal 29926 zcmeI533!#oxyMJriXbAO5FlWrgpdoQF_2(ta-S5i=HA>VMw`b(<3e33Zh#6T#a5zK z6U8=a)fPc^6c+?nTx#9G72HJu!F|IGwaRfJbN|2j&K$lR&dG^u^(hnnXTD|Top;`u zd1vOGnGa)jFuR)E+}-83H)DTh%!9_5jEvy^?H!HD+1Z%1wCMc~#`NfD%`eUVeFtM6??e3H{$bIdJb?JY{n(w1`R~C#eui0;Y0Ook6~x!Q z!j&K5<7b%0U5xqccRqfG8Qb2NGbb1`NIWZ=86%JnTz%lV>y|(DdZ{P%^?|2fT?+N) z-h1!W3+w(FYq=8i$0L5eXV;;zv7wf~sH>~3ZK!K(tZ!^+XpDCaJZoxdYSf>1jgg4{ zMH=hGYy#Ji_<5wE(MBo6A~o42YoQZy>DJk%;6isc2=ADLU}K$gjZGH%k=oLP@S zMpaDFZ>X)BR67=eO%V}qtaITb3ZHe%@wIx=pcHwnm?U>z&q=ihE08j2^)})zt->pT zS{L3%^dcHQ(&$81r`UuS9q1zuF(-l6MIxfF2oex{2HZ7~n}AL61D{)CMqju-ate&Mxjq(b(YmhJ_4U=joPu{mFkY_YE$QXX=lwHw? z=vM!fbd!8C!X5M@k)}pvJn;3aaPTR~;GA%%8$@(+2t5{QM-I6`B#5KmfQpkdcZw2C zgYZ#0s<;Y9y53O|Dk0YFe8p~bL2#U7+VQ!~Pf%6Wa@ z?CRC2=#Ban=jm6M-%CFeRlz~+uB&s+**7csw4bn}oyoaJYG<}#Dr&VBC0nPqp?fJC z=?=7#oV>{9$&)ARDGjVHcwbdJwaMKRKF~Eyn`yk<2g(z5DV=5;r=ss5<2dBKyO%~( zGA=wl#O9`^^JY|M zsh&Y=H>(Wmf*MM-t5pZPneuI%s{XT9aa36qhHAZ;E@3m>X`OM<3#$wCK5K&2I2tE+;JJXe3jk7Jmh&2uRL}>S=Cjc#@!6sv4oxhs38V`ECprh>Ss0<7SQB801EdABz;58fz7f3lX3-s!8kG zxu9h9PF%Kd^p*8V>u-yoEpCE7HhzB5Aqbqh0_|$#TQ>}F2C$zbLpj*nk%MX zYG%#6++1^*1wb&J||CycuTh+*xMf{MqKJ1vAaOdGpM|g$vE1 ztLF&|%=OpK6Li05k-1^@ zJ@=eh^TKMgX3ZM&;<~kF{fq0&`t|G0%P+rdUVr^H^Tr!*n77`3+r0D6JLbK2-!<>Q z|GwGu;fH3^rVq`Bn>Lw`KKjUf{I7qRPe1+CY>q^XTA2CrtFKIRb8}4m+b_0D;NL9) z^yyFD73b&Y=H{kvb-mMjM_sxuW6v`cD!vTGnPaIzKnFxT>bjuA(TD z@Ksw~jqdap=Yoe-H4491NmW%v$o-~bYvkaH2NnF))RY(PCHmEhP&R5GxnaYG?X&N` z`&S*RBq~Zr;fndk-vJfS-wXPc6_x)xq+7Q=_Hfwqm(Z;)E6&92y*EEXaaon%F08kt49%@{5tuUjoc@*M~|Mt zU$3m9(TY$CefSY-T=?oJ{pyMX^7le^Iqokrb1%`VEGx(v1t--)RaJ46KJu@w7@eP4 zFlw|bAN>r^EUKuiDlN#&r>sg!N=6lzE{N#!fsW`UPa}VRb`_Jlqc`@E*e!{>C3lb|3G%gqO!Vbr07#jqcc?|ojP{f zwPUBQxuxY5gm?9a@ZzUR!lov`Po+w=^yfSOZ0Epr99mW(nR))zZnnw}ejNSM%=X@O z7+S7c5u-m^&9c0#+_|!{Vue?cSC;nM(Yy9JJRv;gi#(}|Mf>fypMG+J@D&H7@8Dg# zpO;k}cyRTB(efQ#Kv4w+mYJEISzNBv>8Rr3;*t_UzjFI4 ze0fD#an8`3=)V#k92%|v6=h<+4F02e(3M^*Mn!q~f%+-al`;^Oe^q%|Y3cq4>@Qb( zfcyiTD?Ol8nn{re=^|80o=*PdrE1%%CMBar%Ef+0jsCR~b)j7fA^t}zxR?)ep$w3b z;*q09t5k{M{>mz-Z`A*?GKD9s&vOvGSmDdagv(wJ{^g~b9dkrwbY5CxCY&r>#sLU zmn=3n-?Z4=cIy&z(@i&-TW($&%qy4OXl`G2i}}Z0%gpVXQ~vXx|1`_*kIpMKr+nm* zN6cd@SDMEkf80Fv)Kg~l>eXiL+F&lZVZ#RV%F7$ftFOLd-gy00HAp__JG~ z-Vf+A)Vb`mp|SWGJ2}^t_Zit@ zEB>&)gO%-)qLBq@Lko*@`|jdg=j^;F{{@O)Qdm;x-WL@PZ0B6Zyb*;#{_`AtB|-ec z;sL>6zr!!Q{D$@EGtjw=9(rGx5e)8k{)LY}EIVUh#=rps^^>FbgS&L@+@*7u9szyH zUnLWDg(F6&l;rkx7e4*moIvDwIXO9bgdhO#d*l`8rC7G<)#S z!GjfG=zj^SQN!hwQZ#;EZeDI~-d3lm!-tQ^8y>{}mGZ2=!Xo`J{M$O@Lw;#wNvp@C#>-thKPALhmqlU&Q zzd7iC4C9njPB>CF^JCo@rFPOO=J&PZH9nbSF8cF18jGCo#v+$obfNkC<$p1kT!MZ4 zB4;0;{`X7Fl~-Ks#wW99&o=XBPdC>tnk~EdTxScvZqXcb{WWvVHP>9@#wm#)cwL= zyG)__fs)Hue+Y-_3zQESFiqhm^r|??0lZ*<#l6J&`Gh<24GL<+b{aO6CLa> zqSrkyzaYOLyMORJyE8_*PDAqZ)AC3xI~qPcy{}w)dR~6_Az~?afPX#&K629YhV^y) zcke&UrJFvqAb%Lo^YS{7(w=$ld2YH3pPQDKm-{pN@ZA-lv-nJR1BN}))Cabs@9wC+ zQ2gf%3EWV1j@emRnOQ^hobW?3vt*mg*0Zc3Ik~wx`Wr_0>>&62W{XYzx$vT+&Ur|- zydm&U7M$EPCX?{;^`n3M43iwvvs_;u`WZ4PJ3BMo^#6H({o{{+4*LE2<(?!4bqLfa zdH;1Ex4wQJoo|Qj8=-#e@IwzW6DJ&FPCxZ{&9BFq%PzajOrJhoYqx)QYqksK&oWmn zoNX4&XYM@5ELj|^%d#fx=F7L-V(z^2PV#Z9%Zgg|wk3Rm`{7ZcjYpUDbb_r~kz;`c!g#B2b zURqG2BaydTU(>avWx8wEtjs<3=$SDni#{S_kna0SwRg_S=&mVa7w-GE+p*nlnHhZt z4II=pOZQ!R_3GI*BcrRryZ2oOWo7m4m$_TJ_U-%XeP$PF*Pi_{cUDi3LHIsBd-m+L z_kfzIoCDtx@m`h z>yEDcyW4-0;S#IYS%Lo)cj1K>(vvVll2zDX(bdTbqtg^dr!#c$!WecV>12iua~Pu& z7)B>C+}5tH^1BJ$qu3+r^9=BwEntKv9`SXe!_k5+^ht;GNVlDM*)htGZc{r=k9QE@ z+w%-v&nxM|1N`kNFfHsY^c6CM{=xuZppYdDiu#m3&v~CA5T1HS{2l`Ngl-pse32() zw6l2G34X?m8G}q)xLLDi4cGpu(KBbxtkiz0>L?DCf0za{hYLptM+!#?zZH%Vjun0< zj1^84P7+QL#tWwkrwbE>Ng;55n!tO)jT255h!36Ph2sS1A1#a#Nb`szk3915Y15`1 zCZ6C69uE?JC7$!ef1Ug*XUv#!pPoG;JSsc}rc9Z#GK5vS29HPagnaO%@Kh8}%LmUy z@vMB{@9}*YABXq=TAnt(Pj996%&yef$MF>9?@sZ1x%fUqvR``DRaZT;bm`JhHRfrK z!pi?K!ttl^*$4CI&tIiH+$?O+80|gnb^B8L+nS@W@_&qQ{ArvRk$m4#S!@utJoL~* z%^DNRJke~w`s%Bs*s^7dZ403DO_7Q|bTyW3);`27@Gdla{=fY4OZ(YppIPO_YVTkS zJOi6IZ;nCZUv2M>SlMM__~MH%EPzfJt;r-Dj%!aNOxLHyJMtIhzZu>IEB+nNgpIdFR^8 z#LEepflog9#D4to#}3+uDY^l8MjT`z{;lM1;k`Bf-+c28tG%K2)|;<)&>mCkvFz3x zY=9+J`%bO)nA$ZjJQpjca2`HX9@nm2Yae^;v2CFFj}1d>hZa2i@WU~vZ93U~9sZH= zhV|>L_RHF-XN*e;?b)@mAI8ccTn?IlIeEzzX}<|%hqQ0K^;VnZAJmigt@hqp?E$vh zXPgq+cWkxS*Oh;`txyiHz4n^D{r20f`WmbK!B%G`Q$lOHR%^gk`q6TY44_LJNmYN~ zAFNxq#%e#aJ#GBaDe=cC<5Z89x_V2UCM};2*=8O83l=PJb>lsiZ7OJgveiCktNzKA zU0eC5uD%;>t83T3VCT)5ZngJ2C8pG#thRB3Yj3_y`h2|d$}5h4^^^ALXP&WJqyx1d z+D4>LBGO-Be2)IoJMEjckE*>;X0+AUUw_@{!&LJ3{F8?@Yo52-S8la`Jtee{-QIH3 zV#mMNC0-BH7cN`2%)tyQbKDpuC39ZpkF9M-wz=V>d(T33+)q6JP~W#zKtjHDL?vE+AsX0 z1CT|k`h(v0{KJ#ZJh(JTw>3~#Z@&3vr|<5$=N`wu?>pgN>q~aF^#855-s*Ia@28Ua z4?g&y)j14DFU&t`+S;Cj^Zx~Afbf5MTsSe#{bza8mY)wk& z+>Pq&Y^(J^tMxu759(to`P1%@Ic10ZJ^%2Hp3wQ07C;9wPK)Osp3%hsns2K=TD|%? zJAdvBtMfxCF=g^88oMmC8#b(Wyi;eWkFD_!4~h7vzj69nbp(FH_?P-xbVefn{TSB! z8`i(5{_qN`b5SXA>M6%K{@+qPgeUr=w(w6l`WP?&XH|cEe+i%Q_=2&%>d&Xj`@_-t zLw||BrY(h`b4=<_{$_Q?D_RwgXRqwnSa!nlxzJz|UW(1H982FeiU>zvjy7 zlkQ9j^t;yMWBP*r+sh4~e5}rt3w(I*$J6D$E&LOox=WwQob~zVpLg;^rd)fx@WKl=4CbiG038qLGM+;| zp4YISh;J`1bO7Tz$}>^>Wefl<(tuyaJB(|n6O0X#ja9<)@7AtYu3TwldvdfH6D2D{ zp9jykFZZ_aPh9FhI+XO_n>G-x`{C(;GvI@HVlfd?M2z_;aiKb)V|t|>=f2BZN`p64*H{yM%5wv~Tm!?=fW6Y`=?ke6hD zr?!AG9DNIQlR652o>wp9FwgYiVW5XwlRxtV=ukJ25ABgQ>f0=SxXt?O_;%~tY9b%m zKp!0u=9TL(ul^dH>yd>2nEli1e@{0on`GC%{KLL)e~J9Cu8F@+6h2Hhq(8CWdi!V0 z{><2vJotHEBHzzxQ~Bt!Z;SXem|rp1kpA@iV}Jfk?ePos&CRM?9#eKtptw5=vpUAej4&F7tpD8?~vF0bj7NJ>i zc84FK4{z}Jj(ENs-gSMb@-b24_9m6bMOY3%NVz-ksTo0-M5l}muo7Y%{duDiLisa(!MWt7yZcH zfd?MQ-YWJtvDb76iyb#3#SSbg<9eF!WmIakzXfF5>6K; z2;+p4gcAhl95;Ua_@kp~kXEVE{iXWnS+i%)eo5zaw+QwJK(o?lR=N*ptT0!2P4lY)@MCjqQXb4f0P78a@E+m4DgK%F3G3tf z_^exKErodw^8{zNAx-QU%!PDr+3GB_eN}6Yue~a~_KMY+X3asdS-$OT>V)^aF&`qH z2Xp}Qa^{BEb+C2u9$RcQeP>gRPoH=?b8U6bTc~$vlCSgL4m#8A_LX=!!2@;&*7QAe z&f6vewwKn@hhNgaec6px=g$*D=gbx6Jx9m$fK8UPbsj4ru)9*PnTs%wOq73UAuD*$ zxpb>D@Cl)_?h5m6i#Pw=j22mOk@zYWO@So3^sf6MjYBJJ5oX7_??->s!j zou+< zLl3U7)6PHF;R5+vagNnDIb;`o(b@2kRigCKOWw8^_GuI0b``eUh3$IY=I7T`{5^g+ z9J(M``jkJmQ`Q2IFLexr_gB#F5`n%2yDI#~r%C$oO+JuSqV&;aFKPV*J2LH*J}us6 zp3MHwb96gA(1yY?^68Q`ytS4-_FvM67BsQThrv2SGGHfXeG(b^@*+JCU#8TV*7A=X z8XLE_QFHCVI}hyaVZb}>hjil8iQx5bDnA@I)c<-r z^G3-$qI%g(-TVPSI?dWY^pX06jT#3pP~Y^5`o}Hwkv{;MNlSgm3ewj6W2E{n<{jgI zK#Wr#{u|QPylA`o50(ISgiXesE&4&E5ZEoY{$i(K(w-}LJH;4I2mKq}o_p@e87aLSSzfH1J8Iz7{Y?p`n2|QQCcgcKh9zvFFpR1`kwD{9^b67?H5Xid3v+P z=*^51{rVl(jNAP@kUqrEvBPt8uKhfmFpTMm!?nh)z8`S3=qnh{>N_7+-v+VzCWyW6 znz>fr1+nbo52r=n%-j+%ZUcS~JYy7igO+%A;GVvXF_^wXvd#RKxotQ<>@#I95rw`M&Pwcppj%opYAH~Ve%MJSQ!nmG!B4F<7_cYFNdO6_>7 zZ?D9lZ?Cv<17j)TLZA51W&gI@!>zQS&-j*b@$}(`Il#5oUc1fwkFhy>C;hw+`pkX& zc*pyUouKdSB4PO>8|X83VI1P^G+YxO`hL7{!wokmpO@N8F1e@$X3Usw@6r4*5q-vY zo<8$8eecDAIh?0Yo;~#48hi5CBU(V;rEz8G>tdLH#&6JP92P%6Vs6CT1sQti`#9Uo ziS!*DHx5lipYa)TX3iSFKbv_c^vNSYmii8l)pvPXK;Pbp&2{3-m$5nH$?zVD@K}>^ zBs}=JjlQR&@%|H5-`LSS0IYIzIp~nbc>0X>q0O8je*TbX-auH!tHks0<9G5HPoFYm zenK6KpCj-r9`M1KJUkD825Bau&vWWD`($V*9^3==xP*Z$8C%DXxp{^hL;O4a$yhnn z_`0p*>8O5i`cwM z5tDh@9XU_@{+m37rUwHWmWMI~KMpHl6()(h_L{4AsINbB$NH&fwy&?By7Sp*)$elF zSyMax@sEG#q~{&a`P11Q8qPa!rwcB)puPTYjMzA6!Tfo@ojZ5V1v6*P__MyceUb22 z;cvnWVU{pkm?=ybE)y<3_Sj?pBAqzxh9ygmk^N_r+HEs!Hy-H2c=#|p*IDLG*b3=? zH*S2#>f0^$!R7bJc5|QlqqS~af=;G?1+;V8JoY$~Bpd3)=BIoiwBI*{c<^y;B$Bfvi0IJI1<-->mV?bd}wc-vsLWrzdHSKiK1Y NnHhZp$9G4-{{zJOe9r&? literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/documents.ico b/reactos/base/shell/explorer/res/documents.ico new file mode 100644 index 0000000000000000000000000000000000000000..2902e4b7cdc68c857de44adeccd949b4e78c442f GIT binary patch literal 29926 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/dot.ico b/reactos/base/shell/explorer/res/dot.ico new file mode 100644 index 0000000000000000000000000000000000000000..9ddbb8a41c7472dca30197bd6541898b0df64bc8 GIT binary patch literal 3750 zcmds(e@xV69LL`$5GQhirG^T4nHi86V#TSbrzmB{4_oBs2-sYW^#_r(eUEA5=nuHm zKit$!UF~w&7HdPD>DbJ;N)l_%xj`d!4U~QuO>KE-Kjx?R=li{5IPPwh{gFMl=brEL z>+}42Jw0c(MKe%kk;(~&L+}zyRvz&S9$*mh}B6c~~ zbLQpBwUw2XRaI5%*RL-tD=RE4%+Ai9pE)t&C>wnK*w z9XWEOy}jM<_p^ILLqkPH#qv3m#+S9B?(RN(`0(Dnd%a%ohMMY# z^SOCr`07tX!^6YDU~q77u&b+U|Ni|gEiDx*@*}R7BVM~QbY8TTE5Cf1i5Kr*Bfuw?TfY5^Mf=q!Zf+&Na zfqW`+AVeUgAa)?OAc5fhkF=#DWgeRg_H>82^ZKn(Lw&ppfhi7~m){c@?Vmer2h*%} z%*GD1*TKHA8r7%oGONE_`KuA=Pqv-j8Z`P6T`1TdG_<0dWgU|pwwoMN>pIe`I%g*P zO{0C*X`DXJ8l{%=j^n2en#VS)m}ap~7%uh&4YhNS?STZ;&)5Z`3SFs|hu6&PsNfoD zW2a#|dwSA?hKP>f!iTh>(f@9#Ip@ljQly?+WAX5vEencEP0_ePNrI(%k^kqEiYT#WBfr|3z(W4 z%ROhY8MLj&%^W}Vxn$ezcR9LdzO$&*G7$O?+qtc9R7UInQCO4~SDv;esbzk3E``d2h01 z;K`Lm%a;|*dw6=Ned+3wXNs5RXH5)``1Dg{C94+RA07`_vtr5oIg3Z;^LIW*znS`m z-q|~At;ic?0%ke?yrB;-tV|#fFyA^p+l0w_$Mr*h`lu5xt%(v6o9*>l)r=y2iV}T3 z*jQlq`FuJM^FA+6I?*s#!}NyX@#O(2H^gYxjv|I$RHPUl%|;3T?mjuKQLOEXGUETI z*qvc3XY8cD3iU$tTg(2+3SU^3<)_{X^;f9FLOmAhvrx0ujz5--ZN^LG)Lx+`3pH7& z&qA#h>bOwfg_^H6qRwOA_BT4I)k1w1>a$R*h59YjcA@SI{R49?(dIyH7V5T8vxS;1 z)Ni4d3w2-U3kdxOp}!FoZfdnq(}h|t)N!G<3pL-gN&i9Ua|r#BsQoW}^K~cnT&U|p zjTh>@&?gZ34np5T=##{p|Iqi}mQ(wMdN0&{p-&+68-%`w&@U1CKr#1E_vMGdem{K( zp|4=tp>HAdM})qS_KkUd;e9>dbEf?4sZTrUw+MY5+5FKL(|6`i DK928Q literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/dot_red.ico b/reactos/base/shell/explorer/res/dot_red.ico new file mode 100644 index 0000000000000000000000000000000000000000..4d176eef1d552bb3ca84b8562a8cce458b818a76 GIT binary patch literal 3750 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 Wf7*24?~L4UrL_9E_lmvmz4uRwx7!&2 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/drivebar.bmp b/reactos/base/shell/explorer/res/drivebar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8fb09722dc030eaa0e2e5d9d3c88e8015c30f625 GIT binary patch literal 3366 zcmc(gKWH3B6o+3x-0BvE+=WCSP!km)ss{pUm0IA&wW>^&)M`?wQllnZK(L*QBoNS= zAe}3_P~{>Xa22VrRH-nWR-EJ;#Z>80>Pu~}_ z&u2tF2%$@q7HbtiWI3FX$Bb3;Z+^@CW<>f4~v&NBWU| z3>Mi@JK{Swax8KZ#lllL7#s`^1_y&7!QfzUFgO?-42B7VgTcYzU~n)PIt&g52ZMvb z!Qdi3I2;^KIbt*g@X+e7pacqjJu)nw;GRI9O+73o1B0Fy4~vJzWP!uO;o*!p39tkp0s$=rU^e%?7;%d@w{9A`B6R2t$Oy z(g}tDLxds15MW>%3iDxzFhm$43~Wuo4?~0@!Vm$7#1Cv1Ss0n**~8QKa75c%=Xm)< zevtL`b=lb1kgcsP+1c5VCr_Tp-rk-Z9UaNZ$%&kvo=UIRlgrCXxw^WNi{GPsfA1dO z@h0l(H=qssSx@)XZj|g@Sg+k`wLY4ToaebYXlt7u|KEE3WW)Y&*za4^)>q}zr`-o1 zPa@>`O#-gsO(Q*te{vG^=j1Dh-PV=@b=UBS&Yqi5%sBg+vTzHmfdINw&rl2U$b7-Rf)4Y zA5>T4jk>jh>%;!GVpP>UI@w0FpE{|Y7-z|!{JM*pjgJ=?uipJjwZUL8tcF?U%d)w! z&@6YKb-OLrQ__Y34`jXOFtkTla`SifL z{Vn=l!a5udJLl*6W%RRZ8{Ff4tSrlx;j(g+4e)B_Vj$n154E&hS!8X$r))4%0AQ_ao=G8!{D9;2g=qlI+*F3 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 V-R~kNB~{=GYiP|nA^t!8{a;(eUVQ)n literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/favorites.ico b/reactos/base/shell/explorer/res/favorites.ico new file mode 100644 index 0000000000000000000000000000000000000000..54ec557b5f0eb61c7d865b41f9c359a471de9c1c GIT binary patch literal 29926 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/floating.ico b/reactos/base/shell/explorer/res/floating.ico new file mode 100644 index 0000000000000000000000000000000000000000..bbb19608d5a4d892b295d333d1e35f925121b804 GIT binary patch literal 158 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 aTUGB+Ce^-HZdJXzEw+7?XO{1eia!BmSomiE literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig0.bmp b/reactos/base/shell/explorer/res/icoalig0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0fb9e324877e0bd92c3299821b9e7f52bbacb1e0 GIT binary patch literal 3718 zcmeH}u}d6L5XL8PaK|A58!MYwMMyUg5K>)#U}J4J|AI}5tFDd&gx6UlffQ+M(_EDz zPOVL>ECdOxRuL2?zc;4_BoKBZfxzwE+uirw&V0Z9-rjMe@${+W_Od7PoU>Pq7mOz| zNPTmdhu`cbBD`fXnIG75Dzn*4X5VIV@%4lBdOaBo2C}rYB+JXova+%wtE;QBwzekg z>+7<$wI$>6SVp6fY;0`Eslk#l@S$;Huox^E3mgWA!C`P192pfH27|$1Fx2P_4uip9aJ+(jMu^Y+#XRG! z=|F{d;i`-p?*dc7v|vzRDtH$@EHo*27rb*h(iXe1kWGQ1z);AcE*q)j z-J@`1Uzd>#96yK6;c)zNX)6aAI2>L%xUpPriX0Y)#er}P^AUi>DReG!1c!w;gFdW@ z!{RlMWT{U>T?I540)~JgU)(P;7*Sh8r3i2niW1s)Aw&SfnC>stR2!Ed5t?%&qx_$9&`wq2tYeZ>l z<434X+qTBHzQbX?-wsh{S{<^wU&IczcUkRrsNJQwEAubk_DS_`Zf?5%WBIGv3Vk2; HKRfvew|(f& literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig1.bmp b/reactos/base/shell/explorer/res/icoalig1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3ae36488cdf0afa00985e565d7f7d4666dc7dc7b GIT binary patch literal 3718 zcmeH}p=;Yg6vy8nkPynCCaPvtE6hC@6sF<>HPvhM@>=84l+YBOhftoyzp*RBnEJmR74JolZx#wzgz@ds}+Fp6u-G$nNg0?CtHz z;o+eS1_SB$`?9~kFT=MX2L~Y^jg(1;lP#6>jg+XD^K!Zc!(8>{!6+mIGuR?b^dOb2MhPh#6 zY-+G%8TiupV6Yf0Sr#}94uiwsFgUVQa2N~*gTYWsXK)w{27}`jj9Ef_<}cP+-dY`~ z@GeAUsqro_6-)~T1*U>`;mg7%1@D4)UPpSP<6rPE_}42c_!nwZU??yY>QJwZs^sZW zm>KIeQUk}&VRJYfzr5PYK@A)ZuN)jKubU)?#bI$E9K(DBU~v+iAV+Xmc+=U3J8@XN z)+1T!(@<{#4TgXrUfFWQA00Mt! zvmh}DGWIam21n%HHOAzHe3GN1BRM`kmeFV=b`Xu()_NiyB8z zflUQA71&f@sS0$vONA{A>dw~6?q-|K*2(UY_P4DJ{-oR|FlX)7tkpbs<)bdVuK!!i vzZ&(3{By~ZKFrG;o8)D}7R5aHKAsoFKGxdz_xIKKpXXM?HGLnSVTJV{V`b>h literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig2.bmp b/reactos/base/shell/explorer/res/icoalig2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f5064423e5fcb69d1842e1b3912abbd05ba0a304 GIT binary patch literal 3718 zcmeH}u}fP~6o*eCkPxKc;^b1N3f&GAgihH5F3xV}UvTM=DRZR|xSK;;=+MQrOQsI> z%(~RcL6E}JsX~O~cTX&cq!?qz+~nT-?(f}me&0Ly1=8yeUrM&OEs@t;y`#UOzmQJq z+ufXI3+y!wPyqFDwdrL1z+2cXUU01V<0n!8$yhl~M6m5-C9{A!*N`FenTPgTjzV zFenTPgTkONBqj_BgTkONC=7`XgTkONC=3dN1{xd+hgOb=tN;pg{S>;>(d#3_Vwf97 zMpA<%%fLQIl3s^rt7 zFf-O;qy~y2s>|e3sqaUD?~)li_eEqtQr?j*jH;@K8=pPUQ6TRL;)M4)`4psBZlY)QNn#s(I@&r1?`@d$IPN=;q0xP17uD*e14V?=Rc3 z0?P_4E3mA zIJGvhvJfQjw2GiG`F2i?LJHprLg3!r?!Nuq&iuZeeeZ^&$#co;bw}hScW-E~XwRgV z`bIy8e{^FJzA_%q26}E~I-Sb&=Ty#qe3nk9BfVZvmX?-eFc`@4^0KU~tjOx>s;sT8 z$>!#!j7B3F4u`V7zAodpAsZVZALKydm&^BqMh;F+h==c}>3;y+p3jT%K6c`E&g*wz@qbj+3 z6h``bjMTvKbJ!dX$1jhza!><@!z%|H%i|`bR@^e$8vgl zD(C0ta&d7XXO|%#cXxS@$5gkz19c!@&T8H|4QYPYt2^KIjp(LzXwx+F8g_|oy6+d) zq5_KwEGqCc72t33X^if>A|!AG4{cmyR)$0zcXof+rPZL4sL(Ge`DKuvYOCq zww$XM==xJ5`aR@nCI}lwd!77U9~m7 O34T;;g}zBN*Z2o1qUg>5 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig4.bmp b/reactos/base/shell/explorer/res/icoalig4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2ceaf8bfe9d7087f14b3ad39150e895db0c7bfd2 GIT binary patch literal 3718 zcmeH`u}fP~6vj^>kPxJh#mS{k6}lZL2%WMAT%6s`zu?j#Q|3xRxSK;;=+Gr=mrNb% znRTg?gCK>cQw4?7-#tM^=-^9>rNx)rd*A(X&;5SyyD!7h`;m5)z1@D4)9!Gkk<6rPE_}3#U_!qJ%FccUHIn-k#m3(>> zM*4b;WZ?KYYz~Lxmq%MU$iU(7%E5!>aZ}{5I4ll?W0b!4NP63;{#H5HRHH1cSp6Fa!(^1KZG84@1BZFa!*2O+$wvU<@EGa z&d<-~;^IQiE<@h!?eRYzlWzSF)PenSR`;#bkmg6dx{F<(scu@AHchjrVVBybyYsiM zeAGqFDgKSpg^RmaS66A==V}RXTYGugy0(T@{rc@|Z!jOamVZPg?pNQ|X(ct4^=g;a z^?Q}Y?Miq4MC~GHbnUxH?alcT_3ixw+|AGT0gUci++=lEzSrzuti9KRJuZ4o;4y*! GErFl>=;+P> literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig5.bmp b/reactos/base/shell/explorer/res/icoalig5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5d38cd319e8ba145848ca2cda6be6376625631eb GIT binary patch literal 3718 zcmeH`p=;Yg6vy8nkPynCCaPvtE6hC@6sF<>HPvrBx2C}iSA)A|%;$%Bc7&iIgCfkhEt|7!(GDL19QF z7!(GDL19oB5)%f6L19oB6oy2HL19oB6b6Ms0}T#^Ln}u_Rse;$ehS^`==I3380LnN zk!jFX{1@D4)UPpSP<6rPE_}42c_!nwZU??yY>QJwZs^sZW zm>KIeQUk}&VRJYfzr5PYK@A)ZuN)jKubUu;#bI$E9K(DCU~vMSO^)EO@THT7J8@XN z)+1T!+fZ)-4TgXrUuX899u#!4a9e?lE~LA7pQDPxklsWipw_!NGwX9UaMZI+c@?6FEISm9w)mxwyEH ztE(%yzP^^rdC2?2L;lBOs$2g9bs}G`YTmjGX@1t$ZP&gK-8?w7X_~f%U1FQ=+rQQF zsF+i@if}vKlZN1X?!2?@*7x`6&aUM`_vYpX<3Ar;9b5V?KgmC#_WSKI`}0=O{cQ7j po9I4ax9!2;kBWT+a~8N|troElK5F|rT}7@cu&ThS0{=?|egV%z=*|ED literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig6.bmp b/reactos/base/shell/explorer/res/icoalig6.bmp new file mode 100644 index 0000000000000000000000000000000000000000..654da49cc00d4d4263e127fe43425f9e54cca1a0 GIT binary patch literal 3718 zcmeH`p=(=F6vodWkPynCrmALDE6g1j6sF<>HPvSdq;aidm+8l zcl$Z~r5lOxmCGgWDwzekg>+7&=F?egQak<-gd`SA4{MoKeUq4|8OXo{w2TD6!j zF?2&WbVE1vT2{~tdSOz~3p#^1x}!U~BRG0659Z!;A1hF%{T7Q@^y zGB!0>G6sG$ZVVQKC1ZiZ;4nB04ud13g2P}i7z~CQoxx!+7z~bA&}W4B%s)OZ(|3Z?~v0#m`e@MB?7zzx99O|)=N0~cxG8d292N({G0ay07N^izhj zH#awOdwVO_vye|mNBoaRq+9<3bzr}o)qU$Ur1?{?ZoBI{)y>kSP1CeB>{8ow51;!* zuoZDWWIk<)DPFwv!Rhg^VEN;s?%mzp;>Q25wr;f`@iSP~@3)2M_h&6@shrLFc`a*R mD<7_<&7V?x_ylI2v3*uGp!R39Y`m-Ws{~dFtP=RI6SxQDQRvP9 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig7.bmp b/reactos/base/shell/explorer/res/icoalig7.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8e0942009b7ec8f6740a2d6f3f2f90e11236221a GIT binary patch literal 3718 zcmeH`F>4z^5QQfokT53T#+915iXq)Vz>rG4K#gm6^B3HtP^CH{VA#$@5=fE8Z5mZ6 zqN(L3s#F+E;Or^}8^+&`;#6^QavFnA+S}WAJNv$Sdp8(Po=YCDJ0dT+dP93fdnUcq zM;qDw<1`lGFXQp5B2`a#sA6g_I(dkhJHdFenTPgTjzV zFenTPgTkONBqj_BgTkONC=7`XgTkONC=3dN1{xd+hgOb=OaO(x{tC@$==G6dG0Y7k zV^M=8W8kK7VXzo184DZ+hrwZR7#tZD90r5IU@+9^3=V_AU~s&Gb4G~I>c=?at?598 zcVSjWjdy{mU|KLJFcrKDHw%jtybIpB9qEmZf5E@tU$>~>U&yAwP+%zJP`8a#^663N zIoE9@1IN!{b2uEo+}g@P1`dZ;4jwGGn<9tBVR0ZF!+Zr`aSEMDj^MEHr?C!u;;?wl zBU$R(P8afOCL%9kOePaKIy#csY$hisCvtjvDvQNJmdmA_pP$R+ z<)vI*UCG6D$j9SjzT+|J)^DJ8te2y@ZXJd+zw6Om@AyV_)4H^2nsp7k)HdDskLt*L z)+MI+0i|t=H#pL+dvkNs(s<+g`ajgxu-ZNFU*C3RIeYzDg5r5sY4I7g@}{yLtF&5G zGC7O0wEcVaklJeeXMZ2CN9~z;;`M@R8|?k_+wSlEE48|_PF8mYkFoZS{i%OS;3DB5LZ|Ej7iYKoFSvBbl(|w6?&i=II&^XElBq*I zvo3XV5Tp>DDkz+O_ayN(k0vqFrI450_ul>8bI$L3=O!WTPVc$I@p?t%C3kNauNcpy z8Tw8uE`K?7MR-fMJG^k_R{H(E^ndi_`uitYSy_>0vni{qtFpGXChP0#vazuto12@m zwY4R?ySviqbfn#G%l7uRblM&qA8jd z&4(cgJ)tM`gr3k#T1L<4nMp>^=v>6m4c*WU!O)$#Gj|JT<*fKCg_I-}m$2ugFenTP zgTfFpL4+$2~MEYTJ?5*!JR1V@4+S_MafA;FMfD6LCyBp4D5hL>}W7UDB} zF^~3^?m&fiCMsHucZMlrnlZ>QWxO+snIakQjCX8Dc%$Q=@z3~|Ez0<3dXr(uFl72r zwvDdD)1z?ZT(*%O7=8wu!D0Bt))o$WU~pLB;K5?MNitXr76ZaCjE?{;Mxqg92nGvp z26fmIgT+cef~9;K$}XV6;4nB04uiwsFvQ0R27|$2a2N~*$}otB!C`P190p1=&|z>G z90mu#@i&S&iB3?WMq-}e@Tgs4lDv?QvbVP<`}_OS>-FUD@K8=pPUQIbSkBJQgq~vZf@lE_ExU%Ts|Bf@jdR+-SQnM7wW~V)Gbq&!LM>Oo_2gCd$4foU@&;9 zVT0U3<6wC#JFx7)vI7fufM2|Ya}J)AG+`4zkrT=zCZnYPG4~Nq_lS^IYi>|IWV}_a zySsVGRmeDL$Wg@@SsO+BRYo!zNYhlpWIMoEqP Z`}>9evHXkNQltK0^X4Ppd0{iwe*;Re$Ql3u literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/icoalig9.bmp b/reactos/base/shell/explorer/res/icoalig9.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0e8fb8acfce8c1f95c2232f04a6d781f1a5844d4 GIT binary patch literal 3718 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 SjPRP)h;O*cdjT!KT>l^5+IP$V literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/logov.bmp b/reactos/base/shell/explorer/res/logov.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0d251b664b2d45bbf0c2e6c702ff5126291954aa GIT binary patch literal 27654 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/network-conns.ico b/reactos/base/shell/explorer/res/network-conns.ico new file mode 100644 index 0000000000000000000000000000000000000000..300f234b2068cc9713bf3023f19ce9dc4f3449ff GIT binary patch literal 29926 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 z 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 UJvHUuqNzUFmV6t6=wk5y0Fm*2Hvj+t literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/network.ico b/reactos/base/shell/explorer/res/network.ico new file mode 100644 index 0000000000000000000000000000000000000000..3965e61f86f31be3b6b243f058951d61ff502e56 GIT binary patch literal 29926 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/notify_l.ico b/reactos/base/shell/explorer/res/notify_l.ico new file mode 100644 index 0000000000000000000000000000000000000000..b50d1e73b43ab4b93d0148bc291da555b877740b GIT binary patch literal 198 zcmZQzU<5(|0VXiLfq{WR42U&=SOAC>fEXkX0u5jiLNFn*|NsAw#3PRhGy?fEXkX0u5jiLNFn*|NsAw#3PRhGy?-XtN;K1 Wv;F`7Kj;7d|K~h}2Ju1S=l}p=2|&F7 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/printer.ico b/reactos/base/shell/explorer/res/printer.ico new file mode 100644 index 0000000000000000000000000000000000000000..e30b700a79951ad662de916c983090470aeecdb0 GIT binary patch literal 29926 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 BP4fT% literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/reactos.ico b/reactos/base/shell/explorer/res/reactos.ico new file mode 100644 index 0000000000000000000000000000000000000000..16cebc5698d871e8920bd6accbf526222bf3fca5 GIT binary patch literal 50534 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

x*z=4qp4t7G-afx(CW-ET9>tiHs>s%bva?Q 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 KOt*f@^8WxdX#EBN literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/recent-documents.ico b/reactos/base/shell/explorer/res/recent-documents.ico new file mode 100644 index 0000000000000000000000000000000000000000..26d1b253fc431fef56c73ed525bb0678dd6d0c31 GIT binary patch literal 29926 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 S)`HZ6;u|Hs6HbQz5%_;fO*QNQ literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/ros-big.ico b/reactos/base/shell/explorer/res/ros-big.ico new file mode 100644 index 0000000000000000000000000000000000000000..4c9642ee7315295e2cb52032fa1d2119deb698a0 GIT binary patch literal 97518 zcmeFa2SAla)<67YlZ__tuIY(unwl6(VuHQIs8M4VBPwd_g(4zN;36Vb;VMlp8LK0?MHU*eDE)Xafq4m5M%|JNLlS;%EF+r}icl*!~yvc^|l zaNI)NYtiU&CnIr5@%e(1id(A3>MKwkwEW$o{6Gttlaox;p)4o9TF5LcWNlxf0tMbJ znf{hC3mN`JouWb|9WSiK2?aTUiE_D)%-qyM4wMwvTF4dOFZwjHRo<29$iZ_{3nz1# zvbfYz!P*xUZy_n!hr+5L`(3#imG(0s+b8D zx=I9I0=@!7OA7`sbFX@6;Vw6Ka+F;W2q=+z0)>uGoPmCp5zr@kXhBtA05~8+;>V0s z!g;bx<1Exz8GU+SLsb@41XP?fW#*1dfbBEz zfvkyAxQc38@H0+s?p0M5L^5}Bm+LsmWlRBDmV~=crxs5XSJ24hJGnCh+<^epXv$^T z6;b}_(zwX{YLtusMh5Q7z&yBA?(!;gM>(1R7{IrlOgL9G^@htpvZb}$ox$6nJe2U^ zR9&YjI(Y6`_Myh7&}R@Z74_hO02BcKskXTD^uvFVWX~8Sun#(GqXJ)5;;NQZ+_L=fcpwC=(vX&cG3F^UrFu?txjXT=Vv*=6GlxNUKc}EMG z(7q~B+#NCmIyz3zlxJ2w%@GK~NMb`&AGixj%$H$c*s(6A9>>JaIvB;^b%! z!{rX$LlSm?V2D^7Wkyfo%IK>-Qzb6QM#_N! z5XYaq+zrYMa^#L+z!M4Rn?G?ub>awdGh9yP78YCq$*LX-6QFvA5YGA9{YqdPb#N59rMISl@bj4xRzQX}GIPAg#btu5SeQ)UkBMRStt${pDZH6);K z+HfXo#9RwUnUjt+Aj5E)%hD{$frvYFnh~l`;D&69TnQXs4Gu$#7P67%R-$Tib5nC> zgq+_9@qoZjBvok_xgbpOZtpJTeLB56fehU3Y z4h!x$nwpxM%XG9Bn3`(oSipq3Ik{W7KV*esb%ttH0sX#c9Stbhsw7|}q1QIo)EqHf z(|p7bb4}<1`VhGjJ#>dbQKm{sT496ZhpGzd@rPWE%r$ium}~Z2(BjPw!*wj&WV%k} za+Kx*%4F2GT=Nh>YTKg$~kP{C&_*+OT8%mUmWqS-KL{CLC&om3qi`4zeRq0K`_NB|YkLwRfNpan5cm$!ugBuN+L%}u{H()k9O z03R$By@>3gyQ947frb2v6WX(>Ovi$m`E+@OnR-)RRjxBcWB41U<|BrqA;?p!K(BZf ziezD0<>YS2W(h4@nN<8!z?Up4oXj-`&()e^1Wj~zbg#02_H#p&J8Gaqlsmbv5a>S# zz9dlnWSMMH)PY!#`S6VMk;RB`bek~l_5PN|CUNS$vyKsg2QlPSyc$y%Eh??+jrPM;q(yZKv1CK zzoJiSA$lgb9u_DAbIecbvPoB36B+m^(lhM`oCiyUIbw^ zz6Se;_NPcPBk?G_DB{itzM!f!x&#|Vc^KKJ@mKbK z#Y6>s3H;-NO3w2aDtSS9P%l(fRUN*|F}&h(D)_RdJRzn0z%3Qxsv6{?Fj&Cs#WM@pp3{=9p%NbGxbVlF>@>8l`Lj!>L zxB;LvYcJOzYZ|^%+QJWL%4`YC$tcgv_U&U|> zZUBwYhX!*oBvirJ{|^36f{zXCD;GtDC4cCQLIF^|p*ZS-`4V&kuwdhJ;4}G(a=Iual3>1q zb_MTHl>bz5r$((8a}t7qTuvoHHx4MkcnHh|<%%}kwEbe(f_}MNS6+dF<)SX3K0@~t zH3`*f$dBb6_28Xs8jjDC#bN|@U0PesU_|* z&$$jB2cg+saeL0Qjmy;^3+XF}0O{zpugII`bbW~@51;`Uq_7?hf&$k4V6z5;yy!Lf`P?&iBrzXy; zTJZf-;{K;NsuV&=6z3n*pBIVqPjJrY<0)~@k21QA&utr>i-(x;%IB5mpg>Vxb#6ln z`Wns^^f#PeP#ubI8&dE~b6XA8vqJR;d0_z*3a2;}&kKzf zjbEIS(C7w>thm_x`BEI{1X;~WgvbqUr;7o=X-Cw@rLy7JFTSm-+M>;`#bMS zt=@Z2`tXxaq;_9^F12s_rPSv0cG72U+esZdc9OdP&{gWz?FZ?*Zr!B5efvpcdbg2& z?f;oHabR1?@~6(yw4oiOp@RoXv&X7Q^TvEDEu8SZv_M@=vKaBBq&KOjWb#`-$#U*M zsY92cQojMCqya;QN~1=Olr+>wNmD0|kp};wA&r};Ax)h+Mbe!RGK$ys${v~ z7ir=A>5}ClP07Z1rZi;ud};cO`O=KJbEJj3+LG~N9m&whP%<;tlk^RiNTy4cNS5YH zB&(%nl9{=MWWLl=va+(09M$_st7Z(6TxN`v?Da-Un{-Aq% zu5!tBt*f+Y-D=6v-B)s3yHWD=^pt{~?4)padufNaqZIAsC0=nFUVJl3-pyDcKb+iA->X~u#L#R(yFyvCEtKxX;VO$6c`vN?G6f*LU(VI zwgm-CK|6OzyLa!FqC*3v*zg_F?$8J+GBQFs5FIYX9f+2qqGP4#1MyN^T%2@xr;BuW zmzQ*8-+Cz{dZTnW(nrdO@RgGH`%A}T{iHMTeo}Jq4(V{jR_R#uHYxeQRw?7)R_SQ; zPU%=gFwS>N>2aabnS;BeBM0|MneqFiq(cX!6S4cHQwJlZG3nB| zEa_I!5$Q_tap`K&aq0G@qte|gC#3sVk4a@k+0wP*Z0U0GIq6#IdFe)Zp;TFtE8V|! zM!IvkK)Q?bhj((M2lw-(M|aLi>1T?iYvq@vd)F^X6_pjzz1ugWTNSsZn(9X?Yta1N z%z{WRveE*`ogX9?ysFVbEWfAH&1Xf9PMjW6-FS zww6Pqv-(4i{@V4&lGM0Bqs#x|;ZuuJrC!EQS7g%tsVh$xdFu8*b=sllLJtoI{r=hw zmG;tVT!U7x`ZEWu{ss;n9{N2y)L;5H4@`d8R9}NbFO~fLyLC5oF`GJB(@dt#FBfw1 z(C^hC8qXhIjS_gS_fgcY{M1)lR7=QxDB?-+kM*oh-)Q8#i^;^q+Xp*TeIP z^MCQgKzb5BR^)b4vkXs6EXXm`oZO|YPPUik@ZsO~?cTs81tgzWqJ+@2CtF-hVnN0F zA4Ym7#w2>nI;q7(*_&w&Z~wJP{?qiK*ehrSXjF|=&EMN4B(b#mwnO*zDLJxEvcf1! zL$e<34DzGwHK#m@0g5$lkx$-y=`$!%|AvSCy?u zWEV3{jd9}|9>fufy#ftH75(a~^>^{wlayb2^LEYcimYx1l@$f~F~4^4D~Xa@PMxAL ze4Ix8lQ=-JR|CJEi~e3NdyZTzudJ!7uJKj#t*fXg^HVb@D+qUUv9X*A`ZXFOfMTx( zetk3YatTQ)0r9nUbq?Ln*Hu?n%hY13^W*ktPIjC(dy^5>XO9pxa@A-W~!@Cnlhyk0$ixE<~C6`UwZou z>CNZd5|>%|l-AWz9-a>HR9CC5&+}O4dpXqBROBZ{MI;vV{$|9m5fdkBOw=?}*47u_ zeU!(~|7!JDEF=Bl`S(Q=QWyX)OZTMG+jaD~y1xm>Sp(Eg5oAy>+Ab={JEc$iVZ+9; z2B;*!h3Yluc>vS^{&lr>FA#wV*TXF!#>{a~DwAK`*Mq@t>RyPcx9ZC39JL9qmX3)N z+7DL;0^>BN3SeBs<9FrX@^!pn-mR4=@thClBipf+W~(AD-mayJzMc%;1R6lKfL~To zsMg!k%q(hQ`*Dnbh5|kp;i4~0e|rPmAN{vR2Ikqvg$>0Mv&~j9`>T5i@CMqf0d;kC z)fHuBg+02N%{Gf#+@9$lr)h~wM3qnWN6%LM!(U&QUhCGj!?Sl9U(v;hzT`dAjK!~H z{vv(m0ih+-RF;*LmGxIMn{Am04j^gF6$K<|QR7;gI5uGJx9k2w?xUC>Mb~W7Qr9D8 z6+-nM>lzF23ISA<6ckj9?qa#ry*w9H!!|b|O*VWb<>i`L)T2}w+%8HUwr1IOfqYZ9X*HoyD zpFL5ufZuET%>Dn)fG39DsJDdt*!0r zQCnSG*lEfX;RyUr#b1N_e;M8GMW(MFJ`Aws;7QB7_};#Ga|81L?GC)JsjjZ5xLI+t zvXY^L89jY*%TIwogGby@O`{_%=6?xANrWaI)TW^E>zZtapJqw|#L}oVlyKW_kd%U~&L*XhE zsj#FVCp$4QF7Zfu=`CgfW%aD6t-Y-_eCqG@ylv6+|DyjQyRU+*{5BlcK087#S2MYp zpPye)P*_rkR+p0<74Gfj9C-S5ZTSL@aGDIhO64QX$f zw0vog-UW$K*j^+%B_{`@M|pd>taNmAT(xcc_JpF_kU^cc!|n1?lWz4cOOsWaF!w(+ zerfKbk_}z*ZRU*ckm4-c1=vT^!P--4%%AJP1+saLeuZj>+2?-(AL&7ZV~~Luz8cZjEtT%ZiL2^ zDTZc-W-@$eP98UW=+8e7owO|IU_x5vvExO@kKbOX85dN&$RR5?H#;jU>r__2shCp% zNdB7xHv4b(^YvA7|3iIG&-EbJ1EW>(W#Yhpo(3jOG#xd`a>UT~QIm%LJap*rapT5o zOrESUe)#a=-+kM;bH|~xgN|G*Dms>aEHmNY(K0nluiU~PJUu)W^#TCuRV8B+{Z{C8 z-!yEirmwGyq^+&3g}>3vFm0{=S_az2O~6NAGO(R&>A=rE>pbw=pTAS2Z@=x_vE!$0 zJ{>r9PkQOiqN8c)X$QA$FY@iO!MDO#dp+QLGI0(bCJv2I=m6b+y|>!e`bY}!qqRl@ zFh2Vu8H_gG@U-w1j!c(`p`UX4tYc@Sj!56MY16v(Cv83*I@diZJ!xlLdfF~q+e7zz z#N4i}?p{%;N;s;3pLSa$-?yOq?F?FNx?NdOk?#xowE&ngP$YeAgJie&Vb&A z|Jwj^n~y&F=;IGQ{`lk8Z8}2&@or1qlH%R0Z4X^NtBc;rAy0HtPk%iA65v}Hx7AkO z0HXj}@h=e2*L@bg=*sk^p`U%GfG%Kvfb<^n#~-)pJbZcFo_Ukz*{oW&Y+G6p>7OO4 zSoAb#ao)G(8`A52x^<{f-L23E2SC4q`u_cNb)S_#TQlJB*+9Ym&YeGP)B0lo=k&n` ztv?+&(JgL|%_Q|nlV;Adiama{u5iNrI_gt)|9;KWe+6uL+8KZ7r?_|TPEB2mwh(`R zB?e8!DmPV2M-%I6c~Igz`ysw$DjT@(Q>(?&C*Hg!-fr;<#z1ISm(;#QI&O@ zycBMNicsl}$`p|(L z6$pILy5qp1!zayKzI4*CfrHhT9V&-!P!}^QIKQBq)qK+>W0%aZ3fvJHc{ug(;iSk= z51;Q_wd&Gg`BvxP!!>XsIQfo7!yByy99Rb0&&t0$;P*wAq)$H^Hp^=J!Ch7W_9+YC zgO6Ib`LyHD>hqS*96E5|;F+;k@7L7S)lqLOhU{@c)L(P&a>)fiKb)GeHUG@Iw|zGD zj9~|+uCAu82B|I|%^wP&;6T47;Ik(q6Y!-^hgt1TJ9g~geD%(4K6vk)ci;O64e-;? zepVkbuyf~u>f6)JEut^v-=Sa4i1eMOA5c(e0T;Clhht8k`Et{#^JO<{s8Vr<>91bI zO#tl=^!Mwpt^bVv!ywlWqz2AUC@L>Xum$}0-hJntcfbG`fX_OA_UUJz4YN%T9rUC5 zko`ZF`AskG2OfbEC9D^Di#X+ z#~3jGpM~$xcpyDudokb#s&{Vv0l>fW-UqM*FbFV9!jty?PX$BQhO+a!sr1!mJ_A75@M?%C?$1G5J(&z&5zQq7C-bHh6}95U-_R zKYz~KmX^7D{?Lve3Hsmr_~TF7d;$yrKAj>4R8rl&B_#*yy7^QrwvW7Y`Re7%mo6Sz zuJ!pBy*8{{(@ML-dF%WdI`9txS@EHO4;#qj_h|w?=zn4?G0STHh=HGc{NB6ozKiw; z1U_l=*}xGtSMS}cxpV*iz5DksR+M#5CX?vHm%-lq_wL=hl%&_S(^DkHL z->bP$bH6@S=<6{9Ml1DS-*|lkvEm3#A1E|V!#->C2^%1`exM)3&)YL*e?3j7{Oe2- z>qe$#T*%0{bMMZb%c-G}iM`S9Y!0Zd9THmqoZ_HD*$vgp|7qt5{C^6*6sG`4U9>+5QBH#}PV zIr<0bKkX;8mt;6@+|X}_j2hxS$GWNUY=c?_A0_ z6uJ2IzxvhG{5DOrdvT9HHZc9d4`2>x8|XjN|2ZsT6V#Bjltb1E-%Y+giiYghrOSp2 zSW}{0glLGm8+yaOFa`qHeF))l#$nlCTNF~=Sc}FCs5M@w^h1OSYU>$1&3^<^I@CL5 z#{GM%jy<|NZ1Feg@5>{xnwosWZaV%IR4wrFZSQ@*^4=|^vdd*xk?~i0=|bviHIJIQ z%Vli(lz(;pa6<(7q8~#0*MAm1ob^o(CfeG)y7#Zw1QRu_tX%kYz9zjlaV!L>%-2Az zkI8!f!kA9kFnOHv`7b{|g;Q#3QfiV;q2gKPXI+7@$`4Xl0ob3W;HwO z>NZLL6VVj?URo@Jfb-ex+xiFO76vTrWs--06u4hkn>Es*q#iy~&j=(ZCPs&axXR@& zo`v-(&%=0e19)bDmY()=;7cA_n0(V`JE>HFfWq8U0r0K;*|GLD>93~NbFqoZ=-!KS zN&sJlf#5#`kenDD5fUPIbX_QXVPg{m6JrAd1APM!&z>-#qYb_QKC}Lbb{J5RB|Llf z?cvw^`uaFvT$En`=p`i>A1acPer7-fGr-kL%fv)LH!(0?Y|IE4=<5j^#16RbbLm%! zzWzI)A{WC8PN07?;2WoaXaT)R`V*tWLtLF#xq|`5hWN)H=w}A#>v0nV3r3?QsAjn8 z;XLmkpgLDEzySsjfUmDdD#Hcs{0~e7129|``VR$+W(K&ruh4}AzGk8ag<|HsN9-YLewf3rg}!XXOw3q+LiSG50RL4SA%7!bl52n_&mNC1B<0zD-Q z^j{vnZ*3j~fW(a;V6(4>QvBdO|0y+4(fm>vequy;h&u#eXsjUK1mF#g1^EgQ=<2c} zzAXKKpO*y;VooswHv6wn73^=!eXu~O|0??3UF9Km27-Pi4;F&~ECA62SPfque(u>k zG00~A1Af6p=D#4G1t5~j{3_r>{;n?WUiw1(CZHcuP;r1kL;Ljq3HWEv=CTT&V*dMY zUM&CufksI|J*%Hm|6E<=?%sM#KiU9;SC{}5|8@Tv_>a%#uM z?nedR-No76Tbt=e3lvs>QD7^q%T@s0kKW7k|LnP(TvkCvh+{>;g(soc3%>z=7!07R z*CK|`NpOH0fuNtQ&_6+cR`t2FdG!eR2iP&+!GngRwEcqpFh9}Ie^hl6VHv!fFS#o30%zR;b6yRC?qQk?`{9Qu~73A}$0=(!5L_eUfZ=(J3@R|O+ zvup#P0sh8GPrz3&AJEbHi`JJI5fS3e@bw$wQQQug0RjVNfWgbduc$Z&2IOT60l)@s zTCHL~BD664!t@C4E3{uBepmM}Z4(a@6Pbz$fL(6|VE;^By8WN8ICqvMAgnMmU}36& zs(`IvKl^=1$%#n~>}T- z?NM<*@qo}icUSk2g)%^I5CNzM{VE0gC*+?8`23eAYyf;AA44SrAo>gSmQP4O8lA7A z^9fmLAjogvfC7QV!Vw1lUta$T&o^QKyFyw?fUMMee5EQK59odpz{B}Kus&q52e{ur zKE$BVKj8`K{uA=AC`R;~KKUKtx0p7zi}b z1eCoHdS88qm!`iO@Pz`_Ye0auS856v4=mX1DC}PH0d)Mr^+DGk;;qZvSNy4%ARHlK z0%3n&p8t;lzmP4Eq6LUzqT6S6)K=`#LxtNyB$ap4NhnsLr24lXaLWO&-~{G`=5fPmP&``qU=gEZG%PG6$X)on==HQP-DJYk zAqovtq9CXj9ymkSM(ccfy<3x@#l@Txu|aM@tB`Dvmg9e^<BZ2`}r^yZ~5Jw<>NFA6KBDWPpMLKwzgpK%p72 z%l|{*CF$(lhYue*#G=KWwwg8 zz@Ij3Koej7T-e)&=bQHl6AbwSKRQ8Hwk$8PPgq+%!ml>)=3vdKnFGxnXy!mO2bww1 z%zPtK4e;N3>#fiJ_P4*y@6e%xe8!9!oA63(0A9V^>EhxNYHn`67jMvp zs;Q}YV|UGEUAuNwpD6@j2q)Pefo4S#+h*k4WIs} zar$qp|IIhw9NW8hZzsI2y8(M2#$qXBGI9d)0pu9uIOM~R9z9CV%gamh@$pH-X4d;5 zn{_>U^q4e%{`^l~6<@e6u9NGYI(6!PKR>?&Y$TAxuo(v>E{qf7mVlgGTU#5;xHAoJ zzy0>_?wkIqaQ$zn2mBhNuCBfkZz;zdJa{l;-@bi2kS(z<=%mY+FaHGo_D1fHJOX(Z z@^a|N7UY9PMMWv=*RM|=GGs_hw{G2*{q)mM-66Y|+&lb9?rCUfbV6Af_G*pXxN+lA zY?sCIK8U=9VInhZ#({C^&A2g+j4R{JxHAo7$BuObO{1Qyz4@#u4!~x1#wMjPXlG~f zTf2oTSFTJz4zsYZ2%SB9cId!?1GjbR)X4>X?jjujgm(W4`25NK{rfwmrlyXDEwH?D z<;w1>SFdK^<^EHXCr{4o)vMR0;X{V}ir-uK9__K+ph3M_kAH#hfHGYn_m!HOnhB^k zrK+kb5%Tpz=8cL6A-B78=gx-=n{i-V&>y%mZj7U)rDZ7N%(ycRObgTW_rL$WV^cIY zUsG^^Z9ZfhgSL|e+jkBiRdP{^+BG=I)?k{N5$Mi)z3WwVH^P3Ms5!YMRy+)&aOKZ^XkH&9B_ z{>MAFti9p0)-GW0ZvU=~G1~M$`u6QR8@40}yObP0e*E}R;KF@>2(l~kV&uul!;l$Q z#+h+v8d8`hYC-+x6@T`FVBjpniKCCESy`rWAhq1dT=+TCxz4T)L6

(Yv)3uuYn)Q2O6 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

{b1!ye2O7{mAqo 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 Xy8paanc%J2dvE;yHucXhFarMz(E8F! literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/sdi.bmp b/reactos/base/shell/explorer/res/sdi.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2de2710ba42572692208555e6c3aa723d0ca7fde GIT binary patch literal 3718 zcmeH{F>4z^5QQfokO(H=MwOemiXq)VK#)qkK#gm6^B3HtP^CH{AlS}D5=fCoZ5mZ6 z;;HQ>u3Q*Q;Or^}2gcuy3fnjcyWM@?y*+6-nm&^(uR0!p*`a1@D4)9!Gkk<6rPE_}3#U_!qJ%FccUHIn-k#m3(>> zdfIx7WZ?KYYz~Lxmq%MU$iU(7%E5!>akI!_aabG($1q<3Se%8gq}^u0uW?9Pm4ykZ%1A)QcJtdalY5x-}lO0<`wtyeE-7t Omax5Q6KE4yJAoSuc`2y? literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/search-doc.ico b/reactos/base/shell/explorer/res/search-doc.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ae579103621b84e13d98bc7863cd939f264416c GIT binary patch literal 8038 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 Gk$(eAhl6kc literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/search.ico b/reactos/base/shell/explorer/res/search.ico new file mode 100644 index 0000000000000000000000000000000000000000..36ff3f5a609743efd322ba90db54c01e832feff6 GIT binary patch literal 55246 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 literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/shutdown.ico b/reactos/base/shell/explorer/res/shutdown.ico new file mode 100644 index 0000000000000000000000000000000000000000..b6831c1a01aebfe294c7a0502e9a5e409e70dd54 GIT binary patch literal 29926 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 Pj?rxx^nURFgHrzmrx|d` literal 0 HcmV?d00001 diff --git a/reactos/base/shell/explorer/res/winefile.ico b/reactos/base/shell/explorer/res/winefile.ico new file mode 100644 index 0000000000000000000000000000000000000000..51cb8b248ff9cc9f8dd5d35155b1099ec8a39482 GIT binary patch literal 766 zcmb7Au}Z{15PeZ0NWinQHKnDnm7Sk-u%(3of56ti2&A|oMbh~jSK1l4B0`Gs&FpME z;Xs_^?d;@D-n?C);8WMv(D*n5ZkX?gns_7%TyO;%a;KvqNv3I1;>st)Yzf=|fzeG^!X<-OYo@yeo4Zmu(1@@f)4r&20#!@e?qC zJdk)3SoK{m(lx{M^**{_VfvS>Z8{g7_x1|3$%gV(--G(rq5t=N-*UeDSN*;6&mxQa zzxw6Rl#cvcP5(gh@BFHtcy%lCbN=Lay&s#-CErhK7diNOOK%vwUJrOMd7YhN@cMsA q$2GVmHbhCB6Gg@g_YcH7@p%NTl`DvuScv@3$vl$Z6BF@8 +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=rosshell - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "rosshell.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "rosshell.mak" CFG="rosshell - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "rosshell - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Debug Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Unicode Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rosshell - Win32 Unicode Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "rosshell - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Debug Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "DRelease" +# PROP BASE Intermediate_Dir "DRelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "DRelease" +# PROP Intermediate_Dir "DRelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "URelease" +# PROP BASE Intermediate_Dir "URelease" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /Yu"precomp.h" /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "rosshell - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "UDebug" +# PROP BASE Intermediate_Dir "UDebug" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "rosshell - Win32 Release" +# Name "rosshell - Win32 Debug" +# Name "rosshell - Win32 Debug Release" +# Name "rosshell - Win32 Unicode Release" +# Name "rosshell - Win32 Unicode Debug" +# Begin Group "utility" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\utility\dragdropimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\dragdropimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellbrowserimpl.h +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\shellclasses.h +# End Source File +# Begin Source File + +SOURCE=.\utility\treedroptarget.h +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\utility.h +# End Source File +# Begin Source File + +SOURCE=.\utility\window.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\window.h +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\utility\xmlstorage.h +# End Source File +# End Group +# Begin Group "resources" + +# PROP Default_Filter "bmp,ico" +# Begin Source File + +SOURCE=.\res\action.ico +# End Source File +# Begin Source File + +SOURCE=.\res\appicon.ico +# End Source File +# Begin Source File + +SOURCE=.\res\apps.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_dwn.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrow_up.ico +# End Source File +# Begin Source File + +SOURCE=.\res\arrowsel.ico +# End Source File +# Begin Source File + +SOURCE=.\res\computer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\config.ico +# End Source File +# Begin Source File + +SOURCE=.\res\documents.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_red.ico +# End Source File +# Begin Source File + +SOURCE=.\res\dot_trans.ico +# End Source File +# Begin Source File + +SOURCE=.\res\drivebar.bmp +# End Source File +# Begin Source File + +SOURCE=".\explorer-jp.rc" +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\res\explorer.ico +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\explorer_intres.rc +# End Source File +# Begin Source File + +SOURCE=.\res\favorites.ico +# End Source File +# Begin Source File + +SOURCE=.\res\floating.ico +# End Source File +# Begin Source File + +SOURCE=.\res\folder.ico +# End Source File +# Begin Source File + +SOURCE=.\res\icoali10.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig0.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig1.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig2.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig3.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig4.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig5.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig6.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig7.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig8.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\icoalig9.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\images.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\info.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logoff.ico +# End Source File +# Begin Source File + +SOURCE=.\res\logov.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov16.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\logov256.bmp +# End Source File +# Begin Source File + +SOURCE=.\res\network.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_l.ico +# End Source File +# Begin Source File + +SOURCE=.\res\notify_r.ico +# End Source File +# Begin Source File + +SOURCE=.\res\printer.ico +# End Source File +# Begin Source File + +SOURCE=.\res\reactos.ico +# End Source File +# Begin Source File + +SOURCE=".\res\ros-big.ico" +# End Source File +# Begin Source File + +SOURCE=".\res\search-doc.ico" +# End Source File +# Begin Source File + +SOURCE=.\res\search.ico +# End Source File +# Begin Source File + +SOURCE=.\res\speaker.ico +# End Source File +# Begin Source File + +SOURCE=.\res\startmenu.ico +# End Source File +# End Group +# Begin Group "taskbar" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\taskbar\desktopbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\desktopbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\favorites.h +# End Source File +# Begin Source File + +SOURCE=.\notifyhook\notifyhook.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\quicklaunch.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\startmenu.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\taskbar.h +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.cpp +# End Source File +# Begin Source File + +SOURCE=.\taskbar\traynotify.h +# End Source File +# End Group +# Begin Group "desktop" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\desktop\desktop.cpp +# End Source File +# Begin Source File + +SOURCE=.\desktop\desktop.h +# End Source File +# End Group +# Begin Group "shell" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\shell\entries.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\entries.h +# End Source File +# Begin Source File + +SOURCE=.\shell\filechild.h +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\pane.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellbrowser.h +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\shellfs.h +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.cpp +# End Source File +# Begin Source File + +SOURCE=.\shell\winfs.h +# End Source File +# End Group +# Begin Group "dialogs" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dialogs\searchprogram.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\searchprogram.h +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.cpp +# End Source File +# Begin Source File + +SOURCE=.\dialogs\settings.h +# End Source File +# End Group +# Begin Group "main" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\explorer.cpp +# End Source File +# Begin Source File + +SOURCE=.\explorer.h +# End Source File +# Begin Source File + +SOURCE=.\externals.h +# End Source File +# Begin Source File + +SOURCE=.\globals.h +# End Source File +# Begin Source File + +SOURCE=".\i386-stub-win32.c" +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\precomp.cpp +# ADD CPP /Yc"precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\precomp.h +# End Source File +# End Group +# Begin Group "services" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\services\shellservices.cpp +# End Source File +# Begin Source File + +SOURCE=.\services\shellservices.h +# End Source File +# Begin Source File + +SOURCE=.\services\startup.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# End Group +# End Target +# End Project diff --git a/reactos/base/shell/explorer/rosshell.dsw b/reactos/base/shell/explorer/rosshell.dsw new file mode 100644 index 00000000000..a4b210436b6 --- /dev/null +++ b/reactos/base/shell/explorer/rosshell.dsw @@ -0,0 +1,56 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "rosshell"=.\rosshell.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name notifyhook + End Project Dependency +}}} + +############################################################################### + +Project: "make_rosshell"=.\make_rosshell.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/base/shell/explorer/services/shellservices.cpp b/reactos/base/shell/explorer/services/shellservices.cpp new file mode 100644 index 00000000000..48b3caa90bb --- /dev/null +++ b/reactos/base/shell/explorer/services/shellservices.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellservices.cpp + // + // Martin Fuchs, 28.03.2005 + // + + +#include + +#include "shellservices.h" + + +int SSOThread::Run() +{ + ComInit usingCOM(COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE|COINIT_SPEED_OVER_MEMORY); + + HKEY hkey; + CLSID clsid; + WCHAR name[MAX_PATH], value[MAX_PATH]; + + typedef vector*> SSOVector; + SSOVector sso_ptrs; + + if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"), &hkey)) { + for(int idx=0; ; ++idx) { + DWORD name_len = MAX_PATH; + DWORD value_len = sizeof(value); + + if (RegEnumValueW(hkey, idx, name, &name_len, 0, NULL, (LPBYTE)&value, &value_len)) + break; + + if (!_alive) + break; + + SIfacePtr* sso_ptr = new SIfacePtr; + + if (CLSIDFromString(value, &clsid) == NOERROR) { + if (SUCCEEDED(sso_ptr->CreateInstance(clsid, IID_IOleCommandTarget))) { + if (SUCCEEDED((*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL))) + sso_ptrs.push_back(sso_ptr); + } + } + } + + RegCloseKey(hkey); + } + + if (!sso_ptrs.empty()) { + MSG msg; + + while(_alive) { + if (MsgWaitForMultipleObjects(1, &_evtFinish, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+0) + break; // _evtFinish has been set. + + while(_alive) { + if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + break; + + if (msg.message == WM_QUIT) + break; + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + // shutdown all running Shell Service Objects + for(SSOVector::iterator it=sso_ptrs.begin(); it!=sso_ptrs.end(); ++it) { + SIfacePtr* sso_ptr = *it; + (*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL); + delete sso_ptr; + } + } + + return 0; +} diff --git a/reactos/base/shell/explorer/services/shellservices.h b/reactos/base/shell/explorer/services/shellservices.h new file mode 100644 index 00000000000..ecda2819069 --- /dev/null +++ b/reactos/base/shell/explorer/services/shellservices.h @@ -0,0 +1,36 @@ +/* + * Copyright 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellservices.h + // + // Martin Fuchs, 28.03.2005 + // + + + // launch start programs +extern "C" int startup(int argc, char *argv[]); + + // load Shell Service Objects (volume control, printer/network icons, ...) +struct SSOThread : public Thread +{ + int Run(); +}; diff --git a/reactos/base/shell/explorer/services/startup.c b/reactos/base/shell/explorer/services/startup.c new file mode 100644 index 00000000000..ec0e4224d80 --- /dev/null +++ b/reactos/base/shell/explorer/services/startup.c @@ -0,0 +1,485 @@ +/* + * Copyright (C) 2002 Andreas Mohr + * Copyright (C) 2002 Shachar Shemesh + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Based on the Wine "bootup" handler application + * + * This app handles the various "hooks" windows allows for applications to perform + * as part of the bootstrap process. Theses are roughly devided into three types. + * Knowledge base articles that explain this are 137367, 179365, 232487 and 232509. + * Also, 119941 has some info on grpconv.exe + * The operations performed are (by order of execution): + * + * Preboot (prior to fully loading the Windows kernel): + * - wininit.exe (rename operations left in wininit.ini - Win 9x only) + * - PendingRenameOperations (rename operations left in the registry - Win NT+ only) + * + * Startup (before the user logs in) + * - Services (NT, ?semi-synchronous?, not implemented yet) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce (9x, asynch) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices (9x, asynch) + * + * After log in + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, synch) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) + * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) + * - Startup folders (all, ?asynch?, no imp) + * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, asynch) + * + * Somewhere in there is processing the RunOnceEx entries (also no imp) + * + * Bugs: + * - If a pending rename registry does not start with \??\ the entry is + * processed anyways. I'm not sure that is the Windows behaviour. + * - Need to check what is the windows behaviour when trying to delete files + * and directories that are read-only + * - In the pending rename registry processing - there are no traces of the files + * processed (requires translations from Unicode to Ansi). + */ + +#include +#include +#include + +/** + * Performs the rename operations dictated in %SystemRoot%\Wininit.ini. + * Returns FALSE if there was an error, or otherwise if all is ok. + */ +static BOOL wininit() +{ + return TRUE; +} + +static BOOL pendingRename() +{ + static const WCHAR ValueName[] = {'P','e','n','d','i','n','g', + 'F','i','l','e','R','e','n','a','m','e', + 'O','p','e','r','a','t','i','o','n','s',0}; + static const WCHAR SessionW[] = { 'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\', + 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0}; + WCHAR *buffer=NULL; + const WCHAR *src=NULL, *dst=NULL; + DWORD dataLength=0; + HKEY hSession=NULL; + DWORD res; + + printf("Entered\n"); + + if ((res=RegOpenKeyExW(HKEY_LOCAL_MACHINE, SessionW, 0, KEY_ALL_ACCESS, &hSession)) + !=ERROR_SUCCESS) + { + if (res==ERROR_FILE_NOT_FOUND) + { + printf("The key was not found - skipping\n"); + res=TRUE; + } + else + { + printf("Couldn't open key, error %ld\n", res); + res=FALSE; + } + + goto end; + } + + res=RegQueryValueExW(hSession, ValueName, NULL, NULL /* The value type does not really interest us, as it is not + truely a REG_MULTI_SZ anyways */, + NULL, &dataLength); + if (res==ERROR_FILE_NOT_FOUND) + { + /* No value - nothing to do. Great! */ + printf("Value not present - nothing to rename\n"); + res=TRUE; + goto end; + } + + if (res!=ERROR_SUCCESS) + { + printf("Couldn't query value's length (%ld)\n", res); + res=FALSE; + goto end; + } + + buffer=malloc(dataLength); + if (buffer==NULL) + { + printf("Couldn't allocate %lu bytes for the value\n", dataLength); + res=FALSE; + goto end; + } + + res=RegQueryValueExW(hSession, ValueName, NULL, NULL, (LPBYTE)buffer, &dataLength); + if (res!=ERROR_SUCCESS) + { + printf("Couldn't query value after successfully querying before (%lu),\n" + "please report to wine-devel@winehq.org\n", res); + res=FALSE; + goto end; + } + + /* Make sure that the data is long enough and ends with two NULLs. This + * simplifies the code later on. + */ + if (dataLength<2*sizeof(buffer[0]) || + buffer[dataLength/sizeof(buffer[0])-1]!='\0' || + buffer[dataLength/sizeof(buffer[0])-2]!='\0') + { + printf("Improper value format - doesn't end with NULL\n"); + res=FALSE; + goto end; + } + + for(src=buffer; (src-buffer)*sizeof(src[0])0) + { + DWORD nValLength=nMaxValue, nDataLength=nMaxCmdLine; + DWORD type; + + --i; + + if ((res=RegEnumValueW(hkRun, i, szValue, &nValLength, 0, &type, + (LPBYTE)szCmdLine, &nDataLength))!=ERROR_SUCCESS) + { + printf("Couldn't read in value %ld - %ld\n", i, res); + + continue; + } + + if (bDelete && (res=RegDeleteValueW(hkRun, szValue))!=ERROR_SUCCESS) + { + printf("Couldn't delete value - %ld, %ld. Running command anyways.\n", i, res); + } + + if (type!=REG_SZ) + { + printf("Incorrect type of value #%ld (%ld)\n", i, type); + + continue; + } + + if ((res=runCmd(szCmdLine, NULL, bSynchronous, FALSE))==INVALID_RUNCMD_RETURN) + { + printf("Error running cmd #%ld (%ld)\n", i, GetLastError()); + } + + printf("Done processing cmd #%ld\n", i); + } + + res=ERROR_SUCCESS; + +end: + if (hkRun!=NULL) + RegCloseKey(hkRun); + if (hkWin!=NULL) + RegCloseKey(hkWin); + + printf("done\n"); + + return res==ERROR_SUCCESS?TRUE:FALSE; +} + + /// structure holding startup flags +struct op_mask { + BOOL w9xonly; /* Perform only operations done on Windows 9x */ + BOOL ntonly; /* Perform only operations done on Windows NT */ + BOOL startup; /* Perform the operations that are performed every boot */ + BOOL preboot; /* Perform file renames typically done before the system starts */ + BOOL prelogin; /* Perform the operations typically done before the user logs in */ + BOOL postlogin; /* Operations done after login */ +}; + +static const struct op_mask + SESSION_START = {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE}, + SETUP = {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE}; +#define DEFAULT SESSION_START + +int startup(int argc, char *argv[]) +{ + struct op_mask ops; /* Which of the ops do we want to perform? */ + /* First, set the current directory to SystemRoot */ + TCHAR gen_path[MAX_PATH]; + DWORD res; + + res = GetWindowsDirectory(gen_path, sizeof(gen_path)); + + if (res==0) + { + printf("Couldn't get the windows directory - error %ld\n", + GetLastError()); + + return 100; + } + + if (res>=sizeof(gen_path)) + { + printf("Windows path too long (%ld)\n", res); + + return 100; + } + + if (!SetCurrentDirectory(gen_path)) + { + wprintf(L"Cannot set the dir to %s (%ld)\n", gen_path, GetLastError()); + + return 100; + } + + if (argc>1) + { + switch(argv[1][0]) + { + case 'r': /* Restart */ + ops=SETUP; + break; + case 's': /* Full start */ + ops=SESSION_START; + break; + default: + ops=DEFAULT; + break; + } + } else + ops=DEFAULT; + + /* Perform the ops by order, stopping if one fails, skipping if necessary */ + /* Shachar: Sorry for the perl syntax */ + res=(ops.ntonly || !ops.preboot || wininit()) && + (ops.w9xonly || !ops.preboot || pendingRename()) && + (ops.ntonly || !ops.prelogin || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICESONCE], TRUE, FALSE)) && + (ops.ntonly || !ops.prelogin || !ops.startup || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICES], FALSE, FALSE)) && + (!ops.postlogin || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNONCE], TRUE, TRUE)) && + (!ops.postlogin || !ops.startup || + ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUN], FALSE, FALSE)) && + (!ops.postlogin || !ops.startup || + ProcessRunKeys(HKEY_CURRENT_USER, runkeys_names[RUNKEY_RUN], FALSE, FALSE)); + + printf("Operation done\n"); + + return res?0:101; +} diff --git a/reactos/base/shell/explorer/shell/entries.cpp b/reactos/base/shell/explorer/shell/entries.cpp new file mode 100644 index 00000000000..562eeb7e612 --- /dev/null +++ b/reactos/base/shell/explorer/shell/entries.cpp @@ -0,0 +1,800 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // entries.cpp + // + // Martin Fuchs, 23.07.2003 + // + + +#include + +//#include "entries.h" + + + // allocate and initialise a directory entry +Entry::Entry(ENTRY_TYPE etype) + : _etype(etype) +{ + _up = NULL; + _next = NULL; + _down = NULL; + _expanded = false; + _scanned = false; + _bhfi_valid = false; + _level = 0; + _icon_id = ICID_UNKNOWN; + _display_name = _data.cFileName; + _type_name = NULL; + _content = NULL; +} + +Entry::Entry(Entry* parent, ENTRY_TYPE etype) + : _up(parent), + _etype(etype) +{ + _next = NULL; + _down = NULL; + _expanded = false; + _scanned = false; + _bhfi_valid = false; + _level = 0; + _icon_id = ICID_UNKNOWN; + _shell_attribs = 0; + _display_name = _data.cFileName; + _type_name = NULL; + _content = NULL; +} + +Entry::Entry(const Entry& other) +{ + _next = NULL; + _down = NULL; + _up = NULL; + + assert(!other._next); + assert(!other._down); + assert(!other._up); + + _expanded = other._expanded; + _scanned = other._scanned; + _level = other._level; + + _data = other._data; + + _shell_attribs = other._shell_attribs; + _display_name = other._display_name==other._data.cFileName? _data.cFileName: _tcsdup(other._display_name); + _type_name = other._type_name? _tcsdup(other._type_name): NULL; + _content = other._content? _tcsdup(other._content): NULL; + + _etype = other._etype; + _icon_id = other._icon_id; + + _bhfi = other._bhfi; + _bhfi_valid = other._bhfi_valid; +} + + // free a directory entry +Entry::~Entry() +{ + if (_icon_id > ICID_NONE) + g_Globals._icon_cache.free_icon(_icon_id); + + if (_display_name != _data.cFileName) + free(_display_name); + + if (_type_name) + free(_type_name); + + if (_content) + free(_content); +} + + + // read directory tree and expand to the given location +Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder, int scan_flags) +{ + CONTEXT("Entry::read_tree()"); + + WaitCursor wait; + + Entry* entry = this; + + for(const void*p=path; p && entry; ) { + entry->smart_scan(sortOrder, scan_flags); + + if (entry->_down) + entry->_expanded = true; + + Entry* found = entry->find_entry(p); + p = entry->get_next_path_component(p); + + entry = found; + } + + return entry; +} + + +void Entry::read_directory_base(SORT_ORDER sortOrder, int scan_flags) +{ + CONTEXT("Entry::read_directory_base()"); + + // call into subclass + read_directory(scan_flags); + +#ifndef ROSSHELL + if (g_Globals._prescan_nodes) { //@todo _prescan_nodes should not be used for reading the start menu. + for(Entry*entry=_down; entry; entry=entry->_next) + if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + entry->read_directory(scan_flags); + entry->sort_directory(sortOrder); + } + } +#endif + + sort_directory(sortOrder); +} + + +Root::Root() +{ + memset(this, 0, sizeof(Root)); +} + +Root::~Root() +{ + if (_entry) { + _entry->free_subentries(); + delete _entry; + } +} + + + // sort order for different directory/file types +enum TYPE_ORDER { + TO_DIR, + TO_DOT, + TO_DOTDOT, + TO_OTHER_DIR, + TO_VIRTUAL_FOLDER, + TO_FILE +}; + + // distinguish between ".", ".." and any other directory names +static TYPE_ORDER TypeOrderFromDirname(LPCTSTR name) +{ + if (name[0] == '.') { + if (name[1] == '\0') + return TO_DOT; // "." + + if (name[1]=='.' && name[2]=='\0') + return TO_DOTDOT; // ".." + } + + return TO_OTHER_DIR; // any other directory +} + + // directories first... +static int compareType(const Entry* entry1, const Entry* entry2) +{ + const WIN32_FIND_DATA* fd1 = &entry1->_data; + const WIN32_FIND_DATA* fd2 = &entry2->_data; + + TYPE_ORDER order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + TYPE_ORDER order2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE; + + // Handle "." and ".." as special case and move them at the very first beginning. + if (order1==TO_DIR && order2==TO_DIR) { + order1 = TypeOrderFromDirname(fd1->cFileName); + order2 = TypeOrderFromDirname(fd2->cFileName); + + // Move virtual folders after physical folders + if (!(entry1->_shell_attribs & SFGAO_FILESYSTEM)) + order1 = TO_VIRTUAL_FOLDER; + + if (!(entry2->_shell_attribs & SFGAO_FILESYSTEM)) + order2 = TO_VIRTUAL_FOLDER; + } + + return order2==order1? 0: order1_data.cFileName, entry2->_data.cFileName); +} + +static int compareExt(const void* arg1, const void* arg2) +{ + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; + const TCHAR *name1, *name2, *ext1, *ext2; + + int cmp = compareType(entry1, entry2); + if (cmp) + return cmp; + + name1 = entry1->_data.cFileName; + name2 = entry2->_data.cFileName; + + ext1 = _tcsrchr(name1, TEXT('.')); + ext2 = _tcsrchr(name2, TEXT('.')); + + if (ext1) + ++ext1; + else + ext1 = TEXT(""); + + if (ext2) + ++ext2; + else + ext2 = TEXT(""); + + cmp = lstrcmpi(ext1, ext2); + if (cmp) + return cmp; + + return lstrcmpi(name1, name2); +} + +static int compareSize(const void* arg1, const void* arg2) +{ + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; + + int cmp = compareType(entry1, entry2); + if (cmp) + return cmp; + + cmp = entry2->_data.nFileSizeHigh - entry1->_data.nFileSizeHigh; + + if (cmp < 0) + return -1; + else if (cmp > 0) + return 1; + + cmp = entry2->_data.nFileSizeLow - entry1->_data.nFileSizeLow; + + return cmp<0? -1: cmp>0? 1: 0; +} + +static int compareDate(const void* arg1, const void* arg2) +{ + const Entry* entry1 = *(const Entry**)arg1; + const Entry* entry2 = *(const Entry**)arg2; + + int cmp = compareType(entry1, entry2); + if (cmp) + return cmp; + + return CompareFileTime(&entry2->_data.ftLastWriteTime, &entry1->_data.ftLastWriteTime); +} + + +static int (*sortFunctions[])(const void* arg1, const void* arg2) = { + compareNothing, // SORT_NONE + compareName, // SORT_NAME + compareExt, // SORT_EXT + compareSize, // SORT_SIZE + compareDate // SORT_DATE +}; + + +void Entry::sort_directory(SORT_ORDER sortOrder) +{ + if (sortOrder != SORT_NONE) { + Entry* entry = _down; + Entry** array, **p; + int len; + + len = 0; + for(entry=_down; entry; entry=entry->_next) + ++len; + + if (len) { + array = (Entry**) alloca(len*sizeof(Entry*)); + + p = array; + for(entry=_down; entry; entry=entry->_next) + *p++ = entry; + + // call qsort with the appropriate compare function + qsort(array, len, sizeof(array[0]), sortFunctions[sortOrder]); + + _down = array[0]; + + for(p=array; --len; p++) + (*p)->_next = p[1]; + + (*p)->_next = 0; + } + } +} + + +void Entry::smart_scan(SORT_ORDER sortOrder, int scan_flags) +{ + CONTEXT("Entry::smart_scan()"); + + if (!_scanned) { + free_subentries(); + read_directory_base(sortOrder, scan_flags); ///@todo We could use IShellFolder2::GetDefaultColumn to determine sort order. + } +} + + + +int Entry::extract_icon(ICONCACHE_FLAGS flags) +{ + TCHAR path[MAX_PATH]; + + ICON_ID icon_id = ICID_NONE; + + if (_etype!=ET_SHELL && get_path(path, COUNTOF(path))) // not for ET_SHELL to display the correct desktop icon + if (!(flags & ICF_MIDDLE)) // not for ICF_MIDDLE to extract 24x24 icons because SHGetFileInfo() doesn't support this icon size + icon_id = g_Globals._icon_cache.extract(path, flags); + + if (icon_id == ICID_NONE) { + if (!(flags & ICF_OVERLAYS)) { + IExtractIcon* pExtract; + if (SUCCEEDED(GetUIObjectOf(0, IID_IExtractIcon, (LPVOID*)&pExtract))) { + unsigned gil_flags; + int idx; + + if (flags & ICF_OPEN) + gil_flags |= GIL_OPENICON; + + if (SUCCEEDED(pExtract->GetIconLocation(GIL_FORSHELL, path, COUNTOF(path), &idx, &gil_flags))) { + if (gil_flags & GIL_NOTFILENAME) + icon_id = g_Globals._icon_cache.extract(pExtract, path, idx, flags); + else { + if (idx == -1) + idx = 0; // special case for some control panel applications ("System") + + icon_id = g_Globals._icon_cache.extract(path, idx, flags); + } + + /* using create_absolute_pidl() [see below] results in more correct icons for some control panel applets (NVidia display driver). + if (icon_id == ICID_NONE) { + SHFILEINFO sfi; + + if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON)) + icon_id = g_Globals._icon_cache.add(sfi.hIcon)._id; + } */ + /* + if (icon_id == ICID_NONE) { + LPBYTE b = (LPBYTE) alloca(0x10000); + SHFILEINFO sfi; + + FILE* file = fopen(path, "rb"); + if (file) { + int l = fread(b, 1, 0x10000, file); + fclose(file); + + if (l) + icon_id = g_Globals._icon_cache.add(CreateIconFromResourceEx(b, l, TRUE, 0x00030000, 16, 16, LR_DEFAULTCOLOR)); + } + } */ + } + } + } + + if (icon_id == ICID_NONE) { + SHFILEINFO sfi; + + const ShellPath& pidl_abs = create_absolute_pidl(); + LPCITEMIDLIST pidl = pidl_abs; + + int shgfi_flags = SHGFI_PIDL; + + if (!(flags & (ICF_LARGE|ICF_MIDDLE))) + shgfi_flags |= SHGFI_SMALLICON; + + if (flags & ICF_OPEN) + shgfi_flags |= SHGFI_OPENICON; + + if (flags & ICF_SYSCACHE) { + assert(!(flags&ICF_OVERLAYS)); + + HIMAGELIST himlSys = (HIMAGELIST) SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|shgfi_flags); + if (himlSys) + icon_id = g_Globals._icon_cache.add(sfi.iIcon); + } else { + if (flags & ICF_OVERLAYS) + shgfi_flags |= SHGFI_ADDOVERLAYS; + + if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON|shgfi_flags)) + icon_id = g_Globals._icon_cache.add(sfi.hIcon); + } + } + } + + return icon_id; +} + +int Entry::safe_extract_icon(ICONCACHE_FLAGS flags) +{ + try { + return extract_icon(flags); + } catch(COMException&) { + // ignore unexpected exceptions while extracting icons + } + + return ICID_NONE; +} + + +BOOL Entry::launch_entry(HWND hwnd, UINT nCmdShow) +{ + TCHAR cmd[MAX_PATH]; + + if (!get_path(cmd, COUNTOF(cmd))) + return FALSE; + + // add path to the recent file list + SHAddToRecentDocs(SHARD_PATH, cmd); + + // start program, open document... + return launch_file(hwnd, cmd, nCmdShow); +} + + + // local replacement implementation for SHBindToParent() + // (derived from http://www.geocities.com/SiliconValley/2060/articles/shell-helpers.html) +static HRESULT my_SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, VOID** ppv, LPCITEMIDLIST* ppidlLast) +{ + HRESULT hr; + + if (!ppv) + return E_POINTER; + + // There must be at least one item ID. + if (!pidl || !pidl->mkid.cb) + return E_INVALIDARG; + + // Get the desktop folder as root. + ShellFolder desktop; +/* IShellFolderPtr desktop; + hr = SHGetDesktopFolder(&desktop); + if (FAILED(hr)) + return hr; */ + + // Walk to the penultimate item ID. + LPCITEMIDLIST marker = pidl; + for (;;) + { + LPCITEMIDLIST next = reinterpret_cast( + marker->mkid.abID - sizeof(marker->mkid.cb) + marker->mkid.cb); + if (!next->mkid.cb) + break; + marker = next; + } + + if (marker == pidl) + { + // There was only a single item ID, so bind to the root folder. + hr = desktop->QueryInterface(riid, ppv); + } + else + { + // Copy the ID list, truncating the last item. + int length = marker->mkid.abID - pidl->mkid.abID; + if (LPITEMIDLIST parent_id = reinterpret_cast( + malloc(length + sizeof(pidl->mkid.cb)))) + { + LPBYTE raw_data = reinterpret_cast(parent_id); + memcpy(raw_data, pidl, length); + memset(raw_data + length, 0, sizeof(pidl->mkid.cb)); + hr = desktop->BindToObject(parent_id, 0, riid, ppv); + free(parent_id); + } + else + return E_OUTOFMEMORY; + } + + // Return a pointer to the last item ID. + if (ppidlLast) + *ppidlLast = marker; + + return hr; +} +#define USE_MY_SHBINDTOPARENT + +HRESULT Entry::do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs) +{ + ShellPath shell_path = create_absolute_pidl(); + LPCITEMIDLIST pidl_abs = shell_path; + + if (!pidl_abs) + return S_FALSE; // no action for registry entries, etc. + +#ifdef USE_MY_SHBINDTOPARENT + IShellFolder* parentFolder; + LPCITEMIDLIST pidlLast; + + // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ... + HRESULT hr = my_SHBindToParent(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast); + + if (SUCCEEDED(hr)) { + hr = ShellFolderContextMenu(parentFolder, hwnd, 1, &pidlLast, pos.x, pos.y, cm_ifs); + + parentFolder->Release(); + } + + return hr; +#else + static DynamicFct SHBindToParent(TEXT("SHELL32"), "SHBindToParent"); + + if (SHBindToParent) { + IShellFolder* parentFolder; + LPCITEMIDLIST pidlLast; + + // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ... + HRESULT hr = (*SHBindToParent)(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast); + + if (SUCCEEDED(hr)) { + hr = ShellFolderContextMenu(parentFolder, hwnd, 1, &pidlLast, pos.x, pos.y, cm_ifs); + + parentFolder->Release(); + } + + return hr; + } else { + /**@todo use parent folder instead of desktop folder + Entry* dir = _up; + + ShellPath parent_path; + + if (dir) + parent_path = dir->create_absolute_pidl(); + else + parent_path = DesktopFolderPath(); + + ShellPath shell_path = create_relative_pidl(parent_path); + LPCITEMIDLIST pidl = shell_path; + + ShellFolder parent_folder = parent_path; + return ShellFolderContextMenu(parent_folder, hwnd, 1, &pidl, pos.x, pos.y); + */ + return ShellFolderContextMenu(GetDesktopFolder(), hwnd, 1, &pidl_abs, pos.x, pos.y, cm_ifs); + } +#endif +} + + +HRESULT Entry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut) +{ + TCHAR path[MAX_PATH]; +/* + if (!get_path(path, COUNTOF(path))) + return E_FAIL; + + ShellPath shell_path(path); + + IShellFolder* pFolder; + LPCITEMIDLIST pidl_last = NULL; + + static DynamicFct SHBindToParent(TEXT("SHELL32"), "SHBindToParent"); + + if (!SHBindToParent) + return E_NOTIMPL; + + HRESULT hr = (*SHBindToParent)(shell_path, IID_IShellFolder, (LPVOID*)&pFolder, &pidl_last); + if (FAILED(hr)) + return hr; + + ShellFolder shell_folder(pFolder); + + shell_folder->Release(); + + return shell_folder->GetUIObjectOf(hWnd, 1, &pidl_last, riid, NULL, ppvOut); +*/ + if (!_up) + return E_INVALIDARG; + + if (!_up->get_path(path, COUNTOF(path))) + return E_FAIL; + + ShellPath shell_path(path); + ShellFolder shell_folder(shell_path); + +#ifdef UNICODE + LPWSTR wname = _data.cFileName; +#else + WCHAR wname[MAX_PATH]; + MultiByteToWideChar(CP_ACP, 0, _data.cFileName, -1, wname, COUNTOF(wname)); +#endif + + LPITEMIDLIST pidl_last = NULL; + HRESULT hr = shell_folder->ParseDisplayName(hWnd, NULL, wname, NULL, &pidl_last, NULL); + + if (FAILED(hr)) + return hr; + + hr = shell_folder->GetUIObjectOf(hWnd, 1, (LPCITEMIDLIST*)&pidl_last, riid, NULL, ppvOut); + + ShellMalloc()->Free((void*)pidl_last); + + return hr; +} + + + // get full path of specified directory entry +bool Entry::get_path_base ( PTSTR path, size_t path_count, ENTRY_TYPE etype ) const +{ + int level = 0; + size_t len = 0; + size_t l = 0; + LPCTSTR name = NULL; + TCHAR buffer[MAX_PATH]; + + if (!path || path_count==0) + return false; + + const Entry* entry; + if ( path_count > 1 ) + { + for(entry=this; entry; level++) { + l = 0; + + if (entry->_etype == etype) { + name = entry->_data.cFileName; + + for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\\'); s++) + ++l; + + if (!entry->_up) + break; + } else { + if (entry->get_path(buffer, COUNTOF(buffer))) { + l = _tcslen(buffer); + name = buffer; + + /* special handling of drive names */ + if (l>0 && buffer[l-1]=='\\' && path[0]=='\\') + --l; + + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + } + + entry = NULL; + break; + } + + if (l > 0) { + if ( len+l+1 >= path_count ) + { + /* compare to 2 here because of terminator plus the '\\' we prepend */ + if ( l + 2 > path_count ) + len = 0; + else + len = path_count - l - 2; + } + memmove(path+l+1, path, len*sizeof(TCHAR)); + /* compare to 2 here because of terminator plus the '\\' we prepend */ + if ( l+2 >= path_count ) + l = path_count - 2; + memcpy(path+1, name, l*sizeof(TCHAR)); + len += l+1; + +#ifndef _NO_WIN_FS + if (etype == ET_WINDOWS && entry->_up && !(entry->_up->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // a NTFS stream? + path[0] = TEXT(':'); + else +#endif + path[0] = TEXT('\\'); + } + + entry = entry->_up; + } + + if (entry) { + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + } + + if ( !level && (len+1 < path_count) ) + path[len++] = TEXT('\\'); + } + + path[len] = TEXT('\0'); + + return true; +} + + // recursively free all child entries +void Entry::free_subentries() +{ + Entry *entry, *next=_down; + + if (next) { + _down = 0; + + do { + entry = next; + next = entry->_next; + + entry->free_subentries(); + delete entry; + } while(next); + } +} + + +Entry* Root::read_tree(LPCTSTR path, int scan_flags) +{ + Entry* entry; + + if (path && *path) + entry = _entry->read_tree(path, _sort_order); + else { + entry = _entry->read_tree(NULL, _sort_order); + + _entry->smart_scan(); + + if (_entry->_down) + _entry->_expanded = true; + } + + return entry; +} + + +Entry* Root::read_tree(LPCITEMIDLIST pidl, int scan_flags) +{ + return _entry->read_tree(pidl, _sort_order); +} diff --git a/reactos/base/shell/explorer/shell/entries.h b/reactos/base/shell/explorer/shell/entries.h new file mode 100644 index 00000000000..b0f162e334e --- /dev/null +++ b/reactos/base/shell/explorer/shell/entries.h @@ -0,0 +1,162 @@ +/* + * Copyright 2003, 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // entries.h + // + // Martin Fuchs, 23.07.2003 + // + + +enum ENTRY_TYPE { + ET_UNKNOWN, +#ifndef _NO_WIN_FS + ET_WINDOWS, +#endif +#ifdef __WINE__ + ET_UNIX, +#endif + ET_SHELL, + ET_NTOBJS, + ET_REGISTRY, + ET_FAT, + ET_WEB +}; + +enum SORT_ORDER { + SORT_NONE, + SORT_NAME, + SORT_EXT, + SORT_SIZE, + SORT_DATE +}; + +enum SCAN_FLAGS { + SCAN_DONT_EXTRACT_ICONS = 1, + SCAN_DONT_ACCESS = 2, + SCAN_NO_FILESYSTEM = 4 +}; + +#ifndef ATTRIBUTE_SYMBOLIC_LINK +#define ATTRIBUTE_LONGNAME 0x08000000 +#define ATTRIBUTE_VOLNAME 0x10000000 +#define ATTRIBUTE_ERASED 0x20000000 +#define ATTRIBUTE_SYMBOLIC_LINK 0x40000000 +#define ATTRIBUTE_EXECUTABLE 0x80000000 +#endif + +enum ICONCACHE_FLAGS { + ICF_NORMAL = 0, + ICF_MIDDLE = 1, + ICF_LARGE = 2, + ICF_OPEN = 4, + ICF_OVERLAYS = 8, + ICF_HICON = 16, + ICF_SYSCACHE = 32 +}; + +#ifndef SHGFI_ADDOVERLAYS // missing in MinGW (as of 28.12.2005) +#define SHGFI_ADDOVERLAYS 0x000000020 +#endif + + + /// base of all file and directory entries +struct Entry +{ +protected: + Entry(ENTRY_TYPE etype); + Entry(Entry* parent, ENTRY_TYPE etype); + Entry(const Entry&); + +public: + virtual ~Entry(); + + Entry* _next; + Entry* _down; + Entry* _up; + + bool _expanded; + bool _scanned; + int _level; + + WIN32_FIND_DATA _data; + + SFGAOF _shell_attribs; + LPTSTR _display_name; + LPTSTR _type_name; + LPTSTR _content; + + ENTRY_TYPE _etype; + int /*ICON_ID*/ _icon_id; + + BY_HANDLE_FILE_INFORMATION _bhfi; + bool _bhfi_valid; + + void free_subentries(); + + void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0); + Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0); + void sort_directory(SORT_ORDER sortOrder); + void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0); + int extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL); + int safe_extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL); + + virtual void read_directory(int scan_flags=0) {} + virtual const void* get_next_path_component(const void*) const {return NULL;} + virtual Entry* find_entry(const void*) {return NULL;} + virtual bool get_path(PTSTR path, size_t path_count) const = 0; + virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;} + virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut); + virtual ShellFolder get_shell_folder() const; + virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL); + virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs); + +protected: + bool get_path_base(PTSTR path, size_t path_count, ENTRY_TYPE etype) const; +}; + + + /// base for all directory entries +struct Directory { +protected: + Directory() : _path(NULL) {} + virtual ~Directory() {} + + void* _path; +}; + + + /// root entry for file system trees +struct Root { + Root(); + ~Root(); + + Entry* _entry; + TCHAR _path[MAX_PATH]; + TCHAR _volname[_MAX_FNAME]; + TCHAR _fs[_MAX_DIR]; + DWORD _drive_type; + DWORD _fs_flags; + SORT_ORDER _sort_order; + + Entry* read_tree(LPCTSTR path, int scan_flags=0); + Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=0); +}; diff --git a/reactos/base/shell/explorer/shell/fatfs.cpp b/reactos/base/shell/explorer/shell/fatfs.cpp new file mode 100644 index 00000000000..8750637df9e --- /dev/null +++ b/reactos/base/shell/explorer/shell/fatfs.cpp @@ -0,0 +1,634 @@ +/* + * Copyright 2004 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // fatfs.cpp + // + // Martin Fuchs, 01.02.2004 + // + + +#include + +#include "fatfs.h" + + +static union DEntry* link_dir_entries(struct dirent* dir, struct Kette* K, int cnt) +{ + union DEntry* Ent = (union DEntry*) dir; + struct Kette* L = NULL; + + for(; cnt; cnt--) { + K->Rueck = L; + (L=K)->Ent = Ent; + AddP(K, sizeof(struct Kette)); + L->Vorw = K; + AddP(Ent, sizeof(union DEntry)); + } + + L->Vorw = NULL; + + return Ent; +} + +void FATDirectory::read_directory(int scan_flags) +{ + CONTEXT("FATDirectory::read_directory()"); + + read_dir(); + + union DEntry* p = (union DEntry*) _dir; + int i = 0; + + do { +/* if (!IS_LNAME(p->E.attr) && p->E.name[0]!=FAT_DEL_CHAR) + gesBytes += p->E.size; +*/ + + AddP(p, sizeof(union DEntry)); + } while(++i<_ents && p->E.name[0]); + + _alloc = (struct Kette*) malloc((size_t)((_ents=i)+8)*sizeof(struct Kette)); + if (!_alloc) + return; + + link_dir_entries(_dir, _alloc, i); + + Entry* first_entry = NULL; + int level = _level + 1; + + Entry* last = NULL; + + WIN32_FIND_DATA w32fd; + FAT_attribute attr; + String long_name; + + TCHAR buffer[MAX_PATH]; + + _tcscpy(buffer, (LPCTSTR)_path); + LPTSTR pname = buffer + _tcslen(buffer); + int plen = COUNTOF(buffer) - _tcslen(buffer); + + *pname++ = '\\'; + --plen; + + for(Kette*p=_alloc; p; p=p->Vorw) { + memset(&w32fd, 0, sizeof(WIN32_FIND_DATA)); + + DEntry_E& e = p->Ent->E; + + // get file/directory attributes + attr.b = e.attr; + + if (attr.b & (_A_DELETED | _A_ILLEGAL)) + attr.b |= _A_ILLEGAL; + + const char* s = e.name; + LPTSTR d = w32fd.cFileName; + + if (!IS_LNAME(attr.b) || e.name[0]==FAT_DEL_CHAR) { + if (e.name[0] == FAT_DEL_CHAR) + w32fd.dwFileAttributes |= ATTRIBUTE_ERASED; + else if (IS_LNAME(attr.b)) + w32fd.dwFileAttributes |= ATTRIBUTE_LONGNAME; + else if (attr.a.directory) + w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; + else if (attr.a.volume) + w32fd.dwFileAttributes |= ATTRIBUTE_VOLNAME; //@@ -> in Volume-Name der Root kopieren + + // get file name + *d++ = *s==FAT_DEL_CHAR? '?': *s; + ++s; + + for(i=0; i<7; ++i) + *d++ = *s++; + + while(d>w32fd.cFileName && d[-1]==' ') + --d; + + *d++ = '.'; + + for(; i<10; ++i) + *d++ = *s++; + + while(d>w32fd.cFileName && d[-1]==' ') + --d; + + if (d>w32fd.cFileName && d[-1]=='.') + --d; + + *d = '\0'; + } else { + // read long file name + TCHAR lname[] = {s[1], s[3], s[5], s[7], s[9], s[14], s[16], s[18], s[20], s[22], s[24], s[28], s[30]}; + + long_name = String(lname, 13) + long_name; + } + + if (!IS_LNAME(attr.b) && !attr.a.volume) { + // get file size + w32fd.nFileSizeLow = e.size; + + // convert date/time attribute into FILETIME + const fdate& date = e.date; + const ftime& time = e.time; + SYSTEMTIME stime; + FILETIME ftime; + + stime.wYear = date.year + 1980; + stime.wMonth = date.month; + stime.wDayOfWeek = (WORD)-1; + stime.wDay = date.day; + stime.wHour = time.hour; + stime.wMinute = time.min; + stime.wSecond = time.sec2 * 2; + stime.wMilliseconds = 0; + + if (SystemTimeToFileTime(&stime, &ftime)) + LocalFileTimeToFileTime(&ftime, &w32fd.ftLastWriteTime); + + if (!(w32fd.dwFileAttributes & ATTRIBUTE_ERASED)) { //@@ + Entry* entry; + + if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + _tcscpy_s(pname, plen, w32fd.cFileName); + entry = new FATDirectory(_drive, this, buffer, e.fclus); + } else + entry = new FATEntry(this, e.fclus); + + memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA)); + + if (!long_name.empty()) { + entry->_content = _tcsdup(long_name); + long_name.erase(); + } + + if (!first_entry) + first_entry = entry; + + if (last) + last->_next = entry; + + entry->_level = level; + + last = entry; + } + } + } + + if (last) + last->_next = NULL; + + _down = first_entry; + _scanned = true; +} + + +const void* FATDirectory::get_next_path_component(const void* p) const +{ + LPCTSTR s = (LPCTSTR) p; + + while(*s && *s!=TEXT('\\') && *s!=TEXT('/')) + ++s; + + while(*s==TEXT('\\') || *s==TEXT('/')) + ++s; + + if (!*s) + return NULL; + + return s; +} + + +Entry* FATDirectory::find_entry(const void* p) +{ + LPCTSTR name = (LPCTSTR)p; + + for(Entry*entry=_down; entry; entry=entry->_next) { + LPCTSTR p = name; + LPCTSTR q = entry->_data.cFileName; + + do { + if (!*p || *p==TEXT('\\') || *p==TEXT('/')) + return entry; + } while(tolower(*p++) == tolower(*q++)); + + p = name; + q = entry->_data.cAlternateFileName; + + do { + if (!*p || *p==TEXT('\\') || *p==TEXT('/')) + return entry; + } while(tolower(*p++) == tolower(*q++)); + } + + return NULL; +} + + + // get full path of specified directory entry +bool FATEntry::get_path(PTSTR path, size_t path_count) const +{ + return get_path_base ( path, path_count, ET_FAT ); +} + +ShellPath FATEntry::create_absolute_pidl() const +{ + CONTEXT("WinEntry::create_absolute_pidl()"); + + return (LPCITEMIDLIST)NULL; +/* prepend root path if the drive is currently actually mounted in the file system -> return working PIDL + TCHAR path[MAX_PATH]; + + if (get_path(path, COUNTOF(path))) + return ShellPath(path); + + return ShellPath(); +*/ +} + + +FATDirectory::FATDirectory(FATDrive& drive, LPCTSTR root_path) + : FATEntry(), + _drive(drive) +{ + _path = _tcsdup(root_path); + + _secarr = NULL; + _cur_bufs = 0; + _ents = 0; + _dir = NULL; + _cluster = 0; +} + +FATDirectory::FATDirectory(FATDrive& drive, Entry* parent, LPCTSTR path, unsigned cluster) + : FATEntry(parent, cluster), + _drive(drive) +{ + _path = _tcsdup(path); + + _secarr = NULL; + _cur_bufs = 0; + _ents = 0; + _dir = NULL; +} + +FATDirectory::~FATDirectory() +{ + free(_path); + _path = NULL; +} + +bool FATDirectory::read_dir() +{ + int i; + + if (_cluster == 0) { + if (!_drive._boot_sector.SectorsPerFAT) { // FAT32? [boot_sector32->reserved0==0] + BootSector32* boot_sector32 = (BootSector32*) &_drive._boot_sector; + DWORD sect = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32; // lese Root-Directory ein + int RootEntries = boot_sector32->RootSectors * 32; //@@ + + _secarr = (struct dirsecz*)malloc(sizeof(DWORD) * (_cur_bufs = (int)((_ents=RootEntries)/_drive._bufents))); + + for(i=0; i<_cur_bufs; i++) + _secarr->s[i] = sect+i; + + _dir = (struct dirent*)malloc((size_t)(_ents+16)*sizeof(union DEntry)); + if (!_dir) + return false; + + if (!(_drive.read_sector(*_secarr->s,(Buffer*)_dir,_cur_bufs))) + return false; + } else { + DWORD sect = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*_drive._boot_sector.SectorsPerFAT; // read in root directory + + _secarr = (struct dirsecz*)malloc(sizeof(DWORD) * (_cur_bufs = (int)((_ents=_drive._boot_sector.RootEntries)/_drive._bufents))); + + for(i=0; i<_cur_bufs; i++) + _secarr->s[i] = sect+i; + + _dir = (struct dirent*)malloc((size_t)(_ents+16)*sizeof(union DEntry)); + if (!_dir) + return false; + + if (!_drive.read_sector(*_secarr->s,(Buffer*)_dir,_cur_bufs)) + return false; + } + } else { + Buffer* buf; + bool ok; + + DWORD h = _cluster; + + _cur_bufs = 0; + + do { + h = _drive.read_FAT(h, ok); + + if (!ok) + return false; + + _cur_bufs++; + } while (h<0x0ffffff0 && h); + + _secarr = (struct dirsecz*) malloc(sizeof(DWORD) * _cur_bufs); + + if (!_secarr) + return false; + + _ents = _drive._bufents * (size_t)_cur_bufs * _drive._SClus; + + if ((buf=(Buffer*)(_dir=(struct dirent*)malloc((size_t) (_ents+16)*sizeof(union DEntry)))) == NULL) + return false; + + h = _cluster; + + DWORD fdatsec; + + if (!_drive._boot_sector.SectorsPerFAT) { // FAT32 ? + BootSector32* boot_sector32 = (BootSector32*) &_drive._boot_sector; + //int RootEntries = boot_sector32->RootSectors * 32; //@@ + //fdatsec = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32 + RootEntries*sizeof(DEntry)/_drive._boot_sector.BytesPerSector; // dpb.fdirsec + fdatsec = _drive._boot_sector.ReservedSectors + + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32 + boot_sector32->RootSectors; + } else + fdatsec = _drive._boot_sector.ReservedSectors + + _drive._boot_sector.NumberFATs*_drive._boot_sector.SectorsPerFAT + + _drive._boot_sector.RootEntries*sizeof(DEntry)/_drive._boot_sector.BytesPerSector; // dpb.fdirsec + + for(i=0; i<_cur_bufs; i++) { + _secarr->s[i] = fdatsec + (DWORD)_drive._SClus*(h-2); + + h = _drive.read_FAT(h, ok); + + if (!ok) + return false; + } + + for(i=0; i<_cur_bufs; i++) { + if ((ok = (_drive.read_sector(_secarr->s[i], buf, _drive._SClus))) == true) + AddP(buf, _drive._bufl*_drive._SClus) + else { + //@@FPara = _secarr->s[i]; + return false; + } + } + + buf->dat[0] = 0; // Endekennzeichen fr Rekurs setzen + } + + return true; +} + + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + +FATDrive::FATDrive(LPCTSTR path) + : FATDirectory(*this, TEXT("\\")) +{ + _bufl = 0; + _bufents = 0; + _SClus = 0; + _FATCache = NULL; + _CacheCount = 0; + _CacheSec = NULL; + _CacheCnt = NULL; + _CacheDty = NULL; + _Caches = 0; + + _hDrive = CreateFile(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); + + if (_hDrive != INVALID_HANDLE_VALUE) { + _boot_sector.BytesPerSector = 512; + + if (read_sector(0, (Buffer*)&_boot_sector, 1)) { + _bufl = _boot_sector.BytesPerSector; + _SClus = _boot_sector.SectorsPerCluster; + _bufents = _bufl / sizeof(union DEntry); + } + + small_cache(); + } +} + +FATDrive::~FATDrive() +{ + if (_hDrive != INVALID_HANDLE_VALUE) + CloseHandle(_hDrive); + + free(_path); + _path = NULL; +} + +void FATDrive::small_cache() +{ + if (_FATCache) + free(_FATCache); + + if (_CacheSec) { + free(_CacheSec), _CacheSec = NULL; + free(_CacheCnt); + free(_CacheDty); + } + + _Caches = CACHE_SIZE_LOW; + _FATCache = (struct Cache *) malloc((_Caches+1) * _drive._bufl); + + reset_cache(); +} + +void FATDrive::reset_cache() // mark cache as empty +{ + int i; + + if (!_CacheSec) { + _CacheSec = (DWORD*) malloc(_Caches * sizeof(DWORD)); + _CacheCnt = (int*) malloc(_Caches * sizeof(int)); + _CacheDty = (bool*) malloc(_Caches * sizeof(bool)); + } else { + _CacheSec = (DWORD*) realloc(_CacheSec, _Caches * sizeof(DWORD)); + _CacheCnt = (int*) realloc(_CacheCnt, _Caches * sizeof(int)); + _CacheDty = (bool*) realloc(_CacheDty, _Caches * sizeof(bool)); + } + + for(i=0; i<_Caches; i++) + _CacheSec[i] = 0; + + _read_ahead = (_Caches+1) / 2; +} + +bool FATDrive::read_sector(DWORD sec, Buffer* buf, int len) +{ + sec += 63; //@@ jump to first partition + + if (SetFilePointer(_hDrive, sec*_drive._boot_sector.BytesPerSector, 0, 0) == INVALID_SET_FILE_POINTER) + return false; + + DWORD read; + + if (!ReadFile(_hDrive, buf, len*_drive._boot_sector.BytesPerSector, &read, 0)) + return false; + + return true; +} + +DWORD FATDrive::read_FAT(DWORD cluster, bool& ok) //@@ use exception handling +{ + DWORD nClus; + Buffer* FATBuf; + + DWORD nclus = (_boot_sector.Sectors32? _boot_sector.Sectors32: _boot_sector.Sectors16) / _boot_sector.SectorsPerCluster; ///@todo cache result + + if (cluster > nclus) { + ok = false; + return (DWORD)-1; + } + + if (nclus >= 65536) { // FAT32 + DWORD FATsec = cluster / (_boot_sector.BytesPerSector/4); + DWORD z = (cluster - _boot_sector.BytesPerSector/4 * FATsec)*4; + FATsec += _boot_sector.ReservedSectors; + if (!read_cache(FATsec, &FATBuf)) + ok = false; + nClus = dpeek(&FATBuf->dat[z]); + } else if (nclus >= 4096) { // 16 Bit-FAT + DWORD FATsec = cluster / (_boot_sector.BytesPerSector/2); + DWORD z = (cluster - _boot_sector.BytesPerSector/2 * FATsec)*2; + FATsec += _boot_sector.ReservedSectors; + if (!read_cache(FATsec, &FATBuf)) + ok = false; + nClus = wpeek(&FATBuf->dat[z]); + + if (nClus >= 0xfff0) + nClus |= 0x0fff0000; + } else { // 12 Bit-FAT + DWORD FATsec = cluster*3 / (_boot_sector.BytesPerSector*2); + DWORD z = (cluster*3 - _boot_sector.BytesPerSector*2*FATsec)/2; + FATsec += _boot_sector.ReservedSectors; + if (!read_cache(FATsec,&FATBuf)) + ok = false; + BYTE a = FATBuf->dat[z++]; + + if (z >= _boot_sector.BytesPerSector) + if (!read_cache(FATsec+1,&FATBuf)) + ok = false; + z = 0; + + BYTE b = FATBuf->dat[z]; + + if (cluster & 1) + nClus = (a>>4) | (b<<4); + else + nClus = a | ((b & 0xf)<<8); + + if (nClus >= 0xff0) + nClus |= 0x0ffff000; + } + + return nClus; +} + +bool FATDrive::read_cache(DWORD sec, Buffer** bufptr) +{ + int i, C, anz; + + if (_boot_sector.BytesPerSector != BufLen) // no standard sector size? + return read_sector(sec, *bufptr=(Buffer*)&_FATCache[0], 1); + + _CacheCount++; + + for(i=0; _CacheSec[i]!=sec && i<_Caches; ) + ++i; + + if (i < _Caches) + { + *bufptr = (Buffer*) &_FATCache[i]; // FAT-Sektor schon gepuffert + _CacheCnt[i]++; + return true; + } + + i = get_cache_buffer(); + + if (_cache_empty) // von get_cache_buffer() gesetzt + { + C = _CacheCount-1; + anz = _boot_sector.SectorsPerFAT*_boot_sector.NumberFATs - sec; + + if (anz > _read_ahead) + anz = _read_ahead; + + for(i=0; i

+{ + typedef ResizeController super; + + TrayNotifyDlg(HWND hwnd); + ~TrayNotifyDlg(); + +protected: + HWND _tree_ctrl; + HACCEL _haccel; + HIMAGELIST _himl; + NotifyArea* _pNotifyArea; + NotifyIconDlgInfoMap _info; + + typedef pair IconStatePair; + typedef map IconStateMap; + + NotifyIconCfgList _cfg_org; + IconStateMap _icon_states_org; + bool _show_hidden_org; + + HTREEITEM _hitemCurrent; + HTREEITEM _hitemCurrent_visible; + HTREEITEM _hitemCurrent_hidden; + HTREEITEM _hitemConfig; + HTREEITEM _selectedItem; + + virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); + + void Refresh(); + void InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyInfo&, HDC); + void InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyIconDlgInfo&, HDC, HICON, NOTIFYICONMODE); + void SetIconMode(NOTIFYICONMODE mode); + void RefreshProperties(const NotifyIconDlgInfo& entry); +}; + + + /// window for displaying the time in the tray notification area +struct ClockWindow : public Window +{ + typedef Window super; + + ClockWindow(HWND hwnd); + + static HWND Create(HWND hwndParent); + + void TimerTick(); + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Notify(int id, NMHDR* pnmh); + + bool FormatTime(); + void Paint(); + + TCHAR _time[16]; + ToolTip _tooltip; +}; diff --git a/reactos/base/shell/explorer/utility/dragdropimpl.cpp b/reactos/base/shell/explorer/utility/dragdropimpl.cpp new file mode 100644 index 00000000000..92f7ed559f5 --- /dev/null +++ b/reactos/base/shell/explorer/utility/dragdropimpl.cpp @@ -0,0 +1,514 @@ +#include + +/************************************************************************** + THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF + ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + PARTICULAR PURPOSE. + Author: Leon Finker 11/2000 + Modifications: replaced ATL by STL, Martin Fuchs 7/2003 +**************************************************************************/ + +// dragdropimp.cpp: implementation of the IDataObjectImpl class. +////////////////////////////////////////////////////////////////////// + +//#include +//#include + +//#include "dragdropimpl.h" + +////////////////////////////////////////////////////////////////////// +// IDataObjectImpl Class +////////////////////////////////////////////////////////////////////// + +IDataObjectImpl::IDataObjectImpl(IDropSourceImpl* pDropSource) + : super(IID_IDataObject), + m_pDropSource(pDropSource), + m_cRefCount(0) +{ +} + +IDataObjectImpl::~IDataObjectImpl() +{ + for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it) + ReleaseStgMedium(it->_medium); +} + +STDMETHODIMP IDataObjectImpl::GetData( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn, + /* [out] */ STGMEDIUM __RPC_FAR *pmedium) +{ + if (pformatetcIn == NULL || pmedium == NULL) + return E_INVALIDARG; + + pmedium->hGlobal = NULL; + + for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it) + { + if (pformatetcIn->tymed & it->_format->tymed && + pformatetcIn->dwAspect == it->_format->dwAspect && + pformatetcIn->cfFormat == it->_format->cfFormat) + { + CopyMedium(pmedium, it->_medium, it->_format); + return S_OK; + } + } + + return DV_E_FORMATETC; +} + +STDMETHODIMP IDataObjectImpl::GetDataHere( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, + /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium) +{ + return E_NOTIMPL; +} + +STDMETHODIMP IDataObjectImpl::QueryGetData( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc) +{ + if (pformatetc == NULL) + return E_INVALIDARG; + + //support others if needed DVASPECT_THUMBNAIL //DVASPECT_ICON //DVASPECT_DOCPRINT + if (!(DVASPECT_CONTENT & pformatetc->dwAspect)) + return (DV_E_DVASPECT); + + HRESULT hr = DV_E_TYMED; + + for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it) + { + if (pformatetc->tymed & it->_format->tymed) + { + if (pformatetc->cfFormat == it->_format->cfFormat) + return S_OK; + else + hr = DV_E_CLIPFORMAT; + } + else + hr = DV_E_TYMED; + } + + return hr; +} + +STDMETHODIMP IDataObjectImpl::GetCanonicalFormatEtc( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn, + /* [out] */ FORMATETC __RPC_FAR *pformatetcOut) +{ + if (pformatetcOut == NULL) + return E_INVALIDARG; + + return DATA_S_SAMEFORMATETC; +} + +STDMETHODIMP IDataObjectImpl::SetData( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, + /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium, + /* [in] */ BOOL fRelease) +{ + if (pformatetc == NULL || pmedium == NULL) + return E_INVALIDARG; + + assert(pformatetc->tymed == pmedium->tymed); + FORMATETC* fetc=new FORMATETC; + STGMEDIUM* pStgMed = new STGMEDIUM; + + if (fetc == NULL || pStgMed == NULL) + return E_OUTOFMEMORY; + + ZeroMemory(fetc, sizeof(FORMATETC)); + ZeroMemory(pStgMed, sizeof(STGMEDIUM)); + + *fetc = *pformatetc; + + if (fRelease) + *pStgMed = *pmedium; + else + CopyMedium(pStgMed, pmedium, pformatetc); + + DataStorage storage; + + storage._format = fetc; + storage._medium = pStgMed; + + _storage.push_back(storage); + + return S_OK; +} + +void IDataObjectImpl::CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc) +{ + switch(pMedSrc->tymed) + { + case TYMED_HGLOBAL: + pMedDest->hGlobal = (HGLOBAL)OleDuplicateData(pMedSrc->hGlobal, pFmtSrc->cfFormat, 0); + break; + case TYMED_GDI: + pMedDest->hBitmap = (HBITMAP)OleDuplicateData(pMedSrc->hBitmap, pFmtSrc->cfFormat, 0); + break; + case TYMED_MFPICT: + pMedDest->hMetaFilePict = (HMETAFILEPICT)OleDuplicateData(pMedSrc->hMetaFilePict, pFmtSrc->cfFormat, 0); + break; + case TYMED_ENHMF: + pMedDest->hEnhMetaFile = (HENHMETAFILE)OleDuplicateData(pMedSrc->hEnhMetaFile, pFmtSrc->cfFormat, 0); + break; + case TYMED_FILE: + pMedDest->lpszFileName = (LPOLESTR)OleDuplicateData(pMedSrc->lpszFileName, pFmtSrc->cfFormat, 0); + break; + case TYMED_ISTREAM: + pMedDest->pstm = pMedSrc->pstm; + pMedSrc->pstm->AddRef(); + break; + case TYMED_ISTORAGE: + pMedDest->pstg = pMedSrc->pstg; + pMedSrc->pstg->AddRef(); + break; + case TYMED_NULL: + default: + break; + } + pMedDest->tymed = pMedSrc->tymed; + pMedDest->pUnkForRelease = pMedSrc->pUnkForRelease; +} + +STDMETHODIMP IDataObjectImpl::EnumFormatEtc( + /* [in] */ DWORD dwDirection, + /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc) +{ + if (ppenumFormatEtc == NULL) + return E_POINTER; + + *ppenumFormatEtc=NULL; + switch (dwDirection) + { + case DATADIR_GET: + *ppenumFormatEtc = new EnumFormatEtcImpl(_storage); + + if (!*ppenumFormatEtc) + return E_OUTOFMEMORY; + + (*ppenumFormatEtc)->AddRef(); + break; + + case DATADIR_SET: + default: + return E_NOTIMPL; + break; + } + + return S_OK; +} + +STDMETHODIMP IDataObjectImpl::DAdvise( + /* [in] */ FORMATETC __RPC_FAR *pformatetc, + /* [in] */ DWORD advf, + /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink, + /* [out] */ DWORD __RPC_FAR *pdwConnection) +{ + return OLE_E_ADVISENOTSUPPORTED; +} + +STDMETHODIMP IDataObjectImpl::DUnadvise( + /* [in] */ DWORD dwConnection) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE IDataObjectImpl::EnumDAdvise( + /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise) +{ + return OLE_E_ADVISENOTSUPPORTED; +} + +////////////////////////////////////////////////////////////////////// +// IDropSourceImpl Class +////////////////////////////////////////////////////////////////////// + +STDMETHODIMP IDropSourceImpl::QueryContinueDrag( + /* [in] */ BOOL fEscapePressed, + /* [in] */ DWORD grfKeyState) +{ + if (fEscapePressed) + return DRAGDROP_S_CANCEL; + if (!(grfKeyState & (MK_LBUTTON|MK_RBUTTON))) + { + m_bDropped = true; + return DRAGDROP_S_DROP; + } + + return S_OK; + +} + +STDMETHODIMP IDropSourceImpl::GiveFeedback( + /* [in] */ DWORD dwEffect) +{ + return DRAGDROP_S_USEDEFAULTCURSORS; +} + +////////////////////////////////////////////////////////////////////// +// EnumFormatEtcImpl Class +////////////////////////////////////////////////////////////////////// + +EnumFormatEtcImpl::EnumFormatEtcImpl(const FormatArray& ArrFE) + : super(IID_IEnumFORMATETC), + m_cRefCount(0), + m_iCur(0) +{ + for(FormatArray::const_iterator it=ArrFE.begin(); it!=ArrFE.end(); ++it) + m_pFmtEtc.push_back(*it); +} + +EnumFormatEtcImpl::EnumFormatEtcImpl(const StorageArray& ArrFE) + : super(IID_IEnumFORMATETC), + m_cRefCount(0), + m_iCur(0) +{ + for(StorageArray::const_iterator it=ArrFE.begin(); it!=ArrFE.end(); ++it) + m_pFmtEtc.push_back(*it->_format); +} + +STDMETHODIMP EnumFormatEtcImpl::Next(ULONG celt,LPFORMATETC lpFormatEtc, ULONG* pceltFetched) +{ + if (pceltFetched != NULL) + *pceltFetched=0; + + ULONG cReturn = celt; + + if (celt <= 0 || lpFormatEtc == NULL || m_iCur >= m_pFmtEtc.size()) + return S_FALSE; + + if (pceltFetched == NULL && celt != 1) // pceltFetched can be NULL only for 1 item request + return S_FALSE; + + while (m_iCur < m_pFmtEtc.size() && cReturn > 0) + { + *lpFormatEtc++ = m_pFmtEtc[m_iCur++]; + --cReturn; + } + if (pceltFetched != NULL) + *pceltFetched = celt - cReturn; + + return (cReturn == 0) ? S_OK : S_FALSE; +} + +STDMETHODIMP EnumFormatEtcImpl::Skip(ULONG celt) +{ + if ((m_iCur + int(celt)) >= m_pFmtEtc.size()) + return S_FALSE; + + m_iCur += celt; + return S_OK; +} + +STDMETHODIMP EnumFormatEtcImpl::Reset(void) +{ + m_iCur = 0; + return S_OK; +} + +STDMETHODIMP EnumFormatEtcImpl::Clone(IEnumFORMATETC** ppCloneEnumFormatEtc) +{ + if (ppCloneEnumFormatEtc == NULL) + return E_POINTER; + + EnumFormatEtcImpl* newEnum = new EnumFormatEtcImpl(m_pFmtEtc); + + if (!newEnum) + return E_OUTOFMEMORY; + + newEnum->AddRef(); + newEnum->m_iCur = m_iCur; + *ppCloneEnumFormatEtc = newEnum; + + return S_OK; +} + +////////////////////////////////////////////////////////////////////// +// IDropTargetImpl Class +////////////////////////////////////////////////////////////////////// +IDropTargetImpl::IDropTargetImpl(HWND hTargetWnd) + : m_cRefCount(0), + m_bAllowDrop(false), + m_pDropTargetHelper(NULL), + m_pSupportedFrmt(NULL), + m_hTargetWnd(hTargetWnd) +{ + assert(m_hTargetWnd != NULL); + + if (FAILED(CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER, + IID_IDropTargetHelper,(LPVOID*)&m_pDropTargetHelper))) + m_pDropTargetHelper = NULL; +} + +IDropTargetImpl::~IDropTargetImpl() +{ + if (m_pDropTargetHelper != NULL) + { + m_pDropTargetHelper->Release(); + m_pDropTargetHelper = NULL; + } +} + +HRESULT STDMETHODCALLTYPE IDropTargetImpl::QueryInterface( /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject) +{ + *ppvObject = NULL; + if (IID_IUnknown==riid || IID_IDropTarget==riid) + *ppvObject=this; + + if (*ppvObject != NULL) + { + ((LPUNKNOWN)*ppvObject)->AddRef(); + return S_OK; + } + + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE IDropTargetImpl::Release() +{ + long nTemp = --m_cRefCount; + + assert(nTemp >= 0); + + if (nTemp == 0) + delete this; + + return nTemp; +} + +bool IDropTargetImpl::QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect) +{ + DWORD dwOKEffects = *pdwEffect; + + if (!m_bAllowDrop) + { + *pdwEffect = DROPEFFECT_NONE; + return false; + } + + //CTRL+SHIFT -- DROPEFFECT_LINK + //CTRL -- DROPEFFECT_COPY + //SHIFT -- DROPEFFECT_MOVE + //no modifier -- DROPEFFECT_MOVE or whatever is allowed by src + *pdwEffect = (grfKeyState & MK_CONTROL) ? + ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY ): + ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_MOVE : DROPEFFECT_NONE ); + if (*pdwEffect == 0) + { + // No modifier keys used by user while dragging. + if (DROPEFFECT_COPY & dwOKEffects) + *pdwEffect = DROPEFFECT_COPY; + else if (DROPEFFECT_MOVE & dwOKEffects) + *pdwEffect = DROPEFFECT_MOVE; + else if (DROPEFFECT_LINK & dwOKEffects) + *pdwEffect = DROPEFFECT_LINK; + else + { + *pdwEffect = DROPEFFECT_NONE; + } + } + else + { + // Check if the drag source application allows the drop effect desired by user. + // The drag source specifies this in DoDragDrop + if (!(*pdwEffect & dwOKEffects)) + *pdwEffect = DROPEFFECT_NONE; + } + + return (DROPEFFECT_NONE == *pdwEffect)?false:true; +} + +HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragEnter( + /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, + /* [in] */ DWORD grfKeyState, + /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect) +{ + if (pDataObj == NULL) + return E_INVALIDARG; + + if (m_pDropTargetHelper) + m_pDropTargetHelper->DragEnter(m_hTargetWnd, pDataObj, (LPPOINT)&pt, *pdwEffect); + + //IEnumFORMATETC* pEnum; + //pDataObj->EnumFormatEtc(DATADIR_GET,&pEnum); + //FORMATETC ftm; + //for() + //pEnum->Next(1,&ftm,0); + //pEnum->Release(); + m_pSupportedFrmt = NULL; + + for(FormatArray::iterator it=m_formatetc.begin(); it!=m_formatetc.end(); ++it) + { + m_bAllowDrop = (pDataObj->QueryGetData(&*it) == S_OK)? true: false; + + if (m_bAllowDrop) + { + m_pSupportedFrmt = &*it; + break; + } + } + + QueryDrop(grfKeyState, pdwEffect); + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragOver( + /* [in] */ DWORD grfKeyState, + /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect) +{ + if (m_pDropTargetHelper) + m_pDropTargetHelper->DragOver((LPPOINT)&pt, *pdwEffect); + + QueryDrop(grfKeyState, pdwEffect); + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragLeave() +{ + if (m_pDropTargetHelper) + m_pDropTargetHelper->DragLeave(); + + m_bAllowDrop = false; + m_pSupportedFrmt = NULL; + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE IDropTargetImpl::Drop( + /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, + /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect) +{ + if (pDataObj == NULL) + return E_INVALIDARG; + + if (m_pDropTargetHelper) + m_pDropTargetHelper->Drop(pDataObj, (LPPOINT)&pt, *pdwEffect); + + if (QueryDrop(grfKeyState, pdwEffect)) + { + if (m_bAllowDrop && m_pSupportedFrmt != NULL) + { + STGMEDIUM medium; + + if (pDataObj->GetData(m_pSupportedFrmt, &medium) == S_OK) + { + if (OnDrop(m_pSupportedFrmt, medium, pdwEffect)) //does derive class wants us to free medium? + ReleaseStgMedium(&medium); + } + } + } + + m_bAllowDrop = false; + *pdwEffect = DROPEFFECT_NONE; + m_pSupportedFrmt = NULL; + + return S_OK; +} diff --git a/reactos/base/shell/explorer/utility/dragdropimpl.h b/reactos/base/shell/explorer/utility/dragdropimpl.h new file mode 100644 index 00000000000..6a59c67a078 --- /dev/null +++ b/reactos/base/shell/explorer/utility/dragdropimpl.h @@ -0,0 +1,267 @@ +// IDataObjectImpl.h: interface for the CIDataObjectImpl class. +/************************************************************************** + THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF + ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A + PARTICULAR PURPOSE. + Author: Leon Finker 11/2000 + Modifications: replaced ATL by STL, Martin Fuchs 7/2003 +**************************************************************************/ + +#include +using std::vector; + + +typedef vector FormatArray; + + /// structure containing information for one format of EnumFormatEtcImpl +struct DataStorage { + FORMATETC* _format; + STGMEDIUM* _medium; +}; + +typedef vector StorageArray; + + + /// implementation of IEnumFORMATETC interface +class EnumFormatEtcImpl + : public IComSrvBase, public SimpleComObject +{ + typedef IComSrvBase super; + +private: + ULONG m_cRefCount; + FormatArray m_pFmtEtc; + size_t m_iCur; + +public: + EnumFormatEtcImpl(const FormatArray& ArrFE); + EnumFormatEtcImpl(const StorageArray& ArrFE); + virtual ~EnumFormatEtcImpl() {} + + //IEnumFORMATETC members + virtual HRESULT STDMETHODCALLTYPE Next(ULONG, LPFORMATETC, ULONG*); + virtual HRESULT STDMETHODCALLTYPE Skip(ULONG); + virtual HRESULT STDMETHODCALLTYPE Reset(void); + virtual HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC**); +}; + + /// implementation of IDropSource interface +class IDropSourceImpl + : public IComSrvBase, public SimpleComObject +{ + typedef IComSrvBase super; + + long m_cRefCount; + +public: + bool m_bDropped; + + IDropSourceImpl() + : super(IID_IDropSource), + m_cRefCount(0), + m_bDropped(false) + { + } + + virtual ~IDropSourceImpl() {} + + //IDropSource + virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag( + /* [in] */ BOOL fEscapePressed, + /* [in] */ DWORD grfKeyState); + + virtual HRESULT STDMETHODCALLTYPE GiveFeedback( + /* [in] */ DWORD dwEffect); +}; + + /// implementation of IDataObject interface +class IDataObjectImpl + : public IComSrvBase, public SimpleComObject + //public IAsyncOperation +{ + typedef IComSrvBase super; + + IDropSourceImpl* m_pDropSource; + long m_cRefCount; + + StorageArray _storage; + +public: + IDataObjectImpl(IDropSourceImpl* pDropSource); + virtual ~IDataObjectImpl(); + + void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc); + + //IDataObject + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn, + /* [out] */ STGMEDIUM __RPC_FAR *pmedium); + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, + /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium); + + virtual HRESULT STDMETHODCALLTYPE QueryGetData( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc); + + virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn, + /* [out] */ FORMATETC __RPC_FAR *pformatetcOut); + + virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData( + /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc, + /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium, + /* [in] */ BOOL fRelease); + + virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc( + /* [in] */ DWORD dwDirection, + /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc); + + virtual HRESULT STDMETHODCALLTYPE DAdvise( + /* [in] */ FORMATETC __RPC_FAR *pformatetc, + /* [in] */ DWORD advf, + /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink, + /* [out] */ DWORD __RPC_FAR *pdwConnection); + + virtual HRESULT STDMETHODCALLTYPE DUnadvise( + /* [in] */ DWORD dwConnection); + + virtual HRESULT STDMETHODCALLTYPE EnumDAdvise( + /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise); + + //IAsyncOperation + //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode( + // /* [in] */ BOOL fDoOpAsync) + //{ + // return E_NOTIMPL; + //} + // + //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode( + // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync) + //{ + // return E_NOTIMPL; + //} + // + //virtual HRESULT STDMETHODCALLTYPE StartOperation( + // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved) + //{ + // return E_NOTIMPL; + //} + // + //virtual HRESULT STDMETHODCALLTYPE InOperation( + // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp) + //{ + // return E_NOTIMPL; + //} + // + //virtual HRESULT STDMETHODCALLTYPE EndOperation( + // /* [in] */ HRESULT hResult, + // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved, + // /* [in] */ DWORD dwEffects) + //{ + // return E_NOTIMPL; + //}*/ +}; + + /// implementation of IDropTarget interface +class IDropTargetImpl : public IDropTarget +{ + DWORD m_cRefCount; + bool m_bAllowDrop; + IDropTargetHelper* m_pDropTargetHelper; + + FormatArray m_formatetc; + FORMATETC* m_pSupportedFrmt; + +protected: + HWND m_hTargetWnd; + +public: + IDropTargetImpl(HWND m_hTargetWnd); + virtual ~IDropTargetImpl(); + + void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);} + + //return values: true - release the medium. false - don't release the medium + virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0; + + virtual HRESULT STDMETHODCALLTYPE QueryInterface( + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;} + virtual ULONG STDMETHODCALLTYPE Release(); + + bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragEnter( + /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, + /* [in] */ DWORD grfKeyState, + /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragOver( + /* [in] */ DWORD grfKeyState, + /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragLeave(); + virtual HRESULT STDMETHODCALLTYPE Drop( + /* [unique][in] */ IDataObject __RPC_FAR *pDataObj, + /* [in] */ DWORD grfKeyState, + /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect); +}; + + /// implementation of IDragSourceHelper interface +class DragSourceHelper +{ + IDragSourceHelper* pDragSourceHelper; + +public: + DragSourceHelper() + { + if (FAILED(CoCreateInstance(CLSID_DragDropHelper, + NULL, + CLSCTX_INPROC_SERVER, + IID_IDragSourceHelper, + (void**)&pDragSourceHelper))) + pDragSourceHelper = NULL; + } + + virtual ~DragSourceHelper() + { + if (pDragSourceHelper != NULL) + { + pDragSourceHelper->Release(); + pDragSourceHelper=NULL; + } + } + + // IDragSourceHelper + HRESULT InitializeFromBitmap(HBITMAP hBitmap, + POINT& pt, // cursor position in client coords of the window + RECT& rc, // selected item's bounding rect + IDataObject* pDataObject, + COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect. + ) + { + if (pDragSourceHelper == NULL) + return E_FAIL; + + SHDRAGIMAGE di; + BITMAP bm; + GetObject(hBitmap, sizeof(bm), &bm); + di.sizeDragImage.cx = bm.bmWidth; + di.sizeDragImage.cy = bm.bmHeight; + di.hbmpDragImage = hBitmap; + di.crColorKey = crColorKey; + di.ptOffset.x = pt.x - rc.left; + di.ptOffset.y = pt.y - rc.top; + return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject); + } + + HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject) + { + if (pDragSourceHelper == NULL) + return E_FAIL; + return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject); + } +}; diff --git a/reactos/base/shell/explorer/utility/shellbrowserimpl.cpp b/reactos/base/shell/explorer/utility/shellbrowserimpl.cpp new file mode 100644 index 00000000000..61b11c53c5c --- /dev/null +++ b/reactos/base/shell/explorer/utility/shellbrowserimpl.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2003 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellbrowserimpl.cpp + // + // Martin Fuchs, 28.09.2003 + // + // Credits: Thanks to Leon Finker for his explorer cabinet window example + // + + +#include + + +HRESULT IShellBrowserImpl::QueryInterface(REFIID iid, void** ppvObject) +{ + if (!ppvObject) + return E_POINTER; + + if (iid == IID_IUnknown) + *ppvObject = (IUnknown*)static_cast(this); + else if (iid == IID_IOleWindow) + *ppvObject = static_cast(this); + else if (iid == IID_IShellBrowser) + *ppvObject = static_cast(this); + else if (iid == IID_ICommDlgBrowser) + *ppvObject = static_cast(this); + else if (iid == IID_IServiceProvider) + *ppvObject = static_cast(this); + else { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + return S_OK; +} + +HRESULT IShellBrowserImpl::QueryService(REFGUID guidService, REFIID riid, void** ppvObject) +{ + if (!ppvObject) + return E_POINTER; + + ///@todo use guidService + + if (riid == IID_IUnknown) + *ppvObject = (IUnknown*)static_cast(this); + else if (riid == IID_IOleWindow) + *ppvObject = static_cast(this); + else if (riid == IID_IShellBrowser) + *ppvObject = static_cast(this); + else if (riid == IID_ICommDlgBrowser) + *ppvObject = static_cast(this); + else if (riid == IID_IServiceProvider) + *ppvObject = static_cast(this); + else if (riid == IID_IOleCommandTarget) + *ppvObject = static_cast(this); + else { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + return S_OK; +} + +HRESULT IShellBrowserImpl::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText) +{ + return E_FAIL; ///@todo implement IOleCommandTarget +} + +HRESULT IShellBrowserImpl::Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut) +{ + return E_FAIL; ///@todo implement IOleCommandTarget +} + + + // process default command: look for folders and traverse into them +HRESULT IShellBrowserImpl::OnDefaultCommand(IShellView* ppshv) +{ + IDataObject* selection; + + HRESULT hr = ppshv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (void**)&selection); + if (FAILED(hr)) + return hr; + + PIDList pidList; + + hr = pidList.GetData(selection); + if (FAILED(hr)) { + selection->Release(); + return hr; + } + + hr = OnDefaultCommand(pidList); + + selection->Release(); + + return hr; +} diff --git a/reactos/base/shell/explorer/utility/shellbrowserimpl.h b/reactos/base/shell/explorer/utility/shellbrowserimpl.h new file mode 100644 index 00000000000..e1bfe0be188 --- /dev/null +++ b/reactos/base/shell/explorer/utility/shellbrowserimpl.h @@ -0,0 +1,100 @@ +/* + * Copyright 2003 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellbrowserimpl.h + // + // Martin Fuchs, 23.07.2003 + // + // Credits: Thanks to Leon Finker for his explorer cabinet window example + // + +#ifdef __MINGW32__ +#include "servprov.h" // for IServiceProvider +#include "docobj.h" // for IOleCommandTarget +#endif + + + /// Implementation of IShellBrowser and ICommDlgBrowser interfaces for explorer child windows (see ShellBrowserChild) +struct IShellBrowserImpl + : public IShellBrowser, + public ICommDlgBrowser, + public IServiceProvider, + public IOleCommandTarget +{ + IShellBrowserImpl() + : _dwRef(0) + { + } + + virtual ~IShellBrowserImpl() + { + } + + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject); + + virtual ULONG STDMETHODCALLTYPE AddRef() {return ++_dwRef;} + virtual ULONG STDMETHODCALLTYPE Release() {return --_dwRef;} //not heap based + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode) {return E_NOTIMPL;} + + // *** ICommDlgBrowser methods *** + virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand(IShellView* ppshv); + + virtual HRESULT STDMETHODCALLTYPE OnStateChange(IShellView* ppshv, ULONG uChange) + { //handle selection, rename, focus if needed + return E_NOTIMPL; + } + + virtual HRESULT STDMETHODCALLTYPE IncludeObject(IShellView* ppshv, LPCITEMIDLIST pidl) + { //filter files if needed + return S_OK; + } + + // *** IShellBrowser methods *** (same as IOleInPlaceFrame) + virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuReserved, HWND hwndActiveObject) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR lpszStatusText) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, LPSTREAM* ppStrm) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(IShellView* ppshv) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) {return E_NOTIMPL;} + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(LPMSG lpmsg, WORD wID) {return S_OK;} + + // IServiceProvider + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void** ppvObject); + + // IOleCommandTarget + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + +protected: + DWORD _dwRef; + + virtual HRESULT OnDefaultCommand(LPIDA pida) {return E_NOTIMPL;} +}; + +#ifndef WM_GETISHELLBROWSER +#define WM_GETISHELLBROWSER (WM_USER+7) +#endif diff --git a/reactos/base/shell/explorer/utility/shellclasses.cpp b/reactos/base/shell/explorer/utility/shellclasses.cpp new file mode 100644 index 00000000000..f7cd3feb13e --- /dev/null +++ b/reactos/base/shell/explorer/utility/shellclasses.cpp @@ -0,0 +1,571 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellclasses.cpp + // + // C++ wrapper classes for COM interfaces and shell objects + // + // Martin Fuchs, 20.07.2003 + // + + +#include + + +#ifdef _MS_VER +#pragma comment(lib, "shell32") // link to shell32.dll +#endif + + + // work around GCC's wide string constant bug +#ifdef __GNUC__ +const LPCTSTR sCFSTR_SHELLIDLIST = TEXT("Shell IDList Array"); +#endif + + + // helper functions for string copying + +/*LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count) +{ + LPCSTR s; + LPSTR d = dest; + + for(s=source; count&&(*d++=*s++); ) + count--; + + return dest; +} + +LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count) +{ + LPCWSTR s; + LPWSTR d = dest; + + for(s=source; count&&(*d++=*s++); ) + count--; + + return dest; +}*/ + + +String COMException::toString() const +{ + TCHAR msg[4*BUFFER_LEN]; + int l = 4*BUFFER_LEN; + LPTSTR p = msg; + + int n = _stprintf_s2(p, l, TEXT("%s\nContext: %s"), super::ErrorMessage(), (LPCTSTR)_context.toString()); + p += n; + l -= n; + + if (_file) + p += _stprintf_s2(p, l, TEXT("\nLocation: %hs:%d"), _file, _line); + + return msg; +} + + + /// Exception Handler for COM exceptions + +void HandleException(COMException& e, HWND hwnd) +{ + String msg = e.toString(); + + SetLastError(0); + + if (hwnd && !IsWindowVisible(hwnd)) + hwnd = 0; + + MessageBox(hwnd, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK); + + // If displaying the error message box _with_ parent was not successfull, display it now without a parent window. + if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE) + MessageBox(0, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK); +} + + + // common IMalloc object + +CommonShellMalloc ShellMalloc::s_cmn_shell_malloc; + + + // common desktop object + +ShellFolder& GetDesktopFolder() +{ + static CommonDesktop s_desktop; + + // initialize s_desktop + s_desktop.init(); + + return s_desktop; +} + + +void CommonDesktop::init() +{ + CONTEXT("CommonDesktop::init()"); + + if (!_desktop) + _desktop = new ShellFolder; +} + +CommonDesktop::~CommonDesktop() +{ + if (_desktop) + delete _desktop; +} + + +HRESULT path_from_pidlA(IShellFolder* folder, LPCITEMIDLIST pidl, LPSTR buffer, int len) +{ + CONTEXT("path_from_pidlA()"); + + StrRetA str; + + HRESULT hr = folder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &str); + + if (SUCCEEDED(hr)) + str.GetString(pidl->mkid, buffer, len); + else + buffer[0] = '\0'; + + return hr; +} + +HRESULT path_from_pidlW(IShellFolder* folder, LPCITEMIDLIST pidl, LPWSTR buffer, int len) +{ + CONTEXT("path_from_pidlW()"); + + StrRetW str; + + HRESULT hr = folder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &str); + + if (SUCCEEDED(hr)) + str.GetString(pidl->mkid, buffer, len); + else + buffer[0] = '\0'; + + return hr; +} + +HRESULT name_from_pidl(IShellFolder* folder, LPCITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags) +{ + CONTEXT("name_from_pidl()"); + + StrRet str; + + HRESULT hr = folder->GetDisplayNameOf(pidl, flags, &str); + + if (SUCCEEDED(hr)) + str.GetString(pidl->mkid, buffer, len); + else + buffer[0] = '\0'; + + return hr; +} + + +#ifndef _NO_COMUTIL + +ShellFolder::ShellFolder() +{ + CONTEXT("ShellFolder::ShellFolder()"); + + IShellFolder* desktop; + + CHECKERROR(SHGetDesktopFolder(&desktop)); + + super::Attach(desktop); + desktop->AddRef(); +} + +ShellFolder::ShellFolder(IShellFolder* p) + : super(p) +{ + CONTEXT("ShellFolder::ShellFolder(IShellFolder*)"); + + p->AddRef(); +} + +ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl) +{ + CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)"); + + IShellFolder* ptr; + + if (!pidl) + CHECKERROR(E_INVALIDARG); + + if (pidl && pidl->mkid.cb) + CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr)); + else + ptr = parent; + + super::Attach(ptr); + ptr->AddRef(); +} + +ShellFolder::ShellFolder(LPCITEMIDLIST pidl) +{ + CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)"); + + IShellFolder* ptr; + IShellFolder* parent = GetDesktopFolder(); + + if (pidl && pidl->mkid.cb) + CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr)); + else + ptr = parent; + + super::Attach(ptr); + ptr->AddRef(); +} + +void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl) +{ + CONTEXT("ShellFolder::attach(IShellFolder*, LPCITEMIDLIST)"); + + IShellFolder* ptr; + + if (pidl && pidl->mkid.cb) + CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr)); + else + ptr = parent; + + super::Attach(ptr); + ptr->AddRef(); +} + +#else // _com_ptr not available -> use SIfacePtr + +ShellFolder::ShellFolder() +{ + CONTEXT("ShellFolder::ShellFolder()"); + + CHECKERROR(SHGetDesktopFolder(&_p)); + + _p->AddRef(); +} + +ShellFolder::ShellFolder(IShellFolder* p) + : super(p) +{ + CONTEXT("ShellFolder::ShellFolder(IShellFolder*)"); + + _p->AddRef(); +} + +ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl) +{ + CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)"); + + if (pidl && pidl->mkid.cb) + CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p)); + else + _p = GetDesktopFolder(); + + _p->AddRef(); +} + +ShellFolder::ShellFolder(LPCITEMIDLIST pidl) +{ + CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)"); + + if (pidl && pidl->mkid.cb) + CHECKERROR(GetDesktopFolder()->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p)); + else + _p = GetDesktopFolder(); + + _p->AddRef(); +} + +void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl) +{ + CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)"); + + IShellFolder* h = _p; + + CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p)); + + _p->AddRef(); + h->Release(); +} + +#endif + +String ShellFolder::get_name(LPCITEMIDLIST pidl, SHGDNF flags) const +{ + CONTEXT("ShellFolder::get_name()"); + + TCHAR buffer[MAX_PATH]; + StrRet strret; + + HRESULT hr = ((IShellFolder*)*const_cast(this))->GetDisplayNameOf(pidl, flags, &strret); + + if (hr == S_OK) + strret.GetString(pidl->mkid, buffer, COUNTOF(buffer)); + else { + CHECKERROR(hr); + *buffer = TEXT('\0'); + } + + return buffer; +} + + +void ShellPath::split(ShellPath& parent, ShellPath& obj) const +{ + SHITEMID *piid, *piidLast; + int size = 0; + + // find last item-id and calculate total size of pidl + for(piid=piidLast=&_p->mkid; piid->cb; ) { + piidLast = piid; + size += (piid->cb); + piid = (SHITEMID*)((LPBYTE)piid + (piid->cb)); + } + + // copy parent folder portion + size -= piidLast->cb; // don't count "object" item-id + + if (size > 0) + parent.assign(_p, size); + + // copy "object" portion + obj.assign((ITEMIDLIST*)piidLast, piidLast->cb); +} + +void ShellPath::GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd, ShellFolder& sf) +{ + CONTEXT("ShellPath::GetUIObjectOf()"); + + ShellPath parent, obj; + + split(parent, obj); + + LPCITEMIDLIST idl = obj; + + if (parent && parent->mkid.cb) + // use the IShellFolder of the parent + CHECKERROR(ShellFolder((IShellFolder*)sf,parent)->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut)); + else // else use desktop folder + CHECKERROR(sf->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut)); +} + +#if 0 // ILCombine() was missing in previous versions of MinGW and is not exported from shell32.dll on Windows 2000. + + // convert an item id list from relative to absolute (=relative to the desktop) format +ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const +{ + CONTEXT("ShellPath::create_absolute_pidl()"); + + return ILCombine(parent_pidl, _p); + +/* seems to work only for NT upwards + // create a new item id list with _p append behind parent_pidl + int l1 = ILGetSize(parent_pidl) - sizeof(USHORT/ SHITEMID::cb /); + int l2 = ILGetSize(_p); + + LPITEMIDLIST p = (LPITEMIDLIST) _malloc->Alloc(l1+l2); + + memcpy(p, parent_pidl, l1); + memcpy((LPBYTE)p+l1, _p, l2); + + return p; +*/ +} + +#else + +ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const +{ + CONTEXT("ShellPath::create_absolute_pidl()"); + + static DynamicFct ILCombine(TEXT("SHELL32"), 25); + + if (ILCombine) + return (*ILCombine)(parent_pidl, _p); + + // create a new item id list with _p append behind parent_pidl + int l1 = ILGetSize(parent_pidl) - sizeof(USHORT/*SHITEMID::cb*/); + int l2 = ILGetSize(_p); + + LPITEMIDLIST p = (LPITEMIDLIST) _malloc->Alloc(l1+l2); + + memcpy(p, parent_pidl, l1); + memcpy((LPBYTE)p+l1, _p, l2); + + return p; +} + +#endif + + // local implementation of ILGetSize() to replace missing export on Windows 2000 +UINT ILGetSize_local(LPCITEMIDLIST pidl) +{ + if (!pidl) + return 0; + + int l = sizeof(USHORT/*SHITEMID::cb*/); + + while(pidl->mkid.cb) { + l += pidl->mkid.cb; + pidl = LPCITEMIDLIST((LPBYTE)pidl+pidl->mkid.cb); + } + + return l; +} + + +#ifndef _SHFOLDER_H_ +#define CSIDL_FLAG_CREATE 0x8000 +#endif + + /// file system path of special folder +SpecialFolderFSPath::SpecialFolderFSPath(int folder, HWND hwnd) +{ + _fullpath[0] = '\0'; + +#ifdef UNICODE + static DynamicFct s_pSHGetSpecialFolderPath(TEXT("shell32"), "SHGetSpecialFolderPathW"); +#else + static DynamicFct s_pSHGetSpecialFolderPath(TEXT("shell32"), "SHGetSpecialFolderPathA"); +#endif + if (*s_pSHGetSpecialFolderPath) + (*s_pSHGetSpecialFolderPath)(hwnd, _fullpath, folder, TRUE); + else { + // SHGetSpecialFolderPath() is not compatible to WIN95/NT4 +#ifdef UNICODE + static DynamicFct s_pSHGetFolderPath_shell32(TEXT("shell32"), "SHGetFolderPathW"); +#else + static DynamicFct s_pSHGetFolderPath_shell32(TEXT("shell32"), "SHGetFolderPathA"); +#endif + if (*s_pSHGetFolderPath_shell32) + (*s_pSHGetFolderPath_shell32)(hwnd, folder|CSIDL_FLAG_CREATE, 0, 0, _fullpath); + else { + // SHGetFolderPath() is only present in shfolder.dll on some platforms. +#ifdef UNICODE + static DynamicLoadLibFct s_pSHGetFolderPath_shfolder(TEXT("shfolder"), "SHGetFolderPathW"); +#else + static DynamicLoadLibFct s_pSHGetFolderPath_shfolder(TEXT("shfolder"), "SHGetFolderPathA"); +#endif + if (*s_pSHGetFolderPath_shfolder) + (*s_pSHGetFolderPath_shfolder)(hwnd, folder|CSIDL_FLAG_CREATE, 0, 0, _fullpath); + } + } +} + + +void CtxMenuInterfaces::reset() +{ + _pctxmenu2 = NULL; + +#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005) + _pctxmenu3 = NULL; +#endif +} + +bool CtxMenuInterfaces::HandleMenuMsg(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ +#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005) + if (_pctxmenu3) { + if (SUCCEEDED(_pctxmenu3->HandleMenuMsg(nmsg, wparam, lparam))) + return true; + } +#endif + + if (_pctxmenu2) + if (SUCCEEDED(_pctxmenu2->HandleMenuMsg(nmsg, wparam, lparam))) + return true; + + return false; +} + +IContextMenu* CtxMenuInterfaces::query_interfaces(IContextMenu* pcm1) +{ + IContextMenu* pcm = NULL; + + reset(); + + // Get the higher version context menu interfaces. +#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005) + if (pcm1->QueryInterface(IID_IContextMenu3, (void**)&pcm) == NOERROR) + _pctxmenu3 = (LPCONTEXTMENU3)pcm; + else +#endif + if (pcm1->QueryInterface(IID_IContextMenu2, (void**)&pcm) == NOERROR) + _pctxmenu2 = (LPCONTEXTMENU2)pcm; + + if (pcm) { + pcm1->Release(); + return pcm; + } else + return pcm1; +} + + +HRESULT ShellFolderContextMenu(IShellFolder* shell_folder, HWND hwndParent, int cidl, + LPCITEMIDLIST* apidl, int x, int y, CtxMenuInterfaces& cm_ifs) +{ + IContextMenu* pcm; + + HRESULT hr = shell_folder->GetUIObjectOf(hwndParent, cidl, apidl, IID_IContextMenu, NULL, (LPVOID*)&pcm); +// HRESULT hr = CDefFolderMenu_Create2(dir?dir->_pidl:DesktopFolder(), hwndParent, 1, &pidl, shell_folder, NULL, 0, NULL, &pcm); + + if (SUCCEEDED(hr)) { + pcm = cm_ifs.query_interfaces(pcm); + + HMENU hmenu = CreatePopupMenu(); + + if (hmenu) { + hr = pcm->QueryContextMenu(hmenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL|CMF_EXPLORE); + + if (SUCCEEDED(hr)) { + UINT idCmd = TrackPopupMenu(hmenu, TPM_LEFTALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON, x, y, 0, hwndParent, NULL); + + cm_ifs.reset(); + + if (idCmd) { + CMINVOKECOMMANDINFO cmi; + + cmi.cbSize = sizeof(CMINVOKECOMMANDINFO); + cmi.fMask = 0; + cmi.hwnd = hwndParent; + cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - FCIDM_SHVIEWFIRST); + cmi.lpParameters = NULL; + cmi.lpDirectory = NULL; + cmi.nShow = SW_SHOWNORMAL; + cmi.dwHotKey = 0; + cmi.hIcon = 0; + + hr = pcm->InvokeCommand(&cmi); + } + } else + cm_ifs.reset(); + } + + pcm->Release(); + } + + return hr; +} diff --git a/reactos/base/shell/explorer/utility/shellclasses.dsp b/reactos/base/shell/explorer/utility/shellclasses.dsp new file mode 100644 index 00000000000..7c1b30d0f3b --- /dev/null +++ b/reactos/base/shell/explorer/utility/shellclasses.dsp @@ -0,0 +1,146 @@ +# Microsoft Developer Studio Project File - Name="shellclasses" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=shellclasses - Win32 Unicode Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "shellclasses.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "shellclasses.mak" CFG="shellclasses - Win32 Unicode Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "shellclasses - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "shellclasses - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "shellclasses - Win32 Unicode Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "shellclasses - Win32 Unicode Release" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.cmd +RSC=rc.exe + +!IF "$(CFG)" == "shellclasses - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "shellclasses - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "shellclasses - Win32 Unicode Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "shellclasses___Win32_Unicode_Debug" +# PROP BASE Intermediate_Dir "shellclasses___Win32_Unicode_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "UDebug" +# PROP Intermediate_Dir "UDebug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /FR /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "UNICODE" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "shellclasses - Win32 Unicode Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "shellclasses___Win32_Unicode_Release" +# PROP BASE Intermediate_Dir "shellclasses___Win32_Unicode_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "URelease" +# PROP Intermediate_Dir "URelease" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "UNICODE" /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.cmd +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ENDIF + +# Begin Target + +# Name "shellclasses - Win32 Release" +# Name "shellclasses - Win32 Debug" +# Name "shellclasses - Win32 Unicode Debug" +# Name "shellclasses - Win32 Unicode Release" +# Begin Source File + +SOURCE=.\shellclasses.cpp +# End Source File +# Begin Source File + +SOURCE=.\shellclasses.h +# End Source File +# Begin Source File + +SOURCE=.\shelltests.cpp +# End Source File +# End Target +# End Project diff --git a/reactos/base/shell/explorer/utility/shellclasses.dsw b/reactos/base/shell/explorer/utility/shellclasses.dsw new file mode 100644 index 00000000000..76302002c26 --- /dev/null +++ b/reactos/base/shell/explorer/utility/shellclasses.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "shellclasses"=.\shellclasses.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/reactos/base/shell/explorer/utility/shellclasses.h b/reactos/base/shell/explorer/utility/shellclasses.h new file mode 100644 index 00000000000..3b23981550b --- /dev/null +++ b/reactos/base/shell/explorer/utility/shellclasses.h @@ -0,0 +1,1165 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // shellclasses.h + // + // C++ wrapper classes for COM interfaces and shell objects + // + // Martin Fuchs, 20.07.2003 + // + + + // windows shell headers +#include +#include + +/*@@ +#if _MSC_VER>=1300 // VS.Net +#include +using namespace _com_util; +#endif +*/ + +#ifndef _INC_COMUTIL // is comutil.h of MS headers not available? +#ifndef _NO_COMUTIL +#define _NO_COMUTIL +#endif +#endif + + // work around GCC's wide string constant bug when compiling inline functions +#ifdef __GNUC__ +extern const LPCTSTR sCFSTR_SHELLIDLIST; +#undef CFSTR_SHELLIDLIST +#define CFSTR_SHELLIDLIST sCFSTR_SHELLIDLIST +#endif + +#ifdef _MSC_VER +#define NOVTABLE __declspec(novtable) +#else +#define NOVTABLE +#endif +#define ANSUNC + + + // Exception Handling + +#ifndef _NO_COMUTIL + +#define COMExceptionBase _com_error + +#else + + /// COM ExceptionBase class as replacement for _com_error +struct COMExceptionBase +{ + COMExceptionBase(HRESULT hr) + : _hr(hr) + { + } + + HRESULT Error() const + { + return _hr; + } + + LPCTSTR ErrorMessage() const + { + if (_msg.empty()) { + LPTSTR pBuf; + + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, + 0, _hr, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)&pBuf, 0, NULL)) { + _msg = pBuf; + LocalFree(pBuf); + } else { + TCHAR buffer[128]; + _sntprintf(buffer, COUNTOF(buffer), TEXT("unknown Exception: 0x%08lX"), _hr); + _msg = buffer; + } + } + + return _msg; + } + +protected: + HRESULT _hr; + mutable String _msg; +}; + +#endif + + + /// Exception with context information + +struct COMException : public COMExceptionBase +{ + typedef COMExceptionBase super; + + COMException(HRESULT hr) + : super(hr), + _context(CURRENT_CONTEXT), + _file(NULL), _line(0) + { + LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); + } + + COMException(HRESULT hr, const char* file, int line) + : super(hr), + _context(CURRENT_CONTEXT), + _file(file), _line(line) + { + LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); + } + + COMException(HRESULT hr, const String& obj) + : super(hr), + _context(CURRENT_CONTEXT), + _file(NULL), _line(0) + { + LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); + } + + COMException(HRESULT hr, const String& obj, const char* file, int line) + : super(hr), + _context(CURRENT_CONTEXT), + _file(file), _line(line) + { + LOG(toString()); + LOG(CURRENT_CONTEXT.getStackTrace()); + } + + String toString() const; + + Context _context; + + const char* _file; + int _line; +}; + +#define THROW_EXCEPTION(hr) throw COMException(hr, __FILE__, __LINE__) +#define CHECKERROR(hr) ((void)(FAILED(hr)? THROW_EXCEPTION(hr): 0)) + + +#ifdef _NO_COMUTIL + +inline void CheckError(HRESULT hr) +{ + if (FAILED(hr)) + throw COMException(hr); +} + +#endif + + + /// COM Initialisation + +struct ComInit +{ + ComInit() + { + CHECKERROR(CoInitialize(0)); + } + +#if (_WIN32_WINNT>=0x0400) || defined(_WIN32_DCOM) + ComInit(DWORD flag) + { + CHECKERROR(CoInitializeEx(0, flag)); + } +#endif + + ~ComInit() + { + CoUninitialize(); + } +}; + + + /// OLE initialisation for drag drop support + +struct OleInit +{ + OleInit() + { + CHECKERROR(OleInitialize(0)); + } + + ~OleInit() + { + OleUninitialize(); + } +}; + + + /// Exception Handler for COM exceptions + +extern void HandleException(COMException& e, HWND hwnd); + + + /// We use a common IMalloc object for all shell memory allocations. + +struct CommonShellMalloc +{ + CommonShellMalloc() + { + _p = NULL; + } + + void init() + { + if (!_p) + CHECKERROR(SHGetMalloc(&_p)); + } + + ~CommonShellMalloc() + { + if (_p) + _p->Release(); + } + + operator IMalloc*() + { + return _p; + } + + IMalloc* _p; +}; + + + /// wrapper class for IMalloc with usage of common allocator + +struct ShellMalloc +{ + ShellMalloc() + { + // initialize s_cmn_shell_malloc + s_cmn_shell_malloc.init(); + } + + IMalloc* operator->() + { + return s_cmn_shell_malloc; + } + + static CommonShellMalloc s_cmn_shell_malloc; +}; + + + /// wrapper template class for pointers to shell objects managed by IMalloc + +template struct SShellPtr +{ + ~SShellPtr() + { + _malloc->Free(_p); + } + + T* operator->() + { + return _p; + } + + T const* operator->() const + { + return _p; + } + + operator T const *() const + { + return _p; + } + + const T& operator*() const + { + return *_p; + } + + T& operator*() + { + return *_p; + } + +protected: + SShellPtr() + : _p(0) + { + } + + SShellPtr(T* p) + : _p(p) + { + } + + void Free() + { + _malloc->Free(_p); + _p = NULL; + } + + T* _p; + mutable ShellMalloc _malloc; // IMalloc memory management object + +private: + // disallow copying of SShellPtr objects + SShellPtr(const SShellPtr&) {} + void operator=(SShellPtr const&) {} +}; + + + /// wrapper class for COM interface pointers + +template struct SIfacePtr +{ + SIfacePtr() + : _p(0) + { + } + + SIfacePtr(T* p) + : _p(p) + { + if (p) + p->AddRef(); + } + + SIfacePtr(IUnknown* unknown, REFIID riid) + { + CHECKERROR(unknown->QueryInterface(riid, (LPVOID*)&_p)); + } + + ~SIfacePtr() + { + Free(); + } + + T* operator->() + { + return _p; + } + + const T* operator->() const + { + return _p; + } + +/* not GCC compatible + operator const T*() const + { + return _p; + } */ + + operator T*() + { + return _p; + } + + T** operator&() + { + return &_p; + } + + bool empty() const //NOTE: GCC seems not to work correctly when defining operator bool() AND operator T*() at one time + { + return !_p; + } + + SIfacePtr& operator=(T* p) + { + Free(); + + if (p) { + p->AddRef(); + _p = p; + } + + return *this; + } + + void operator=(SIfacePtr const& o) + { + T* h = _p; + + if (o._p) + o._p->AddRef(); + + _p = o._p; + + if (h) + h->Release(); + } + + HRESULT CreateInstance(REFIID clsid, REFIID riid) + { + return CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&_p); + } + + template HRESULT QueryInterface(REFIID riid, I* p) + { + return _p->QueryInterface(riid, (LPVOID*)p); + } + + T* get() + { + return _p; + } + + void Free() + { + T* h = _p; + _p = NULL; + + if (h) + h->Release(); + } + +protected: + SIfacePtr(const SIfacePtr& o) + : _p(o._p) + { + if (_p) + _p->AddRef(); + } + + T* _p; +}; + + +struct NOVTABLE ComSrvObject // NOVTABLE erlaubt, da protected Destruktor +{ +protected: + ComSrvObject() : _ref(1) {} + virtual ~ComSrvObject() {} + + ULONG _ref; +}; + +struct SimpleComObject : public ComSrvObject +{ + ULONG IncRef() {return ++_ref;} + ULONG DecRef() {ULONG ref=--_ref; if (!ref) {_ref++; delete this;} return ref;} +}; + + + // server object interfaces + +template struct IComSrvQI : public BASE +{ + IComSrvQI(REFIID uuid_base) + : _uuid_base(uuid_base) + { + } + + STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv) + { + *ppv = NULL; + + if (IsEqualIID(riid, _uuid_base) || IsEqualIID(riid, IID_IUnknown)) + {*ppv=static_cast(this); this->AddRef(); return S_OK;} + + return E_NOINTERFACE; + } + +protected: + IComSrvQI() {} + virtual ~IComSrvQI() {} + + REFIID _uuid_base; +}; + +template<> struct IComSrvQI : public IUnknown +{ + STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv) + { + *ppv = NULL; + + if (IsEqualIID(riid, IID_IUnknown)) + {*ppv=this; AddRef(); return S_OK;} + + return E_NOINTERFACE; + } + +protected: + IComSrvQI() {} + virtual ~IComSrvQI() {} +}; + + +template + class IComSrvBase : public IComSrvQI +{ + typedef IComSrvQI super; + +protected: + IComSrvBase(REFIID uuid_base) + : super(uuid_base) + { + } + +public: + STDMETHODIMP_(ULONG) AddRef() {return static_cast(this)->IncRef();} + STDMETHODIMP_(ULONG) Release() {return static_cast(this)->DecRef();} +}; + + + +struct ShellFolder; + + + /// caching of desktop ShellFolder object + +struct CommonDesktop +{ + CommonDesktop() + { + _desktop = 0; + } + + ~CommonDesktop(); + + void init(); + + operator ShellFolder&() + { + return *_desktop; + } + +protected: + ShellFolder* _desktop; +}; + + +#ifndef _NO_COMUTIL // _com_ptr available? + + /// IShellFolder smart pointer +struct ShellFolder : public IShellFolderPtr // IShellFolderPtr uses intrinsic extensions of the VC++ compiler. +{ + typedef IShellFolderPtr super; + + ShellFolder(); // desktop folder + ShellFolder(IShellFolder* p); + ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl); + ShellFolder(LPCITEMIDLIST pidl); + + void attach(IShellFolder* parent, LPCITEMIDLIST pidl); + String get_name(LPCITEMIDLIST pidl=NULL, SHGDNF flags=SHGDN_NORMAL) const; + + bool empty() const {return !operator bool();} //NOTE: see SIfacePtr::empty() +}; + +#ifdef UNICODE +#define IShellLinkPtr IShellLinkWPtr +#else +#define IShellLinkPtr IShellLinkAPtr +#endif + + /// IShellLink smart pointer +struct ShellLinkPtr : public IShellLinkPtr +{ + typedef IShellLinkPtr super; + + ShellLinkPtr(IShellLink* p) + : super(p) + { + p->AddRef(); + } + + bool empty() const {return !operator bool();} //NOTE: see SIfacePtr::empty() +}; + +#else // _com_ptr not available -> use SIfacePtr + + /// IShellFolder smart pointer +struct ShellFolder : public SIfacePtr +{ + typedef SIfacePtr super; + + ShellFolder(); + ShellFolder(IShellFolder* p); + ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl); + ShellFolder(LPCITEMIDLIST pidl); + + void attach(IShellFolder* parent, LPCITEMIDLIST pidl); + String get_name(LPCITEMIDLIST pidl, SHGDNF flags=SHGDN_NORMAL) const; +}; + + /// IShellLink smart pointer +struct ShellLinkPtr : public SIfacePtr +{ + typedef SIfacePtr super; + + ShellLinkPtr(IShellLink* p) + : super(p) + { + _p->AddRef(); + } + +}; + +#endif + + +extern ShellFolder& GetDesktopFolder(); + + +#ifdef UNICODE +#define path_from_pidl path_from_pidlW +#else +#define path_from_pidl path_from_pidlA +#endif + +extern HRESULT path_from_pidlA(IShellFolder* folder, LPCITEMIDLIST pidl, LPSTR buffer, int len); +extern HRESULT path_from_pidlW(IShellFolder* folder, LPCITEMIDLIST pidl, LPWSTR buffer, int len); +extern HRESULT name_from_pidl(IShellFolder* folder, LPCITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags); + + + // ILGetSize() was missing in previous versions of MinGW and is not exported from shell32.dll on Windows 2000. +extern "C" UINT ILGetSize_local(LPCITEMIDLIST pidl); +#define ILGetSize ILGetSize_local + +#if 0 +#ifdef UNICODE // CFSTR_FILENAME was defined wrong in previous versions of MinGW. +#define CFSTR_FILENAMEW TEXT("FileNameW") +#undef CFSTR_FILENAME +#define CFSTR_FILENAME CFSTR_FILENAMEW +#endif +#endif + + + /// wrapper class for item ID lists + +struct ShellPath : public SShellPtr +{ + typedef SShellPtr super; + + ShellPath() + { + } + + ShellPath(IShellFolder* folder, LPCWSTR path) + { + CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCWSTR)"); + + if (path) + CHECKERROR(folder->ParseDisplayName(0, NULL, (LPOLESTR)path, NULL, &_p, NULL)); + else + _p = NULL; + } + + ShellPath(LPCWSTR path) + { + OBJ_CONTEXT("ShellPath::ShellPath(LPCWSTR)", path); + + if (path) + CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, NULL, (LPOLESTR)path, NULL, &_p, NULL)); + else + _p = NULL; + } + + ShellPath(IShellFolder* folder, LPCSTR path) + { + CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCSTR)"); + + WCHAR b[MAX_PATH]; + + if (path) { + MultiByteToWideChar(CP_ACP, 0, path, -1, b, COUNTOF(b)); + CHECKERROR(folder->ParseDisplayName(0, NULL, b, NULL, &_p, NULL)); + } else + _p = NULL; + } + + ShellPath(LPCSTR path) + { + CONTEXT("ShellPath::ShellPath(LPCSTR)"); + + WCHAR b[MAX_PATH]; + + if (path) { + MultiByteToWideChar(CP_ACP, 0, path, -1, b, COUNTOF(b)); + CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, NULL, b, NULL, &_p, NULL)); + } else + _p = NULL; + } + + ShellPath(const ShellPath& o) + : super(NULL) + { + //CONTEXT("ShellPath::ShellPath(const ShellPath&)"); + + if (o._p) { + int l = ILGetSize(o._p); + _p = (ITEMIDLIST*) _malloc->Alloc(l); + if (_p) memcpy(_p, o._p, l); + } + } + + explicit ShellPath(LPITEMIDLIST p) + : super(p) + { + } + + ShellPath(LPCITEMIDLIST p) + { + //CONTEXT("ShellPath::ShellPath(LPCITEMIDLIST)"); + + if (p) { + int l = ILGetSize(p); + _p = (ITEMIDLIST*) _malloc->Alloc(l); + if (_p) memcpy(_p, p, l); + } + } + + void operator=(const ShellPath& o) + { + //CONTEXT("ShellPath::operator=(const ShellPath&)"); + + ITEMIDLIST* h = _p; + + if (o._p) { + int l = ILGetSize(o._p); + + _p = (ITEMIDLIST*) _malloc->Alloc(l); + if (_p) memcpy(_p, o._p, l); + } + else + _p = NULL; + + _malloc->Free(h); + } + + void operator=(ITEMIDLIST* p) + { + //CONTEXT("ShellPath::operator=(ITEMIDLIST*)"); + + ITEMIDLIST* h = _p; + + if (p) { + int l = ILGetSize(p); + _p = (ITEMIDLIST*) _malloc->Alloc(l); + if (_p) memcpy(_p, p, l); + } + else + _p = NULL; + + _malloc->Free(h); + } + + void operator=(const SHITEMID& o) + { + ITEMIDLIST* h = _p; + + LPBYTE p = (LPBYTE)_malloc->Alloc(o.cb+2); + if (p) *(PWORD)((LPBYTE)memcpy(p, &o, o.cb)+o.cb) = 0; + _p = (ITEMIDLIST*)p; + + _malloc->Free(h); + } + + void operator+=(const SHITEMID& o) + { + int l0 = ILGetSize(_p); + LPBYTE p = (LPBYTE)_malloc->Alloc(l0+o.cb); + int l = l0 - 2; + + if (p) { + memcpy(p, _p, l); + *(PWORD)((LPBYTE)memcpy(p+l, &o, o.cb)+o.cb) = 0; + } + + _malloc->Free(_p); + _p = (ITEMIDLIST*)p; + } + + void assign(LPCITEMIDLIST pidl, size_t size) + { + //CONTEXT("ShellPath::assign(LPCITEMIDLIST, size_t)"); + + ITEMIDLIST* h = _p; + + _p = (ITEMIDLIST*) _malloc->Alloc(size+sizeof(USHORT/*SHITEMID::cb*/)); + + if (_p) { + memcpy(_p, pidl, size); + ((ITEMIDLIST*)((LPBYTE)_p+size))->mkid.cb = 0; // terminator + } + + _malloc->Free(h); + } + + void assign(LPCITEMIDLIST pidl) + { + //CONTEXT("ShellPath::assign(LPCITEMIDLIST)"); + + ITEMIDLIST* h = _p; + + if (pidl) { + int l = ILGetSize(pidl); + _p = (ITEMIDLIST*) _malloc->Alloc(l); + if (_p) memcpy(_p, pidl, l); + } else + _p = NULL; + + _malloc->Free(h); + } + + void split(ShellPath& parent, ShellPath& obj) const; + + void GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd=0, ShellFolder& sf=GetDesktopFolder()); + + ShellFolder get_folder() + { + return ShellFolder(_p); + } + + ShellFolder get_folder(IShellFolder* parent) + { + CONTEXT("ShellPath::get_folder()"); + return ShellFolder(parent, _p); + } + + // convert an item id list from relative to absolute (=relative to the desktop) format + ShellPath create_absolute_pidl(LPCITEMIDLIST parent_pidl) const; +}; + + +#if defined(__WINE__) && defined(NONAMELESSUNION) // Wine doesn't know of unnamed union members and uses some macros instead. +#define UNION_MEMBER(x) DUMMYUNIONNAME.##x +#else +#define UNION_MEMBER(x) x +#endif + + + // encapsulation of STRRET structure for easy string retrieval with conversion + +#ifdef UNICODE +#define StrRet StrRetW +//#define tcscpyn wcscpyn +#else +#define StrRet StrRetA +//#define tcscpyn strcpyn +#endif + +//extern LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count); +//extern LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count); + + /// easy retrieval of multi byte strings out of STRRET structures +struct StrRetA : public STRRET +{ + ~StrRetA() + { + if (uType == STRRET_WSTR) + ShellMalloc()->Free(pOleStr); + } + + void GetString(const SHITEMID& shiid, LPSTR b, int l) + { + switch(uType) { + case STRRET_WSTR: + WideCharToMultiByte(CP_ACP, 0, UNION_MEMBER(pOleStr), -1, b, l, NULL, NULL); + break; + + case STRRET_OFFSET: + lstrcpynA(b, (LPCSTR)&shiid+UNION_MEMBER(uOffset), l); + break; + + case STRRET_CSTR: + lstrcpynA(b, UNION_MEMBER(cStr), l); + } + } +}; + + /// easy retrieval of wide char strings out of STRRET structures +struct StrRetW : public STRRET +{ + ~StrRetW() + { + if (uType == STRRET_WSTR) + ShellMalloc()->Free(pOleStr); + } + + void GetString(const SHITEMID& shiid, LPWSTR b, int l) + { + switch(uType) { + case STRRET_WSTR: + lstrcpynW(b, UNION_MEMBER(pOleStr), l); + break; + + case STRRET_OFFSET: + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&shiid+UNION_MEMBER(uOffset), -1, b, l); + break; + + case STRRET_CSTR: + MultiByteToWideChar(CP_ACP, 0, UNION_MEMBER(cStr), -1, b, l); + } + } +}; + + + /// Retrieval of file system paths of ShellPath objects +class FileSysShellPath : public ShellPath +{ + TCHAR _fullpath[MAX_PATH]; + +protected: + FileSysShellPath() {_fullpath[0] = '\0';} + +public: + FileSysShellPath(const ShellPath& o) : ShellPath(o) {_fullpath[0] = '\0';} + + operator LPCTSTR() {if (!SHGetPathFromIDList(_p, _fullpath)) return NULL; return _fullpath;} +}; + + + /// Browse dialog operating on shell namespace +struct FolderBrowser : public FileSysShellPath +{ + FolderBrowser(HWND owner, UINT flags, LPCTSTR title, LPCITEMIDLIST root=0) + { + _displayname[0] = '\0'; + _browseinfo.hwndOwner = owner; + _browseinfo.pidlRoot = root; + _browseinfo.pszDisplayName = _displayname; + _browseinfo.lpszTitle = title; + _browseinfo.ulFlags = flags; + _browseinfo.lpfn = 0; + _browseinfo.lParam = 0; + _browseinfo.iImage = 0; + + _p = SHBrowseForFolder(&_browseinfo); + } + + LPCTSTR GetDisplayName() + { + return _displayname; + } + + bool IsOK() + { + return _p != 0; + } + +private: + BROWSEINFO _browseinfo; + TCHAR _displayname[MAX_PATH]; +}; + + + /// Retrieval of special shell folder paths +struct SpecialFolderPath : public ShellPath +{ + SpecialFolderPath(int folder, HWND hwnd) + { + HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p); + CHECKERROR(hr); + } +}; + + /// Shell folder path of the desktop +struct DesktopFolderPath : public SpecialFolderPath +{ + DesktopFolderPath() + : SpecialFolderPath(CSIDL_DESKTOP, 0) + { + } +}; + + /// Retrieval of special shell folder +struct SpecialFolder : public ShellFolder +{ + SpecialFolder(int folder, HWND hwnd) + : ShellFolder(GetDesktopFolder(), SpecialFolderPath(folder, hwnd)) + { + } +}; + + /// Shell folder of the desktop +struct DesktopFolder : public ShellFolder +{ +}; + + + /// file system path of special folder +struct SpecialFolderFSPath +{ + SpecialFolderFSPath(int folder/*e.g. CSIDL_DESKTOP*/, HWND hwnd); + + operator LPCTSTR() + { + return _fullpath; + } + +protected: + TCHAR _fullpath[MAX_PATH]; +}; + +/* + /// file system path of special folder +struct SpecialFolderFSPath : public FileSysShellPath +{ + SpecialFolderFSPath(int folder, HWND hwnd) + { + CONTEXT("SpecialFolderFSPath::SpecialFolderFSPath()"); + + HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p); + CHECKERROR(hr); + } +}; +*/ + + + /// wrapper class for enumerating shell namespace objects + +struct ShellItemEnumerator : public SIfacePtr +{ + ShellItemEnumerator(IShellFolder* folder, DWORD flags=SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN) + { + CONTEXT("ShellItemEnumerator::ShellItemEnumerator()"); + + CHECKERROR(folder->EnumObjects(0, flags, &_p)); + } +}; + + + /// list of PIDLs +struct PIDList +{ + PIDList() + { + memset(&_stgm, 0, sizeof(STGMEDIUM)); + } + + ~PIDList() + { + if (_stgm.hGlobal) { + GlobalUnlock(_stgm.hGlobal); + ReleaseStgMedium(&_stgm); + } + } + + HRESULT GetData(IDataObject* selection) + { + static UINT CF_IDLIST = RegisterClipboardFormat(CFSTR_SHELLIDLIST); + + FORMATETC fetc; + fetc.cfFormat = CF_IDLIST; + fetc.ptd = NULL; + fetc.dwAspect = DVASPECT_CONTENT; + fetc.lindex = -1; + fetc.tymed = TYMED_HGLOBAL; + + HRESULT hr = selection->QueryGetData(&fetc); + if (FAILED(hr)) + return hr; + + hr = selection->GetData(&fetc, &_stgm); + if (FAILED(hr)) + return hr; + + _pIDList = (LPIDA)GlobalLock(_stgm.hGlobal); + + return hr; + } + + operator LPIDA() {return _pIDList;} + +protected: + STGMEDIUM _stgm; + LPIDA _pIDList; +}; + + +struct CtxMenuInterfaces +{ + CtxMenuInterfaces() + { + reset(); + } + + void reset(); + bool HandleMenuMsg(UINT nmsg, WPARAM wparam, LPARAM lparam); + IContextMenu* query_interfaces(IContextMenu* pcm1); + + IContextMenu2* _pctxmenu2; + +#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005) + IContextMenu3* _pctxmenu3; +#endif +}; + +template struct ExtContextMenuHandlerT + : public BASE +{ + typedef BASE super; + + ExtContextMenuHandlerT(HWND hwnd) + : super(hwnd) + { + } + + template ExtContextMenuHandlerT(HWND hwnd, const PARA& info) + : super(hwnd, info) + { + } + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case WM_DRAWITEM: + case WM_MEASUREITEM: + if (!wparam) // Is the message menu-related? + if (_cm_ifs.HandleMenuMsg(nmsg, wparam, lparam)) + return TRUE; + + break; + + case WM_INITMENUPOPUP: + if (_cm_ifs.HandleMenuMsg(nmsg, wparam, lparam)) + return 0; + + break; + +#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005) + case WM_MENUCHAR: // only supported by IContextMenu3 + if (_cm_ifs._pctxmenu3) { + LRESULT lResult = 0; + + _cm_ifs._pctxmenu3->HandleMenuMsg2(nmsg, wparam, lparam, &lResult); + + return lResult; + } + + return 0; +#endif + } + + return super::WndProc(nmsg, wparam, lparam); + } + +protected: + CtxMenuInterfaces _cm_ifs; +}; + + +extern HRESULT ShellFolderContextMenu(IShellFolder* shell_folder, HWND hwndParent, int cidl, + LPCITEMIDLIST* ppidl, int x, int y, CtxMenuInterfaces& cm_ifs); diff --git a/reactos/base/shell/explorer/utility/shelltests.cpp b/reactos/base/shell/explorer/utility/shelltests.cpp new file mode 100644 index 00000000000..4984b6c7e5d --- /dev/null +++ b/reactos/base/shell/explorer/utility/shelltests.cpp @@ -0,0 +1,140 @@ +/* + * Copyright 2003 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // shelltests.cpp + // + // Examples for usage of shellclasses.cpp, shellclasses.h + // + // Martin Fuchs, 20.07.2003 + // + + +//#define WIN32_LEAN_AND_MEAN +//#define WIN32_EXTRA_LEAN +//#include + +#include "utility.h" // for String +#include "shellclasses.h" + + +static void dump_shell_namespace(ShellFolder& folder) +{ + ShellItemEnumerator enumerator(folder, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN|SHCONTF_SHAREABLE|SHCONTF_STORAGE); + + LPITEMIDLIST pidl; + HRESULT hr = S_OK; + + do { + ULONG cnt = 0; + + HRESULT hr = enumerator->Next(1, &pidl, &cnt); + + if (!SUCCEEDED(hr)) + break; + + if (hr == S_FALSE) // no more entries? + break; + + if (pidl) { + ULONG attribs = -1; + + HRESULT hr = folder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &attribs); + + if (SUCCEEDED(hr)) { + if (attribs == -1) + attribs = 0; + + const String& name = folder.get_name(pidl); + + if (attribs & (SFGAO_FOLDER|SFGAO_HASSUBFOLDER)) + cout << "folder: "; + else + cout << "file: "; + + cout << "\"" << name << "\"\n attribs=" << hex << attribs << endl; + } + } + } while(SUCCEEDED(hr)); +} + + +int main() +{ + // initialize COM + ComInit usingCOM; + + + HWND hwnd = 0; + + + try { + + // example for retrieval of special folder paths + + SpecialFolderFSPath programs(CSIDL_PROGRAM_FILES, hwnd); + SpecialFolderFSPath autostart(CSIDL_STARTUP, hwnd); + + cout << "program files path = " << (LPCTSTR)programs << endl; + cout << "autostart folder path = " << (LPCTSTR)autostart << endl; + + cout << endl; + + + // example for enumerating shell namespace objects + + cout << "Desktop:\n"; + dump_shell_namespace(GetDesktopFolder()); + cout << endl; + + cout << "C:\\\n"; + dump_shell_namespace(ShellPath("C:\\").get_folder()); + cout << endl; + + + // example for calling a browser dialog for the whole desktop + + FolderBrowser desktop_browser(hwnd, + BIF_RETURNONLYFSDIRS|BIF_EDITBOX|BIF_NEWDIALOGSTYLE, + TEXT("Please select the path:")); + + if (desktop_browser.IsOK()) + MessageBox(hwnd, desktop_browser, TEXT("Your selected path"), MB_OK); + + + // example for calling a rooted browser dialog + + ShellPath browseRoot("C:\\"); + FolderBrowser rooted_browser(hwnd, + BIF_RETURNONLYFSDIRS|BIF_EDITBOX|BIF_VALIDATE, + TEXT("Please select the path:"), + browseRoot); + + if (rooted_browser.IsOK()) + MessageBox(hwnd, rooted_browser, TEXT("Your selected path"), MB_OK); + + } catch(COMException& e) { + + //HandleException(e, hwnd); + cerr << e.ErrorMessage() << endl; + + } + + return 0; +} diff --git a/reactos/base/shell/explorer/utility/splitpath.c b/reactos/base/shell/explorer/utility/splitpath.c new file mode 100644 index 00000000000..157bed49107 --- /dev/null +++ b/reactos/base/shell/explorer/utility/splitpath.c @@ -0,0 +1,151 @@ +/* + * Copyright 2000 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "utility.h" + +#ifdef UNICODE + +void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext) +{ + const WCHAR* end; /* end of processed string */ + const WCHAR* p; /* search pointer */ + const WCHAR* s; /* copy pointer */ + + /* extract drive name */ + if (path[0] && path[1]==':') { + if (drv) { + *drv++ = *path++; + *drv++ = *path++; + *drv = L'\0'; + } + } else if (drv) + *drv = L'\0'; + + /* search for end of string or stream separator */ + for(end=path; *end && *end!=L':'; ) + end++; + + /* search for begin of file extension */ + for(p=end; p>path && *--p!=L'\\' && *p!=L'/'; ) + if (*p == L'.') { + end = p; + break; + } + + if (ext) + for(s=end; *ext=*s++; ) + ext++; + + /* search for end of directory name */ + for(p=end; p>path; ) + if (*--p=='\\' || *p=='/') { + p++; + break; + } + + if (name) { + for(s=p; spath && *--p!='\\' && *p!='/'; ) + if (*p == '.') { + end = p; + break; + } + + if (ext) + for(s=end; (*ext=*s++); ) + ext++; + + /* search for end of directory name */ + for(p=end; p>path; ) + if (*--p=='\\' || *p=='/') { + p++; + break; + } + + if (name) { + for(s=p; scfFormat == CF_HDROP && medium.tymed == TYMED_HGLOBAL) + { + HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal); + if (hDrop != NULL) + { + TCHAR szFileName[MAX_PATH]; + + UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); + + for(UINT i = 0; i < cFiles; ++i) + { + DragQueryFile(hDrop, i, szFileName, sizeof(szFileName)); + + if (DROPEFFECT_COPY & *pdwEffect) + { + // copy the file or dir + + ///@todo Add the code to handle Copy + + } + else if (DROPEFFECT_MOVE & *pdwEffect) + { + // move the file or dir + + ///@todo Add the code to handle Move + + } + } + //DragFinish(hDrop); // base class calls ReleaseStgMedium + } + GlobalUnlock(medium.hGlobal); + } + + TreeView_SelectDropTarget(m_hTargetWnd, NULL); + + return true; //let base free the medium + } + + virtual HRESULT STDMETHODCALLTYPE DragOver( + /* [in] */ DWORD grfKeyState, + /* [in] */ POINTL pt, + /* [out][in] */ DWORD __RPC_FAR *pdwEffect) + { + TVHITTESTINFO hit; + hit.pt = (POINT&)pt; + ScreenToClient(m_hTargetWnd, &hit.pt); + hit.flags = TVHT_ONITEM; + HTREEITEM hItem = TreeView_HitTest(m_hTargetWnd,&hit); + + if (hItem != NULL) + TreeView_SelectDropTarget(m_hTargetWnd, hItem); + + return IDropTargetImpl::DragOver(grfKeyState, pt, pdwEffect); + } + + virtual HRESULT STDMETHODCALLTYPE DragLeave(void) + { + TreeView_SelectDropTarget(m_hTargetWnd, NULL); + + return IDropTargetImpl::DragLeave(); + } +}; diff --git a/reactos/base/shell/explorer/utility/utility.cpp b/reactos/base/shell/explorer/utility/utility.cpp new file mode 100644 index 00000000000..825e5370e35 --- /dev/null +++ b/reactos/base/shell/explorer/utility/utility.cpp @@ -0,0 +1,534 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // utility.cpp + // + // Martin Fuchs, 23.07.2003 + // + + +#include + +//#include + +#include +#include + + +DWORD WINAPI Thread::ThreadProc(void* para) +{ + Thread* pThis = (Thread*) para; + + int ret = pThis->Run(); + + pThis->_alive = false; + + return ret; +} + + +void CenterWindow(HWND hwnd) +{ + RECT rt, prt; + GetWindowRect(hwnd, &rt); + + DWORD style; + HWND owner = 0; + + for(HWND wh=hwnd; (wh=GetWindow(wh,GW_OWNER))!=0; ) + if (((style=GetWindowStyle(wh))&WS_VISIBLE) && !(style&WS_MINIMIZE)) + {owner=wh; break;} + + if (owner) + GetWindowRect(owner, &prt); + else + SystemParametersInfo(SPI_GETWORKAREA, 0, &prt, 0); //@@ GetDesktopWindow() wre auch hilfreich. + + SetWindowPos(hwnd, 0, (prt.left+prt.right+rt.left-rt.right)/2, + (prt.top+prt.bottom+rt.top-rt.bottom)/2, 0,0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); + + MoveVisible(hwnd); +} + +void MoveVisible(HWND hwnd) +{ + RECT rc; + GetWindowRect(hwnd, &rc); + int left=rc.left, top=rc.top; + + int xmax = GetSystemMetrics(SM_CXSCREEN); + int ymax = GetSystemMetrics(SM_CYSCREEN); + + if (rc.left < 0) + rc.left = 0; + else if (rc.right > xmax) + if ((rc.left-=rc.right-xmax) < 0) + rc.left = 0; + + if (rc.top < 0) + rc.top = 0; + else if (rc.bottom > ymax) + if ((rc.top-=rc.bottom-ymax) < 0) + rc.top = 0; + + if (rc.left!=left || rc.top!=top) + SetWindowPos(hwnd, 0, rc.left,rc.top, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE); +} + + +void display_error(HWND hwnd, DWORD error) //@@ CONTEXT mit ausgeben -> display_error(HWND hwnd, const Exception& e) +{ + PTSTR msg; + + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, + 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) { + LOG(FmtString(TEXT("display_error(%#x): %s"), error, msg)); + + SetLastError(0); + MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK); + + if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE) + MessageBox(0, msg, TEXT("ROS Explorer"), MB_OK); + } else { + LOG(FmtString(TEXT("Unknown Error %#x"), error)); + + FmtString msg(TEXT("Unknown Error %#x"), error); + + SetLastError(0); + MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK); + + if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE) + MessageBox(0, msg, TEXT("ROS Explorer"), MB_OK); + } + + LocalFree(msg); +} + + +Context Context::s_main("-NO-CONTEXT-"); +Context* Context::s_current = &Context::s_main; + +String Context::toString() const +{ + String str = _ctx; + + if (!_obj.empty()) + str.appendf(TEXT("\nObject: %s"), (LPCTSTR)_obj); + + return str; +} + +String Context::getStackTrace() const +{ + ostringstream str; + + str << "Context Trace:\n"; + + for(const Context*p=this; p && p!=&s_main; p=p->_last) { + str << "- " << p->_ctx; + + if (!p->_obj.empty()) + str << " obj=" << ANS(p->_obj); + + str << '\n'; + } + + return str.str(); +} + + +BOOL time_to_filetime(const time_t* t, FILETIME* ftime) +{ +#ifdef __STDC_WANT_SECURE_LIB__ + SYSTEMTIME stime; + struct tm tm_; + struct tm* tm = &tm_; + + if (gmtime_s(tm, t) != 0) + return FALSE; +#else + struct tm* tm = gmtime(t); + SYSTEMTIME stime; + + if (!tm) + return FALSE; +#endif + + stime.wYear = tm->tm_year+1900; + stime.wMonth = tm->tm_mon+1; + stime.wDayOfWeek = (WORD)-1; + stime.wDay = tm->tm_mday; + stime.wHour = tm->tm_hour; + stime.wMinute = tm->tm_min; + stime.wSecond = tm->tm_sec; + stime.wMilliseconds = 0; + + return SystemTimeToFileTime(&stime, ftime); +} + + +BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow, LPCTSTR parameters) +{ + CONTEXT("launch_file()"); + + HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow); + + if ((int)hinst <= 32) { + display_error(hwnd, GetLastError()); + return FALSE; + } + + return TRUE; +} + +#ifdef UNICODE +BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow, LPCSTR parameters) +{ + HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow); + + if ((int)hinst <= 32) { + display_error(hwnd, GetLastError()); + return FALSE; + } + + return TRUE; +} +#endif + + +/* search for already running instance */ + +static int g_foundPrevInstance = 0; + +static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam) +{ + TCHAR cls[128]; + + GetClassName(hwnd, cls, 128); + + if (!lstrcmp(cls, (LPCTSTR)lparam)) { + g_foundPrevInstance++; + return FALSE; + } + + return TRUE; +} + +/* search for window of given class name to allow only one running instance */ +int find_window_class(LPCTSTR classname) +{ + EnumWindows(EnumWndProc, (LPARAM)classname); + + if (g_foundPrevInstance) + return 1; + + return 0; +} + + +String get_windows_version_str() +{ + OSVERSIONINFOEX osvi = {sizeof(OSVERSIONINFOEX)}; + BOOL osvie_val; + String str; + + if (!(osvie_val = GetVersionEx((OSVERSIONINFO*)&osvi))) { + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + if (!GetVersionEx((OSVERSIONINFO*)&osvi)) + return TEXT("???"); + } + + switch(osvi.dwPlatformId) { + case VER_PLATFORM_WIN32_NT: +#ifdef _ROS_ // This work around can be removed if ReactOS gets a unique version number. + str = TEXT("ReactOS"); +#else + if (osvi.dwMajorVersion <= 4) + str = TEXT("Microsoft Windows NT"); + else if (osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0) + str = TEXT("Microsoft Windows 2000"); + else if (osvi.dwMajorVersion==5 && osvi.dwMinorVersion==1) + str = TEXT("Microsoft Windows XP"); +#endif + + if (osvie_val) { + if (osvi.wProductType == VER_NT_WORKSTATION) { + if (osvi.wSuiteMask & VER_SUITE_PERSONAL) + str += TEXT(" Personal"); + else + str += TEXT(" Professional"); + } else if (osvi.wProductType == VER_NT_SERVER) { + if (osvi.wSuiteMask & VER_SUITE_DATACENTER) + str += TEXT(" DataCenter Server"); + else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) + str += TEXT(" Advanced Server"); + else + str += TEXT(" Server"); + } else if (osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) { + str += TEXT(" Domain Controller"); + } + } else { + TCHAR type[80]; + DWORD dwBufLen; + HKEY hkey; + + if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hkey)) { + RegQueryValueEx(hkey, TEXT("ProductType"), NULL, NULL, (LPBYTE)type, &dwBufLen); + RegCloseKey(hkey); + + if (!_tcsicmp(TEXT("WINNT"), type)) + str += TEXT(" Workstation"); + else if (!_tcsicmp(TEXT("LANMANNT"), type)) + str += TEXT(" Server"); + else if (!_tcsicmp(TEXT("SERVERNT"), type)) + str += TEXT(" Advanced Server"); + } + } + break; + + case VER_PLATFORM_WIN32_WINDOWS: + if (osvi.dwMajorVersion>4 || + (osvi.dwMajorVersion==4 && osvi.dwMinorVersion>0)) { + if (osvi.dwMinorVersion == 90) + str = TEXT("Microsoft Windows ME"); + else + str = TEXT("Microsoft Windows 98"); + + if (osvi.szCSDVersion[1] == 'A') + str += TEXT(" SE"); + } else { + str = TEXT("Microsoft Windows 95"); + + if (osvi.szCSDVersion[1]=='B' || osvi.szCSDVersion[1]=='C') + str += TEXT(" OSR2"); + } + break; + + case VER_PLATFORM_WIN32s: + str = TEXT("Microsoft Win32s"); + + default: + return TEXT("???"); + } + + String vstr; + + if (osvi.dwMajorVersion <= 4) + vstr.printf(TEXT(" Version %d.%d %s Build %d"), + osvi.dwMajorVersion, osvi.dwMinorVersion, + osvi.szCSDVersion, osvi.dwBuildNumber&0xFFFF); + else + vstr.printf(TEXT(" %s (Build %d)"), osvi.szCSDVersion, osvi.dwBuildNumber&0xFFFF); + + return str + vstr; +} + + +typedef void (WINAPI*RUNDLLPROC)(HWND hwnd, HINSTANCE hinst, LPCTSTR cmdline, DWORD nCmdShow); + +BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow) +{ + HMODULE hmod = LoadLibrary(dllname); + if (!hmod) + return FALSE; + +/*TODO + + It is possible to create a Unicode version of the function. + Rundll32 first tries to find a function named EntryPointW. + If it cannot find this function, it tries EntryPointA, then EntryPoint. + To create a DLL that supports ANSI on Windows 95/98/Me and Unicode otherwise, + export two functions: EntryPointW and EntryPoint. +*/ + RUNDLLPROC proc = (RUNDLLPROC)GetProcAddress(hmod, procname); + if (!proc) { + FreeLibrary(hmod); + return FALSE; + } + + proc(hwnd, hmod, cmdline, nCmdShow); + + FreeLibrary(hmod); + + return TRUE; +} + + +#ifdef UNICODE +#define CONTROL_RUNDLL "Control_RunDLLW" +#else +#define CONTROL_RUNDLL "Control_RunDLLA" +#endif + +BOOL launch_cpanel(HWND hwnd, LPCTSTR applet) +{ + //launch_file(_hwnd, applet, SW_SHOWNORMAL); // This would be enough, but we want the to use the most direct and fastest call. + //launch_file(_hwnd, String(TEXT("rundll32.exe /d shell32.dll,Control_RunDLL "))+applet, SW_SHOWNORMAL); + + return RunDLL(hwnd, TEXT("shell32"), CONTROL_RUNDLL, applet, SW_SHOWNORMAL); +} + + +BOOL RecursiveCreateDirectory(LPCTSTR path_in) +{ + TCHAR path[MAX_PATH], hole_path[MAX_PATH]; + + _tcscpy(hole_path, path_in); + + int drv_len = 0; + LPCTSTR d; + + for(d=hole_path; *d && *d!='/' && *d!='\\'; ++d) { + ++drv_len; + + if (*d == ':') + break; + } + + LPTSTR dir = hole_path + drv_len; + + int l; + LPTSTR p = hole_path + (l=_tcslen(hole_path)); + + while(--p>=hole_path && (*p=='/' || *p=='\\')) + *p = '\0'; + + WIN32_FIND_DATA w32fd; + + HANDLE hFind = FindFirstFile(hole_path, &w32fd); + + if (hFind == INVALID_HANDLE_VALUE) { + _tcsncpy(path, hole_path, drv_len); + int i = drv_len; + + for(p=dir; *p=='/'||*p=='\\'; p++) + path[i++] = *p++; + + for(; i + + // Unicode support +#ifdef UNICODE +#define _UNICODE +#endif +#include + +#include // for SelectBrush(), ListBox_SetSel(), SubclassWindow(), ... +#include + +#ifndef _MSC_VER +#include +#endif +#include // for VARIANT + +#include // for alloca() +#include +#include // for _MAX_DIR, ... +#include // for sprintf() +#include + +#ifndef _MAX_PATH +#define _MAX_DRIVE 3 +#define _MAX_FNAME 256 +#define _MAX_DIR _MAX_FNAME +#define _MAX_EXT _MAX_FNAME +#define _MAX_PATH 260 +#endif + +#define W_VER_NT 0 // constant for HIWORD(GetVersion())>>14 + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define for if (0) {} else for + +#ifdef _countof +#define COUNTOF _countof +#else +#define COUNTOF(x) (sizeof(x)/sizeof(x[0])) +#endif + + +#define BUFFER_LEN 2048 + + +extern void _log_(LPCTSTR txt); + +#define LOG(txt) _log_(txt) + + +#ifdef _MSC_VER +#define LONGLONGARG TEXT("I64") +#else +#define LONGLONGARG TEXT("L") +#endif + + +#ifndef _tcsrchr +#ifdef UNICODE +#define _tcsrchr wcsrchr +#else +#define _tcsrchr strrchr +#endif +#endif + +#ifndef _stprintf +#ifdef UNICODE +#define _stprintf wcsprintf +#else +#define _stprintf sprintf +#endif +#endif + +#define U2A(s, d, l) WideCharToMultiByte(CP_ACP, 0, s, -1, d, l, NULL, NULL) +#define U2nA(s, d, l) WideCharToMultiByte(CP_ACP, 0, s, l, d, l, NULL, NULL) +#define A2U(s, d, l) MultiByteToWideChar(CP_ACP, 0, s, -1, d, l) +#define A2nU(s, d, l) MultiByteToWideChar(CP_ACP, 0, s, l, d, l) + + +#ifdef __WINE__ +#ifdef UNICODE +extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext); +#else +extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext); +#endif +#define _tcsnicmp strncasecmp +#define _tcsicoll strcasecmp +#endif + +#ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED +#define FILE_ATTRIBUTE_ENCRYPTED 0x00000040 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#endif + + +#define SetDlgCtrlID(hwnd, id) SetWindowLong(hwnd, GWL_ID, id) +#define SetWindowStyle(hwnd, val) (DWORD)SetWindowLong(hwnd, GWL_STYLE, val) +#define SetWindowExStyle(h, val) (DWORD)SetWindowLong(hwnd, GWL_EXSTYLE, val) +#define Window_SetIcon(hwnd, type, hicon) (HICON)SendMessage(hwnd, WM_SETICON, type, (LPARAM)(hicon)) + + + // center window in respect to its parent window +extern void CenterWindow(HWND hwnd); + + // move window into visibility +extern void MoveVisible(HWND hwnd); + + // display error message +extern void display_error(HWND hwnd, DWORD error); + + // convert time_t to WIN32 FILETIME +extern BOOL time_to_filetime(const time_t* t, FILETIME* ftime); + + // search for windows of a specific classname +extern int find_window_class(LPCTSTR classname); + + // create a directory with all missing parent directories +BOOL RecursiveCreateDirectory(LPCTSTR path_in); + + // read DWORD value from registry +DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def); + + // write DWORD value to registry +BOOL RegSetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD value); + + // test for existing directory +BOOL exists_path(LPCTSTR path); + + +#ifdef __cplusplus +} // extern "C" +#endif + + + // secure CRT functions +#ifdef __STDC_WANT_SECURE_LIB__ // for VS 2005: _MSC_VER>=1400 + +#define _stprintf_s1 _stprintf_s +#define _stprintf_s2 _stprintf_s + +#else // __STDC_WANT_SECURE_LIB__ + +#define strcpy_s(d, l, s) strcpy(d, s) +#define _tcscpy_s(d, l, s) _tcscpy(d, s) +#define wcsncpy_s(d, l, s, n) wcsncpy(d, s, n) +#define _stprintf_s1(b, l, f, p1) _stprintf(b, f, p1) +#define _stprintf_s2(b, l, f, p1,p2) _stprintf(b, f, p1,p2) +#define _tsplitpath_s(f, d,dl, p,pl, n,nl, e,el) _tsplitpath(f, d, p, n, e) + +#endif // __STDC_WANT_SECURE_LIB__ + + +#ifdef __cplusplus + +#ifdef _MSC_VER +#pragma warning(disable: 4786) // disable warnings about too long debug information symbols +#endif + + // STL headers for strings and streams +#include +#include +using namespace std; + + // containers +#include +#include +#include +#include +#include + + +/* not necessary with correct include file order for comdef.h ("\include" path first) +#if _MSC_VER>=1300 // VS.Net +#define _NO_COMUTIL +#endif +*/ + +#if defined(_MSC_VER) && !defined(_NO_COMUTIL) + + // COM utility headers +#include +using namespace _com_util; + +#endif // _MSC_VER && !_NO_COMUTIL + + + // launch a program or document file +extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow=SW_SHOWNORMAL, LPCTSTR parameters=NULL); +#ifdef UNICODE +extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow=SW_SHOWNORMAL, LPCSTR parameters=NULL); +#else +#define launch_fileA launch_file +#endif + + // call an DLL export like rundll32 +extern BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow); + + // launch control panel applet +extern BOOL launch_cpanel(HWND hwnd, LPCTSTR applet); + + + /// initialization of windows common controls +struct CommonControlInit +{ + CommonControlInit(DWORD flags=ICC_LISTVIEW_CLASSES|ICC_TREEVIEW_CLASSES|ICC_BAR_CLASSES|ICC_PROGRESS_CLASS|ICC_COOL_CLASSES) + { + INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), flags}; + + InitCommonControlsEx(&icc); + } +}; + + + /// wait cursor + +struct WaitCursor ///@todo integrate with WM_SETCURSOR to enable multithreaded background tasks as program launching +{ + WaitCursor() + { + _old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); + } + + ~WaitCursor() + { + SetCursor(_old_cursor); + } + +protected: + HCURSOR _old_cursor; +}; + + + /// base of all structures storing a window handle +struct WindowHandle +{ + WindowHandle(HWND hwnd=0) + : _hwnd(hwnd) {} + + operator HWND() const {return _hwnd;} + HWND* operator&() {return &_hwnd;} + +protected: + HWND _hwnd; +}; + + + /// locally hide a window +struct HiddenWindow : public WindowHandle +{ + HiddenWindow(HWND hwnd) + : WindowHandle(IsWindowVisible(hwnd)? hwnd: 0) + { + if (_hwnd) + SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); + } + + ~HiddenWindow() + { + if (_hwnd) + SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER); + } +}; + + + /// critical section wrapper + +struct CritSect : public CRITICAL_SECTION +{ + CritSect() + { + InitializeCriticalSection(this); + } + + ~CritSect() + { + DeleteCriticalSection(this); + } +}; + + + /// Lock protects a code section utilizing a critical section + +struct Lock +{ + Lock(CritSect& crit_sect) + : _crit_sect(crit_sect) + { + EnterCriticalSection(&crit_sect); + } + + ~Lock() + { + LeaveCriticalSection(&_crit_sect); + } + +protected: + CritSect& _crit_sect; +}; + + + /// Thread base class + +struct Thread +{ + Thread() + : _alive(false), + _destroy(false) + { + _hThread = INVALID_HANDLE_VALUE; + _evtFinish = CreateEvent(NULL, TRUE, FALSE, NULL); + } + + virtual ~Thread() + { + Stop(); + + CloseHandle(_evtFinish); + CloseHandle(_hThread); + + if (_destroy) + delete this; + } + + void Start() + { + if (!_alive) { + _alive = true; + _hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL); + } + } + + void Stop() + { + SetEvent(_evtFinish); + + if (_alive) { + { + Lock lock(_crit_sect); + _alive = false; + } + + // wait for finishing + WaitForSingleObject(_hThread, INFINITE); + } + } + + virtual int Run() = 0; + + bool is_alive() const {return _alive;} + + CritSect _crit_sect; + +protected: + static DWORD WINAPI ThreadProc(void* para); + + HANDLE _hThread; + HANDLE _evtFinish; + bool _alive; + bool _destroy; +}; + + + // window utilities + + /// ClientRect retreives the client area rectangle of a window. +struct ClientRect : public RECT +{ + ClientRect(HWND hwnd) + { + GetClientRect(hwnd, this); + } + + operator LPRECT() {return this;} + + POINT& pos() {return *(LPPOINT)this;} +}; + + /// ClientRect retreives the window rectangle of a window. +struct WindowRect : public RECT +{ + WindowRect(HWND hwnd) + { + GetWindowRect(hwnd, this); + } + + operator LPRECT() {return this;} + + POINT& pos() {return *(LPPOINT)this;} +}; + + /// PointL encapsulates the POINT structure into a C++ object. +struct Point : public POINT +{ + Point(LONG x_, LONG y_) + { + x = x_; + y = y_; + } + + // constructor for being used in processing WM_MOUSEMOVE, WM_LBUTTONDOWN, ... messages + Point(LPARAM lparam) + { + x = GET_X_LPARAM(lparam); + y = GET_Y_LPARAM(lparam); + } + + operator LPPOINT() {return this;} +}; + + + /// transform coordinates in a RECT from client to screen coordiantes +inline void ClientToScreen(HWND hwnd, RECT* prect) + {::ClientToScreen(hwnd,(LPPOINT)&prect->left); ::ClientToScreen(hwnd,(LPPOINT)&prect->right);} + + /// transform coordinates in a RECT from screen to client coordiantes +inline void ScreenToClient(HWND hwnd, RECT* prect) + {::ScreenToClient(hwnd,(LPPOINT)&prect->left); ::ScreenToClient(hwnd,(LPPOINT)&prect->right);} + + + /// structure containing information about full screen display of the frame window +struct FullScreenParameters +{ + FullScreenParameters() + : _mode(FALSE) + { + } + + BOOL _mode; + RECT _orgPos; + BOOL _wasZoomed; +}; + + + // drawing utilities + + /// PaintCanvas is a encapsulation of device contexts managed by BeginPaint()/EndPaint(). +struct PaintCanvas : public PAINTSTRUCT +{ + PaintCanvas(HWND hwnd) + : _hwnd(hwnd) + { + BeginPaint(hwnd, this); + } + + ~PaintCanvas() + { + EndPaint(_hwnd, this); + } + + operator HDC() const {return hdc;} + +protected: + HWND _hwnd; +}; + + /// Canvas is a encapsulation of device contexts. +struct Canvas +{ + Canvas(HDC hdc) : _hdc(hdc) {} + + operator HDC() {return _hdc;} + +protected: + HDC _hdc; +}; + + /// WindowCanvas is a encapsulation of client area device contexts. +struct WindowCanvas : public Canvas +{ + WindowCanvas(HWND hwnd) + : Canvas(GetDC(hwnd)), _hwnd(hwnd) {} + + ~WindowCanvas() {ReleaseDC(_hwnd, _hdc);} + +protected: + HWND _hwnd; +}; + + + // double buffering classes + + /// Memory Canvas creates and destroys memory devoce contexts. +struct MemCanvas : public Canvas +{ + MemCanvas(HDC hdc=0) + : Canvas(CreateCompatibleDC(hdc)) {assert(_hdc);} + + ~MemCanvas() {DeleteDC(_hdc);} +}; + + /// SelectedBitmap is used to localy select bitmaps into device contexts. +struct SelectedBitmap +{ + SelectedBitmap(HDC hdc, HBITMAP hbmp) + : _hdc(hdc), _old_hbmp(SelectBitmap(hdc, hbmp)) {} + + ~SelectedBitmap() {DeleteObject(SelectBitmap(_hdc, _old_hbmp));} + +protected: + HDC _hdc; + HBITMAP _old_hbmp; +}; + + /// BufferCanvas manages offscreen bitmaps selected into memory device contexts. +struct BufferCanvas : public MemCanvas +{ + BufferCanvas(HDC hdc, int x, int y, int w, int h) + : MemCanvas(hdc), _hdctarg(hdc), + _x(x), _y(y), _w(w), _h(h), + _bmp(_hdc, CreateCompatibleBitmap(hdc, w, h)) {} + + BufferCanvas(HDC hdc, const RECT& rect) + : MemCanvas(hdc), _hdctarg(hdc), + _x(rect.left), _y(rect.top), _w(rect.right-rect.left), _h(rect.bottom-rect.top), + _bmp(_hdc, CreateCompatibleBitmap(hdc, _w, _h)) {} + +protected: + HDC _hdctarg; + int _x, _y, _w, _h; + SelectedBitmap _bmp; +}; + + /// BufferedCanvas enables double buffering for a device context. +struct BufferedCanvas : public BufferCanvas +{ + BufferedCanvas(HDC hdc, int x, int y, int w, int h, DWORD mode=SRCCOPY) + : BufferCanvas(hdc, x, y, w, h), _mode(mode) {} + + BufferedCanvas(HDC hdc, const RECT& rect, DWORD mode=SRCCOPY) + : BufferCanvas(hdc, rect), _mode(mode) {} + + ~BufferedCanvas() {BitBlt(_hdctarg, _x, _y, _w, _h, _hdc, 0, 0, _mode);} + + DWORD _mode; +}; + + /// BufferedPaintCanvas extends PaintCanvas for double buffering. +struct BufferedPaintCanvas : public PaintCanvas, public BufferedCanvas +{ + BufferedPaintCanvas(HWND hwnd) + : PaintCanvas(hwnd), + BufferedCanvas(PAINTSTRUCT::hdc, 0, 0, rcPaint.right, rcPaint.bottom) + { + } + + operator HDC() {return BufferedCanvas::_hdc;} +}; + + + /// TextColor locally selects a text color for drawing. +struct TextColor +{ + TextColor(HDC hdc, COLORREF color) + : _hdc(hdc), _old_color(SetTextColor(hdc, color)) {} + + ~TextColor() {SetTextColor(_hdc, _old_color);} + +protected: + HDC _hdc; + COLORREF _old_color; +}; + + /// BkMode locally sets the background mode for drawing. +struct BkMode +{ + BkMode(HDC hdc, int bkmode) + : _hdc(hdc), _old_bkmode(SetBkMode(hdc, bkmode)) {} + + ~BkMode() {SetBkMode(_hdc, _old_bkmode);} + +protected: + HDC _hdc; + COLORREF _old_bkmode; +}; + + /// FontSelection locally selects a font for drawing. +struct FontSelection +{ + FontSelection(HDC hdc, HFONT hFont) + : _hdc(hdc), _old_hFont(SelectFont(hdc, hFont)) {} + + ~FontSelection() {SelectFont(_hdc, _old_hFont);} + +protected: + HDC _hdc; + HFONT _old_hFont; +}; + + /// BitmapSelection locally selects a bitmap into a device context. +struct BitmapSelection +{ + BitmapSelection(HDC hdc, HBITMAP hBmp) + : _hdc(hdc), _old_hBmp(SelectBitmap(hdc, hBmp)) {} + + ~BitmapSelection() {SelectBitmap(_hdc, _old_hBmp);} + +protected: + HDC _hdc; + HBITMAP _old_hBmp; +}; + + /// BrushSelection locally selects a brush into a device context. +struct BrushSelection +{ + BrushSelection(HDC hdc, HBRUSH hBrush) + : _hdc(hdc), _old_hBrush(SelectBrush(hdc, hBrush)) {} + + ~BrushSelection() {SelectBrush(_hdc, _old_hBrush);} + +protected: + HDC _hdc; + HBRUSH _old_hBrush; +}; + + + /// Popup Menus +struct PopupMenu +{ + PopupMenu() + : _hmenu(CreatePopupMenu()) + { + } + + PopupMenu(UINT nid); + + operator HMENU() {return _hmenu;} + + void Append(UINT id, LPCTSTR str, UINT flags=MF_STRING) + { + AppendMenu(_hmenu, flags, id, str); + } + + int TrackPopupMenu(HWND hwnd, const POINT& pt, UINT flags=TPM_LEFTBUTTON|TPM_RIGHTBUTTON, LPTPMPARAMS tpm=NULL) { + return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, tpm); + } + + int PopupContextMenu(HWND hwnd, POINTS pos, UINT flags=TPM_LEFTBUTTON|TPM_RIGHTBUTTON) { + POINT pt; POINTSTOPOINT(pt, pos); + return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, NULL); + } + + int TrackPopupMenu(HWND hwnd, POINTS pos, UINT flags=TPM_LEFTBUTTON|TPM_RIGHTBUTTON) { + POINT pt; POINTSTOPOINT(pt, pos); + ClientToScreen(hwnd, &pt); + return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, NULL); + } + + int TrackPopupMenuAtCursor(HWND hwnd, UINT flags=TPM_LEFTBUTTON) { + POINT pt; GetCursorPos(&pt); + return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, NULL); + } + + int TrackPopupMenuAtPos(HWND hwnd, DWORD pos, UINT flags=TPM_LEFTBUTTON) { + return TrackPopupMenuEx(_hmenu, flags, GET_X_LPARAM(pos), GET_Y_LPARAM(pos), hwnd, NULL); + } + +protected: + HMENU _hmenu; +}; + + +struct Variant : public VARIANT +{ + Variant() {VariantInit(this);} + Variant(const VARIANT& var); + Variant(const VARIANT* var); + ~Variant(); + + operator long() const; + operator bool() const; + operator VARIANT_BOOL() const; + operator IDispatch*() const; +}; + + +struct BStr +{ + BStr() + { + _p = NULL; + } + + BStr(const BSTR s) + { + _p = SysAllocString(s); + } + + BStr(LPCSTR s) + { + WCHAR b[BUFFER_LEN]; + + if (s) + _p = SysAllocStringLen(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1); + else + _p = NULL; + } + + BStr(LPCWSTR s) + { + _p = SysAllocString(s); + } + + BStr(const VARIANT& var) + : _p(NULL) + { + assign(var); + } + + ~BStr() + { + SysFreeString(_p); + } + + void assign(BSTR s); + void assign(const VARIANT& var); + + operator BSTR() const + { + return _p? _p: (BSTR)L""; + } + + int length() const + { + return _p? wcslen(_p): 0; + } + +protected: + BSTR _p; +}; + + + /// string class for TCHAR strings +struct String +#ifdef UNICODE + : public wstring +#else + : public string +#endif +{ +#ifdef UNICODE + typedef wstring super; +#else + typedef string super; +#endif + + String() {} + + String(LPCTSTR s) {if (s) super::assign(s);} + String(LPCTSTR s, int l) : super(s, l) {} + + String(const super& other) : super(other) {} + String(const String& other) : super(other) {} + +#ifdef UNICODE + String(LPCSTR s) {assign(s);} + String(LPCSTR s, int l) {assign(s, l);} + String(const string& other) {assign(other.c_str());} + String& operator=(LPCSTR s) {assign(s); return *this;} + void assign(LPCSTR s) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1);} else erase();} + void assign(LPCSTR s, int l) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, BUFFER_LEN));} else erase();} + void assign(const BStr& s) {int l = s.length(); super::assign(s, l);} +#else + String(LPCWSTR s) {assign(s);} + String(LPCWSTR s, int l) {assign(s, l);} + String(const wstring& other) {assign(other.c_str());} + String& operator=(LPCWSTR s) {assign(s); return *this;} + void assign(LPCWSTR s) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, -1, b, BUFFER_LEN, 0, 0)-1);} else erase();} + void assign(LPCWSTR s, int l) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();} + void assign(const BStr& s) {int l = s.length(); if (l) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();} +#endif + String(const BStr& s) {assign(s);} + String& operator=(const BStr& s) {assign(s); return *this;} + + String& operator=(LPCTSTR s) {if (s) super::assign(s); else erase(); return *this;} + String& operator=(const super& s) {super::assign(s); return *this;} + void assign(LPCTSTR s) {super::assign(s);} + void assign(LPCTSTR s, int l) {super::assign(s, l);} + + operator LPCTSTR() const {return c_str();} + +#ifdef UNICODE + operator string() const {char b[BUFFER_LEN]; return string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0)-1);} +#else + operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);} +#endif + + LPTSTR str() {return (LPTSTR)data();} /// return modifyable character string pointer + + String& printf(LPCTSTR fmt, ...) + { + va_list l; + TCHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::assign(b, _vsntprintf(b, COUNTOF(b), fmt, l)); + va_end(l); + + return *this; + } + + String& vprintf(LPCTSTR fmt, va_list l) + { + TCHAR b[BUFFER_LEN]; + + super::assign(b, _vsntprintf(b, COUNTOF(b), fmt, l)); + + return *this; + } + + String& appendf(LPCTSTR fmt, ...) + { + va_list l; + TCHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::append(b, _vsntprintf(b, COUNTOF(b), fmt, l)); + va_end(l); + + return *this; + } + + String& vappendf(LPCTSTR fmt, va_list l) + { + TCHAR b[BUFFER_LEN]; + + super::append(b, _vsntprintf(b, COUNTOF(b), fmt, l)); + + return *this; + } + + void toLower() + { + if (!empty()) + CharLower(str()); + } +}; + +#define _STRING_DEFINED + + +struct FmtString : public String +{ + FmtString(LPCTSTR fmt, ...) + { + va_list l; + + va_start(l, fmt); + vprintf(fmt, l); + va_end(l); + } +}; + + +#ifdef UNICODE + +struct ANS +{ + ANS(LPCWSTR s) + { + int l = wcslen(s) + 1; + _str = (LPSTR) malloc(2*l); + + if (WideCharToMultiByte(CP_ACP, 0, s, -1, _str, 2*l, 0, 0) <= 0) + *_str = '\0'; + } + + ~ANS() + { + free(_str); + } + + operator LPCSTR() {return _str;} + +protected: + LPSTR _str; +}; + +#define UNC(x) ((LPCWSTR)(x)) + +#else + +#define ANS(x) ((LPCSTR)(x)) + +struct UNC +{ + UNC(LPCSTR s) + { + int l = strlen(s) + 1; + _str = (LPWSTR) malloc(2*l); + + if (_str && MultiByteToWideChar(CP_ACP, 0, s, -1, _str, l) <= 0) + *_str = '\0'; + } + + ~UNC() + { + free(_str); + } + + operator LPCWSTR() {return _str;} + +protected: + LPWSTR _str; +}; + +#endif + + + // determine windows version string +String get_windows_version_str(); + + + /// link dynamicly to functions by using GetModuleHandle() and GetProcAddress() +template struct DynamicFct +{ + DynamicFct(LPCTSTR moduleName, UINT ordinal) + { + HMODULE hModule = GetModuleHandle(moduleName); + + _fct = (FCT) GetProcAddress(hModule, (LPCSTR)ordinal); + } + + DynamicFct(LPCTSTR moduleName, LPCSTR name) + { + HMODULE hModule = GetModuleHandle(moduleName); + + _fct = (FCT) GetProcAddress(hModule, name); + } + + FCT operator*() const {return _fct;} + operator bool() const {return _fct? true: false;} + +protected: + FCT _fct; +}; + + + /// link dynamicly to functions by using LoadLibrary() and GetProcAddress() +template struct DynamicLoadLibFct +{ + DynamicLoadLibFct(LPCTSTR moduleName, UINT ordinal) + { + _hModule = LoadLibrary(moduleName); + + _fct = (FCT) GetProcAddress(_hModule, (LPCSTR)ordinal); + } + + DynamicLoadLibFct(LPCTSTR moduleName, LPCSTR name) + { + _hModule = LoadLibrary(moduleName); + + _fct = (FCT) GetProcAddress(_hModule, name); + } + + ~DynamicLoadLibFct() + { + FreeLibrary(_hModule); + } + + FCT operator*() const {return _fct;} + operator bool() const {return _fct? true: false;} + +protected: + HMODULE _hModule; + FCT _fct; +}; + + +struct Context +{ + Context(const char* ctx) + : _ctx(ctx) + { + _last = s_current; + s_current = this; + } + + Context(const char* ctx, LPCSTR obj) + : _ctx(ctx), + _obj(obj) + { + _last = s_current; + s_current = this; + } + + Context(const char* ctx, LPCWSTR obj) + : _ctx(ctx), + _obj(obj) + { + _last = s_current; + s_current = this; + } + + Context(const Context& other) + : _ctx(other._ctx), + _obj(other._obj) + { + _last = NULL; + } + + ~Context() + { + if (_last) { + s_current = _last; + _last = NULL; + } + } + + String toString() const; + String getStackTrace() const; + + const char* _ctx; + String _obj; + + static Context& current() {return *s_current;} + +protected: + Context* _last; + + static Context* s_current; ///@todo use TLS + static Context s_main; +}; + +#define CONTEXT_OBJ __ctx__._obj +#define CONTEXT(c) Context __ctx__(c) +#define CURRENT_CONTEXT Context::current() +#define OBJ_CONTEXT(c, o) Context __ctx__(c, o) + + +extern bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out); + + +#endif // __cplusplus diff --git a/reactos/base/shell/explorer/utility/window.cpp b/reactos/base/shell/explorer/utility/window.cpp new file mode 100644 index 00000000000..1eb43bf8b61 --- /dev/null +++ b/reactos/base/shell/explorer/utility/window.cpp @@ -0,0 +1,1446 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // window.cpp + // + // Martin Fuchs, 23.07.2003 + // + + +#include + +#include "../resource.h" // for ID_GO_BACK, ... + + +WindowClass::WindowClass(LPCTSTR classname, UINT style_, WNDPROC wndproc) +{ + memset(this, 0, sizeof(WNDCLASSEX)); + + cbSize = sizeof(WNDCLASSEX); + style = style_; + hInstance = g_Globals._hInstance; + hCursor = LoadCursor(0, IDC_ARROW); + + lpszClassName = classname; + lpfnWndProc = wndproc; + + _atomClass = 0; +} + + +IconWindowClass::IconWindowClass(LPCTSTR classname, UINT nid, UINT style, WNDPROC wndproc) + : WindowClass(classname, style, wndproc) +{ + hIcon = ResIcon(nid); + hIconSm = SmallIcon(nid); +} + + +Window::WindowMap Window::s_wnd_map; + +Window::CREATORFUNC Window::s_window_creator = NULL; +const void* Window::s_new_info = NULL; + +HHOOK Window::s_hcbtHook = 0; + + +Window::StaticWindowData& Window::GetStaticWindowData() +{ + static StaticWindowData s_initialized_data; + + return s_initialized_data; +} + + +Window::Window(HWND hwnd) + : WindowHandle(hwnd) +{ + Lock lock(GetStaticWindowData()._map_crit_sect); // protect access to s_wnd_map + + s_wnd_map[_hwnd] = this; +} + +Window::~Window() +{ + Lock lock(GetStaticWindowData()._map_crit_sect); // protect access to s_wnd_map + + s_wnd_map.erase(_hwnd); +} + + +HWND Window::Create(CREATORFUNC creator, DWORD dwExStyle, + LPCTSTR lpClassName, LPCTSTR lpWindowName, + DWORD dwStyle, int x, int y, int w, int h, + HWND hwndParent, HMENU hMenu/*, LPVOID lpParam*/) +{ + Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info + + s_window_creator = creator; + s_new_info = NULL; + + return CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, + x, y, w, h, + hwndParent, hMenu, g_Globals._hInstance, 0/*lpParam*/); +} + +HWND Window::Create(CREATORFUNC_INFO creator, const void* info, DWORD dwExStyle, + LPCTSTR lpClassName, LPCTSTR lpWindowName, + DWORD dwStyle, int x, int y, int w, int h, + HWND hwndParent, HMENU hMenu/*, LPVOID lpParam*/) +{ + Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info + + s_window_creator = (CREATORFUNC) creator; + s_new_info = info; + + return CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle, + x, y, w, h, + hwndParent, hMenu, g_Globals._hInstance, 0/*lpParam*/); +} + + +Window* Window::create_mdi_child(const ChildWndInfo& info, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator) +{ + Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info + + s_window_creator = (CREATORFUNC) creator; + s_new_info = &info; + + s_hcbtHook = SetWindowsHookEx(WH_CBT, MDICBTHookProc, 0, GetCurrentThreadId()); + + HWND hwnd = (HWND) SendMessage(info._hmdiclient, WM_MDICREATE, 0, (LPARAM)&mcs); + + UnhookWindowsHookEx(s_hcbtHook); + + Window* child = get_window(hwnd); + s_new_info = NULL; + + if (child && (!hwnd || !child->_hwnd)) + child = NULL; + + return child; +} + +LRESULT CALLBACK Window::MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam) +{ + if (code == HCBT_CREATEWND) { + HWND hwnd = (HWND)wparam; + + // create Window controller and associate it with the window handle + Window* child = get_window(hwnd); + + if (!child) + child = create_controller(hwnd); + } + + return CallNextHookEx(s_hcbtHook, code, wparam, lparam); +} + + +/* +Window* Window::create_property_sheet(PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info) +{ + Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info + + s_window_creator = creator; + s_new_info = info; + + s_hcbtHook = SetWindowsHookEx(WH_CBT, PropSheetCBTHookProc, 0, GetCurrentThreadId()); + + HWND hwnd = (HWND) PropertySheet(ppsd); + + UnhookWindowsHookEx(s_hcbtHook); + + Window* child = get_window(hwnd); + s_new_info = NULL; + + if (child && (!hwnd || !child->_hwnd)) + child = NULL; + + return child; +} +*/ + +LRESULT CALLBACK Window::PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam) +{ + if (code == HCBT_CREATEWND) { + HWND hwnd = (HWND)wparam; + + // create Window controller and associate it with the window handle + Window* child = get_window(hwnd); + + if (!child) + child = create_controller(hwnd); + } + + return CallNextHookEx(s_hcbtHook, code, wparam, lparam); +} + + + /// get window controller from window handle + +Window* Window::get_window(HWND hwnd) +{ + { + Lock lock(GetStaticWindowData()._map_crit_sect); // protect access to s_wnd_map + + WindowMap::const_iterator found = s_wnd_map.find(hwnd); + + if (found!=s_wnd_map.end()) + return found->second; + } + + return NULL; +} + + + /// create controller for a new window + +Window* Window::create_controller(HWND hwnd) +{ + if (s_window_creator) { // protect for recursion and create the window object only for the first window + Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info + + const void* info = s_new_info; + s_new_info = NULL; + + CREATORFUNC window_creator = s_window_creator; + s_window_creator = NULL; + + if (info) + return CREATORFUNC_INFO(window_creator)(hwnd, info); + else + return CREATORFUNC(window_creator)(hwnd); + } + + return NULL; +} + + +LRESULT Window::Init(LPCREATESTRUCT pcs) +{ + return 0; +} + + +LRESULT CALLBACK Window::WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + Window* pThis = get_window(hwnd); + + if (!pThis) + pThis = create_controller(hwnd); + + if (pThis) { + switch(nmsg) { + case WM_COMMAND: + return pThis->Command(LOWORD(wparam), HIWORD(wparam)); + + case WM_NOTIFY: + return pThis->Notify(wparam, (NMHDR*)lparam); + + case WM_NOTIFYFORMAT: + return NFR_CURRENT; + + case WM_CREATE: + return pThis->Init((LPCREATESTRUCT)lparam); + + case WM_NCDESTROY: + delete pThis; + return 0; + + default: + return pThis->WndProc(nmsg, wparam, lparam); + } + } + else + return DefWindowProc(hwnd, nmsg, wparam, lparam); +} + +LRESULT Window::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + return DefWindowProc(_hwnd, nmsg, wparam, lparam); +} + +int Window::Command(int id, int code) +{ + return 1; // no command handler found +} + +int Window::Notify(int id, NMHDR* pnmh) +{ + return 0; +} + +void Window::CancelModes() +{ + PostMessage(HWND_BROADCAST, WM_CANCELMODE, 0, 0); +} + + +SubclassedWindow::SubclassedWindow(HWND hwnd) + : super(hwnd) +{ + _orgWndProc = SubclassWindow(_hwnd, SubclassedWndProc); + + if (!_orgWndProc) + delete this; +} + +LRESULT CALLBACK SubclassedWindow::SubclassedWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + SubclassedWindow* pThis = GET_WINDOW(SubclassedWindow, hwnd); + assert(pThis); + + if (pThis) { + switch(nmsg) { + case WM_COMMAND: + if (!pThis->Command(LOWORD(wparam), HIWORD(wparam))) + return 0; + break; + + case WM_NOTIFY: + return pThis->Notify(wparam, (NMHDR*)lparam); + + case WM_NOTIFYFORMAT: + return NFR_CURRENT; + + case WM_CREATE: + return pThis->Init((LPCREATESTRUCT)lparam); + + case WM_NCDESTROY: + delete pThis; + return 0; + + default: + return pThis->WndProc(nmsg, wparam, lparam); + } + } + + return CallWindowProc(pThis->_orgWndProc, hwnd, nmsg, wparam, lparam); +} + +LRESULT SubclassedWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam); +} + +int SubclassedWindow::Command(int id, int code) +{ + return 1; // no command handler found +} + +int SubclassedWindow::Notify(int id, NMHDR* pnmh) +{ + return CallWindowProc(_orgWndProc, _hwnd, WM_NOTIFY, id, (LPARAM)pnmh); +} + + +ChildWindow::ChildWindow(HWND hwnd, const ChildWndInfo& info) + : super(hwnd), + _hwndFrame(GetParent(info._hmdiclient)) +{ + _focus_pane = 0; + _split_pos = DEFAULT_SPLIT_POS; + _last_split = DEFAULT_SPLIT_POS; +} + + +ChildWindow* ChildWindow::create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator, + LPCTSTR classname, LPCTSTR title, DWORD style) +{ + MDICREATESTRUCT mcs; + + mcs.szClass = classname; + mcs.szTitle = title; + mcs.hOwner = g_Globals._hInstance; + mcs.x = rect.left, + mcs.y = rect.top; + mcs.cx = rect.right - rect.left; + mcs.cy = rect.bottom - rect.top; + mcs.style = style; + mcs.lParam = 0; + + return static_cast(create_mdi_child(info, mcs, creator)); +} + + +LRESULT ChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_PAINT: { + RECT rc; + PaintCanvas canvas(_hwnd); + ClientRect rt(_hwnd); + rt.left = _split_pos-SPLIT_WIDTH/2; + rt.right = _split_pos+SPLIT_WIDTH/2+1; + HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(LTGRAY_BRUSH)); + Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1); + SetRect(&rc, rt.left, rt.top-1, rt.right, rt.bottom+1); + DrawEdge(canvas, &rc, EDGE_RAISED, BF_RECT); + SelectObject(canvas, lastBrush); + break;} + + case WM_SETCURSOR: + if (LOWORD(lparam) == HTCLIENT) { + POINT pt; + GetCursorPos(&pt); + ScreenToClient(_hwnd, &pt); + + if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) { + SetCursor(LoadCursor(0, IDC_SIZEWE)); + return TRUE; + } + } + goto def; + + case WM_SIZE: + if (wparam != SIZE_MINIMIZED) + resize_children(LOWORD(lparam), HIWORD(lparam)); + goto def; + + case WM_GETMINMAXINFO: + DefMDIChildProc(_hwnd, nmsg, wparam, lparam); + + {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam; + + lpmmi->ptMaxTrackSize.x <<= 1; // 2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN + lpmmi->ptMaxTrackSize.y <<= 1; // 2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN + break;} + + case WM_LBUTTONDOWN: { + int x = GET_X_LPARAM(lparam); + + ClientRect rt(_hwnd); + + if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) { + _last_split = _split_pos; + SetCapture(_hwnd); + } + + break;} + + case WM_LBUTTONUP: + if (GetCapture() == _hwnd) + ReleaseCapture(); + break; + + case WM_KEYDOWN: + if (wparam == VK_ESCAPE) + if (GetCapture() == _hwnd) { + _split_pos = _last_split; + ClientRect rt(_hwnd); + resize_children(rt.right, rt.bottom); + _last_split = -1; + ReleaseCapture(); + SetCursor(LoadCursor(0, IDC_ARROW)); + } + break; + + case WM_MOUSEMOVE: + if (GetCapture() == _hwnd) { + int x = GET_X_LPARAM(lparam); + + ClientRect rt(_hwnd); + + if (x>=0 && xCommand(LOWORD(wparam), HIWORD(wparam)); + return TRUE; // message has been processed + + case WM_NOTIFY: + pThis->Notify(wparam, (NMHDR*)lparam); + return TRUE; // message has been processed + + case WM_NOTIFYFORMAT: + SetWindowLong(hwnd, DWLP_MSGRESULT, NFR_CURRENT); // set return value NFR_CURRENT + return TRUE; // message has been processed + + case WM_NCDESTROY: + delete pThis; + return TRUE; // message has been processed + + default: + return pThis->WndProc(nmsg, wparam, lparam); + } + } else if (nmsg == WM_INITDIALOG) { + pThis = create_controller(hwnd); + + if (pThis) + return pThis->Init(NULL); + } + + return FALSE; // message has not been processed +} + +LRESULT Dialog::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + return FALSE; // message has not been processed +} + +int Dialog::Command(int id, int code) +{ + if (code == BN_CLICKED) { + EndDialog(_hwnd, id); + return 0; // message has been processed + } + + return 1; +} + + +ResizeManager::ResizeManager(HWND hwnd) + : _hwnd(hwnd) +{ + ClientRect clnt(hwnd); + _last_size.cx = clnt.right; + _last_size.cy = clnt.bottom; + + WindowRect rect(hwnd); + _min_wnd_size.cx = rect.right - rect.left; + _min_wnd_size.cy = rect.bottom - rect.top; +} + +void ResizeManager::HandleSize(int cx, int cy) +{ + ClientRect clnt_rect(_hwnd); + SIZE new_size = {cx, cy}; + + int dx = new_size.cx - _last_size.cx; + int dy = new_size.cy - _last_size.cy; + + if (!dx && !dy) + return; + + _last_size = new_size; + + HDWP hDWP = BeginDeferWindowPos(size()); + + for(ResizeManager::const_iterator it=begin(); it!=end(); ++it) { + const ResizeEntry& e = *it; + RECT move = {0}; + + if (e._flags & MOVE_LEFT) + move.left += dx; + + if (e._flags & MOVE_RIGHT) + move.right += dx; + + if (e._flags & MOVE_TOP) + move.top += dy; + + if (e._flags & MOVE_BOTTOM) + move.bottom += dy; + + UINT flags = 0; + + if (!move.left && !move.top) + flags = SWP_NOMOVE; + + if (move.right==move.left && move.bottom==move.top) + flags |= SWP_NOSIZE; + + if (flags != (SWP_NOMOVE|SWP_NOSIZE)) { + HWND hwnd = GetDlgItem(_hwnd, e._id); + + if (hwnd) { + WindowRect rect(hwnd); + ScreenToClient(_hwnd, rect); + + rect.left += move.left; + rect.right += move.right; + rect.top += move.top; + rect.bottom += move.bottom; + + hDWP = DeferWindowPos(hDWP, hwnd, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, flags|SWP_NOACTIVATE|SWP_NOZORDER); + } + } + } + + EndDeferWindowPos(hDWP); +} + +void ResizeManager::Resize(int dx, int dy) +{ + ::SetWindowPos(_hwnd, 0, 0, 0, _min_wnd_size.cx+dx, _min_wnd_size.cy+dy, SWP_NOMOVE|SWP_NOACTIVATE); + MoveVisible(_hwnd); + + ClientRect clnt_rect(_hwnd); + HandleSize(clnt_rect.right, clnt_rect.bottom); +} + + +Button::Button(HWND parent, LPCTSTR title, int left, int top, int width, int height, + int id, DWORD flags, DWORD exStyle) + : WindowHandle(CreateWindowEx(exStyle, TEXT("BUTTON"), title, flags, left, top, width, height, + parent, (HMENU)id, g_Globals._hInstance, 0)) +{ +} + + +LRESULT OwnerdrawnButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + if (nmsg == PM_DISPATCH_DRAWITEM) { + DrawItem((LPDRAWITEMSTRUCT)lparam); + return TRUE; + } else + return super::WndProc(nmsg, wparam, lparam); +} + + +Static::Static(HWND parent, LPCTSTR title, int left, int top, int width, int height, + int id, DWORD flags, DWORD exStyle) + : WindowHandle(CreateWindowEx(exStyle, TEXT("STATIC"), title, flags, left, top, width, height, + parent, (HMENU)id, g_Globals._hInstance, 0)) +{ +} + + +static RECT s_MyDrawText_Rect = {0, 0, 0, 0}; + +static BOOL CALLBACK MyDrawText(HDC hdc, LPARAM data, int cnt) +{ + ::DrawText(hdc, (LPCTSTR)data, cnt, &s_MyDrawText_Rect, DT_SINGLELINE); + return TRUE; +} + +void DrawGrayText(HDC hdc, LPRECT pRect, LPCTSTR title, int dt_flags) +{ + COLORREF gray = GetSysColor(COLOR_GRAYTEXT); + + if (gray) { + TextColor lcColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT)); + RECT shadowRect = {pRect->left+1, pRect->top+1, pRect->right+1, pRect->bottom+1}; + DrawText(hdc, title, -1, &shadowRect, dt_flags); + + SetTextColor(hdc, gray); + DrawText(hdc, title, -1, pRect, dt_flags); + } else { + int old_r = pRect->right; + int old_b = pRect->bottom; + + DrawText(hdc, title, -1, pRect, dt_flags|DT_CALCRECT); + + int x = pRect->left + (old_r-pRect->right)/2; + int y = pRect->top + (old_b-pRect->bottom)/2; + int w = pRect->right-pRect->left; + int h = pRect->bottom-pRect->top; + s_MyDrawText_Rect.right = w; + s_MyDrawText_Rect.bottom = h; + + GrayString(hdc, GetSysColorBrush(COLOR_GRAYTEXT), MyDrawText, (LPARAM)title, -1, x, y, w, h); + } +} + + +/* not yet used +void ColorButton::DrawItem(LPDRAWITEMSTRUCT dis) +{ + UINT state = DFCS_BUTTONPUSH; + + if (dis->itemState & ODS_DISABLED) + state |= DFCS_INACTIVE; + + RECT textRect = {dis->rcItem.left+2, dis->rcItem.top+2, dis->rcItem.right-4, dis->rcItem.bottom-4}; + + if (dis->itemState & ODS_SELECTED) { + state |= DFCS_PUSHED; + ++textRect.left; ++textRect.top; + ++textRect.right; ++textRect.bottom; + } + + DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, state); + + TCHAR title[BUFFER_LEN]; + GetWindowText(_hwnd, title, BUFFER_LEN); + + BkMode bk_mode(dis->hDC, TRANSPARENT); + + if (dis->itemState & (ODS_DISABLED|ODS_GRAYED)) + DrawGrayText(dis, &textRect, title, DT_SINGLELINE|DT_VCENTER|DT_CENTER); + else { + TextColor lcColor(dis->hDC, _textColor); + DrawText(dis->hDC, title, -1, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); + } + + if (dis->itemState & ODS_FOCUS) { + RECT rect = { + dis->rcItem.left+3, dis->rcItem.top+3, + dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4 + }; + if (dis->itemState & ODS_SELECTED) { + ++rect.left; ++rect.top; + ++rect.right; ++rect.bottom; + } + DrawFocusRect(dis->hDC, &rect); + } +} +*/ + + +void PictureButton::DrawItem(LPDRAWITEMSTRUCT dis) +{ + UINT state = DFCS_BUTTONPUSH; + int style = GetWindowStyle(_hwnd); + + if (dis->itemState & ODS_DISABLED) + state |= DFCS_INACTIVE; + + POINT imagePos; + RECT textRect; + int dt_flags; + + if (style & BS_BOTTOM) { + // align horizontal centered, vertical floating + imagePos.x = (dis->rcItem.left + dis->rcItem.right - _cx) / 2; + imagePos.y = dis->rcItem.top + 3; + + textRect.left = dis->rcItem.left + 2; + textRect.top = dis->rcItem.top + _cy + 4; + textRect.right = dis->rcItem.right - 4; + textRect.bottom = dis->rcItem.bottom - 4; + + dt_flags = DT_SINGLELINE|DT_CENTER|DT_VCENTER; + } else { + // horizontal floating, vertical centered + imagePos.x = dis->rcItem.left + 3; + imagePos.y = (dis->rcItem.top + dis->rcItem.bottom - _cy)/2; + + textRect.left = dis->rcItem.left + _cx + 4; + textRect.top = dis->rcItem.top + 2; + textRect.right = dis->rcItem.right - 4; + textRect.bottom = dis->rcItem.bottom - 4; + + dt_flags = DT_SINGLELINE|DT_VCENTER/*|DT_CENTER*/; + } + + if (dis->itemState & ODS_SELECTED) { + state |= DFCS_PUSHED; + ++imagePos.x; ++imagePos.y; + ++textRect.left; ++textRect.top; + ++textRect.right; ++textRect.bottom; + } + + if (_flat) { + FillRect(dis->hDC, &dis->rcItem, _hBrush); + + if (style & BS_FLAT) // Only with BS_FLAT set, there will be drawn a frame without highlight. + DrawEdge(dis->hDC, &dis->rcItem, EDGE_RAISED, BF_RECT|BF_FLAT); + } else + DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, state); + + if (_hIcon) + DrawIconEx(dis->hDC, imagePos.x, imagePos.y, _hIcon, _cx, _cy, 0, _hBrush, DI_NORMAL); + else { + MemCanvas mem_dc; + BitmapSelection sel(mem_dc, _hBmp); + BitBlt(dis->hDC, imagePos.x, imagePos.y, _cx, _cy, mem_dc, 0, 0, SRCCOPY); + } + + TCHAR title[BUFFER_LEN]; + GetWindowText(_hwnd, title, BUFFER_LEN); + + BkMode bk_mode(dis->hDC, TRANSPARENT); + + if (dis->itemState & (ODS_DISABLED|ODS_GRAYED)) + DrawGrayText(dis->hDC, &textRect, title, dt_flags); + else { + TextColor lcColor(dis->hDC, GetSysColor(COLOR_BTNTEXT)); + DrawText(dis->hDC, title, -1, &textRect, dt_flags); + } + + if (dis->itemState & ODS_FOCUS) { + RECT rect = { + dis->rcItem.left+3, dis->rcItem.top+3, + dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4 + }; + if (dis->itemState & ODS_SELECTED) { + ++rect.left; ++rect.top; + ++rect.right; ++rect.bottom; + } + DrawFocusRect(dis->hDC, &rect); + } +} + + +void FlatButton::DrawItem(LPDRAWITEMSTRUCT dis) +{ + UINT style = DFCS_BUTTONPUSH; + + if (dis->itemState & ODS_DISABLED) + style |= DFCS_INACTIVE; + + RECT textRect = {dis->rcItem.left+2, dis->rcItem.top+2, dis->rcItem.right-4, dis->rcItem.bottom-4}; + + if (dis->itemState & ODS_SELECTED) { + style |= DFCS_PUSHED; + ++textRect.left; ++textRect.top; + ++textRect.right; ++textRect.bottom; + } + + FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_BTNFACE)); + + // highlight the button? + if (_active) + DrawEdge(dis->hDC, &dis->rcItem, EDGE_ETCHED, BF_RECT); + else if (GetWindowStyle(_hwnd) & BS_FLAT) // Only with BS_FLAT there will be drawn a frame to show highlighting. + DrawEdge(dis->hDC, &dis->rcItem, EDGE_RAISED, BF_RECT|BF_FLAT); + + TCHAR txt[BUFFER_LEN]; + int txt_len = GetWindowText(_hwnd, txt, BUFFER_LEN); + + if (dis->itemState & (ODS_DISABLED|ODS_GRAYED)) { + COLORREF gray = GetSysColor(COLOR_GRAYTEXT); + + if (gray) { + { + TextColor lcColor(dis->hDC, GetSysColor(COLOR_BTNHIGHLIGHT)); + RECT shadowRect = {textRect.left+1, textRect.top+1, textRect.right+1, textRect.bottom+1}; + DrawText(dis->hDC, txt, txt_len, &shadowRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); + } + + BkMode mode(dis->hDC, TRANSPARENT); + TextColor lcColor(dis->hDC, gray); + DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); + } else { + int old_r = textRect.right; + int old_b = textRect.bottom; + DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_CALCRECT); + int x = textRect.left + (old_r-textRect.right)/2; + int y = textRect.top + (old_b-textRect.bottom)/2; + int w = textRect.right-textRect.left; + int h = textRect.bottom-textRect.top; + s_MyDrawText_Rect.right = w; + s_MyDrawText_Rect.bottom = h; + GrayString(dis->hDC, GetSysColorBrush(COLOR_GRAYTEXT), MyDrawText, (LPARAM)txt, txt_len, x, y, w, h); + } + } else { + TextColor lcColor(dis->hDC, _active? _activeColor: _textColor); + DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); + } + + if (dis->itemState & ODS_FOCUS) { + RECT rect = { + dis->rcItem.left+3, dis->rcItem.top+3, + dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4 + }; + if (dis->itemState & ODS_SELECTED) { + ++rect.left; ++rect.top; + ++rect.right; ++rect.bottom; + } + DrawFocusRect(dis->hDC, &rect); + } +} + +LRESULT FlatButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case WM_MOUSEMOVE: { + bool active = false; + + if (IsWindowEnabled(_hwnd)) { + DWORD pid_foreground; + HWND hwnd_foreground = GetForegroundWindow(); //@@ may be better look for WM_ACTIVATEAPP ? + GetWindowThreadProcessId(hwnd_foreground, &pid_foreground); + + if (GetCurrentProcessId() == pid_foreground) { + POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)}; + ClientRect clntRect(_hwnd); + + // highlight the button? + if (pt.x>=clntRect.left && pt.x=clntRect.top && pt.y=clntRect.right || pt.y=clntRect.bottom) + goto cancel_press; + + goto def;} + + case WM_CANCELMODE: + cancel_press: { + TRACKMOUSEEVENT tme = {sizeof(tme), /*TME_HOVER|*/TME_LEAVE|TME_CANCEL, _hwnd/*, HOVER_DEFAULT*/}; + _TrackMouseEvent(&tme); + _active = false; + ReleaseCapture();} + // fall through + + case WM_MOUSELEAVE: + if (_active) { + _active = false; + + InvalidateRect(_hwnd, NULL, TRUE); + } + + return 0; + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } +} + + +HyperlinkCtrl::HyperlinkCtrl(HWND hwnd, COLORREF colorLink, COLORREF colorVisited) + : super(hwnd), + _cmd(ResString(GetDlgCtrlID(hwnd))), + _textColor(colorLink), + _colorVisited(colorVisited), + _hfont(0), + _crsr_link(0) +{ + init(); +} + +HyperlinkCtrl::HyperlinkCtrl(HWND owner, int id, COLORREF colorLink, COLORREF colorVisited) + : super(GetDlgItem(owner, id)), + _cmd(ResString(id)), + _textColor(colorLink), + _colorVisited(colorVisited), + _hfont(0), + _crsr_link(0) +{ + init(); +} + +void HyperlinkCtrl::init() +{ + if (_cmd.empty()) { + TCHAR txt[BUFFER_LEN]; + _cmd.assign(txt, GetWindowText(_hwnd, txt, BUFFER_LEN)); + } +} + +HyperlinkCtrl::~HyperlinkCtrl() +{ + if (_hfont) + DeleteObject(_hfont); +} + +LRESULT HyperlinkCtrl::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + switch(nmsg) { + case PM_DISPATCH_CTLCOLOR: { + if (!_hfont) { + HFONT hfont = (HFONT) SendMessage(_hwnd, WM_GETFONT, 0, 0); + LOGFONT lf; GetObject(hfont, sizeof(lf), &lf); + lf.lfUnderline = TRUE; + _hfont = CreateFontIndirect(&lf); + } + + HDC hdc = (HDC) wparam; + SetTextColor(hdc, _textColor); //@@ + SelectFont(hdc, _hfont); + SetBkMode(hdc, TRANSPARENT); + return (LRESULT)GetStockObject(HOLLOW_BRUSH); + } + + case WM_SETCURSOR: + if (!_crsr_link) + _crsr_link = LoadCursor(0, IDC_HAND); + + if (_crsr_link) + SetCursor(_crsr_link); + return 0; + + case WM_NCHITTEST: + return HTCLIENT; // Aktivierung von Maus-Botschaften + + case WM_LBUTTONDOWN: + if (LaunchLink()) { + _textColor = _colorVisited; + InvalidateRect(_hwnd, NULL, FALSE); + } else + MessageBeep(0); + return 0; + + default: + return super::WndProc(nmsg, wparam, lparam); + } +} + + +ToolTip::ToolTip(HWND owner) + : super(CreateWindowEx(WS_EX_TOPMOST|WS_EX_NOPARENTNOTIFY, TOOLTIPS_CLASS, 0, + WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, + owner, 0, g_Globals._hInstance, 0)) +{ + activate(); +} + + +ListSort::ListSort(HWND hwndListview, PFNLVCOMPARE compare_fct) + : WindowHandle(hwndListview), + _compare_fct(compare_fct) +{ + _sort_crit = 0; + _direction = false; +} + +void ListSort::toggle_sort(int idx) +{ + if (_sort_crit == idx) + _direction = !_direction; + else { + _sort_crit = idx; + _direction = false; + } +} + +void ListSort::sort() +{ + int idx = ListView_GetSelectionMark(_hwnd); + LPARAM param = ListView_GetItemData(_hwnd, idx); + + ListView_SortItems(_hwnd, _compare_fct, (LPARAM)this); + + if (idx >= 0) { + idx = ListView_FindItemPara(_hwnd, param); + ListView_EnsureVisible(_hwnd, idx, FALSE); + } +} + + +PropSheetPage::PropSheetPage(UINT nid, Window::CREATORFUNC dlg_creator) + : _dlg_creator(dlg_creator) +{ + PROPSHEETPAGE::dwSize = sizeof(PROPSHEETPAGE); + PROPSHEETPAGE::dwFlags = 0; + PROPSHEETPAGE::hInstance = g_Globals._hInstance; + PROPSHEETPAGE::pszTemplate = MAKEINTRESOURCE(nid); + PROPSHEETPAGE::pfnDlgProc = PropSheetPageDlg::DialogProc; + PROPSHEETPAGE::lParam = (LPARAM) this; +} + + +#ifndef PSM_GETRESULT // currently (as of 18.01.2004) missing in MinGW headers +#define PSM_GETRESULT (WM_USER + 135) +#define PropSheet_GetResult(hDlg) SNDMSG(hDlg, PSM_GETRESULT, 0, 0) +#endif + + +PropertySheetDialog::PropertySheetDialog(HWND owner) + : _hwnd(0) +{ + PROPSHEETHEADER::dwSize = sizeof(PROPSHEETHEADER); + PROPSHEETHEADER::dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS; + PROPSHEETHEADER::hwndParent = owner; + PROPSHEETHEADER::hInstance = g_Globals._hInstance; +} + +void PropertySheetDialog::add(PropSheetPage& psp) +{ + _pages.push_back(psp); +} + +int PropertySheetDialog::DoModal(int start_page) +{ + PROPSHEETHEADER::ppsp = (LPCPROPSHEETPAGE) &_pages[0]; + PROPSHEETHEADER::nPages = _pages.size(); + PROPSHEETHEADER::nStartPage = start_page; +/* + Window* pwnd = Window::create_property_sheet(this, WINDOW_CREATOR(PropertySheetDlg), NULL); + if (!pwnd) + return -1; + + HWND hwndPropSheet = *pwnd; +*/ + int ret = PropertySheet(this); + if (ret == -1) + return -1; + + HWND hwndPropSheet = (HWND) ret; + HWND hwndparent = GetParent(hwndPropSheet); + + if (hwndparent) + EnableWindow(hwndparent, FALSE); + + ret = 0; + MSG msg; + + while(GetMessage(&msg, 0, 0, 0)) { + try { + if (Window::pretranslate_msg(&msg)) + continue; + + if (PropSheet_IsDialogMessage(hwndPropSheet, &msg)) + continue; + + if (Window::dispatch_dialog_msg(&msg)) + continue; + + TranslateMessage(&msg); + + try { + DispatchMessage(&msg); + } catch(COMException& e) { + HandleException(e, 0); + } + + if (!PropSheet_GetCurrentPageHwnd(hwndPropSheet)) { + ret = PropSheet_GetResult(hwndPropSheet); + break; + } + } catch(COMException& e) { + HandleException(e, 0); + } + } + + if (hwndparent) + EnableWindow(hwndparent, TRUE); + + DestroyWindow(hwndPropSheet); + + return ret; +} + +HWND PropertySheetDialog::GetCurrentPage() +{ + HWND hdlg = PropSheet_GetCurrentPageHwnd(_hwnd); + return hdlg; +} + + +PropSheetPageDlg::PropSheetPageDlg(HWND hwnd) + : super(hwnd) +{ +} + +INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + PropSheetPageDlg* pThis = GET_WINDOW(PropSheetPageDlg, hwnd); + + if (pThis) { + switch(nmsg) { + case WM_COMMAND: + pThis->Command(LOWORD(wparam), HIWORD(wparam)); + return TRUE; // message has been processed + + case WM_NOTIFY: + pThis->Notify(wparam, (NMHDR*)lparam); + return TRUE; // message has been processed + + case WM_NOTIFYFORMAT: + SetWindowLong(hwnd, DWLP_MSGRESULT, NFR_CURRENT); // set return value NFR_CURRENT + return TRUE; // message has been processed + + case WM_NCDESTROY: + delete pThis; + return TRUE; // message has been processed + + default: + return pThis->WndProc(nmsg, wparam, lparam); + } + } else if (nmsg == WM_INITDIALOG) { + PROPSHEETPAGE* psp = (PROPSHEETPAGE*) lparam; + PropSheetPage* ppsp = (PropSheetPage*) psp->lParam; + + if (ppsp->_dlg_creator) { + pThis = static_cast(ppsp->_dlg_creator(hwnd)); + + if (pThis) + return pThis->Init(NULL); + } + } + + return FALSE; // message has not been processed +} + +int PropSheetPageDlg::Command(int id, int code) +{ + // override call to EndDialog in Dialog::Command(); + + return FALSE; +} diff --git a/reactos/base/shell/explorer/utility/window.h b/reactos/base/shell/explorer/utility/window.h new file mode 100644 index 00000000000..4d2a8b45133 --- /dev/null +++ b/reactos/base/shell/explorer/utility/window.h @@ -0,0 +1,1119 @@ +/* + * Copyright 2003, 2004, 2005 Martin Fuchs + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // + // Explorer clone + // + // window.h + // + // Martin Fuchs, 23.07.2003 + // + + +typedef set WindowSet; + + + /* + Classes are declared using "struct", not "class" because the default + access mode is "public". This way we can list the member functions in a + natural order without explicitly specifying any access mode at the begin + of the definition. + First are public constructors and destructor, then public member functions. + After that we list protected member varibables and functions. If needed, + private implemenation varibales and functions are positioned at the end. + */ + + + /// information structure for creation of a MDI child window +struct ChildWndInfo +{ + ChildWndInfo(HWND hmdiclient) + : _hmdiclient(hmdiclient) {} + + HWND _hmdiclient; +}; + + + /** + Class Window is the base class for several C++ window wrapper classes. + Window objects are allocated from the heap. They are automatically freed + when the window gets destroyed. + */ +struct Window : public WindowHandle +{ + Window(HWND hwnd); + virtual ~Window(); + + + typedef map WindowMap; + + typedef Window* (*CREATORFUNC)(HWND); + typedef Window* (*CREATORFUNC_INFO)(HWND, const void*); + + static HWND Create(CREATORFUNC creator, + DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, + DWORD dwStyle, int x, int y, int w, int h, + HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/); + + static HWND Create(CREATORFUNC_INFO creator, const void* info, + DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, + DWORD dwStyle, int x, int y, int w, int h, + HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/); + + static Window* create_mdi_child(const ChildWndInfo& info, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator); +// static Window* create_property_sheet(struct PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info); + + static LRESULT CALLBACK WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); + static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); + + static Window* get_window(HWND hwnd); +#ifndef _MSC_VER + template static CLASS* get_window(HWND hwnd) {return static_cast(get_window(hwnd));} +#define GET_WINDOW(CLASS, hwnd) Window::get_window(hwnd) +#endif + + static void register_pretranslate(HWND hwnd); + static void unregister_pretranslate(HWND hwnd); + static BOOL pretranslate_msg(LPMSG pmsg); + + static void register_dialog(HWND hwnd); + static void unregister_dialog(HWND hwnd); + static BOOL dispatch_dialog_msg(LPMSG pmsg); + + static int MessageLoop(); + + + LRESULT SendParent(UINT nmsg, WPARAM wparam=0, LPARAM lparam=0); + LRESULT PostParent(UINT nmsg, WPARAM wparam=0, LPARAM lparam=0); + + static void CancelModes(); + + +protected: + virtual LRESULT Init(LPCREATESTRUCT pcs); // WM_CREATE processing + virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual int Command(int id, int code); // WM_COMMAND processing + virtual int Notify(int id, NMHDR* pnmh); // WM_NOTIFY processing + + static Window* create_controller(HWND hwnd); + + + static WindowMap s_wnd_map; + + static const void* s_new_info; + static CREATORFUNC s_window_creator; + + + /// structure for managing critical sections as static class information in struct Window + struct StaticWindowData { + CritSect _map_crit_sect; + CritSect _create_crit_sect; + }; + + static StaticWindowData& GetStaticWindowData(); + + + // MDI child creation + static HHOOK s_hcbtHook; + static LRESULT CALLBACK MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam); + static LRESULT CALLBACK PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam); + + static WindowSet s_pretranslate_windows; + static WindowSet s_dialogs; +}; + +#ifdef UNICODE +#define NFR_CURRENT NFR_UNICODE +#else +#define NFR_CURRENT NFR_ANSI +#endif + + +#ifdef _MSC_VER +template struct GetWindowHelper +{ + static CLASS* get_window(HWND hwnd) { + return static_cast(Window::get_window(hwnd)); + } +}; +#define GET_WINDOW(CLASS, hwnd) GetWindowHelper::get_window(hwnd) +#endif + + + /// dynamic casting of Window pointers +template struct TypeCheck +{ + static CLASS* dyn_cast(Window* wnd) + {return dynamic_cast(wnd);} +}; + +#define WINDOW_DYNAMIC_CAST(CLASS, hwnd) \ + TypeCheck::dyn_cast(Window::get_window(hwnd)) + + + /** + SubclassedWindow is used to wrap already existing window handles + into C++ Window objects. To construct a object, use the "new" operator + to put it in the heap. It is automatically freed, when the window + gets destroyed. + */ +struct SubclassedWindow : public Window +{ + typedef Window super; + + SubclassedWindow(HWND); + +protected: + WNDPROC _orgWndProc; + + static LRESULT CALLBACK SubclassedWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); + + virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual int Command(int id, int code); + virtual int Notify(int id, NMHDR* pnmh); +}; + + + /// template class used in macro WINDOW_CREATOR to define the creater functions for Window objects +template struct WindowCreator +{ + static WND_CLASS* window_creator(HWND hwnd) + { + return new WND_CLASS(hwnd); + } +}; + +#define WINDOW_CREATOR(WND_CLASS) \ + ((Window::CREATORFUNC) WindowCreator::window_creator) + + + /// template class used in macro WINDOW_CREATOR_INFO to the define creater functions for Window objects with additional creation information +template struct WindowCreatorInfo +{ + static WND_CLASS* window_creator(HWND hwnd, const void* info) + { + return new WND_CLASS(hwnd, *static_cast(info)); + } +}; + +#define WINDOW_CREATOR_INFO(WND_CLASS, INFO_CLASS) \ + ((Window::CREATORFUNC_INFO) WindowCreatorInfo::window_creator) + + + /** + WindowClass is a neat wrapper for RegisterClassEx(). + Just construct a WindowClass object, override the attributes you want + to change, then call Register() or simply request the ATOM value to + register the window class. You don't have to worry calling Register() + more than once. It checks if, the class has already been registered. + */ +struct WindowClass : public WNDCLASSEX +{ + WindowClass(LPCTSTR classname, UINT style=0, WNDPROC wndproc=Window::WindowWndProc); + + ATOM Register() + { + if (!_atomClass) + _atomClass = RegisterClassEx(this); + + return _atomClass; + } + + operator ATOM() {return Register();} + + // return LPCTSTR for the CreateWindowEx() parameter + operator LPCTSTR() {return (LPCTSTR)(int)Register();} + +protected: + ATOM _atomClass; +}; + + /// window class with gray background color +struct BtnWindowClass : public WindowClass +{ + BtnWindowClass(LPCTSTR classname, UINT style=0, WNDPROC wndproc=Window::WindowWndProc) + : WindowClass(classname, style, wndproc) + { + hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); + } +}; + + /// window class with specified icon from resources +struct IconWindowClass : public WindowClass +{ + IconWindowClass(LPCTSTR classname, UINT nid, UINT style=0, WNDPROC wndproc=Window::WindowWndProc); +}; + + + // private message constants +#define PM_DISPATCH_COMMAND (WM_APP+0x00) +#define PM_TRANSLATE_MSG (WM_APP+0x01) + + +#define SPLIT_WIDTH 5 +#define DEFAULT_SPLIT_POS 300 +#define COLOR_SPLITBAR LTGRAY_BRUSH + + + /// menu info structure +struct MenuInfo +{ + HMENU _hMenuView; +}; + +#define PM_FRM_GET_MENUINFO (WM_APP+0x02) + +#define Frame_GetMenuInfo(hwnd) ((MenuInfo*)SNDMSG(hwnd, PM_FRM_GET_MENUINFO, 0, 0)) + + + /** + Class ChildWindow represents MDI child windows. + It is used with class MainFrame. + */ +struct ChildWindow : public Window +{ + typedef Window super; + + ChildWindow(HWND hwnd, const ChildWndInfo& info); + + static ChildWindow* create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator, + LPCTSTR classname, LPCTSTR title=NULL, DWORD style=0); + + bool go_to(LPCTSTR url); + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + virtual void resize_children(int cx, int cy); + virtual String jump_to_int(LPCTSTR url) = 0; + +protected: + MenuInfo*_menu_info; + + WindowHandle _left_hwnd; + WindowHandle _right_hwnd; + int _focus_pane; // 0: left 1: right + + int _split_pos; + int _last_split; + + HWND _hwndFrame; + String _statusText; + String _url; + + stack _url_history; + + void set_url(LPCTSTR url); +}; + +#define PM_SETSTATUSTEXT (WM_APP+0x1E) + + + /** + PreTranslateWindow is used to register windows to be called by Window::pretranslate_msg(). + This way you get PM_TRANSLATE_MSG messages before the message loop dispatches messages. + You can then for example use TranslateAccelerator() to implement key shortcuts. + */ +struct PreTranslateWindow : public Window +{ + typedef Window super; + + PreTranslateWindow(HWND); + ~PreTranslateWindow(); +}; + + + /** + The class DialogWindow implements modeless dialogs, which are managed by + Window::dispatch_dialog_msg() in Window::MessageLoop(). + A DialogWindow object should be constructed by calling Window::Create() + and specifying the class using the WINDOW_CREATOR() macro. + */ +struct DialogWindow : public Window +{ + typedef Window super; + + DialogWindow(HWND hwnd) + : super(hwnd) + { + register_dialog(hwnd); + } + + ~DialogWindow() + { + unregister_dialog(_hwnd); + } +}; + + + /** + The class Dialog implements modal dialogs. + A Dialog object should be constructed by calling Dialog::DoModal() + and specifying the class using the WINDOW_CREATOR() macro. + */ +struct Dialog : public Window +{ + typedef Window super; + + Dialog(HWND); + ~Dialog(); + + static int DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent=0); + static int DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent=0); + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + int Command(int id, int code); +}; + + +#define PM_FRM_CALC_CLIENT (WM_APP+0x03) +#define Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, PM_FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt)) + +#define PM_JUMP_TO_URL (WM_APP+0x25) +#define PM_URL_CHANGED (WM_APP+0x26) + + +struct PropSheetPage : public PROPSHEETPAGE +{ + PropSheetPage(UINT nid, Window::CREATORFUNC dlg_creator); + + void init(struct PropertySheetDialog*); + +protected: + friend struct PropSheetPageDlg; + + Window::CREATORFUNC _dlg_creator; +}; + + + /// Property Sheet dialog +struct PropertySheetDialog : public PROPSHEETHEADER +{ + PropertySheetDialog(HWND owner); + + void add(PropSheetPage& psp); + int DoModal(int start_page=0); + + HWND GetCurrentPage(); + +protected: + typedef vector Vector; + Vector _pages; + HWND _hwnd; +}; + + + /// Property Sheet Page (inner dialog) +struct PropSheetPageDlg : public Dialog +{ + typedef Dialog super; + + PropSheetPageDlg(HWND); + +protected: + friend struct PropertySheetDialog; + friend struct PropSheetPage; + + static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam); + + int Command(int id, int code); +}; + + +/* + /// Property Sheet Dialog (outer dialog) +struct PropertySheetDlg : public SubclassedWindow +{ + typedef SubclassedWindow super; + + PropertySheetDlg(HWND hwnd) : super(hwnd) {} +}; +*/ + + + // Layouting of resizable windows + + /// Flags to specify how to move and resize controls when resizing their parent window +enum RESIZE_FLAGS { + MOVE_LEFT = 0x1, + MOVE_RIGHT = 0x2, + MOVE_TOP = 0x4, + MOVE_BOTTOM = 0x8, + + MOVE_X = MOVE_LEFT | MOVE_RIGHT, + MOVE_Y = MOVE_TOP | MOVE_BOTTOM, + RESIZE_X= MOVE_RIGHT, + RESIZE_Y= MOVE_BOTTOM, + + MOVE = MOVE_X | MOVE_Y, + RESIZE = RESIZE_X | RESIZE_Y +}; + + /// structure to assign RESIZE_FLAGS to dialogs control +struct ResizeEntry +{ + ResizeEntry(UINT id, int flags) + : _id(id), _flags(flags) {} + + ResizeEntry(HWND hwnd, int flags) + : _id(GetDlgCtrlID(hwnd)), _flags(flags) {} + + UINT _id; + int _flags; +}; + + + /// Management of controls in resizable dialogs +struct ResizeManager : public std::list +{ + typedef std::list super; + + ResizeManager(HWND hwnd); + + void Add(UINT id, int flags) + {push_back(ResizeEntry(id, flags));} + + void Add(HWND hwnd, int flags) + {push_back(ResizeEntry(hwnd, flags));} + + void HandleSize(int cx, int cy); + void Resize(int dx, int dy); + + void SetMinMaxInfo(LPMINMAXINFO lpmmi) + { + lpmmi->ptMinTrackSize.x = _min_wnd_size.cx; + lpmmi->ptMinTrackSize.y = _min_wnd_size.cy; + } + + SIZE _min_wnd_size; + +protected: + HWND _hwnd; + SIZE _last_size; +}; + + + /// Controller base template class for resizable dialogs +template struct ResizeController : public BASE +{ + typedef BASE super; + + ResizeController(HWND hwnd) + : super(hwnd), + _resize_mgr(hwnd) + { + } + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case PM_FRM_CALC_CLIENT: + GetClientSpace((PRECT)lparam); + return TRUE; + + case WM_SIZE: + if (wparam != SIZE_MINIMIZED) + _resize_mgr.HandleSize(LOWORD(lparam), HIWORD(lparam)); + goto def; + + case WM_GETMINMAXINFO: + _resize_mgr.SetMinMaxInfo((LPMINMAXINFO)lparam); + goto def; + + default: def: + return super::WndProc(nmsg, wparam, lparam); + } + } + + virtual void GetClientSpace(PRECT prect) + { + if (!IsIconic(this->_hwnd)) { + GetClientRect(this->_hwnd, prect); + } else { + WINDOWPLACEMENT wp; + GetWindowPlacement(this->_hwnd, &wp); + prect->left = prect->top = 0; + prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left- + 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE)); + prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top- + 2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))- + GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE); + } + } + +protected: + ResizeManager _resize_mgr; +}; + + + /** + This class constructs button controls. + The button will remain existent when the C++ Button object is destroyed. + There is no conjunction between C++ object and windows control life time. + */ +struct Button : public WindowHandle +{ + Button(HWND parent, LPCTSTR text, int left, int top, int width, int height, + int id, DWORD flags=WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, DWORD exStyle=0); +}; + + + /** + This class constructs static controls. + The control will remain existent when the C++ object is destroyed. + There is no conjunction between C++ object and windows control life time. + */ +struct Static : public WindowHandle +{ + Static(HWND parent, LPCTSTR text, int left, int top, int width, int height, + int id, DWORD flags=WS_VISIBLE|WS_CHILD|SS_SIMPLE, DWORD ex_flags=0); +}; + + + // control color message routing for ColorStatic and HyperlinkCtrl + +#define PM_DISPATCH_CTLCOLOR (WM_APP+0x08) + +template struct CtlColorParent : public BASE +{ + typedef BASE super; + + CtlColorParent(HWND hwnd) + : super(hwnd) {} + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case WM_CTLCOLOR: + case WM_CTLCOLORBTN: + case WM_CTLCOLORDLG: + case WM_CTLCOLORSCROLLBAR: + case WM_CTLCOLORSTATIC: { + HWND hctl = (HWND) lparam; + return SendMessage(hctl, PM_DISPATCH_CTLCOLOR, wparam, nmsg); + } + + default: + return super::WndProc(nmsg, wparam, lparam); + } + } +}; + + +#define PM_DISPATCH_DRAWITEM (WM_APP+0x09) + + /// draw message routing for ColorButton and PictureButton +template struct OwnerDrawParent : public BASE +{ + typedef BASE super; + + OwnerDrawParent(HWND hwnd) + : super(hwnd) {} + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + switch(nmsg) { + case WM_DRAWITEM: + if (wparam) { // should there be drawn a control? + HWND hctl = GetDlgItem(this->_hwnd, wparam); + + if (hctl) + return SendMessage(hctl, PM_DISPATCH_DRAWITEM, wparam, lparam); + } /*else // or is it a menu entry? + ; */ + + return 0; + + default: + return super::WndProc(nmsg, wparam, lparam); + } + } +}; + + + /** + Subclass button controls to draw them by using PM_DISPATCH_DRAWITEM + The owning window should use the OwnerDrawParent template to route owner draw messages to the buttons. + */ +struct OwnerdrawnButton : public SubclassedWindow +{ + typedef SubclassedWindow super; + + OwnerdrawnButton(HWND hwnd) + : super(hwnd) {} + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + virtual void DrawItem(LPDRAWITEMSTRUCT dis) = 0; +}; + +extern void DrawGrayText(HDC hdc, LPRECT pRect, LPCTSTR text, int dt_flags); + + + /** + Subclass button controls to paint colored text labels. + The owning window should use the OwnerDrawParent template to route owner draw messages to the buttons. + */ +/* not yet used +struct ColorButton : public OwnerdrawnButton +{ + typedef OwnerdrawnButton super; + + ColorButton(HWND hwnd, COLORREF textColor) + : super(hwnd), _textColor(textColor) {} + +protected: + virtual void DrawItem(LPDRAWITEMSTRUCT dis); + + COLORREF _textColor; +}; +*/ + + +struct FlatButton : public OwnerdrawnButton +{ + typedef OwnerdrawnButton super; + + FlatButton(HWND hwnd) + : super(hwnd), _active(false) {} + + FlatButton(HWND owner, int id) + : super(GetDlgItem(owner, IDOK)), _active(false) {} + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + virtual void DrawItem(LPDRAWITEMSTRUCT dis); + + COLORREF _textColor; + COLORREF _activeColor; + bool _active; +}; + + + /** + Subclass button controls to paint pictures left to the labels. + The buttons should have set the style bit BS_OWNERDRAW. + The owning window should use the OwnerDrawParent template to route owner draw messages to the buttons. + */ +struct PictureButton : public OwnerdrawnButton +{ + typedef OwnerdrawnButton super; + + PictureButton(HWND hwnd, HICON hIcon, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false) + : super(hwnd), _hIcon(hIcon), _hBmp(0), _hBrush(hbrush), _flat(flat) + { + _cx = 16; + _cy = 16; + } + + PictureButton(HWND hparent, int id, HICON hIcon, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false) + : super(GetDlgItem(hparent, id)), _hIcon(hIcon), _hBmp(0), _hBrush(hbrush), _flat(flat) + { + _cx = 16; + _cy = 16; + } + + PictureButton(HWND hwnd, HBITMAP hBmp, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false) + : super(hwnd), _hIcon(0), _hBmp(hBmp), _hBrush(hbrush), _flat(flat) + { + BITMAP bmp; + GetObject(hBmp, sizeof(bmp), &bmp); + _cx = bmp.bmWidth; + _cy = bmp.bmHeight; + } + + PictureButton(HWND hparent, int id, HBITMAP hBmp, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false) + : super(GetDlgItem(hparent, id)), _hIcon(0), _hBmp(hBmp), _hBrush(hbrush), _flat(flat) + { + BITMAP bmp; + GetObject(hBmp, sizeof(bmp), &bmp); + _cx = bmp.bmWidth; + _cy = bmp.bmHeight; + } + +protected: + virtual void DrawItem(LPDRAWITEMSTRUCT dis); + + HICON _hIcon; + HBITMAP _hBmp; + HBRUSH _hBrush; + + int _cx; + int _cy; + + bool _flat; +}; + + +struct ColorStatic : public SubclassedWindow +{ + typedef SubclassedWindow super; + + ColorStatic(HWND hwnd, COLORREF textColor=RGB(255,0,0), HBRUSH hbrush_bkgnd=0, HFONT hfont=0) + : super(hwnd), + _textColor(textColor), + _hbrush_bkgnd(hbrush_bkgnd), + _hfont(hfont) + { + } + + ColorStatic(HWND owner, int id, COLORREF textColor=RGB(255,0,0), HBRUSH hbrush_bkgnd=0, HFONT hfont=0) + : super(GetDlgItem(owner, id)), + _textColor(textColor), + _hbrush_bkgnd(hbrush_bkgnd), + _hfont(hfont) + { + } + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + if (nmsg == PM_DISPATCH_CTLCOLOR) { + HDC hdc = (HDC) wparam; + + SetTextColor(hdc, _textColor); + + if (_hfont) + SelectFont(hdc, _hfont); + + if (_hbrush_bkgnd) + return (LRESULT)_hbrush_bkgnd; + else { + SetBkMode(hdc, TRANSPARENT); + return (LRESULT)GetStockBrush(HOLLOW_BRUSH); + } + } else + return super::WndProc(nmsg, wparam, lparam); + } + + COLORREF _textColor; + HBRUSH _hbrush_bkgnd; + HFONT _hfont; +}; + + + /// Hyperlink Controls + +struct HyperlinkCtrl : public SubclassedWindow +{ + typedef SubclassedWindow super; + + HyperlinkCtrl(HWND hwnd, COLORREF colorLink=RGB(0,0,255), COLORREF colorVisited=RGB(128,0,128)); + HyperlinkCtrl(HWND owner, int id, COLORREF colorLink=RGB(0,0,255), COLORREF colorVisited=RGB(128,0,128)); + + ~HyperlinkCtrl(); + + String _cmd; + +protected: + COLORREF _textColor; + COLORREF _colorVisited; + HFONT _hfont; + HCURSOR _crsr_link; + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); + + void init(); + + bool LaunchLink() + { + if (!_cmd.empty()) { + HINSTANCE hinst = ShellExecute(GetParent(_hwnd), _T("open"), _cmd, 0, 0, SW_SHOWNORMAL); + return (int)hinst > HINSTANCE_ERROR; + } + + return true; + } +}; + + + /// encapsulation of tool tip controls +struct ToolTip : public WindowHandle +{ + typedef WindowHandle super; + + ToolTip(HWND owner); + + void activate(BOOL active=TRUE) + { + SendMessage(_hwnd, TTM_ACTIVATE, active, 0); + } + + void add(HWND hparent, HWND htool, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0) + { + TOOLINFO ti = { + sizeof(TOOLINFO), TTF_SUBCLASS|TTF_IDISHWND|TTF_TRANSPARENT, hparent, (UINT)htool, + {0,0,0,0}, 0, (LPTSTR)txt, lparam + }; + +#ifdef UNICODE ///@todo Why is it neccesary to try both TTM_ADDTOOLW and TTM_ADDTOOLW ?! + if (!SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); +#else + if (!SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti); +#endif + } + + void add(HWND hparent, UINT id, const RECT& rect, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0) + { + TOOLINFO ti = { + sizeof(TOOLINFO), TTF_SUBCLASS|TTF_TRANSPARENT, hparent, id, + {rect.left,rect.top,rect.right,rect.bottom}, 0, (LPTSTR)txt, lparam + }; + +#ifdef UNICODE + if (!SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); +#else + if (!SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti)) + SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti); +#endif + } + + void remove(HWND hparent, HWND htool) + { + TOOLINFO ti = { + sizeof(TOOLINFO), TTF_IDISHWND, hparent, (UINT)htool, + {0,0,0,0}, 0, 0, 0 + }; + + SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti); + } + + void remove(HWND hparent, UINT id) + { + TOOLINFO ti = { + sizeof(TOOLINFO), 0, hparent, id, + {0,0,0,0}, 0, 0, 0 + }; + + SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti); + } +}; + + +inline int ListView_GetItemData(HWND list_ctrl, int idx) +{ + LV_ITEM item; + + item.mask = LVIF_PARAM; + item.iItem = idx; + + if (!ListView_GetItem(list_ctrl, &item)) + return 0; + + return item.lParam; +} + +inline int ListView_FindItemPara(HWND list_ctrl, LPARAM param) +{ + LVFINDINFO fi; + + fi.flags = LVFI_PARAM; + fi.lParam = param; + + return ListView_FindItem(list_ctrl, (unsigned)-1, &fi); +} + +inline int ListView_GetFocusedItem(HWND list_ctrl) +{ + int idx = ListView_GetItemCount(list_ctrl); + + while(--idx >= 0) + if (ListView_GetItemState(list_ctrl, idx, LVIS_FOCUSED)) + break; + + return idx; +} + + + /// sorting of list controls +struct ListSort : public WindowHandle +{ + ListSort(HWND hwndListview, PFNLVCOMPARE compare_fct); + + void toggle_sort(int idx); + void sort(); + + int _sort_crit; + bool _direction; + +protected: + PFNLVCOMPARE _compare_fct; + + static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort); +}; + + +inline LPARAM TreeView_GetItemData(HWND hwndTreeView, HTREEITEM hItem) +{ + TVITEM tvItem; + + tvItem.mask = TVIF_PARAM; + tvItem.hItem = hItem; + + if (!TreeView_GetItem(hwndTreeView, &tvItem)) + return 0; + + return tvItem.lParam; +} + + +enum {TRAYBUTTON_LEFT=0, TRAYBUTTON_RIGHT, TRAYBUTTON_MIDDLE}; + +#define PM_TRAYICON (WM_APP+0x20) + +#define WINMSG_TASKBARCREATED TEXT("TaskbarCreated") + +#define WINMSG_SHELLHOOK TEXT("SHELLHOOK") + + +struct TrayIcon +{ + TrayIcon(HWND hparent, UINT id) + : _hparent(hparent), _id(id) {} + + ~TrayIcon() + {Remove();} + + void Add(HICON hIcon, LPCTSTR tooltip=NULL) + {Set(NIM_ADD, _id, hIcon, tooltip);} + + void Modify(HICON hIcon, LPCTSTR tooltip=NULL) + {Set(NIM_MODIFY, _id, hIcon, tooltip);} + + void Remove() + { + NOTIFYICONDATA nid = { + sizeof(NOTIFYICONDATA), // cbSize + _hparent, // hWnd + _id, // uID + }; + + Shell_NotifyIcon(NIM_DELETE, &nid); + } + +protected: + HWND _hparent; + UINT _id; + + void Set(DWORD dwMessage, UINT id, HICON hIcon, LPCTSTR tooltip=NULL) + { + NOTIFYICONDATA nid = { + sizeof(NOTIFYICONDATA), // cbSize + _hparent, // hWnd + id, // uID + NIF_MESSAGE|NIF_ICON, // uFlags + PM_TRAYICON, // uCallbackMessage + hIcon // hIcon + }; + + if (tooltip) + lstrcpyn(nid.szTip, tooltip, COUNTOF(nid.szTip)); + + if (nid.szTip[0]) + nid.uFlags |= NIF_TIP; + + Shell_NotifyIcon(dwMessage, &nid); + } +}; + + +template struct TrayIconControllerTemplate : public BASE +{ + typedef BASE super; + + TrayIconControllerTemplate(HWND hwnd) : BASE(hwnd), + WM_TASKBARCREATED(RegisterWindowMessage(WINMSG_TASKBARCREATED)) + { + } + + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + if (nmsg == PM_TRAYICON) { + switch(lparam) { + case WM_MOUSEMOVE: + TrayMouseOver(wparam); + break; + + case WM_LBUTTONDOWN: + TrayClick(wparam, TRAYBUTTON_LEFT); + break; + + case WM_LBUTTONDBLCLK: + TrayDblClick(wparam, TRAYBUTTON_LEFT); + break; + + case WM_RBUTTONDOWN: + TrayClick(wparam, TRAYBUTTON_RIGHT); + break; + + case WM_RBUTTONDBLCLK: + TrayDblClick(wparam, TRAYBUTTON_RIGHT); + break; + + case WM_MBUTTONDOWN: + TrayClick(wparam, TRAYBUTTON_MIDDLE); + break; + + case WM_MBUTTONDBLCLK: + TrayDblClick(wparam, TRAYBUTTON_MIDDLE); + break; + } + + return 0; + } else if (nmsg == WM_TASKBARCREATED) { + AddTrayIcons(); + return 0; + } else + return super::WndProc(nmsg, wparam, lparam); + } + + virtual void AddTrayIcons() = 0; + virtual void TrayMouseOver(UINT id) {} + virtual void TrayClick(UINT id, int btn) {} + virtual void TrayDblClick(UINT id, int btn) {} + +protected: + const UINT WM_TASKBARCREATED; +}; + + +struct EditController : public SubclassedWindow +{ + typedef SubclassedWindow super; + + EditController(HWND hwnd) + : super(hwnd) + { + } + +protected: + LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam) + { + if (nmsg==WM_KEYDOWN && wparam==VK_RETURN) { + SendParent(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(_hwnd),1), (LPARAM)_hwnd); + return 0; + } else + return super::WndProc(nmsg, wparam, lparam); + } +}; diff --git a/reactos/base/shell/explorer/utility/xmlstorage.cpp b/reactos/base/shell/explorer/utility/xmlstorage.cpp new file mode 100644 index 00000000000..91978f3d2b8 --- /dev/null +++ b/reactos/base/shell/explorer/utility/xmlstorage.cpp @@ -0,0 +1,638 @@ + + // + // XML storage classes + // + // xmlstorage.cpp + // + // Copyright (c) 2004, 2005 Martin Fuchs + // + + +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 _NO_COMMENT +#define _NO_COMMENT // no #pragma comment(lib, ...) statements in .lib files +#endif + +//#include "xmlstorage.h" +#include + + + // work around GCC's wide string constant bug +#ifdef __GNUC__ +const LPCXSSTR XMLStorage::XS_TRUE = XS_TRUE_STR; +const LPCXSSTR XMLStorage::XS_FALSE = XS_FALSE_STR; +const LPCXSSTR XMLStorage::XS_NUMBERFMT = XS_NUMBERFMT_STR; +#endif + + +namespace XMLStorage { + + + /// remove escape characters from zero terminated string +static std::string unescape(const char* s, char b='"', char e='"') +{ + const char* end = s + strlen(s); + +// if (*s == b) +// ++s; +// +// if (end>s && end[-1]==e) +// --end; + + if (*s == b) + if (end>s && end[-1]==e) + ++s, --end; + + return std::string(s, end-s); +} + + /// remove escape characters from string with specified length +static std::string unescape(const char* s, int l, char b='"', char e='"') +{ + const char* end = s + l; + +// if (*s == b) +// ++s; +// +// if (end>s && end[-1]==e) +// --end; + + if (*s == b) + if (end>s && end[-1]==e) + ++s, --end; + + return std::string(s, end-s); +} + + + /// move XPath like to position in XML tree +bool XMLPos::go(const char* path) +{ + XMLNode* node = _cur; + + // Is this an absolute path? + if (*path == '/') { + node = _root; + ++path; + } + + node = node->find_relative(path); + + if (node) { + go_to(node); + return true; + } else + return false; +} + + /// move XPath like to position in XML tree +bool const_XMLPos::go(const char* path) +{ + const XMLNode* node = _cur; + + // Is this an absolute path? + if (*path == '/') { + node = _root; + ++path; + } + + node = node->find_relative(path); + + if (node) { + go_to(node); + return true; + } else + return false; +} + + +const XMLNode* XMLNode::find_relative(const char* path) const +{ + const XMLNode* node = this; + + // parse relative path + while(*path) { + const char* slash = strchr(path, '/'); + if (slash == path) + return NULL; + + int l = slash? slash-path: strlen(path); + std::string comp(path, l); + path += l; + + // look for [n] and [@attr_name="attr_value"] expressions in path components + const char* bracket = strchr(comp.c_str(), '['); + l = bracket? bracket-comp.c_str(): comp.length(); + std::string child_name(comp.c_str(), l); + std::string attr_name, attr_value; + + int n = 0; + if (bracket) { + std::string expr = unescape(bracket, '[', ']'); + const char* p = expr.c_str(); + + n = atoi(p); // read index number + + if (n) + n = n - 1; // convert into zero based index + + const char* at = strchr(p, '@'); + + if (at) { + p = at + 1; + const char* equal = strchr(p, '='); + + // read attribute name and value + if (equal) { + attr_name = unescape(p, equal-p); + attr_value = unescape(equal+1); + } + } + } + + if (attr_name.empty()) + // search n.th child node with specified name + node = node->find(child_name, n); + else + // search n.th child node with specified name and matching attribute value + node = node->find(child_name, attr_name, attr_value, n); + + if (!node) + return NULL; + + if (*path == '/') + ++path; + } + + return node; +} + +XMLNode* XMLNode::create_relative(const char* path) +{ + XMLNode* node = this; + + // parse relative path + while(*path) { + const char* slash = strchr(path, '/'); + if (slash == path) + return NULL; + + int l = slash? slash-path: strlen(path); + std::string comp(path, l); + path += l; + + // look for [n] and [@attr_name="attr_value"] expressions in path components + const char* bracket = strchr(comp.c_str(), '['); + l = bracket? bracket-comp.c_str(): comp.length(); + std::string child_name(comp.c_str(), l); + std::string attr_name, attr_value; + + int n = 0; + if (bracket) { + std::string expr = unescape(bracket, '[', ']'); + const char* p = expr.c_str(); + + n = atoi(p); // read index number + + if (n) + n = n - 1; // convert into zero based index + + const char* at = strchr(p, '@'); + + if (at) { + p = at + 1; + const char* equal = strchr(p, '='); + + // read attribute name and value + if (equal) { + attr_name = unescape(p, equal-p); + attr_value = unescape(equal+1); + } + } + } + + XMLNode* child; + + if (attr_name.empty()) + // search n.th child node with specified name + child = node->find(child_name, n); + else + // search n.th child node with specified name and matching attribute value + child = node->find(child_name, attr_name, attr_value, n); + + if (!child) { + child = new XMLNode(child_name); + node->add_child(child); + + if (!attr_name.empty()) + (*node)[attr_name] = attr_value; + } + + node = child; + + if (*path == '/') + ++path; + } + + return node; +} + + + /// read XML stream into XML tree below _pos +XML_Status XMLReaderBase::read() +{ + XML_Status status = XML_STATUS_OK; + + while(status == XML_STATUS_OK) { + char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN); + + int l = read_buffer(buffer, BUFFER_LEN); + if (l < 0) + break; + + status = XML_ParseBuffer(_parser, l, false); + } + + if (status != XML_STATUS_ERROR) + status = XML_ParseBuffer(_parser, 0, true); + + if (_pos->_children.empty()) + _pos->_trailing.append(_content); + else + _pos->_children.back()->_trailing.append(_content); + + _content.erase(); + + return status; +} + + + /// store XML version and encoding into XML reader +void XMLCALL XMLReaderBase::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone) +{ + XMLReaderBase* pReader = (XMLReaderBase*) userData; + + if (version) + pReader->_xml_version = version; + + if (encoding) + pReader->_encoding = encoding; +} + + /// notifications about XML start tag +void XMLCALL XMLReaderBase::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts) +{ + XMLReaderBase* pReader = (XMLReaderBase*) userData; + XMLPos& pos = pReader->_pos; + + // search for end of first line + const char* s = pReader->_content.c_str(); + const char* p = s; + const char* e = p + pReader->_content.length(); + + for(; p_children.empty()) { // no children in last node? + if (pReader->_last_tag == TAG_START) + pos->_content.append(s, p-s); + else if (pReader->_last_tag == TAG_END) + pos->_trailing.append(s, p-s); + // else TAG_NONE -> don't store white space in root node + } else + pos->_children.back()->_trailing.append(s, p-s); + + std::string leading; + + if (p != e) + leading.assign(p, e-p); + + XMLNode* node = new XMLNode(String_from_XML_Char(name), leading); + + pos.add_down(node); + + while(*atts) { + const XML_Char* attr_name = *atts++; + const XML_Char* attr_value = *atts++; + + (*node)[String_from_XML_Char(attr_name)] = String_from_XML_Char(attr_value); + } + + pReader->_last_tag = TAG_START; + pReader->_content.erase(); +} + + /// notifications about XML end tag +void XMLCALL XMLReaderBase::XML_EndElementHandler(void* userData, const XML_Char* name) +{ + XMLReaderBase* pReader = (XMLReaderBase*) userData; + XMLPos& pos = pReader->_pos; + + // search for end of first line + const char* s = pReader->_content.c_str(); + const char* p = s; + const char* e = p + pReader->_content.length(); + + for(; p_children.empty()) // no children in current node? + pos->_content.append(s, p-s); + else + if (pReader->_last_tag == TAG_START) + pos->_content.append(s, p-s); + else + pos->_children.back()->_trailing.append(s, p-s); + + if (p != e) + pos->_end_leading.assign(p, e-p); + + pos.back(); + + pReader->_last_tag = TAG_END; + pReader->_content.erase(); +} + + /// store content, white space and comments +void XMLCALL XMLReaderBase::XML_DefaultHandler(void* userData, const XML_Char* s, int len) +{ + XMLReaderBase* pReader = (XMLReaderBase*) userData; + + pReader->_content.append(s, len); +} + + + /// return error strings for Expat errors +std::string XMLReaderBase::get_error_string() const +{ + XML_Error error = XML_GetErrorCode(_parser); + + switch(error) { + case XML_ERROR_NONE: return "XML_ERROR_NONE"; + case XML_ERROR_NO_MEMORY: return "XML_ERROR_NO_MEMORY"; + case XML_ERROR_SYNTAX: return "XML_ERROR_SYNTAX"; + case XML_ERROR_NO_ELEMENTS: return "XML_ERROR_NO_ELEMENTS"; + case XML_ERROR_INVALID_TOKEN: return "XML_ERROR_INVALID_TOKEN"; + case XML_ERROR_UNCLOSED_TOKEN: return "XML_ERROR_UNCLOSED_TOKEN"; + case XML_ERROR_PARTIAL_CHAR: return "XML_ERROR_PARTIAL_CHAR"; + case XML_ERROR_TAG_MISMATCH: return "XML_ERROR_TAG_MISMATCH"; + case XML_ERROR_DUPLICATE_ATTRIBUTE: return "XML_ERROR_DUPLICATE_ATTRIBUTE"; + case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: return "XML_ERROR_JUNK_AFTER_DOC_ELEMENT"; + case XML_ERROR_PARAM_ENTITY_REF: return "XML_ERROR_PARAM_ENTITY_REF"; + case XML_ERROR_UNDEFINED_ENTITY: return "XML_ERROR_UNDEFINED_ENTITY"; + case XML_ERROR_RECURSIVE_ENTITY_REF: return "XML_ERROR_RECURSIVE_ENTITY_REF"; + case XML_ERROR_ASYNC_ENTITY: return "XML_ERROR_ASYNC_ENTITY"; + case XML_ERROR_BAD_CHAR_REF: return "XML_ERROR_BAD_CHAR_REF"; + case XML_ERROR_BINARY_ENTITY_REF: return "XML_ERROR_BINARY_ENTITY_REF"; + case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: return "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF"; + case XML_ERROR_MISPLACED_XML_PI: return "XML_ERROR_MISPLACED_XML_PI"; + case XML_ERROR_UNKNOWN_ENCODING: return "XML_ERROR_UNKNOWN_ENCODING"; + case XML_ERROR_INCORRECT_ENCODING: return "XML_ERROR_INCORRECT_ENCODING"; + case XML_ERROR_UNCLOSED_CDATA_SECTION: return "XML_ERROR_UNCLOSED_CDATA_SECTION"; + case XML_ERROR_EXTERNAL_ENTITY_HANDLING: return "XML_ERROR_EXTERNAL_ENTITY_HANDLING"; + case XML_ERROR_NOT_STANDALONE: return "XML_ERROR_NOT_STANDALONE"; + case XML_ERROR_UNEXPECTED_STATE: return "XML_ERROR_UNEXPECTED_STATE"; + case XML_ERROR_ENTITY_DECLARED_IN_PE: return "XML_ERROR_ENTITY_DECLARED_IN_PE"; + case XML_ERROR_FEATURE_REQUIRES_XML_DTD: return "XML_ERROR_FEATURE_REQUIRES_XML_DTD"; + case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING: return "XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING"; + case XML_ERROR_UNBOUND_PREFIX: return "XML_ERROR_UNBOUND_PREFIX"; + // EXPAT version >= 1.95.8 +#if XML_MAJOR_VERSION>1 || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION>95) || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION==95 && XML_MICRO_VERSION>7) + case XML_ERROR_UNDECLARING_PREFIX: return "XML_ERROR_UNDECLARING_PREFIX"; + case XML_ERROR_INCOMPLETE_PE: return "XML_ERROR_INCOMPLETE_PE"; + case XML_ERROR_XML_DECL: return "XML_ERROR_XML_DECL"; + case XML_ERROR_TEXT_DECL: return "XML_ERROR_TEXT_DECL"; + case XML_ERROR_PUBLICID: return "XML_ERROR_PUBLICID"; + case XML_ERROR_SUSPENDED: return "XML_ERROR_SUSPENDED"; + case XML_ERROR_NOT_SUSPENDED: return "XML_ERROR_NOT_SUSPENDED"; + case XML_ERROR_ABORTED: return "XML_ERROR_ABORTED"; + case XML_ERROR_FINISHED: return "XML_ERROR_FINISHED"; + case XML_ERROR_SUSPEND_PE: return "XML_ERROR_SUSPEND_PE"; +#endif +#if XML_MAJOR_VERSION>=2 + /* Added in 2.0. */ + case XML_ERROR_RESERVED_PREFIX_XML: return "XML_ERROR_RESERVED_PREFIX_XML"; + case XML_ERROR_RESERVED_PREFIX_XMLNS: return "XML_ERROR_RESERVED_PREFIX_XMLNS"; + case XML_ERROR_RESERVED_NAMESPACE_URI: return "XML_ERROR_RESERVED_NAMESPACE_URI"; +#endif + } + + std::ostringstream out; + + out << "XML parser error #" << error; + + return out.str(); +} + + + /// encode XML string literals +std::string EncodeXMLString(const XS_String& str) +{ + LPCXSSTR s = str.c_str(); + LPXSSTR buffer = (LPXSSTR)alloca(6*sizeof(XS_CHAR)*XS_len(s)); // worst case """ / "'" + LPXSSTR o = buffer; + + for(LPCXSSTR p=s; *p; ++p) + switch(*p) { + case '&': + *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';'; + break; + + case '<': + *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';'; + break; + + case '>': + *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';'; + break; + + case '"': + *o++ = '&'; *o++ = 'q'; *o++ = 'u'; *o++ = 'o'; *o++ = 't'; *o++ = ';'; + break; + + case '\'': + *o++ = '&'; *o++ = 'a'; *o++ = 'p'; *o++ = 'o'; *o++ = 's'; *o++ = ';'; + break; + + default: + if ((unsigned)*p<20 && *p!='\t' && *p!='\r' && *p!='\n') { + char b[16]; + sprintf(b, "&%d;", (unsigned)*p); + for(const char*q=b; *q; ) + *o++ = *q++; + } else + *o++ = *p; + } + +#ifdef XS_STRING_UTF8 + return XS_String(buffer, o-buffer); +#else + return get_utf8(buffer, o-buffer); +#endif +} + + /// decode XML string literals +XS_String DecodeXMLString(const XS_String& str) +{ + LPCXSSTR s = str.c_str(); + LPXSSTR buffer = (LPXSSTR)alloca(sizeof(XS_CHAR)*XS_len(s)); + LPXSSTR o = buffer; + + for(LPCXSSTR p=s; *p; ++p) + if (*p == '&') { + if (!XS_nicmp(p+1, XS_TEXT("lt;"), 3)) { + *o++ = '<'; + p += 3; + } else if (!XS_nicmp(p+1, XS_TEXT("gt;"), 3)) { + *o++ = '>'; + p += 3; + } else if (!XS_nicmp(p+1, XS_TEXT("amp;"), 4)) { + *o++ = '&'; + p += 4; + } else if (!XS_nicmp(p+1, XS_TEXT("quot;"), 5)) { + *o++ = '"'; + p += 5; + } else if (!XS_nicmp(p+1, XS_TEXT("apos;"), 5)) { + *o++ = '\''; + p += 5; + } else + *o++ = *p; + } else + *o++ = *p; + + return XS_String(buffer, o-buffer); +} + + + /// write node with children tree to output stream using original white space +void XMLNode::write_worker(std::ostream& out, int indent) const +{ + out << _leading << '<' << EncodeXMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; + + if (!_children.empty() || !_content.empty()) { + out << '>' << _content; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->write_worker(out, indent+1); + + out << _end_leading << "'; + } else + out << "/>"; + + out << _trailing; +} + + + /// pretty print node with children tree to output stream +void XMLNode::pretty_write_worker(std::ostream& out, int indent) const +{ + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << '<' << EncodeXMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; + + if (!_children.empty() || !_content.empty()) { + out << ">\n"; + + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + (*it)->pretty_write_worker(out, indent+1); + + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + + out << "\n"; + } else + out << "/>\n"; +} + + + /// write node with children tree to output stream using smart formating +void XMLNode::smart_write_worker(std::ostream& out, int indent) const +{ + if (_leading.empty()) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + else + out << _leading; + + out << '<' << EncodeXMLString(*this); + + for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it) + out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; + + if (_children.empty() && _content.empty()) + out << "/>"; + else { + out << '>'; + + if (_content.empty()) + out << '\n'; + else + out << _content; + + Children::const_iterator it = _children.begin(); + + if (it != _children.end()) { + for(; it!=_children.end(); ++it) + (*it)->smart_write_worker(out, indent+1); + + if (_end_leading.empty()) + for(int i=indent; i--; ) + out << XML_INDENT_SPACE; + else + out << _end_leading; + } else + out << _end_leading; + + out << "'; + } + + if (_trailing.empty()) + out << '\n'; + else + out << _trailing; +} + + +} // namespace XMLStorage diff --git a/reactos/base/shell/explorer/utility/xmlstorage.h b/reactos/base/shell/explorer/utility/xmlstorage.h new file mode 100644 index 00000000000..125a6933365 --- /dev/null +++ b/reactos/base/shell/explorer/utility/xmlstorage.h @@ -0,0 +1,1940 @@ + + // + // XML storage classes + // + // xmlstorage.h + // + // Copyright (c) 2004, 2005 Martin Fuchs + // + + +/* + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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 _XMLSTORAGE_H + +#include + +#ifdef _MSC_VER +#pragma comment(lib, "libexpat.lib") +#pragma warning(disable: 4786) +#endif + + +#include // for LPCTSTR + +#ifdef UNICODE +#define _UNICODE +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + + +#ifndef BUFFER_LEN +#define BUFFER_LEN 2048 +#endif + + +namespace XMLStorage { + + +#ifndef XS_String + +#ifdef XS_STRING_UTF8 +#define XS_CHAR char +#define XS_TEXT(x) x +#define LPXSSTR LPSTR +#define LPCXSSTR LPCSTR +#define XS_icmp stricmp +#define XS_nicmp strnicmp +#define XS_toi atoi +#define XS_len strlen +#define XS_snprintf snprintf +#define XS_vsnprintf vsnprintf +#else +#define XS_CHAR TCHAR +#define XS_TEXT(x) TEXT(x) +#define LPXSSTR LPTSTR +#define LPCXSSTR LPCTSTR +#define XS_icmp _tcsicmp +#define XS_nicmp _tcsnicmp +#define XS_toi _ttoi +#define XS_len _tcslen +#define XS_snprintf _sntprintf +#define XS_vsnprintf _vsntprintf +#endif + +#ifndef COUNTOF +#define COUNTOF(b) (sizeof(b)/sizeof(b[0])) +#endif + +#if defined(_STRING_DEFINED) && !defined(XS_STRING_UTF8) + +#define XS_String String + +#else // _STRING_DEFINED, !XS_STRING_UTF8 + + /// string class for TCHAR strings + +struct XS_String +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + : public std::wstring +#else + : public std::string +#endif +{ +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + typedef std::wstring super; +#else + typedef std::string super; +#endif + + XS_String() {} + + XS_String(LPCXSSTR s) {if (s) super::assign(s);} + XS_String(LPCXSSTR s, size_t l) : super(s, l) {} + + XS_String(const super& other) : super(other) {} + XS_String(const XS_String& other) : super(other) {} + +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + XS_String(LPCSTR s) {assign(s);} + XS_String(LPCSTR s, size_t l) {assign(s, l);} + XS_String(const std::string& other) {assign(other.c_str());} + XS_String& operator=(LPCSTR s) {assign(s); return *this;} + void assign(LPCSTR s) {if (s) {size_t bl=strlen(s); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, bl, b, bl));} else erase();} + void assign(LPCSTR s, size_t l) {if (s) {size_t bl=l; LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, bl));} else erase();} +#else + XS_String(LPCWSTR s) {assign(s);} + XS_String(LPCWSTR s, size_t l) {assign(s, l);} + XS_String(const std::wstring& other) {assign(other.c_str());} + XS_String& operator=(LPCWSTR s) {assign(s); return *this;} +#ifdef XS_STRING_UTF8 + void assign(const XS_String& s) {assign(s.c_str());} + void assign(LPCWSTR s) {if (s) {size_t bl=wcslen(s); LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_UTF8, 0, s, (int)bl, b, (int)bl, 0, 0));} else erase();} + void assign(LPCWSTR s, size_t l) {size_t bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_UTF8, 0, s, (int)l, b, (int)bl, 0, 0));} else erase();} +#else // if !UNICODE && !XS_STRING_UTF8 + void assign(LPCWSTR s) {if (s) {size_t bl=wcslen(s); LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, (int)bl, b, (int)bl, 0, 0));} else erase();} + void assign(LPCWSTR s, size_t l) {size_t bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, (int)l, b, (int)bl, 0, 0));} else erase();} +#endif +#endif + + XS_String& operator=(LPCXSSTR s) {if (s) super::assign(s); else erase(); return *this;} + XS_String& operator=(const super& s) {super::assign(s); return *this;} + void assign(LPCXSSTR s) {super::assign(s);} + void assign(LPCXSSTR s, size_t l) {super::assign(s, l);} + + operator LPCXSSTR() const {return c_str();} + +#ifdef XS_STRING_UTF8 + operator std::wstring() const {size_t bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_UTF8, 0, c_str(), bl, b, bl));} +#elif defined(UNICODE) + operator std::string() const {size_t bl=length(); LPSTR b=(LPSTR)alloca(bl); return std::string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), bl, b, bl, 0, 0));} +#else + operator std::wstring() const {size_t bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), (int)bl, b, (int)bl));} +#endif + + XS_String& printf(LPCXSSTR fmt, ...) + { + va_list l; + XS_CHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::assign(b, XS_vsnprintf(b, COUNTOF(b), fmt, l)); + va_end(l); + + return *this; + } + + XS_String& vprintf(LPCXSSTR fmt, va_list l) + { + XS_CHAR b[BUFFER_LEN]; + + super::assign(b, XS_vsnprintf(b, COUNTOF(b), fmt, l)); + + return *this; + } + + XS_String& appendf(LPCXSSTR fmt, ...) + { + va_list l; + XS_CHAR b[BUFFER_LEN]; + + va_start(l, fmt); + super::append(b, XS_vsnprintf(b, COUNTOF(b), fmt, l)); + va_end(l); + + return *this; + } + + XS_String& vappendf(LPCXSSTR fmt, va_list l) + { + XS_CHAR b[BUFFER_LEN]; + + super::append(b, XS_vsnprintf(b, COUNTOF(b), fmt, l)); + + return *this; + } +}; + +#endif // _STRING_DEFINED, !XS_STRING_UTF8 + +#endif // XS_String + + +#ifndef XS_STRING_UTF8 + +inline void assign_utf8(XS_String& s, const char* str) +{ + int lutf8 = (int)strlen(str); + +#ifdef UNICODE + LPTSTR buffer = (LPTSTR)alloca(sizeof(TCHAR)*lutf8); + int l = MultiByteToWideChar(CP_UTF8, 0, str, lutf8, buffer, lutf8); +#else + LPWSTR wbuffer = (LPWSTR)alloca(sizeof(WCHAR)*lutf8); + int l = MultiByteToWideChar(CP_UTF8, 0, str, lutf8, wbuffer, lutf8); + + int bl=2*l; LPSTR buffer = (LPSTR)alloca(bl); + l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, bl, 0, 0); +#endif + + s.assign(buffer, l); +} + +inline std::string get_utf8(LPCTSTR s, size_t l) +{ +#ifdef UNICODE + size_t bl=2*l; LPSTR buffer = (LPSTR)alloca(bl); + l = WideCharToMultiByte(CP_UTF8, 0, s, (int)l, buffer, (int)bl, 0, 0); +#else + LPWSTR wbuffer = (LPWSTR)alloca(sizeof(WCHAR)*l); + l = MultiByteToWideChar(CP_ACP, 0, s, (int)l, wbuffer, (int)l); + + size_t bl=2*l; LPSTR buffer = (LPSTR)alloca(bl); + l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, (int)l, buffer, (int)bl, 0, 0); +#endif + + return std::string(buffer, l); +} + +inline std::string get_utf8(const XS_String& s) +{ + return get_utf8(s.c_str(), s.length()); +} + +#endif // XS_STRING_UTF8 + +extern std::string EncodeXMLString(const XS_String& str); +extern XS_String DecodeXMLString(const XS_String& str); + + +#ifdef __GNUC__ +#include +typedef __gnu_cxx::stdio_filebuf STDIO_FILEBUF; +#else +typedef std::filebuf STDIO_FILEBUF; +#endif + + +struct FileHolder +{ + FileHolder(LPCTSTR path, LPCTSTR mode) + { +#ifdef __STDC_WANT_SECURE_LIB__ // secure CRT functions using VS 2005 + if (_tfopen_s(&_pfile, path, mode) != 0) + _pfile = NULL; +#else + _pfile = _tfopen(path, mode); +#endif + } + + ~FileHolder() + { + if (_pfile) + fclose(_pfile); + } + +protected: + FILE* _pfile; +}; + + /// input file stream with ANSI/UNICODE file names +struct tifstream : public std::istream, FileHolder +{ + typedef std::istream super; + + tifstream(LPCTSTR path) + : super(&_buf), + FileHolder(path, TEXT("r")), +#ifdef __GNUC__ + _buf(_pfile, ios::in) +#else + _buf(_pfile) +#endif + { + } + +protected: + STDIO_FILEBUF _buf; +}; + + /// output file stream with ANSI/UNICODE file names +struct tofstream : public std::ostream, FileHolder +{ + typedef std::ostream super; + + tofstream(LPCTSTR path) + : super(&_buf), + FileHolder(path, TEXT("w")), +#ifdef __GNUC__ + _buf(_pfile, ios::out) +#else + _buf(_pfile) +#endif + { + } + + ~tofstream() + { + flush(); + } + +protected: + STDIO_FILEBUF _buf; +}; + + + // write XML files with 2 spaces indenting +#define XML_INDENT_SPACE " " + + +#ifdef XML_UNICODE // Are XML_Char strings UTF-16 encoded? + +typedef XS_String String_from_XML_Char; + +#elif defined(XS_STRING_UTF8) + +typedef XS_String String_from_XML_Char; + +#else + + /// converter from Expat strings to XMLStorage internal strings +struct String_from_XML_Char : public XS_String +{ + String_from_XML_Char(const XML_Char* str) + { + assign_utf8(*this, str); + } +}; + +#endif + + +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + + // optimization for faster UNICODE/ASCII string comparison without temporary A/U conversion +inline bool operator==(const XS_String& s1, const char* s2) +{ + LPCWSTR p = s1; + const unsigned char* q = (const unsigned char*)s2; + + while(*p && *q) + if (*p++ != *q++) + return false; + + return *p == *q; +}; + +#endif + + + /// in memory representation of an XML node +struct XMLNode : public XS_String +{ +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + // optimized read access without temporary A/U conversion when using ASCII attribute names + struct AttributeMap : public std::map + { + typedef std::map super; + + const_iterator find(const char* x) const + { + for(const_iterator it=begin(); it!=end(); ++it) + if (it->first == x) + return it; + + return end(); + } + + const_iterator find(const key_type& x) const + { + return super::find(x); + } + + iterator find(const key_type& x) + { + return super::find(x); + } + }; +#else + typedef std::map AttributeMap; +#endif + + /// internal children node list + struct Children : public std::list + { + void assign(const Children& other) + { + clear(); + + for(Children::const_iterator it=other.begin(); it!=other.end(); ++it) + push_back(new XMLNode(**it)); + } + + void clear() + { + while(!empty()) { + XMLNode* node = back(); + pop_back(); + + node->clear(); + delete node; + } + } + }; + + // access to protected class members for XMLPos and XMLReader + friend struct XMLPos; + friend struct const_XMLPos; + friend struct XMLReaderBase; + + XMLNode(const XS_String& name) + : XS_String(name) + { + } + + XMLNode(const XS_String& name, const std::string& leading) + : XS_String(name), + _leading(leading) + { + } + + XMLNode(const XMLNode& other) + : _attributes(other._attributes), + _leading(other._leading), + _content(other._content), + _end_leading(other._end_leading), + _trailing(other._trailing) + { + for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it) + _children.push_back(new XMLNode(**it)); + } + + ~XMLNode() + { + while(!_children.empty()) { + delete _children.back(); + _children.pop_back(); + } + } + + void clear() + { + _leading.erase(); + _content.erase(); + _end_leading.erase(); + _trailing.erase(); + + _attributes.clear(); + _children.clear(); + + XS_String::erase(); + } + + XMLNode& operator=(const XMLNode& other) + { + _children.assign(other._children); + + _attributes = other._attributes; + + _leading = other._leading; + _content = other._content; + _end_leading = other._end_leading; + _trailing = other._trailing; + + return *this; + } + + /// add a new child node + void add_child(XMLNode* child) + { + _children.push_back(child); + } + + /// write access to an attribute + void put(const XS_String& attr_name, const XS_String& value) + { + _attributes[attr_name] = value; + } + + /// C++ write access to an attribute + XS_String& operator[](const XS_String& attr_name) + { + return _attributes[attr_name]; + } + + /// read only access to an attribute + template XS_String get(const T& attr_name) const + { + AttributeMap::const_iterator found = _attributes.find(attr_name); + + if (found != _attributes.end()) + return found->second; + else + return XS_String(); + } + + /// convenient value access in children node + XS_String subvalue(const XS_String& name, const XS_String& attr_name, int n=0) const + { + const XMLNode* node = find(name, n); + + if (node) + return node->get(attr_name); + else + return XS_String(); + } + + /// convenient storage of distinct values in children node + XS_String& subvalue(const XS_String& name, const XS_String& attr_name, int n=0) + { + XMLNode* node = find(name, n); + + if (!node) { + node = new XMLNode(name); + add_child(node); + } + + return (*node)[attr_name]; + } + +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + /// convenient value access in children node + XS_String subvalue(const char* name, const char* attr_name, int n=0) const + { + const XMLNode* node = find(name, n); + + if (node) + return node->get(attr_name); + else + return XS_String(); + } + + /// convenient storage of distinct values in children node + XS_String& subvalue(const char* name, const XS_String& attr_name, int n=0) + { + XMLNode* node = find(name, n); + + if (!node) { + node = new XMLNode(name); + add_child(node); + } + + return (*node)[attr_name]; + } +#endif + + const Children& get_children() const + { + return _children; + } + + Children& get_children() + { + return _children; + } + + XS_String get_content() const + { +#ifdef XS_STRING_UTF8 + const XS_String& ret = _content; +#else + XS_String ret; + assign_utf8(ret, _content.c_str()); +#endif + + return DecodeXMLString(ret.c_str()); + } + + void set_content(const XS_String& s) + { + _content.assign(EncodeXMLString(s.c_str())); + } + + enum WRITE_MODE { + FORMAT_SMART = 0, /// preserve original white space and comments if present; pretty print otherwise + FORMAT_ORIGINAL = 1, /// write XML stream preserving original white space and comments + FORMAT_PRETTY = 2 /// pretty print node to stream without preserving original white space + }; + + /// write node with children tree to output stream + std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0) const + { + switch(mode) { + case FORMAT_PRETTY: + pretty_write_worker(out, indent); + break; + + case FORMAT_ORIGINAL: + write_worker(out, indent); + break; + + default: // FORMAT_SMART + smart_write_worker(out, indent); + } + + return out; + } + +protected: + Children _children; + AttributeMap _attributes; + + std::string _leading; + std::string _content; + std::string _end_leading; + std::string _trailing; + + XMLNode* get_first_child() const + { + if (!_children.empty()) + return _children.front(); + else + return NULL; + } + + XMLNode* find(const XS_String& name, int n=0) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + if (**it == name) + if (!n--) + return *it; + + return NULL; + } + + XMLNode* find(const XS_String& name, const XS_String& attr_name, const XS_String& attr_value, int n=0) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { + const XMLNode& node = **it; + + if (node==name && node.get(attr_name)==attr_value) + if (!n--) + return *it; + } + + return NULL; + } + +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + XMLNode* find(const char* name, int n=0) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) + if (**it == name) + if (!n--) + return *it; + + return NULL; + } + + template + XMLNode* find(const char* name, const T& attr_name, const U& attr_value, int n=0) const + { + for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) { + const XMLNode& node = **it; + + if (node==name && node.get(attr_name)==attr_value) + if (!n--) + return *it; + } + + return NULL; + } +#endif + + /// XPath find function (const) + const XMLNode* find_relative(const char* path) const; + + /// XPath find function + XMLNode* find_relative(const char* path) + {return const_cast(const_cast(this)->find_relative(path));} + + /// relative XPath create function + XMLNode* create_relative(const char* path); + + void write_worker(std::ostream& out, int indent) const; + void pretty_write_worker(std::ostream& out, int indent) const; + void smart_write_worker(std::ostream& out, int indent) const; +}; + + + /// iterator access to children nodes with name filtering +struct XMLChildrenFilter +{ + XMLChildrenFilter(XMLNode::Children& children, const XS_String& name) + : _begin(children.begin(), children.end(), name), + _end(children.end(), children.end(), name) + { + } + + XMLChildrenFilter(XMLNode* node, const XS_String& name) + : _begin(node->get_children().begin(), node->get_children().end(), name), + _end(node->get_children().end(), node->get_children().end(), name) + { + } + + /// internal iterator class + struct iterator + { + typedef XMLNode::Children::iterator BaseIterator; + + iterator(BaseIterator begin, BaseIterator end, const XS_String& filter_name) + : _cur(begin), + _end(end), + _filter_name(filter_name) + { + search_next(); + } + + operator BaseIterator() + { + return _cur; + } + + const XMLNode* operator*() const + { + return *_cur; + } + + XMLNode* operator*() + { + return *_cur; + } + + iterator& operator++() + { + ++_cur; + search_next(); + + return *this; + } + + iterator operator++(int) + { + iterator ret = *this; + + ++_cur; + search_next(); + + return ret; + } + + bool operator==(const BaseIterator& other) const + { + return _cur == other; + } + + bool operator!=(const BaseIterator& other) const + { + return _cur != other; + } + + protected: + BaseIterator _cur; + BaseIterator _end; + XS_String _filter_name; + + void search_next() + { + while(_cur!=_end && **_cur!=_filter_name) + ++_cur; + } + }; + + iterator begin() + { + return _begin; + } + + iterator end() + { + return _end; + } + +protected: + iterator _begin; + iterator _end; +}; + + + /// read only iterator access to children nodes with name filtering +struct const_XMLChildrenFilter +{ + const_XMLChildrenFilter(const XMLNode::Children& children, const XS_String& name) + : _begin(children.begin(), children.end(), name), + _end(children.end(), children.end(), name) + { + } + + const_XMLChildrenFilter(const XMLNode* node, const XS_String& name) + : _begin(node->get_children().begin(), node->get_children().end(), name), + _end(node->get_children().end(), node->get_children().end(), name) + { + } + + /// internal iterator class + struct const_iterator + { + typedef XMLNode::Children::const_iterator BaseIterator; + + const_iterator(BaseIterator begin, BaseIterator end, const XS_String& filter_name) + : _cur(begin), + _end(end), + _filter_name(filter_name) + { + search_next(); + } + + operator BaseIterator() + { + return _cur; + } + + const XMLNode* operator*() const + { + return *_cur; + } + + const_iterator& operator++() + { + ++_cur; + search_next(); + + return *this; + } + + const_iterator operator++(int) + { + const_iterator ret = *this; + + ++_cur; + search_next(); + + return ret; + } + + bool operator==(const BaseIterator& other) const + { + return _cur == other; + } + + bool operator!=(const BaseIterator& other) const + { + return _cur != other; + } + + protected: + BaseIterator _cur; + BaseIterator _end; + XS_String _filter_name; + + void search_next() + { + while(_cur!=_end && **_cur!=_filter_name) + ++_cur; + } + }; + + const_iterator begin() + { + return _begin; + } + + const_iterator end() + { + return _end; + } + +protected: + const_iterator _begin; + const_iterator _end; +}; + + + /// iterator for XML trees +struct XMLPos +{ + XMLPos(XMLNode* root) + : _root(root), + _cur(root) + { + } + + XMLPos(const XMLPos& other) + : _root(other._root), + _cur(other._cur) + { // don't copy _stack + } + + XMLPos(XMLNode* node, const XS_String& name) + : _root(node), + _cur(node) + { + smart_create(name); + } + + XMLPos(XMLNode* node, const XS_String& name, const XS_String& attr_name, const XS_String& attr_value) + : _root(node), + _cur(node) + { + smart_create(name, attr_name, attr_value); + } + + XMLPos(const XMLPos& other, const XS_String& name) + : _root(other._root), + _cur(other._cur) + { + smart_create(name); + } + + XMLPos(const XMLPos& other, const XS_String& name, const XS_String& attr_name, const XS_String& attr_value) + : _root(other._root), + _cur(other._cur) + { + smart_create(name, attr_name, attr_value); + } + + /// access to current node + XMLNode& cur() + { + return *_cur; + } + + const XMLNode& cur() const + { + return *_cur; + } + + /// C++ access to current node + operator const XMLNode*() const {return _cur;} + operator XMLNode*() {return _cur;} + + const XMLNode* operator->() const {return _cur;} + XMLNode* operator->() {return _cur;} + + const XMLNode& operator*() const {return *_cur;} + XMLNode& operator*() {return *_cur;} + + /// attribute access + XS_String get(const XS_String& attr_name) const + { + return _cur->get(attr_name); + } + + /// attribute setting + void put(const XS_String& attr_name, const XS_String& value) + { + _cur->put(attr_name, value); + } + + /// C++ attribute access + template XS_String get(const T& attr_name) const {return (*_cur)[attr_name];} + XS_String& operator[](const XS_String& attr_name) {return (*_cur)[attr_name];} + + /// insert children when building tree + void add_down(XMLNode* child) + { + _cur->add_child(child); + go_to(child); + } + + /// go back to previous position + bool back() + { + if (!_stack.empty()) { + _cur = _stack.top(); + _stack.pop(); + return true; + } else + return false; + } + + /// go down to first child + bool go_down() + { + XMLNode* node = _cur->get_first_child(); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// search for child and go down + bool go_down(const XS_String& name, int n=0) + { + XMLNode* node = _cur->find(name, n); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// move XPath like to position in XML tree + bool go(const char* path); + + /// create child nodes using XPath notation and move to the deepest child + bool create_relative(const char* path) + { + XMLNode* node = _cur->create_relative(path); + if (!node) + return false; // invalid path specified + + go_to(node); + return true; + } + + /// create node and move to it + void create(const XS_String& name) + { + add_down(new XMLNode(name)); + } + + /// create node if not already existing and move to it + void smart_create(const XS_String& name) + { + XMLNode* node = _cur->find(name); + + if (node) + go_to(node); + else + add_down(new XMLNode(name)); + } + + /// search matching child node identified by key name and an attribute value + void smart_create(const XS_String& name, const XS_String& attr_name, const XS_String& attr_value) + { + XMLNode* node = _cur->find(name, attr_name, attr_value); + + if (node) + go_to(node); + else { + node = new XMLNode(name); + add_down(node); + (*node)[attr_name] = attr_value; + } + } + +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + /// search for child and go down + bool go_down(const char* name, int n=0) + { + XMLNode* node = _cur->find(name, n); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// create node and move to it + void create(const char* name) + { + add_down(new XMLNode(name)); + } + + /// create node if not already existing and move to it + void smart_create(const char* name) + { + XMLNode* node = _cur->find(name); + + if (node) + go_to(node); + else + add_down(new XMLNode(name)); + } + + /// search matching child node identified by key name and an attribute value + template + void smart_create(const char* name, const T& attr_name, const U& attr_value) + { + XMLNode* node = _cur->find(name, attr_name, attr_value); + + if (node) + go_to(node); + else { + XMLNode* node = new XMLNode(name); + add_down(node); + (*node)[attr_name] = attr_value; + } + } +#endif + + XS_String& str() {return *_cur;} + const XS_String& str() const {return *_cur;} + +protected: + XMLNode* _root; + XMLNode* _cur; + std::stack _stack; + + /// go to specified node + void go_to(XMLNode* child) + { + _stack.push(_cur); + _cur = child; + } +}; + + + /// iterator for XML trees +struct const_XMLPos +{ + const_XMLPos(const XMLNode* root) + : _root(root), + _cur(root) + { + } + + const_XMLPos(const const_XMLPos& other) + : _root(other._root), + _cur(other._cur) + { // don't copy _stack + } + + /// access to current node + const XMLNode& cur() const + { + return *_cur; + } + + /// C++ access to current node + operator const XMLNode*() const {return _cur;} + + const XMLNode* operator->() const {return _cur;} + + const XMLNode& operator*() const {return *_cur;} + + /// attribute access + XS_String get(const XS_String& attr_name) const + { + return _cur->get(attr_name); + } + + /// C++ attribute access + template XS_String get(const T& attr_name) const {return _cur->get(attr_name);} + + /// go back to previous position + bool back() + { + if (!_stack.empty()) { + _cur = _stack.top(); + _stack.pop(); + return true; + } else + return false; + } + + /// go down to first child + bool go_down() + { + const XMLNode* node = _cur->get_first_child(); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// search for child and go down + bool go_down(const XS_String& name, int n=0) + { + XMLNode* node = _cur->find(name, n); + + if (node) { + go_to(node); + return true; + } else + return false; + } + + /// move XPath like to position in XML tree + bool go(const char* path); + +#if defined(UNICODE) && !defined(XS_STRING_UTF8) + /// search for child and go down + bool go_down(const char* name, int n=0) + { + XMLNode* node = _cur->find(name, n); + + if (node) { + go_to(node); + return true; + } else + return false; + } +#endif + + const XS_String& str() const {return *_cur;} + +protected: + const XMLNode* _root; + const XMLNode* _cur; + std::stack _stack; + + /// go to specified node + void go_to(const XMLNode* child) + { + _stack.push(_cur); + _cur = child; + } +}; + + +#define XS_TRUE_STR XS_TEXT("true") +#define XS_FALSE_STR XS_TEXT("false") +#define XS_NUMBERFMT_STR XS_TEXT("%d") + + // work around GCC's wide string constant bug +#ifdef __GNUC__ +extern const LPCXSSTR XS_TRUE; +extern const LPCXSSTR XS_FALSE; +extern const LPCXSSTR XS_NUMBERFMT; +#else +#define XS_TRUE XS_TRUE_STR +#define XS_FALSE XS_FALSE_STR +#define XS_NUMBERFMT XS_NUMBERFMT_STR +#endif + + + /// type converter for boolean data +struct XMLBool +{ + XMLBool(bool value=false) + : _value(value) + { + } + + XMLBool(LPCXSSTR value, bool def=false) + { + if (value && *value) + _value = !XS_icmp(value, XS_TRUE); + else + _value = def; + } + + XMLBool(const XMLNode* node, const XS_String& attr_name, bool def=false) + { + const XS_String& value = node->get(attr_name); + + if (!value.empty()) + _value = !XS_icmp(value.c_str(), XS_TRUE); + else + _value = def; + } + + operator bool() const + { + return _value; + } + + bool operator!() const + { + return !_value; + } + + operator LPCXSSTR() const + { + return _value? XS_TRUE: XS_FALSE; + } + +protected: + bool _value; + +private: + void operator=(const XMLBool&); // disallow assignment operations +}; + + /// type converter for boolean data with write access +struct XMLBoolRef +{ + XMLBoolRef(XMLNode* node, const XS_String& attr_name, bool def=false) + : _ref((*node)[attr_name]) + { + if (_ref.empty()) + assign(def); + } + + operator bool() const + { + return !XS_icmp(_ref.c_str(), XS_TRUE); + } + + bool operator!() const + { + return XS_icmp(_ref.c_str(), XS_TRUE)? true: false; + } + + XMLBoolRef& operator=(bool value) + { + assign(value); + + return *this; + } + + void assign(bool value) + { + _ref.assign(value? XS_TRUE: XS_FALSE); + } + + void toggle() + { + assign(!operator bool()); + } + +protected: + XS_String& _ref; +}; + + + /// type converter for integer data +struct XMLInt +{ + XMLInt(int value) + : _value(value) + { + } + + XMLInt(LPCXSSTR value, int def=0) + { + if (value && *value) + _value = XS_toi(value); + else + _value = def; + } + + XMLInt(const XMLNode* node, const XS_String& attr_name, int def=0) + { + const XS_String& value = node->get(attr_name); + + if (!value.empty()) + _value = XS_toi(value.c_str()); + else + _value = def; + } + + operator int() const + { + return _value; + } + + operator XS_String() const + { + XS_CHAR buffer[32]; + XS_snprintf(buffer, COUNTOF(buffer), XS_NUMBERFMT, _value); + return buffer; + } + +protected: + int _value; + +private: + void operator=(const XMLInt&); // disallow assignment operations +}; + + /// type converter for integer data with write access +struct XMLIntRef +{ + XMLIntRef(XMLNode* node, const XS_String& attr_name, int def=0) + : _ref((*node)[attr_name]) + { + if (_ref.empty()) + assign(def); + } + + XMLIntRef& operator=(int value) + { + assign(value); + + return *this; + } + + operator int() const + { + return XS_toi(_ref.c_str()); + } + + void assign(int value) + { + XS_CHAR buffer[32]; + XS_snprintf(buffer, COUNTOF(buffer), XS_NUMBERFMT, value); + _ref.assign(buffer); + } + +protected: + XS_String& _ref; +}; + + + /// type converter for string data +struct XMLString +{ + XMLString(const XS_String& value) + : _value(value) + { + } + + XMLString(LPCXSSTR value, LPCXSSTR def=XS_TEXT("")) + { + if (value && *value) + _value = value; + else + _value = def; + } + + XMLString(const XMLNode* node, const XS_String& attr_name, LPCXSSTR def=XS_TEXT("")) + { + const XS_String& value = node->get(attr_name); + + if (!value.empty()) + _value = value; + else + _value = def; + } + + operator const XS_String&() const + { + return _value; + } + + const XS_String& c_str() const + { + return _value; + } + +protected: + XS_String _value; + +private: + void operator=(const XMLString&); // disallow assignment operations +}; + + /// type converter for string data with write access +struct XMStringRef +{ + XMStringRef(XMLNode* node, const XS_String& attr_name, LPCXSSTR def=XS_TEXT("")) + : _ref((*node)[attr_name]) + { + if (_ref.empty()) + assign(def); + } + + XMStringRef(XMLNode* node, const XS_String& node_name, const XS_String& attr_name, LPCXSSTR def=XS_TEXT("")) + : _ref(node->subvalue(node_name, attr_name)) + { + if (_ref.empty()) + assign(def); + } + + XMStringRef& operator=(const XS_String& value) + { + assign(value); + + return *this; + } + + operator const XS_String&() const + { + return _ref; + } + + void assign(const XS_String& value) + { + _ref.assign(value); + } + +protected: + XS_String& _ref; +}; + + +template + inline void read_option(T& var, const_XMLPos& cfg, LPCXSSTR key) + { + const XS_String& val = cfg.get(key); + + if (!val.empty()) + var = val; + } + +template<> + inline void read_option(int& var, const_XMLPos& cfg, LPCXSSTR key) + { + const XS_String& val = cfg.get(key); + + if (!val.empty()) + var = XS_toi(val.c_str()); + } + + +#ifdef _MSC_VER +#pragma warning(disable: 4355) +#endif + + /// XML reader base class +struct XMLReaderBase +{ + XMLReaderBase(XMLNode* node) + : _pos(node), + _parser(XML_ParserCreate(NULL)) + { + XML_SetUserData(_parser, this); + XML_SetXmlDeclHandler(_parser, XML_XmlDeclHandler); + XML_SetElementHandler(_parser, XML_StartElementHandler, XML_EndElementHandler); + XML_SetDefaultHandler(_parser, XML_DefaultHandler); + + _last_tag = TAG_NONE; + } + + virtual ~XMLReaderBase() + { + XML_ParserFree(_parser); + } + + XML_Status read(); + + virtual int read_buffer(char* buffer, int len) = 0; + + std::string get_position() const + { + int line = XML_GetCurrentLineNumber(_parser); + int column = XML_GetCurrentColumnNumber(_parser); + + std::ostringstream out; + out << "(" << line << ") : [column " << column << "]"; + + return out.str(); + } + + std::string get_instructions() const {return _instructions;} + + XML_Error get_error_code() {return XML_GetErrorCode(_parser);} + std::string get_error_string() const; + +protected: + XMLPos _pos; + XML_Parser _parser; + std::string _xml_version; + std::string _encoding; + std::string _instructions; + + std::string _content; + enum {TAG_NONE, TAG_START, TAG_END} _last_tag; + + static void XMLCALL XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone); + static void XMLCALL XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts); + static void XMLCALL XML_EndElementHandler(void* userData, const XML_Char* name); + static void XMLCALL XML_DefaultHandler(void* userData, const XML_Char* s, int len); +}; + + + /// XML file reader +struct XMLReader : public XMLReaderBase +{ + XMLReader(XMLNode* node, std::istream& in) + : XMLReaderBase(node), + _in(in) + { + } + + /// read XML stream into XML tree below _pos + int read_buffer(char* buffer, int len) + { + if (!_in.good()) + return -1; + + _in.read(buffer, len); + + return _in.gcount(); + } + +protected: + std::istream& _in; +}; + + + /// management of XML file headers +struct XMLHeader +{ + XMLHeader(const std::string& xml_version="1.0", const std::string& encoding="UTF-8", const std::string& doctype="") + : _version(xml_version), + _encoding(encoding), + _doctype(doctype) + { + } + + void print(std::ostream& out, bool pretty=true) const + { + out << ""; + + if (pretty) + out << std::endl; + + if (!_doctype.empty()) + out << _doctype << '\n'; + + if (!_additional.empty()) + out << _additional << '\n'; + } + + std::string _version; + std::string _encoding; + std::string _doctype; + std::string _additional; +}; + + + /// XML document holder +struct XMLDoc : public XMLNode +{ + XMLDoc() + : XMLNode(""), + _last_error(XML_ERROR_NONE) + { + } + + XMLDoc(LPCTSTR path) + : XMLNode(""), + _last_error(XML_ERROR_NONE) + { + read(path); + } + + std::istream& read(std::istream& in) + { + XMLReader reader(this, in); + + read(reader); + + return in; + } + + bool read(LPCTSTR path) + { + tifstream in(path); + XMLReader reader(this, in); + +//#if defined(_STRING_DEFINED) && !defined(XS_STRING_UTF8) +// return read(reader, std::string(ANS(path))); +//#else + return read(reader, XS_String(path)); +//#endif + } + + bool read(XMLReaderBase& reader) + { + XML_Status status = reader.read(); + + _header._additional = reader.get_instructions(); + + if (status == XML_STATUS_ERROR) { + std::ostringstream out; + + out << "input stream" << reader.get_position() << " " << reader.get_error_string(); + + _last_error = reader.get_error_code(); + _last_error_msg = out.str(); + } + + return status != XML_STATUS_ERROR; + } + + bool read(XMLReaderBase& reader, const std::string& display_path) + { + XML_Status status = reader.read(); + + _header._additional = reader.get_instructions(); + + if (status == XML_STATUS_ERROR) { + std::ostringstream out; + + out << display_path << reader.get_position() << " " << reader.get_error_string(); + + _last_error = reader.get_error_code(); + _last_error_msg = out.str(); + } + + return status != XML_STATUS_ERROR; + } + + /// write XML stream preserving previous white space and comments + std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART) const + { + _header.print(out); + + if (!_children.empty()) + _children.front()->write(out); + + return out; + } + + /// write XML stream with formating + std::ostream& write_formating(std::ostream& out) const + { + return write(out, FORMAT_PRETTY); + } + + void write(LPCTSTR path, WRITE_MODE mode=FORMAT_SMART) const + { + tofstream out(path); + + write(out, mode); + } + + void write_formating(LPCTSTR path) const + { + tofstream out(path); + + write_formating(out); + } + + XMLHeader _header; + XML_Error _last_error; + std::string _last_error_msg; +}; + + + /// XML message wrapper +struct XMLMessage : public XMLDoc +{ + XMLMessage(const char* name) + : _pos(this) + { + _pos.create(name); + } + + XMLPos _pos; +}; + + +enum PRETTY_FLAGS { + PRETTY_PLAIN = 0, + PRETTY_LINEFEED = 1, + PRETTY_INDENT = 2 +}; + +struct XMLWriter +{ + XMLWriter(std::ostream& out, PRETTY_FLAGS pretty=PRETTY_INDENT, const XMLHeader& header=XMLHeader()) + : _pofstream(NULL), + _out(out), + _pretty(pretty) + { + header.print(_out, false); + } + + XMLWriter(LPCTSTR path, PRETTY_FLAGS pretty=PRETTY_INDENT, const XMLHeader& header=XMLHeader()) + : _pofstream(new tofstream(path)), + _out(*_pofstream), + _pretty(pretty) + { + header.print(_out, false); + } + + ~XMLWriter() + { + _out << std::endl; + delete _pofstream; + } + + /// create node and move to it + void create(const XS_String& name) + { + if (!_stack.empty()) { + StackEntry& last = _stack.top(); + + if (last._state < PRE_CLOSED) { + write_attributes(last); + close_pre(last); + } + + ++last._children; + } + + StackEntry entry; + entry._node_name = name; + _stack.push(entry); + + write_pre(entry); + } + + /// go back to previous position + bool back() + { + if (!_stack.empty()) { + write_post(_stack.top()); + + _stack.pop(); + return true; + } else + return false; + } + + /// attribute setting + void put(const XS_String& attr_name, const XS_String& value) + { + if (!_stack.empty()) + _stack.top()._attributes[attr_name] = value; + } + + /// C++ write access to an attribute + XS_String& operator[](const XS_String& attr_name) + { + if (_stack.empty()) + return s_empty_attr; + + return _stack.top()._attributes[attr_name]; + } + + void set_content(const XS_String& s) + { + if (!_stack.empty()) + _stack.top()._content = s; + } + + // public for access in StackEntry + enum WRITESTATE { + NOTHING, /*PRE,*/ ATTRIBUTES, PRE_CLOSED, /*CONTENT,*/ POST + }; + +protected: + tofstream* _pofstream; + std::ostream& _out; + PRETTY_FLAGS _pretty; + + typedef XMLNode::AttributeMap AttrMap; + + struct StackEntry { + XS_String _node_name; + AttrMap _attributes; + std::string _content; + WRITESTATE _state; + bool _children; + + StackEntry() : _state(NOTHING), _children(false) {} + }; + + std::stack _stack; + + static XS_String s_empty_attr; + + void close_pre(StackEntry& entry) + { + _out << '>'; + + entry._state = PRE_CLOSED; + } + + void write_pre(StackEntry& entry) + { + if (_pretty >= PRETTY_LINEFEED) + _out << std::endl; + + if (_pretty == PRETTY_INDENT) + for(int i=_stack.size(); --i>0; ) + _out << XML_INDENT_SPACE; + + _out << '<' << EncodeXMLString(entry._node_name); + //entry._state = PRE; + } + + void write_attributes(StackEntry& entry) + { + for(AttrMap::const_iterator it=entry._attributes.begin(); it!=entry._attributes.end(); ++it) + _out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\""; + + entry._state = ATTRIBUTES; + } + + void write_post(StackEntry& entry) + { + if (entry._state < ATTRIBUTES) + write_attributes(entry); + + if (entry._children || !entry._content.empty()) { + if (entry._state < PRE_CLOSED) + close_pre(entry); + + _out << entry._content; + //entry._state = CONTENT; + + if (_pretty>=PRETTY_LINEFEED && entry._content.empty()) + _out << std::endl; + + if (_pretty==PRETTY_INDENT && entry._content.empty()) + for(int i=_stack.size(); --i>0; ) + _out << XML_INDENT_SPACE; + + _out << ""; + } else { + _out << "/>"; + } + + entry._state = POST; + } +}; + + +} // namespace XMLStorage + +#define _XMLSTORAGE_H +#endif // _XMLSTORAGE_H diff --git a/reactos/base/shell/shell.rbuild b/reactos/base/shell/shell.rbuild new file mode 100644 index 00000000000..b5a57c74430 --- /dev/null +++ b/reactos/base/shell/shell.rbuild @@ -0,0 +1,13 @@ + + + + + +