From 2bda8f7717adf28da4af0d34fb82f63d2868c31d Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: [PATCH] Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeutils@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- AUTHORS | 28 + COPYING | 346 ++ COPYING-DOCS | 397 ++ INSTALL | 176 + Mainpage.dox | 11 + Makefile.am.in | 10 + Makefile.cvs | 14 + README | 51 + ark/AUTHORS | 5 + ark/ChangeLog | 277 + ark/Makefile.am | 54 + ark/README | 4 + ark/TODO | 11 + ark/ace.cpp | 181 + ark/ace.h | 55 + ark/addition.ui | 79 + ark/ar.cpp | 263 + ark/ar.h | 61 + ark/arch.cpp | 403 ++ ark/arch.h | 221 + ark/archiveformatdlg.cpp | 71 + ark/archiveformatdlg.h | 39 + ark/archiveformatinfo.cpp | 278 + ark/archiveformatinfo.h | 73 + ark/ark.desktop | 87 + ark/ark.kcfg | 90 + ark/ark_part.cpp | 533 ++ ark/ark_part.desktop | 135 + ark/ark_part.h | 148 + ark/ark_part.rc | 57 + ark/ark_part_readonly.rc | 42 + ark/arkapp.cpp | 294 + ark/arkapp.h | 93 + ark/arkfactory.cpp | 68 + ark/arkfactory.h | 43 + ark/arkui.rc | 22 + ark/arkutils.cpp | 230 + ark/arkutils.h | 56 + ark/arkviewer.cpp | 103 + ark/arkviewer.h | 47 + ark/arkwidget.cpp | 2262 ++++++++ ark/arkwidget.h | 318 + ark/common_texts.cpp | 35 + ark/compressedfile.cpp | 376 ++ ark/compressedfile.h | 86 + ark/configure.in.in | 11 + ark/extraction.ui | 79 + ark/extractiondialog.cpp | 195 + ark/extractiondialog.h | 97 + ark/filelistview.cpp | 587 ++ ark/filelistview.h | 163 + ark/general.ui | 93 + ark/hi128-app-ark.png | Bin 0 -> 11259 bytes ark/hi16-app-ark.png | Bin 0 -> 1094 bytes ark/hi22-app-ark.png | Bin 0 -> 1431 bytes ark/hi32-app-ark.png | Bin 0 -> 2259 bytes ark/hi48-app-ark.png | Bin 0 -> 3778 bytes ark/hi64-app-ark.png | Bin 0 -> 5013 bytes ark/hisc-app-ark.svgz | Bin 0 -> 7499 bytes ark/lha.cpp | 302 + ark/lha.h | 61 + ark/main.cpp | 128 + ark/mainwindow.cpp | 481 ++ ark/mainwindow.h | 112 + ark/pics/Makefile.am | 2 + ark/pics/cr22-action-ark_adddir.png | Bin 0 -> 1303 bytes ark/pics/cr22-action-ark_addfile.png | Bin 0 -> 1287 bytes ark/pics/cr22-action-ark_delete.png | Bin 0 -> 1346 bytes ark/pics/cr22-action-ark_extract.png | Bin 0 -> 1227 bytes ark/pics/cr22-action-ark_selectall.png | Bin 0 -> 989 bytes ark/pics/cr22-action-ark_view.png | Bin 0 -> 833 bytes ark/pics/cr32-action-ark_adddir.png | Bin 0 -> 2285 bytes ark/pics/cr32-action-ark_addfile.png | Bin 0 -> 2126 bytes ark/pics/cr32-action-ark_delete.png | Bin 0 -> 2284 bytes ark/pics/cr32-action-ark_extract.png | Bin 0 -> 2084 bytes ark/pics/cr32-action-ark_view.png | Bin 0 -> 1134 bytes ark/rar.cpp | 306 + ark/rar.h | 68 + ark/searchbar.cpp | 49 + ark/searchbar.h | 40 + ark/settings.kcfgc | 5 + ark/sevenzip.cpp | 367 ++ ark/sevenzip.h | 54 + ark/tar.cpp | 774 +++ ark/tar.h | 135 + ark/tarlistingthread.cpp | 161 + ark/tarlistingthread.h | 63 + ark/zip.cpp | 277 + ark/zip.h | 58 + ark/zoo.cpp | 317 + ark/zoo.h | 59 + charselectapplet/Makefile.am | 19 + charselectapplet/charselectapplet.cpp | 366 ++ charselectapplet/charselectapplet.h | 115 + charselectapplet/kcharselectapplet.desktop | 100 + configure.in.in | 12 + doc/KRegExpEditor/Makefile.am | 5 + doc/KRegExpEditor/altn.png | Bin 0 -> 310 bytes doc/KRegExpEditor/altntool.png | Bin 0 -> 1282 bytes doc/KRegExpEditor/anychar.png | Bin 0 -> 616 bytes doc/KRegExpEditor/anychartool.png | Bin 0 -> 531 bytes doc/KRegExpEditor/begline.png | Bin 0 -> 244 bytes doc/KRegExpEditor/boundarytools.png | Bin 0 -> 861 bytes doc/KRegExpEditor/characters.png | Bin 0 -> 240 bytes doc/KRegExpEditor/charactertool.png | Bin 0 -> 983 bytes doc/KRegExpEditor/compound.png | Bin 0 -> 285 bytes doc/KRegExpEditor/compoundtool.png | Bin 0 -> 1432 bytes doc/KRegExpEditor/endline.png | Bin 0 -> 245 bytes doc/KRegExpEditor/index.docbook | 652 +++ doc/KRegExpEditor/linestartendtool.png | Bin 0 -> 817 bytes doc/KRegExpEditor/lookaheadtools.png | Bin 0 -> 774 bytes doc/KRegExpEditor/neglookahead.png | Bin 0 -> 297 bytes doc/KRegExpEditor/nonwordboundary.png | Bin 0 -> 225 bytes doc/KRegExpEditor/poslookahead.png | Bin 0 -> 297 bytes doc/KRegExpEditor/repeat.png | Bin 0 -> 632 bytes doc/KRegExpEditor/repeattool.png | Bin 0 -> 1160 bytes doc/KRegExpEditor/select.png | Bin 0 -> 742 bytes doc/KRegExpEditor/text.png | Bin 0 -> 338 bytes doc/KRegExpEditor/texttool.png | Bin 0 -> 396 bytes doc/KRegExpEditor/theEditor.png | Bin 0 -> 10004 bytes doc/KRegExpEditor/wordboundary.png | Bin 0 -> 210 bytes doc/Makefile.am | 5 + doc/ark/Makefile.am | 5 + doc/ark/index.docbook | 793 +++ doc/ark/man-ark.1.docbook | 174 + doc/kcalc/Makefile.am | 4 + doc/kcalc/commands.docbook | 254 + doc/kcalc/index.docbook | 774 +++ doc/kcalc/kcalc_on_Aix.txt | 123 + doc/kcalc/kcalc_on_OSF.txt | 62 + doc/kcharselect/Makefile.am | 4 + doc/kcharselect/index.docbook | 66 + doc/kcontrol/Makefile.am | 6 + doc/kcontrol/kcmlowbatcrit/Makefile.am | 2 + doc/kcontrol/kcmlowbatcrit/index.docbook | 47 + doc/kcontrol/kcmlowbatwarn/Makefile.am | 2 + doc/kcontrol/kcmlowbatwarn/index.docbook | 104 + doc/kcontrol/laptop/Makefile.am | 2 + doc/kcontrol/laptop/index.docbook | 111 + doc/kcontrol/powerctrl/Makefile.am | 2 + doc/kcontrol/powerctrl/index.docbook | 77 + doc/kdelirc/Makefile.am | 5 + doc/kdelirc/irkick/Makefile.am | 4 + doc/kdelirc/irkick/index.docbook | 131 + doc/kdelirc/kcmlirc/Makefile.am | 4 + doc/kdelirc/kcmlirc/index.docbook | 165 + doc/kdf/Makefile.am | 4 + doc/kdf/index.docbook | 266 + doc/kdf/kdf.png | Bin 0 -> 22869 bytes doc/kdf/kdf_config.png | Bin 0 -> 32396 bytes doc/kedit/Makefile.am | 4 + doc/kedit/index.docbook | 1255 ++++ doc/kfloppy/Makefile.am | 4 + doc/kfloppy/index.docbook | 614 ++ doc/kgpg/Makefile.am | 4 + doc/kgpg/editor.png | Bin 0 -> 15541 bytes doc/kgpg/index.docbook | 354 ++ doc/kgpg/keygen.png | Bin 0 -> 9522 bytes doc/kgpg/keymanage.png | Bin 0 -> 23651 bytes doc/kgpg/keys.png | Bin 0 -> 13790 bytes doc/kgpg/kicker.png | Bin 0 -> 4582 bytes doc/kgpg/options.png | Bin 0 -> 18367 bytes doc/khexedit/Makefile.am | 4 + doc/khexedit/index.docbook | 1063 ++++ doc/khexedit/khexedit1.png | Bin 0 -> 3266 bytes doc/kinfocenter/Makefile.am | 6 + doc/kinfocenter/blockdevices/Makefile.am | 3 + doc/kinfocenter/blockdevices/index.docbook | 89 + doc/kjots/Makefile.am | 4 + doc/kjots/index.docbook | 552 ++ doc/ksim/Makefile.am | 4 + doc/ksim/index.docbook | 66 + doc/ktimer/Makefile.am | 4 + doc/ktimer/index.docbook | 66 + doc/kwallet/Makefile.am | 4 + doc/kwallet/cr22-action-wallet_closed.png | Bin 0 -> 997 bytes doc/kwallet/cr22-action-wallet_open.png | Bin 0 -> 1098 bytes doc/kwallet/edit1.png | Bin 0 -> 19314 bytes doc/kwallet/edit2.png | Bin 0 -> 26113 bytes doc/kwallet/edit3.png | Bin 0 -> 59244 bytes doc/kwallet/index.docbook | 396 ++ doc/kwallet/kwalletmanager.png | Bin 0 -> 11282 bytes doc/kwallet/password1.png | Bin 0 -> 19088 bytes doc/kwallet/password2.png | Bin 0 -> 21999 bytes doc/superkaramba/Makefile.am | 4 + doc/superkaramba/index.docbook | 261 + kcalc/ChangeLog | 387 ++ kcalc/Makefile.am | 40 + kcalc/README | 8 + kcalc/TODO | 15 + kcalc/colors.ui | 278 + kcalc/configure.in.bot | 12 + kcalc/configure.in.in | 78 + kcalc/confvalues.h | 48 + kcalc/constants.ui | 491 ++ kcalc/dlabel.cpp | 184 + kcalc/dlabel.h | 64 + kcalc/general.ui | 199 + kcalc/hi16-app-kcalc.png | Bin 0 -> 983 bytes kcalc/hi22-app-kcalc.png | Bin 0 -> 1421 bytes kcalc/hi32-app-kcalc.png | Bin 0 -> 2701 bytes kcalc/hi48-app-kcalc.png | Bin 0 -> 5023 bytes kcalc/hi64-app-kcalc.png | Bin 0 -> 6760 bytes kcalc/hisc-app-kcalc.svgz | Bin 0 -> 5247 bytes kcalc/kcalc.cpp | 2306 ++++++++ kcalc/kcalc.desktop | 88 + kcalc/kcalc.h | 239 + kcalc/kcalc.kcfg | 127 + kcalc/kcalc_button.cpp | 168 + kcalc/kcalc_button.h | 105 + kcalc/kcalc_const_button.cpp | 109 + kcalc/kcalc_const_button.h | 58 + kcalc/kcalc_const_menu.cpp | 89 + kcalc/kcalc_const_menu.h | 55 + kcalc/kcalc_core.cpp | 1004 ++++ kcalc/kcalc_core.h | 181 + kcalc/kcalc_settings.kcfgc | 8 + kcalc/kcalcdisplay.cpp | 608 ++ kcalc/kcalcdisplay.h | 152 + kcalc/kcalcrc.upd | 4 + kcalc/kcalctype.h | 135 + kcalc/kcalcui.rc | 17 + kcalc/knumber/Makefile.am | 16 + kcalc/knumber/configure.in.in | 73 + kcalc/knumber/knumber.cpp | 693 +++ kcalc/knumber/knumber.h | 289 + kcalc/knumber/knumber_priv.cpp | 1083 ++++ kcalc/knumber/knumber_priv.h | 313 + kcalc/knumber/tests/Makefile.am | 32 + kcalc/knumber/tests/knumbertest.cpp | 582 ++ kcalc/knumber/tests/knumbertest.h | 9 + kcalc/stats.cpp | 196 + kcalc/stats.h | 60 + kcalc/version.h | 1 + kcharselect/KCharSelect.desktop | 98 + kcharselect/Makefile.am | 21 + kcharselect/TODO | 6 + kcharselect/hi16-app-kcharselect.png | Bin 0 -> 325 bytes kcharselect/hi32-app-kcharselect.png | Bin 0 -> 1666 bytes kcharselect/hi48-app-kcharselect.png | Bin 0 -> 1353 bytes kcharselect/kcharselect.upd | 5 + kcharselect/kcharselectdia.cc | 289 + kcharselect/kcharselectdia.h | 71 + kcharselect/kcharselectui.rc | 16 + kcharselect/main.cc | 49 + kdelirc/AUTHORS | 3 + kdelirc/COPYING | 340 ++ kdelirc/ChangeLog | 0 kdelirc/Makefile.am | 3 + kdelirc/README | 55 + kdelirc/README.profile-creation | 145 + kdelirc/README.remote-creation | 129 + kdelirc/TODO | 6 + kdelirc/icons/Makefile.am | 3 + kdelirc/icons/hi16-action-ledblue.png | Bin 0 -> 709 bytes kdelirc/icons/hi16-action-ledgreen.png | Bin 0 -> 641 bytes kdelirc/icons/hi16-action-ledlightblue.png | Bin 0 -> 732 bytes kdelirc/icons/hi16-action-ledlightgreen.png | Bin 0 -> 718 bytes kdelirc/icons/hi16-action-ledorange.png | Bin 0 -> 698 bytes kdelirc/icons/hi16-action-ledpurple.png | Bin 0 -> 702 bytes kdelirc/icons/hi16-action-ledred.png | Bin 0 -> 659 bytes kdelirc/icons/hi16-action-ledyellow.png | Bin 0 -> 672 bytes kdelirc/icons/hi32-action-ledblue.png | Bin 0 -> 1384 bytes kdelirc/icons/hi32-action-ledgreen.png | Bin 0 -> 1265 bytes kdelirc/icons/hi32-action-ledlightblue.png | Bin 0 -> 1378 bytes kdelirc/icons/hi32-action-ledlightgreen.png | Bin 0 -> 1464 bytes kdelirc/icons/hi32-action-ledorange.png | Bin 0 -> 1378 bytes kdelirc/icons/hi32-action-ledpurple.png | Bin 0 -> 1327 bytes kdelirc/icons/hi32-action-ledred.png | Bin 0 -> 1207 bytes kdelirc/icons/hi32-action-ledyellow.png | Bin 0 -> 1354 bytes kdelirc/irkick/Makefile.am | 42 + kdelirc/irkick/hi16-app-irkick.png | Bin 0 -> 954 bytes kdelirc/irkick/hi22-app-irkick.png | Bin 0 -> 1457 bytes kdelirc/irkick/hi32-app-irkick.png | Bin 0 -> 2421 bytes kdelirc/irkick/icons/Makefile.am | 3 + kdelirc/irkick/icons/hi16-action-irkick.png | Bin 0 -> 954 bytes .../irkick/icons/hi16-action-irkickflash.png | Bin 0 -> 892 bytes .../irkick/icons/hi16-action-irkickoff.png | Bin 0 -> 1016 bytes kdelirc/irkick/irkick.cpp | 336 ++ kdelirc/irkick/irkick.desktop | 116 + kdelirc/irkick/irkick.h | 132 + kdelirc/irkick/irkick.project | 12 + kdelirc/irkick/kdedmodule_stub.h | 34 + kdelirc/irkick/klircclient.cpp | 241 + kdelirc/irkick/klircclient.h | 114 + kdelirc/irkick/lo16-app-irkick.png | Bin 0 -> 381 bytes kdelirc/irkick/lo32-app-irkick.png | Bin 0 -> 603 bytes kdelirc/irkick/main.cpp | 39 + kdelirc/kcmlirc/Makefile.am | 15 + kdelirc/kcmlirc/addaction.cpp | 375 ++ kdelirc/kcmlirc/addaction.h | 73 + kdelirc/kcmlirc/addactionbase.ui | 1608 ++++++ kdelirc/kcmlirc/editaction.cpp | 362 ++ kdelirc/kcmlirc/editaction.h | 55 + kdelirc/kcmlirc/editactionbase.ui | 1287 +++++ kdelirc/kcmlirc/editmode.cpp | 38 + kdelirc/kcmlirc/editmode.h | 33 + kdelirc/kcmlirc/editmodebase.ui | 303 + kdelirc/kcmlirc/kcmlirc.cpp | 544 ++ kdelirc/kcmlirc/kcmlirc.desktop | 119 + kdelirc/kcmlirc/kcmlirc.h | 83 + kdelirc/kcmlirc/kcmlircbase.ui | 506 ++ kdelirc/kcmlirc/kcmlircbase.ui.h | 37 + kdelirc/kcmlirc/modeslist.cpp | 33 + kdelirc/kcmlirc/modeslist.h | 33 + kdelirc/kcmlirc/newmode.ui | 158 + kdelirc/kcmlirc/newmode.ui.h | 24 + kdelirc/kcmlirc/selectprofile.ui | 128 + kdelirc/kdelirc/Makefile.am | 45 + kdelirc/kdelirc/arguments.cpp | 36 + kdelirc/kdelirc/arguments.h | 32 + kdelirc/kdelirc/iraction.cpp | 155 + kdelirc/kdelirc/iraction.h | 88 + kdelirc/kdelirc/iractions.cpp | 90 + kdelirc/kdelirc/iractions.h | 52 + kdelirc/kdelirc/mode.cpp | 51 + kdelirc/kdelirc/mode.h | 50 + kdelirc/kdelirc/modes.cpp | 128 + kdelirc/kdelirc/modes.h | 62 + kdelirc/kdelirc/profileserver.cpp | 159 + kdelirc/kdelirc/profileserver.h | 142 + kdelirc/kdelirc/prototype.cpp | 67 + kdelirc/kdelirc/prototype.h | 54 + kdelirc/kdelirc/remoteserver.cpp | 109 + kdelirc/kdelirc/remoteserver.h | 89 + kdelirc/profiles/Makefile.am | 5 + kdelirc/profiles/klauncher.profile.xml | 18 + kdelirc/profiles/konqueror.profile.xml | 17 + kdelirc/profiles/noatun.profile.xml | 75 + kdelirc/profiles/profile.dtd | 28 + kdelirc/remotes/Makefile.am | 6 + kdelirc/remotes/RM-0010.remote.xml | 49 + kdelirc/remotes/cimr100.remote.xml | 31 + kdelirc/remotes/hauppauge.remote.xml | 29 + kdelirc/remotes/remote.dtd | 15 + kdelirc/remotes/sherwood.remote.xml | 61 + kdelirc/remotes/sonytv.remote.xml | 30 + kdessh/LICENSE.readme | 124 + kdessh/Makefile.am | 17 + kdessh/README | 3 + kdessh/kdessh.cpp | 201 + kdessh/sshdlg.cpp | 80 + kdessh/sshdlg.h | 32 + kdeutils.lsm | 11 + kdf/Makefile.am | 37 + kdf/disklist.cpp | 506 ++ kdf/disklist.h | 138 + kdf/disks.cpp | 335 ++ kdf/disks.h | 148 + kdf/kcmdf.cpp | 66 + kdf/kcmdf.desktop | 138 + kdf/kcmdf.h | 49 + kdf/kconftest.cpp | 80 + kdf/kdf.cpp | 96 + kdf/kdf.desktop | 88 + kdf/kdf.h | 45 + kdf/kdfconfig.cpp | 263 + kdf/kdfconfig.h | 97 + kdf/kdfui.rc | 11 + kdf/kdfwidget.cpp | 652 +++ kdf/kdfwidget.h | 153 + kdf/kwikdisk.cpp | 346 ++ kdf/kwikdisk.desktop | 78 + kdf/kwikdisk.h | 78 + kdf/listview.cpp | 113 + kdf/listview.h | 53 + kdf/mntconfig.cpp | 364 ++ kdf/mntconfig.h | 102 + kdf/optiondialog.cpp | 85 + kdf/optiondialog.h | 50 + kdf/pics/Makefile.am | 4 + kdf/pics/cr16-app-kcmdf.png | Bin 0 -> 924 bytes kdf/pics/cr22-app-kcmdf.png | Bin 0 -> 1152 bytes kdf/pics/cr32-app-kcmdf.png | Bin 0 -> 1771 bytes kdf/pics/delete.png | Bin 0 -> 963 bytes kdf/pics/hi128-app-kdf.png | Bin 0 -> 10332 bytes kdf/pics/hi128-app-kwikdisk.png | Bin 0 -> 11838 bytes kdf/pics/hi16-app-kdf.png | Bin 0 -> 924 bytes kdf/pics/hi16-app-kwikdisk.png | Bin 0 -> 818 bytes kdf/pics/hi22-app-kdf.png | Bin 0 -> 1152 bytes kdf/pics/hi22-app-kwikdisk.png | Bin 0 -> 1229 bytes kdf/pics/hi32-app-kdf.png | Bin 0 -> 1771 bytes kdf/pics/hi32-app-kwikdisk.png | Bin 0 -> 2079 bytes kdf/pics/hi48-app-kdf.png | Bin 0 -> 2851 bytes kdf/pics/hi48-app-kwikdisk.png | Bin 0 -> 3510 bytes kdf/pics/hi64-app-kdf.png | Bin 0 -> 3801 bytes kdf/pics/hi64-app-kwikdisk.png | Bin 0 -> 5185 bytes kdf/pics/mini-root.png | Bin 0 -> 785 bytes kdf/pics/tick.png | Bin 0 -> 661 bytes kdf/stdoption.cpp | 148 + kdf/stdoption.h | 72 + kdf/unix_outputs/df-g.hpux | 392 ++ kdf/unix_outputs/df-k.digital | 42 + kdf/unix_outputs/df-k.hpux | 196 + kdf/unix_outputs/df.man.hpux | 198 + kdf/unix_outputs/etcfstab.digital | 43 + kdf/unix_outputs/etcfstab.hpux | 75 + kdf/unix_outputs/unix-defines.txt | 125 + kedit/ChangeLog | 113 + kedit/KEdit.desktop | 82 + kedit/Makefile.am | 35 + kedit/README | 192 + kedit/TODO | 6 + kedit/color.ui | 129 + kedit/kedit.cpp | 1377 +++++ kedit/kedit.h | 229 + kedit/kedit.kcfg | 45 + kedit/keditui.rc | 10 + kedit/ktextfiledlg.cpp | 212 + kedit/ktextfiledlg.h | 74 + kedit/misc.ui | 123 + kedit/misc.ui.h | 14 + kedit/pixmaps/Makefile.am | 2 + kedit/pixmaps/hi16-app-kedit.png | Bin 0 -> 990 bytes kedit/pixmaps/hi22-app-kedit.png | Bin 0 -> 1654 bytes kedit/pixmaps/hi32-app-kedit.png | Bin 0 -> 2683 bytes kedit/pixmaps/hi48-app-kedit.png | Bin 0 -> 4385 bytes kedit/pixmaps/hi64-app-kedit.png | Bin 0 -> 8377 bytes kedit/prefs.kcfgc | 7 + kedit/version.h | 2 + kfloppy/KFloppy.desktop | 96 + kfloppy/Makefile.am | 23 + kfloppy/README | 23 + kfloppy/TODO | 47 + kfloppy/debug.h | 65 + kfloppy/floppy.cpp | 741 +++ kfloppy/floppy.h | 128 + kfloppy/floppy_format.desktop | 54 + kfloppy/format.cpp | 996 ++++ kfloppy/format.h | 426 ++ kfloppy/hi128-app-kfloppy.png | Bin 0 -> 12698 bytes kfloppy/hi16-app-kfloppy.png | Bin 0 -> 1008 bytes kfloppy/hi22-app-kfloppy.png | Bin 0 -> 1397 bytes kfloppy/hi32-app-kfloppy.png | Bin 0 -> 2374 bytes kfloppy/hi48-app-kfloppy.png | Bin 0 -> 3812 bytes kfloppy/hi64-app-kfloppy.png | Bin 0 -> 5298 bytes kfloppy/main.cpp | 79 + kfloppy/zip.cpp | 305 + kfloppy/zip.h | 106 + kgpg/AUTHORS | 1 + kgpg/ChangeLog | 310 + kgpg/INSTALL | 160 + kgpg/Makefile.am | 46 + kgpg/adduid.ui | 64 + kgpg/conf_decryption.ui | 69 + kgpg/conf_encryption.ui | 321 ++ kgpg/conf_encryption.ui.h | 22 + kgpg/conf_gpg.ui | 219 + kgpg/conf_misc.ui | 413 ++ kgpg/conf_servers.ui | 118 + kgpg/conf_ui2.ui | 178 + kgpg/dcopiface.h | 35 + kgpg/detailedconsole.cpp | 65 + kgpg/detailedconsole.h | 43 + kgpg/encryptfile.desktop | 62 + kgpg/encryptfolder.desktop | 52 + kgpg/groupedit.ui | 212 + kgpg/hi16-app-kgpg.png | Bin 0 -> 1013 bytes kgpg/hi22-app-kgpg.png | Bin 0 -> 1255 bytes kgpg/hi32-app-kgpg.png | Bin 0 -> 2073 bytes kgpg/hi48-app-kgpg.png | Bin 0 -> 3477 bytes kgpg/icons/Makefile.am | 2 + kgpg/icons/cr16-action-kgpg_key1.png | Bin 0 -> 267 bytes kgpg/icons/cr16-action-kgpg_key2.png | Bin 0 -> 440 bytes kgpg/icons/cr16-action-kgpg_key3.png | Bin 0 -> 671 bytes kgpg/icons/cr16-action-kgpg_key4.png | Bin 0 -> 353 bytes kgpg/icons/cr22-action-kgpg_edit.png | Bin 0 -> 3797 bytes kgpg/icons/cr22-action-kgpg_export.png | Bin 0 -> 346 bytes kgpg/icons/cr22-action-kgpg_gen.png | Bin 0 -> 585 bytes kgpg/icons/cr22-action-kgpg_identity.png | Bin 0 -> 1358 bytes kgpg/icons/cr22-action-kgpg_import.png | Bin 0 -> 371 bytes kgpg/icons/cr22-action-kgpg_info.png | Bin 0 -> 408 bytes kgpg/icons/cr22-action-kgpg_photo.png | Bin 0 -> 626 bytes kgpg/icons/cr22-action-kgpg_show.png | Bin 0 -> 375 bytes kgpg/icons/cr22-action-kgpg_sign.png | Bin 0 -> 437 bytes kgpg/icons/cr22-action-kgpg_term.png | Bin 0 -> 544 bytes kgpg/keyexport.ui | 142 + kgpg/keyexport.ui.h | 21 + kgpg/keygener.cpp | 176 + kgpg/keygener.h | 50 + kgpg/keyinfowidget.cpp | 465 ++ kgpg/keyinfowidget.h | 84 + kgpg/keyproperties.ui | 507 ++ kgpg/keyserver.ui | 336 ++ kgpg/keyservers.cpp | 574 ++ kgpg/keyservers.h | 81 + kgpg/kgpg.cpp | 1057 ++++ kgpg/kgpg.desktop | 123 + kgpg/kgpg.h | 168 + kgpg/kgpg.kcfg | 206 + kgpg/kgpg.rc | 27 + kgpg/kgpg_anim.gif | Bin 0 -> 954 bytes kgpg/kgpg_blank.png | Bin 0 -> 170 bytes kgpg/kgpg_docked.gif | Bin 0 -> 1602 bytes kgpg/kgpg_docked.png | Bin 0 -> 1167 bytes kgpg/kgpg_fill.png | Bin 0 -> 156 bytes kgpg/kgpgeditor.cpp | 554 ++ kgpg/kgpgeditor.h | 123 + kgpg/kgpginterface.cpp | 2166 +++++++ kgpg/kgpginterface.h | 404 ++ kgpg/kgpglibrary.cpp | 245 + kgpg/kgpglibrary.h | 81 + kgpg/kgpgoptions.cpp | 601 ++ kgpg/kgpgoptions.h | 106 + kgpg/kgpgrevokewidget.ui | 152 + kgpg/kgpgrevokewidget.ui.h | 21 + kgpg/kgpgsettings.kcfgc | 9 + kgpg/kgpgsettings_addons.h | 41 + kgpg/kgpgview.cpp | 409 ++ kgpg/kgpgview.h | 121 + kgpg/kgpgwizard.ui | 405 ++ kgpg/listkeys.cpp | 3149 ++++++++++ kgpg/listkeys.h | 302 + kgpg/listkeys.rc | 137 + kgpg/main.cpp | 79 + kgpg/newkey.ui | 196 + kgpg/newkey.ui.h | 21 + kgpg/popuppublic.cpp | 480 ++ kgpg/popuppublic.h | 76 + kgpg/searchres.ui | 124 + kgpg/sourceselect.ui | 112 + kgpg/tips | 44 + khexedit/Makefile.am | 35 + khexedit/README | 34 + khexedit/bitswapwidget.cc | 323 ++ khexedit/bitswapwidget.h | 101 + khexedit/chartabledialog.cc | 212 + khexedit/chartabledialog.h | 72 + khexedit/configure.in.in | 8 + khexedit/conversion.cc | 395 ++ khexedit/conversion.h | 71 + khexedit/converterdialog.cc | 163 + khexedit/converterdialog.h | 83 + khexedit/dialog.cc | 1433 +++++ khexedit/dialog.h | 350 ++ khexedit/draglabel.cc | 149 + khexedit/draglabel.h | 60 + khexedit/exportdialog.cc | 696 +++ khexedit/exportdialog.h | 138 + khexedit/fileinfodialog.cc | 330 ++ khexedit/fileinfodialog.h | 74 + khexedit/hexbuffer.cc | 5099 +++++++++++++++++ khexedit/hexbuffer.h | 2040 +++++++ khexedit/hexclipboard.cc | 254 + khexedit/hexclipboard.h | 40 + khexedit/hexdrag.cc | 130 + khexedit/hexdrag.h | 54 + khexedit/hexeditorwidget.cc | 2443 ++++++++ khexedit/hexeditorwidget.h | 301 + khexedit/hexeditstate.h | 596 ++ khexedit/hexerror.cc | 69 + khexedit/hexerror.h | 57 + khexedit/hexmanagerwidget.cc | 370 ++ khexedit/hexmanagerwidget.h | 202 + khexedit/hexprinter.cc | 168 + khexedit/hexprinter.h | 108 + khexedit/hextoolwidget.cc | 416 ++ khexedit/hextoolwidget.h | 81 + khexedit/hexvalidator.cc | 329 ++ khexedit/hexvalidator.h | 63 + khexedit/hexviewwidget.cc | 2286 ++++++++ khexedit/hexviewwidget.h | 584 ++ khexedit/hi16-app-khexedit.png | Bin 0 -> 411 bytes khexedit/hi32-app-khexedit.png | Bin 0 -> 1146 bytes khexedit/hi48-app-khexedit.png | Bin 0 -> 1878 bytes khexedit/khexedit.desktop | 86 + khexedit/khexeditui.rc | 137 + khexedit/lib/Makefile.am | 39 + khexedit/lib/README | 36 + khexedit/lib/codecs/Makefile.am | 15 + khexedit/lib/codecs/README | 1 + khexedit/lib/codecs/kbinarybytecodec.cpp | 80 + khexedit/lib/codecs/kbinarybytecodec.h | 59 + khexedit/lib/codecs/kbytecodec.cpp | 63 + khexedit/lib/codecs/kcharcodec.cpp | 74 + khexedit/lib/codecs/kdecimalbytecodec.cpp | 92 + khexedit/lib/codecs/kdecimalbytecodec.h | 59 + khexedit/lib/codecs/kebcdic1047charcodec.cpp | 124 + khexedit/lib/codecs/kebcdic1047charcodec.h | 50 + khexedit/lib/codecs/khexadecimalbytecodec.cpp | 113 + khexedit/lib/codecs/khexadecimalbytecodec.h | 69 + khexedit/lib/codecs/koctalbytecodec.cpp | 80 + khexedit/lib/codecs/koctalbytecodec.h | 59 + khexedit/lib/codecs/ktextcharcodec.cpp | 236 + khexedit/lib/codecs/ktextcharcodec.h | 66 + khexedit/lib/controller/Makefile.am | 12 + khexedit/lib/controller/kchareditor.cpp | 58 + khexedit/lib/controller/kchareditor.h | 43 + khexedit/lib/controller/kcontroller.cpp | 34 + khexedit/lib/controller/kcontroller.h | 44 + khexedit/lib/controller/keditor.cpp | 197 + khexedit/lib/controller/keditor.h | 52 + khexedit/lib/controller/knavigator.cpp | 142 + khexedit/lib/controller/knavigator.h | 46 + khexedit/lib/controller/ktabcontroller.cpp | 70 + khexedit/lib/controller/ktabcontroller.h | 52 + khexedit/lib/controller/kvalueeditor.cpp | 226 + khexedit/lib/controller/kvalueeditor.h | 75 + khexedit/lib/helper.h | 31 + khexedit/lib/kadds.h | 36 + khexedit/lib/kbigbuffer.cpp | 216 + khexedit/lib/kbigbuffer.h | 119 + khexedit/lib/kbordercoltextexport.cpp | 47 + khexedit/lib/kbordercoltextexport.h | 40 + khexedit/lib/kbordercolumn.cpp | 82 + khexedit/lib/kbordercolumn.h | 52 + khexedit/lib/kbuffercoltextexport.cpp | 108 + khexedit/lib/kbuffercoltextexport.h | 73 + khexedit/lib/kbuffercolumn.cpp | 700 +++ khexedit/lib/kbuffercolumn.h | 253 + khexedit/lib/kbuffercoord.h | 293 + khexedit/lib/kbuffercursor.cpp | 365 ++ khexedit/lib/kbuffercursor.h | 172 + khexedit/lib/kbufferdrag.cpp | 237 + khexedit/lib/kbufferdrag.h | 76 + khexedit/lib/kbufferlayout.cpp | 240 + khexedit/lib/kbufferlayout.h | 196 + khexedit/lib/kbufferranges.cpp | 307 + khexedit/lib/kbufferranges.h | 130 + khexedit/lib/kbytecodec.h | 73 + khexedit/lib/kbytesedit.cpp | 162 + khexedit/lib/kbytesedit.h | 163 + khexedit/lib/kcharcodec.h | 55 + khexedit/lib/kcharcoltextexport.cpp | 71 + khexedit/lib/kcharcoltextexport.h | 50 + khexedit/lib/kcharcolumn.cpp | 61 + khexedit/lib/kcharcolumn.h | 116 + khexedit/lib/kcoltextexport.h | 40 + khexedit/lib/kcolumn.cpp | 60 + khexedit/lib/kcolumn.h | 126 + khexedit/lib/kcolumnsview.cpp | 236 + khexedit/lib/kcolumnsview.h | 168 + khexedit/lib/kcoordrange.h | 95 + khexedit/lib/kcoordrangelist.cpp | 78 + khexedit/lib/kcoordrangelist.h | 44 + khexedit/lib/kcursor.cpp | 49 + khexedit/lib/kcursor.h | 68 + khexedit/lib/kdatabuffer.cpp | 51 + khexedit/lib/kdatabuffer.h | 246 + khexedit/lib/kfixedsizebuffer.cpp | 272 + khexedit/lib/kfixedsizebuffer.h | 116 + khexedit/lib/khe.h | 95 + khexedit/lib/khechar.h | 44 + khexedit/lib/khexedit.cpp | 2032 +++++++ khexedit/lib/khexedit.h | 562 ++ khexedit/lib/khexedit_export.h | 25 + khexedit/lib/koffsetcoltextexport.cpp | 61 + khexedit/lib/koffsetcoltextexport.h | 57 + khexedit/lib/koffsetcolumn.cpp | 110 + khexedit/lib/koffsetcolumn.h | 109 + khexedit/lib/koffsetformat.cpp | 48 + khexedit/lib/koffsetformat.h | 70 + khexedit/lib/kplainbuffer.cpp | 344 ++ khexedit/lib/kplainbuffer.h | 131 + khexedit/lib/krange.h | 123 + khexedit/lib/kreadonlybuffer.h | 45 + khexedit/lib/ksection.h | 108 + khexedit/lib/ksectionlist.cpp | 79 + khexedit/lib/ksectionlist.h | 44 + khexedit/lib/kselection.h | 178 + khexedit/lib/kvaluecoltextexport.cpp | 69 + khexedit/lib/kvaluecoltextexport.h | 47 + khexedit/lib/kvaluecolumn.cpp | 134 + khexedit/lib/kvaluecolumn.h | 92 + khexedit/lib/kwordbufferservice.cpp | 209 + khexedit/lib/kwordbufferservice.h | 137 + khexedit/lib/kwrappingrobuffer.cpp | 61 + khexedit/lib/kwrappingrobuffer.h | 85 + khexedit/listview.cc | 54 + khexedit/listview.h | 49 + khexedit/main.cc | 130 + khexedit/optiondialog.cc | 1224 ++++ khexedit/optiondialog.h | 269 + khexedit/parts/Makefile.am | 1 + khexedit/parts/README | 3 + khexedit/parts/kbytesedit/Makefile.am | 15 + khexedit/parts/kbytesedit/README | 23 + .../parts/kbytesedit/kbyteseditwidget.cpp | 319 ++ .../parts/kbytesedit/kbyteseditwidget.desktop | 52 + khexedit/parts/kbytesedit/kbyteseditwidget.h | 185 + khexedit/parts/kpart/Makefile.am | 21 + khexedit/parts/kpart/khebrowserextension.cpp | 95 + khexedit/parts/kpart/khebrowserextension.h | 58 + khexedit/parts/kpart/khepart.cpp | 213 + khexedit/parts/kpart/khepart.h | 95 + khexedit/parts/kpart/khepartfactory.cpp | 90 + khexedit/parts/kpart/khepartfactory.h | 47 + khexedit/parts/kpart/khexedit2part.desktop | 101 + khexedit/parts/kpart/khexedit2partui.rc | 42 + khexedit/pics/Makefile.am | 3 + khexedit/pics/hexdrag.png | Bin 0 -> 459 bytes khexedit/pics/hexmask.png | Bin 0 -> 188 bytes khexedit/pics/hexwrite.png | Bin 0 -> 381 bytes khexedit/printdialogpage.cc | 386 ++ khexedit/printdialogpage.h | 73 + khexedit/progress.h | 130 + khexedit/searchbar.cc | 188 + khexedit/searchbar.h | 73 + khexedit/statusbarprogress.cc | 374 ++ khexedit/statusbarprogress.h | 159 + khexedit/stringdialog.cc | 412 ++ khexedit/stringdialog.h | 110 + khexedit/toplevel.cc | 1366 +++++ khexedit/toplevel.h | 279 + khexedit/version.h | 32 + kjots/ANNOUNCE | 26 + kjots/BUGS | 6 + kjots/CHANGES | 75 + kjots/KJotsMain.cpp | 1199 ++++ kjots/KJotsMain.h | 165 + kjots/KJotsSettings.kcfgc | 8 + kjots/Kjots.desktop | 80 + kjots/Makefile.am | 28 + kjots/README | 33 + kjots/confpagefont.ui | 38 + kjots/confpagemisc.ui | 152 + kjots/icons/Makefile.am | 6 + kjots/icons/README | 24 + kjots/icons/filedel.png | Bin 0 -> 892 bytes kjots/icons/hi16-app-kjots.png | Bin 0 -> 902 bytes kjots/icons/hi22-app-kjots.png | Bin 0 -> 1318 bytes kjots/icons/hi32-app-kjots.png | Bin 0 -> 2287 bytes kjots/icons/hi48-app-kjots.png | Bin 0 -> 3755 bytes kjots/icons/hi64-app-kjots.png | Bin 0 -> 5426 bytes kjots/kjots.kcfg | 35 + kjots/kjotsbookmarks.cpp | 51 + kjots/kjotsbookmarks.h | 51 + kjots/kjotsedit.cpp | 150 + kjots/kjotsedit.h | 54 + kjots/kjotsentry.cpp | 1234 ++++ kjots/kjotsentry.h | 179 + kjots/kjotsui.rc | 41 + kjots/main.cpp | 98 + klaptopdaemon/Makefile.am | 49 + klaptopdaemon/README | 8 + klaptopdaemon/acpi.cpp | 281 + klaptopdaemon/acpi.h | 72 + klaptopdaemon/acpi_helper.cpp | 325 ++ klaptopdaemon/apm.cpp | 285 + klaptopdaemon/apm.h | 71 + klaptopdaemon/applnk/.directory | 48 + klaptopdaemon/applnk/Makefile.am | 4 + klaptopdaemon/applnk/klaptopdaemon.desktop | 116 + klaptopdaemon/applnk/laptop.desktop | 135 + klaptopdaemon/applnk/pcmcia.desktop | 84 + klaptopdaemon/battery.cpp | 390 ++ klaptopdaemon/battery.h | 100 + klaptopdaemon/buttons.cpp | 620 ++ klaptopdaemon/buttons.h | 92 + klaptopdaemon/checkcrc.h | 53 + klaptopdaemon/configure.in.bot | 9 + klaptopdaemon/configure.in.in | 49 + klaptopdaemon/daemon_state.cpp | 282 + klaptopdaemon/daemon_state.h | 141 + klaptopdaemon/daemondock.cpp | 756 +++ klaptopdaemon/daemondock.h | 108 + klaptopdaemon/kpcmcia.cpp | 547 ++ klaptopdaemon/kpcmcia.h | 214 + klaptopdaemon/kpcmciainfo.cpp | 313 + klaptopdaemon/kpcmciainfo.h | 116 + klaptopdaemon/krichtextlabel.cpp | 112 + klaptopdaemon/krichtextlabel.h | 65 + klaptopdaemon/laptop_check.cpp | 53 + klaptopdaemon/laptop_daemon.cpp | 1083 ++++ klaptopdaemon/laptop_daemon.h | 186 + klaptopdaemon/linux/bulkmem.h | 184 + klaptopdaemon/linux/ciscode.h | 96 + klaptopdaemon/linux/cisreg.h | 105 + klaptopdaemon/linux/cistpl.h | 543 ++ klaptopdaemon/linux/cs.h | 455 ++ klaptopdaemon/linux/cs_types.h | 50 + klaptopdaemon/linux/driver_ops.h | 71 + klaptopdaemon/linux/ds.h | 142 + klaptopdaemon/linux/ftl.h | 62 + klaptopdaemon/linux/k_compat.h | 246 + klaptopdaemon/linux/mem_op.h | 120 + klaptopdaemon/linux/memory.h | 30 + klaptopdaemon/linux/ss.h | 113 + klaptopdaemon/linux/version.h | 4 + klaptopdaemon/main.cpp | 305 + klaptopdaemon/main.h | 82 + klaptopdaemon/makecrc.cpp | 38 + klaptopdaemon/pcmcia.cpp | 122 + klaptopdaemon/pcmcia.h | 70 + klaptopdaemon/pics/Makefile.am | 6 + klaptopdaemon/pics/README | 36 + klaptopdaemon/pics/actions/Makefile.am | 3 + .../cr16-action-alt2_laptop_nobattery.png | Bin 0 -> 395 bytes .../cr16-action-alt2_laptop_nocharge.png | Bin 0 -> 280 bytes .../actions/cr16-action-alt2_laptop_power.png | Bin 0 -> 317 bytes .../cr16-action-alt3_laptop_nocharge.png | Bin 0 -> 280 bytes .../actions/cr16-action-alt3_laptop_power.png | Bin 0 -> 284 bytes .../cr16-action-alt_laptop_nocharge.png | Bin 0 -> 795 bytes .../actions/cr16-action-alt_laptop_power.png | Bin 0 -> 775 bytes .../actions/cr16-action-laptop_charge.png | Bin 0 -> 296 bytes .../actions/cr16-action-laptop_nobattery.png | Bin 0 -> 352 bytes .../actions/cr16-action-laptop_nocharge.png | Bin 0 -> 305 bytes .../pics/actions/cr16-action-power.png | Bin 0 -> 335 bytes .../actions/cr22-action-laptop_charge.png | Bin 0 -> 966 bytes .../actions/cr22-action-laptop_nobattery.png | Bin 0 -> 1022 bytes .../actions/cr22-action-laptop_nocharge.png | Bin 0 -> 395 bytes .../pics/actions/cr22-action-laptop_power.png | Bin 0 -> 832 bytes .../pics/actions/cr32-action-power.png | Bin 0 -> 421 bytes .../pics/cr128-app-laptop_battery.png | Bin 0 -> 10017 bytes .../pics/cr16-app-laptop_battery.png | Bin 0 -> 912 bytes klaptopdaemon/pics/cr16-app-laptop_pcmcia.png | Bin 0 -> 477 bytes .../pics/cr32-app-laptop_battery.png | Bin 0 -> 2374 bytes klaptopdaemon/pics/cr32-app-laptop_pcmcia.png | Bin 0 -> 1375 bytes .../pics/cr48-app-laptop_battery.png | Bin 0 -> 3544 bytes klaptopdaemon/pics/cr48-app-laptop_pcmcia.png | Bin 0 -> 1751 bytes .../pics/cr64-app-laptop_battery.png | Bin 0 -> 4730 bytes .../pics/crsc-app-laptop_battery.svgz | Bin 0 -> 4371 bytes klaptopdaemon/portable.cpp | 3087 ++++++++++ klaptopdaemon/portable.h | 147 + klaptopdaemon/power.cpp | 587 ++ klaptopdaemon/power.h | 98 + klaptopdaemon/profile.cpp | 424 ++ klaptopdaemon/profile.h | 82 + klaptopdaemon/smapi.h | 54 + klaptopdaemon/smapibios.h | 93 + klaptopdaemon/smapidev.c | 743 +++ klaptopdaemon/smapidev.h | 273 + klaptopdaemon/sony.cpp | 200 + klaptopdaemon/sony.h | 71 + klaptopdaemon/thinkpad_common.h | 127 + klaptopdaemon/version.h | 19 + klaptopdaemon/wake_laptop.cpp | 39 + klaptopdaemon/warning.cpp | 602 ++ klaptopdaemon/warning.h | 106 + klaptopdaemon/xautolock.cc | 277 + klaptopdaemon/xautolock.h | 77 + klaptopdaemon/xautolock_c.h | 76 + klaptopdaemon/xautolock_diy.c | 289 + klaptopdaemon/xautolock_engine.c | 419 ++ kmilo/Makefile.am | 18 + kmilo/README | 17 + kmilo/TODO | 7 + kmilo/asus/Makefile.am | 37 + kmilo/asus/README | 43 + kmilo/asus/asus.cpp | 213 + kmilo/asus/asus.h | 88 + kmilo/asus/kmilo_asus.desktop | 97 + kmilo/configure.in.in | 60 + kmilo/delli8k/Makefile.am | 36 + kmilo/delli8k/README | 98 + kmilo/delli8k/delli8k.cpp | 256 + kmilo/delli8k/delli8k.h | 89 + kmilo/delli8k/i8k.h | 46 + kmilo/delli8k/kmilo_delli8k.desktop | 96 + kmilo/demo/Makefile.am | 32 + kmilo/demo/demo.cpp | 56 + kmilo/demo/demo.h | 39 + kmilo/demo/kmilo_demo.desktop | 110 + kmilo/generic/Makefile.am | 34 + kmilo/generic/README | 38 + kmilo/generic/generic_monitor.cpp | 324 ++ kmilo/generic/generic_monitor.h | 94 + kmilo/generic/kmilo_generic.desktop | 108 + kmilo/kmilo_kvaio/Makefile.am | 39 + kmilo/kmilo_kvaio/README.sonypi.h | 18 + kmilo/kmilo_kvaio/kcmkvaio/Makefile.am | 15 + .../kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui | 273 + .../kcmkvaio/kcmkvaio_general.ui.h | 15 + kmilo/kmilo_kvaio/kcmkvaio/kvaio.desktop | 146 + kmilo/kmilo_kvaio/kcmkvaio/main.cpp | 176 + kmilo/kmilo_kvaio/kcmkvaio/main.h | 53 + kmilo/kmilo_kvaio/kmilo_kvaio.cpp | 68 + kmilo/kmilo_kvaio/kmilo_kvaio.desktop | 106 + kmilo/kmilo_kvaio/kmilo_kvaio.h | 66 + kmilo/kmilo_kvaio/kvaio.cpp | 606 ++ kmilo/kmilo_kvaio/kvaio.h | 113 + kmilo/kmilo_kvaio/kvaiodriverinterface.cpp | 221 + kmilo/kmilo_kvaio/kvaiodriverinterface.h | 62 + kmilo/kmilo_kvaio/sonypi.h | 158 + kmilo/kmilod/Makefile.am | 43 + kmilo/kmilod/defaultskin.cpp | 107 + kmilo/kmilod/defaultskin.h | 56 + kmilo/kmilod/defaultwidget.ui | 195 + kmilo/kmilod/displayskin.cpp | 34 + kmilo/kmilod/displayskin.h | 47 + kmilo/kmilod/kmilod.cpp | 227 + kmilo/kmilod/kmilod.desktop | 59 + kmilo/kmilod/kmilod.h | 72 + kmilo/kmilod/kmilointerface.cpp | 26 + kmilo/kmilod/kmilointerface.h | 57 + kmilo/kmilod/kmilopluginsvc.desktop | 9 + kmilo/kmilod/monitor.cpp | 44 + kmilo/kmilod/monitor.h | 98 + kmilo/powerbook/Makefile.am | 34 + kmilo/powerbook/kmilo_powerbook.desktop | 105 + kmilo/powerbook/pb_monitor.cpp | 127 + kmilo/powerbook/pb_monitor.h | 42 + kmilo/powerbook2/Makefile.am | 34 + kmilo/powerbook2/kmilo_powerbook.desktop | 106 + kmilo/powerbook2/pb_monitor.cpp | 165 + kmilo/powerbook2/pb_monitor.h | 55 + kmilo/thinkpad/Makefile.am | 36 + kmilo/thinkpad/README | 61 + kmilo/thinkpad/kcmthinkpad/Makefile.am | 15 + .../kcmthinkpad/kcmthinkpad_general.ui | 307 + .../kcmthinkpad/kcmthinkpad_general.ui.h | 36 + kmilo/thinkpad/kcmthinkpad/main.cpp | 189 + kmilo/thinkpad/kcmthinkpad/main.h | 49 + kmilo/thinkpad/kcmthinkpad/thinkpad.desktop | 145 + kmilo/thinkpad/kmilo_thinkpad.desktop | 101 + kmilo/thinkpad/thinkpad.cpp | 556 ++ kmilo/thinkpad/thinkpad.h | 208 + kregexpeditor/Comments | 4 + kregexpeditor/KMultiFormListBox/Makefile.am | 15 + kregexpeditor/KMultiFormListBox/TODO | 1 + kregexpeditor/KMultiFormListBox/ccp.cpp | 83 + kregexpeditor/KMultiFormListBox/ccp.h | 61 + kregexpeditor/KMultiFormListBox/idx.xbm | 5 + .../KMultiFormListBox/indexWindow.cpp | 97 + kregexpeditor/KMultiFormListBox/indexWindow.h | 83 + .../kmultiformlistbox-multivisible.cpp | 305 + .../kmultiformlistbox-multivisible.h | 135 + .../kmultiformlistbox-shower.h | 53 + .../kmultiformlistbox-windowed.cpp | 213 + .../kmultiformlistbox-windowed.h | 83 + .../KMultiFormListBox/kmultiformlistbox.cpp | 104 + .../KMultiFormListBox/kmultiformlistbox.h | 125 + .../kmultiformlistboxentry.cpp | 44 + .../kmultiformlistboxentry.h | 73 + .../kmultiformlistboxfactory.cpp | 26 + .../kmultiformlistboxfactory.h | 70 + .../KMultiFormListBox/widgetwindow.cpp | 117 + .../KMultiFormListBox/widgetwindow.h | 60 + .../KMultiFormListBox/windowlistboxitem.cpp | 45 + .../KMultiFormListBox/windowlistboxitem.h | 44 + kregexpeditor/KWidgetStreamer/Makefile.am | 9 + .../KWidgetStreamer/kwidgetstreamer.cpp | 177 + .../KWidgetStreamer/kwidgetstreamer.h | 74 + kregexpeditor/Makefile.am | 65 + kregexpeditor/TODO | 49 + kregexpeditor/altnregexp.cpp | 102 + kregexpeditor/altnregexp.h | 47 + kregexpeditor/altnwidget.cpp | 254 + kregexpeditor/altnwidget.h | 65 + kregexpeditor/auxbuttons.cpp | 121 + kregexpeditor/auxbuttons.h | 60 + kregexpeditor/characterswidget.cpp | 447 ++ kregexpeditor/characterswidget.h | 144 + kregexpeditor/charselector.cpp | 185 + kregexpeditor/charselector.h | 52 + kregexpeditor/compoundregexp.cpp | 115 + kregexpeditor/compoundregexp.h | 54 + kregexpeditor/compoundwidget.cpp | 324 ++ kregexpeditor/compoundwidget.h | 104 + kregexpeditor/concregexp.cpp | 157 + kregexpeditor/concregexp.h | 49 + kregexpeditor/concwidget.cpp | 400 ++ kregexpeditor/concwidget.h | 69 + kregexpeditor/dcbutton.cpp | 37 + kregexpeditor/dcbutton.h | 42 + kregexpeditor/dotregexp.cpp | 39 + kregexpeditor/dotregexp.h | 41 + kregexpeditor/drag.cpp | 77 + kregexpeditor/drag.h | 45 + kregexpeditor/dragaccepter.cpp | 139 + kregexpeditor/dragaccepter.h | 53 + kregexpeditor/editorwindow.cpp | 453 ++ kregexpeditor/editorwindow.h | 269 + kregexpeditor/emacsregexpconverter.cpp | 253 + kregexpeditor/emacsregexpconverter.h | 43 + kregexpeditor/errormap.cpp | 73 + kregexpeditor/errormap.h | 36 + kregexpeditor/extractrc-from-regexp | 85 + kregexpeditor/gen_qregexplexer.cpp | 1980 +++++++ kregexpeditor/gen_qregexpparser.cc | 1447 +++++ kregexpeditor/gen_qregexpparser.hh | 93 + kregexpeditor/hi128-app-kregexpeditor.png | Bin 0 -> 6933 bytes kregexpeditor/hi16-app-kregexpeditor.png | Bin 0 -> 801 bytes kregexpeditor/hi22-app-kregexpeditor.png | Bin 0 -> 1235 bytes kregexpeditor/hi32-app-kregexpeditor.png | Bin 0 -> 1391 bytes kregexpeditor/hi48-app-kregexpeditor.png | Bin 0 -> 2090 bytes kregexpeditor/hi64-app-kregexpeditor.png | Bin 0 -> 2895 bytes kregexpeditor/infopage.cpp | 97 + kregexpeditor/infopage.h | 37 + kregexpeditor/kregexpeditor.desktop | 76 + kregexpeditor/kregexpeditor.svgz | Bin 0 -> 1098 bytes kregexpeditor/kregexpeditorfactory.cpp | 25 + kregexpeditor/kregexpeditorgui.cpp | 161 + kregexpeditor/kregexpeditorgui.desktop | 62 + kregexpeditor/kregexpeditorgui.h | 93 + kregexpeditor/kregexpeditorprivate.cpp | 424 ++ kregexpeditor/kregexpeditorprivate.h | 106 + kregexpeditor/limitedcharlineedit.cpp | 75 + kregexpeditor/limitedcharlineedit.h | 43 + kregexpeditor/lookaheadregexp.cpp | 72 + kregexpeditor/lookaheadregexp.h | 49 + kregexpeditor/lookaheadwidget.cpp | 110 + kregexpeditor/lookaheadwidget.h | 51 + kregexpeditor/main.cpp | 68 + kregexpeditor/multicontainerwidget.cpp | 265 + kregexpeditor/multicontainerwidget.h | 50 + kregexpeditor/myfontmetrics.cpp | 31 + kregexpeditor/myfontmetrics.h | 27 + kregexpeditor/pair.h | 37 + kregexpeditor/picts/Makefile.am | 2 + kregexpeditor/picts/altn.png | Bin 0 -> 310 bytes kregexpeditor/picts/anychar.png | Bin 0 -> 616 bytes kregexpeditor/picts/autoverify.png | Bin 0 -> 142 bytes kregexpeditor/picts/begline.png | Bin 0 -> 244 bytes kregexpeditor/picts/characters.png | Bin 0 -> 240 bytes kregexpeditor/picts/compound.png | Bin 0 -> 285 bytes kregexpeditor/picts/endline.png | Bin 0 -> 245 bytes kregexpeditor/picts/error.png | Bin 0 -> 234 bytes kregexpeditor/picts/neglookahead.png | Bin 0 -> 297 bytes kregexpeditor/picts/nonwordboundary.png | Bin 0 -> 225 bytes kregexpeditor/picts/poslookahead.png | Bin 0 -> 297 bytes kregexpeditor/picts/repeat.png | Bin 0 -> 632 bytes kregexpeditor/picts/select.png | Bin 0 -> 742 bytes kregexpeditor/picts/text.png | Bin 0 -> 338 bytes kregexpeditor/picts/verify.png | Bin 0 -> 141 bytes kregexpeditor/picts/wordboundary.png | Bin 0 -> 210 bytes kregexpeditor/positionregexp.cpp | 53 + kregexpeditor/positionregexp.h | 46 + kregexpeditor/predefined/General/Makefile.am | 5 + .../predefined/General/anything.regexp | 11 + .../predefined/General/spaces.regexp | 11 + kregexpeditor/predefined/Makefile.am | 1 + kregexpeditor/predefined/README | 2 + kregexpeditor/qregexpparser.l | 319 ++ kregexpeditor/qregexpparser.y | 203 + kregexpeditor/qt-only/clean | 14 + kregexpeditor/qt-only/compat.cpp | 115 + kregexpeditor/qt-only/compat.h | 85 + kregexpeditor/qt-only/compile | 28 + kregexpeditor/qt-only/qt-only.pro | 137 + kregexpeditor/qt-only/win-release.bat | 7 + kregexpeditor/qtregexpconverter.cpp | 299 + kregexpeditor/qtregexpconverter.h | 43 + kregexpeditor/qtregexphighlighter.cpp | 71 + kregexpeditor/qtregexphighlighter.h | 34 + kregexpeditor/regexp.cpp | 95 + kregexpeditor/regexp.h | 72 + kregexpeditor/regexpbuttons.cpp | 217 + kregexpeditor/regexpbuttons.h | 70 + kregexpeditor/regexpconverter.cpp | 93 + kregexpeditor/regexpconverter.h | 79 + kregexpeditor/regexphighlighter.cpp | 44 + kregexpeditor/regexphighlighter.h | 38 + kregexpeditor/regexpwidget.cpp | 227 + kregexpeditor/regexpwidget.h | 203 + kregexpeditor/repeatregexp.cpp | 94 + kregexpeditor/repeatregexp.h | 49 + kregexpeditor/repeatwidget.cpp | 326 ++ kregexpeditor/repeatwidget.h | 103 + kregexpeditor/scrollededitorwindow.cpp | 144 + kregexpeditor/scrollededitorwindow.h | 92 + kregexpeditor/selectablelineedit.cpp | 73 + kregexpeditor/selectablelineedit.h | 53 + kregexpeditor/singlecontainerwidget.cpp | 132 + kregexpeditor/singlecontainerwidget.h | 53 + kregexpeditor/test-without-dl/Makefile.am | 8 + kregexpeditor/test-without-dl/main.cpp | 66 + kregexpeditor/textrangeregexp.cpp | 143 + kregexpeditor/textrangeregexp.h | 75 + kregexpeditor/textregexp.cpp | 81 + kregexpeditor/textregexp.h | 50 + kregexpeditor/textwidget.cpp | 157 + kregexpeditor/textwidget.h | 63 + kregexpeditor/triple.h | 40 + kregexpeditor/userdefinedregexps.cpp | 266 + kregexpeditor/userdefinedregexps.h | 75 + kregexpeditor/util.cpp | 58 + kregexpeditor/util.h | 34 + kregexpeditor/verifier.cpp | 117 + kregexpeditor/verifier.h | 61 + kregexpeditor/verifybuttons.cpp | 214 + kregexpeditor/verifybuttons.h | 79 + kregexpeditor/widgetfactory.cpp | 209 + kregexpeditor/widgetfactory.h | 60 + kregexpeditor/zerowidgets.cpp | 145 + kregexpeditor/zerowidgets.h | 125 + ksim/AUTHORS | 2 + ksim/BUGS | 3 + ksim/COPYING | 340 ++ ksim/ChangeLog | 363 ++ ksim/Makefile.am | 34 + ksim/README | 42 + ksim/TODO | 5 + ksim/baselist.h | 97 + ksim/configure.in.in | 36 + ksim/generalprefs.cpp | 574 ++ ksim/generalprefs.h | 185 + ksim/ksim.cpp | 129 + ksim/ksim.desktop | 134 + ksim/ksim.h | 67 + ksim/ksim_panelextensionrc | 81 + ksim/ksimframe.cpp | 94 + ksim/ksimframe.h | 63 + ksim/ksimpref.cpp | 260 + ksim/ksimpref.h | 112 + ksim/ksimsysinfo.cpp | 325 ++ ksim/ksimsysinfo.h | 70 + ksim/ksimview.cpp | 467 ++ ksim/ksimview.h | 112 + ksim/library/Makefile.am | 25 + ksim/library/chart.cpp | 627 ++ ksim/library/chart.h | 184 + ksim/library/common.cpp | 102 + ksim/library/common.h | 134 + ksim/library/ksimconfig.cpp | 427 ++ ksim/library/ksimconfig.h | 109 + ksim/library/label.cpp | 301 + ksim/library/label.h | 210 + ksim/library/led.cpp | 349 ++ ksim/library/led.h | 193 + ksim/library/pluginglobal.cpp | 207 + ksim/library/pluginglobal.h | 161 + ksim/library/pluginloader.cpp | 326 ++ ksim/library/pluginloader.h | 183 + ksim/library/pluginmodule.cpp | 174 + ksim/library/pluginmodule.h | 205 + ksim/library/progress.cpp | 231 + ksim/library/progress.h | 181 + ksim/library/themeloader.cpp | 1266 ++++ ksim/library/themeloader.h | 511 ++ ksim/library/themetypes.h | 81 + ksim/monitorprefs.cpp | 98 + ksim/monitorprefs.h | 45 + ksim/monitors/Makefile.am | 9 + ksim/monitors/cpu/Makefile.am | 16 + ksim/monitors/cpu/cpu.desktop | 94 + ksim/monitors/cpu/cr16-device-ksim_cpu.png | Bin 0 -> 249 bytes ksim/monitors/cpu/ksimcpu.cpp | 514 ++ ksim/monitors/cpu/ksimcpu.h | 228 + ksim/monitors/disk/Makefile.am | 15 + ksim/monitors/disk/configure.in.in | 13 + ksim/monitors/disk/disk.desktop | 106 + ksim/monitors/disk/ksimdisk.cpp | 570 ++ ksim/monitors/disk/ksimdisk.h | 154 + ksim/monitors/filesystem/DFree.desktop | 87 + ksim/monitors/filesystem/Makefile.am | 16 + ksim/monitors/filesystem/configure.in.in | 2 + ksim/monitors/filesystem/filesystemstats.cpp | 224 + ksim/monitors/filesystem/filesystemstats.h | 40 + ksim/monitors/filesystem/filesystemwidget.cpp | 232 + ksim/monitors/filesystem/filesystemwidget.h | 78 + ksim/monitors/filesystem/fsystemconfig.cpp | 184 + ksim/monitors/filesystem/fsystemconfig.h | 58 + ksim/monitors/filesystem/fsystemiface.h | 32 + ksim/monitors/filesystem/ksimfsystem.cpp | 202 + ksim/monitors/filesystem/ksimfsystem.h | 76 + ksim/monitors/i8k/Makefile.am | 15 + ksim/monitors/i8k/i8k.desktop | 62 + ksim/monitors/i8k/ksimi8k.cpp | 257 + ksim/monitors/i8k/ksimi8k.h | 102 + ksim/monitors/lm_sensors/Lm_sensors.desktop | 84 + ksim/monitors/lm_sensors/Makefile.am | 26 + ksim/monitors/lm_sensors/NVCtrl.c | 357 ++ ksim/monitors/lm_sensors/NVCtrl.h | 807 +++ ksim/monitors/lm_sensors/NVCtrlLib.h | 184 + ksim/monitors/lm_sensors/ksimsensors.cpp | 189 + ksim/monitors/lm_sensors/ksimsensors.h | 91 + ksim/monitors/lm_sensors/ksimsensorsiface.h | 33 + ksim/monitors/lm_sensors/nv_control.h | 205 + ksim/monitors/lm_sensors/sensorbase.cpp | 254 + ksim/monitors/lm_sensors/sensorbase.h | 175 + ksim/monitors/lm_sensors/sensorsconfig.cpp | 241 + ksim/monitors/lm_sensors/sensorsconfig.h | 69 + ksim/monitors/mail/Makefile.am | 15 + ksim/monitors/mail/ksimmail.cpp | 160 + ksim/monitors/mail/ksimmail.h | 90 + ksim/monitors/mail/mail.desktop | 119 + ksim/monitors/net/Makefile.am | 14 + ksim/monitors/net/Net.desktop | 112 + ksim/monitors/net/ksimnet.cpp | 672 +++ ksim/monitors/net/ksimnet.h | 90 + ksim/monitors/net/netconfig.cpp | 296 + ksim/monitors/net/netconfig.h | 67 + ksim/monitors/net/netdevices.h | 218 + ksim/monitors/net/netdialog.cpp | 328 ++ ksim/monitors/net/netdialog.h | 85 + ksim/monitors/snmp/Makefile.am | 16 + ksim/monitors/snmp/Snmp.desktop | 70 + ksim/monitors/snmp/browsedialog.cpp | 147 + ksim/monitors/snmp/browsedialog.h | 71 + ksim/monitors/snmp/browsedialogbase.ui | 262 + ksim/monitors/snmp/chartmonitor.cpp | 83 + ksim/monitors/snmp/chartmonitor.h | 54 + ksim/monitors/snmp/configpage.cpp | 313 + ksim/monitors/snmp/configpage.h | 120 + ksim/monitors/snmp/configure.in.in | 40 + ksim/monitors/snmp/configwidget.ui | 215 + ksim/monitors/snmp/hostconfig.cpp | 152 + ksim/monitors/snmp/hostconfig.h | 86 + ksim/monitors/snmp/hostdialog.cpp | 193 + ksim/monitors/snmp/hostdialog.h | 59 + ksim/monitors/snmp/hostdialogbase.ui | 526 ++ ksim/monitors/snmp/identifier.cpp | 129 + ksim/monitors/snmp/identifier.h | 72 + ksim/monitors/snmp/labelmonitor.cpp | 45 + ksim/monitors/snmp/labelmonitor.h | 52 + ksim/monitors/snmp/monitor.cpp | 96 + ksim/monitors/snmp/monitor.h | 77 + ksim/monitors/snmp/monitorconfig.cpp | 183 + ksim/monitors/snmp/monitorconfig.h | 84 + ksim/monitors/snmp/monitordialog.cpp | 178 + ksim/monitors/snmp/monitordialog.h | 60 + ksim/monitors/snmp/monitordialogbase.ui | 440 ++ ksim/monitors/snmp/pdu.cpp | 98 + ksim/monitors/snmp/pdu.h | 60 + ksim/monitors/snmp/plugin.cpp | 52 + ksim/monitors/snmp/plugin.h | 49 + ksim/monitors/snmp/probedialog.cpp | 117 + ksim/monitors/snmp/probedialog.h | 87 + ksim/monitors/snmp/proberesultdialog.cpp | 55 + ksim/monitors/snmp/proberesultdialog.h | 49 + ksim/monitors/snmp/proberesultdialogbase.ui | 124 + ksim/monitors/snmp/session.cpp | 283 + ksim/monitors/snmp/session.h | 64 + ksim/monitors/snmp/snmp.cpp | 320 ++ ksim/monitors/snmp/snmp.h | 165 + ksim/monitors/snmp/snmp_p.h | 59 + ksim/monitors/snmp/snmplib.cpp | 151 + ksim/monitors/snmp/snmplib.h | 143 + ksim/monitors/snmp/value.cpp | 333 ++ ksim/monitors/snmp/value.h | 106 + ksim/monitors/snmp/value_p.h | 63 + ksim/monitors/snmp/view.cpp | 80 + ksim/monitors/snmp/view.h | 55 + ksim/monitors/snmp/walker.cpp | 121 + ksim/monitors/snmp/walker.h | 82 + ksim/pics/Makefile.am | 2 + ksim/pics/cr16-app-ksim.png | Bin 0 -> 1086 bytes ksim/pics/cr32-app-ksim.png | Bin 0 -> 3314 bytes ksim/pics/cr48-app-ksim.png | Bin 0 -> 6222 bytes ksim/pics/misc/Makefile.am | 5 + ksim/pics/misc/clock.png | Bin 0 -> 875 bytes ksim/pics/misc/uptime.png | Bin 0 -> 654 bytes ksim/systeminfo.cpp | 277 + ksim/systeminfo.h | 137 + ksim/themeprefs.cpp | 272 + ksim/themeprefs.h | 115 + ksim/themes/Makefile.am | 1 + ksim/themes/ksim/Makefile.am | 24 + ksim/themes/ksim/bg_chart.png | Bin 0 -> 263 bytes ksim/themes/ksim/bg_grid.png | Bin 0 -> 172 bytes ksim/themes/ksim/bg_meter.png | Bin 0 -> 246 bytes ksim/themes/ksim/bg_panel.png | Bin 0 -> 245 bytes ksim/themes/ksim/decal_net_leds.png | Bin 0 -> 285 bytes ksim/themes/ksim/frame_bottom.png | Bin 0 -> 206 bytes ksim/themes/ksim/frame_left.png | Bin 0 -> 153 bytes ksim/themes/ksim/frame_right.png | Bin 0 -> 153 bytes ksim/themes/ksim/frame_top.png | Bin 0 -> 211 bytes ksim/themes/ksim/gkrellmrc | 47 + ksim/themes/ksim/gkrellmrc_ksim | 47 + ksim/themes/ksim/host/Makefile.am | 4 + ksim/themes/ksim/host/bg_meter.png | Bin 0 -> 246 bytes ksim/themes/ksim/krell_meter.png | Bin 0 -> 544 bytes ksim/themes/ksim/krell_panel.png | Bin 0 -> 149 bytes ksim/themes/ksim/krell_slider.png | Bin 0 -> 314 bytes ksim/themes/ksim/mail/Makefile.am | 3 + ksim/themes/ksim/mail/decal_mail.png | Bin 0 -> 3935 bytes ksim/themes/ksim/mail/krell_mail.png | Bin 0 -> 3942 bytes ksim/themes/ksim/mail/krell_mail_daemon.png | Bin 0 -> 126 bytes ktimer/Makefile.am | 24 + ktimer/hi128-app-ktimer.png | Bin 0 -> 17753 bytes ktimer/hi16-app-ktimer.png | Bin 0 -> 875 bytes ktimer/hi32-app-ktimer.png | Bin 0 -> 2458 bytes ktimer/hi48-app-ktimer.png | Bin 0 -> 4736 bytes ktimer/ktimer.cpp | 516 ++ ktimer/ktimer.desktop | 63 + ktimer/ktimer.h | 113 + ktimer/main.cpp | 46 + ktimer/prefwidget.ui | 278 + kwallet/Makefile.am | 26 + kwallet/TODO | 13 + kwallet/allyourbase.cpp | 733 +++ kwallet/allyourbase.h | 178 + kwallet/hi128-app-kwalletmanager.png | Bin 0 -> 24094 bytes kwallet/hi128-app-kwalletmanager2.png | Bin 0 -> 28434 bytes kwallet/hi16-app-kwalletmanager.png | Bin 0 -> 1209 bytes kwallet/hi16-app-kwalletmanager2.png | Bin 0 -> 1139 bytes kwallet/hi22-app-kwalletmanager.png | Bin 0 -> 1601 bytes kwallet/hi32-app-kwalletmanager.png | Bin 0 -> 3273 bytes kwallet/hi32-app-kwalletmanager2.png | Bin 0 -> 3225 bytes kwallet/hi48-app-kwalletmanager.png | Bin 0 -> 6355 bytes kwallet/hi48-app-kwalletmanager2.png | Bin 0 -> 6332 bytes kwallet/hi64-app-kwalletmanager.png | Bin 0 -> 9728 bytes kwallet/hi64-app-kwalletmanager2.png | Bin 0 -> 9702 bytes kwallet/icons/Makefile.am | 5 + kwallet/icons/cr22-action-folder_closed.png | Bin 0 -> 1149 bytes kwallet/icons/cr22-action-folder_open.png | Bin 0 -> 1349 bytes kwallet/icons/cr22-action-wallet_closed.png | Bin 0 -> 997 bytes kwallet/icons/cr22-action-wallet_open.png | Bin 0 -> 1098 bytes kwallet/kbetterthankdialogbase.ui | 154 + kwallet/kbetterthankdialogbase.ui.h | 50 + kwallet/konfigurator/Makefile.am | 15 + kwallet/konfigurator/konfigurator.cpp | 323 ++ kwallet/konfigurator/konfigurator.h | 57 + kwallet/konfigurator/kwallet_config.desktop | 47 + kwallet/konfigurator/kwalletconfig.desktop | 152 + .../konfigurator/kwalletmanager_show.desktop | 60 + kwallet/konfigurator/walletconfigwidget.ui | 499 ++ kwallet/kwalleteditor.cpp | 1143 ++++ kwallet/kwalleteditor.h | 110 + kwallet/kwalleteditor.rc | 17 + kwallet/kwalletmanager-kwalletd.desktop | 60 + kwallet/kwalletmanager.cpp | 423 ++ kwallet/kwalletmanager.desktop | 63 + kwallet/kwalletmanager.h | 84 + kwallet/kwalletmanager.rc | 14 + kwallet/kwalletpopup.cpp | 110 + kwallet/kwalletpopup.h | 54 + kwallet/kwmapeditor.cpp | 187 + kwallet/kwmapeditor.h | 61 + kwallet/main.cpp | 100 + kwallet/walletwidget.ui | 416 ++ superkaramba/AUTHORS | 49 + superkaramba/COPYING | 280 + superkaramba/ChangeLog | 710 +++ superkaramba/Doxyfile | 0 superkaramba/INSTALL | 167 + superkaramba/Makefile.am | 4 + superkaramba/NEWS | 0 superkaramba/README | 42 + superkaramba/TODO | 1 + superkaramba/configure.in.bot | 7 + superkaramba/configure.in.in | 77 + superkaramba/doc/Makefile.am | 6 + superkaramba/doc/faq/faq.css | 36 + superkaramba/doc/faq/faq.dat | 75 + superkaramba/doc/faq/faq.html | 111 + superkaramba/doc/faq/faq.txt | 159 + superkaramba/doc/faq/faqfooter.html | 9 + superkaramba/doc/faq/faqfooter.txt | 9 + superkaramba/doc/faq/faqheader.html | 12 + superkaramba/doc/faq/faqheader.txt | 4 + superkaramba/doc/python_api/api.css | 40 + superkaramba/doc/python_api/api_html.rc | 36 + superkaramba/doc/python_api/make_api_doc.sh | 42 + superkaramba/examples/API | 6 + superkaramba/examples/README | 62 + superkaramba/examples/api.html | 4016 +++++++++++++ superkaramba/examples/autoHide/main.py | 62 + superkaramba/examples/autoHide/main.theme | 42 + .../examples/autoHide/pics/MSN-64x64.png | Bin 0 -> 6178 bytes .../examples/autoHide/pics/MSN-96x96.png | Bin 0 -> 11529 bytes .../autoHide/pics/Tux_House-64x64.png | Bin 0 -> 4485 bytes .../autoHide/pics/Tux_House-96x96.png | Bin 0 -> 7462 bytes .../examples/autoHide/pics/Tux_Mail-64x64.png | Bin 0 -> 8572 bytes .../examples/autoHide/pics/Tux_Mail-96x96.png | Bin 0 -> 15942 bytes .../autoHide/pics/Tux_Mozilla-64x64.png | Bin 0 -> 7373 bytes .../autoHide/pics/Tux_Mozilla-96x96.png | Bin 0 -> 13570 bytes .../autoHide/pics/Tux_Sherlock-64x64.png | Bin 0 -> 5635 bytes .../autoHide/pics/Tux_Sherlock-96x96.png | Bin 0 -> 10369 bytes .../autoHide/pics/Tux_Terminal-64x64.png | Bin 0 -> 3489 bytes .../autoHide/pics/Tux_Terminal-96x96.png | Bin 0 -> 5985 bytes .../autoHide/pics/Tux_iPhoto-64x64.png | Bin 0 -> 8036 bytes .../autoHide/pics/Tux_iPhoto-96x96.png | Bin 0 -> 14876 bytes superkaramba/examples/autoHide/pics/bar3.png | Bin 0 -> 393 bytes superkaramba/examples/autoHide/pics/bar4.png | Bin 0 -> 310 bytes .../examples/autoHide/pics/calendar.png | Bin 0 -> 1950 bytes .../autoHide/pics/ctrl center-64x64.png | Bin 0 -> 5582 bytes .../autoHide/pics/ctrl center-96x96.png | Bin 0 -> 9770 bytes .../examples/autoHide/pics/iconbarback.png | Bin 0 -> 2475 bytes .../examples/autoHide/pics/label3.png | Bin 0 -> 300 bytes .../examples/autoHide/pics/label4.png | Bin 0 -> 256 bytes .../examples/autoHide/pics/osxbarback.png | Bin 0 -> 6463 bytes .../examples/autoHide/pics/osxbarbackBig.png | Bin 0 -> 6473 bytes .../examples/autoHide/pics/pointer.png | Bin 0 -> 309 bytes superkaramba/examples/bar/bar.py | 93 + superkaramba/examples/bar/bar.theme | 26 + superkaramba/examples/bar/hor.png | Bin 0 -> 300 bytes superkaramba/examples/bar/ver.png | Bin 0 -> 321 bytes .../examples/change_interval/interval.py | 60 + .../examples/change_interval/interval.theme | 2 + .../examples/control_management/mgmt.py | 49 + .../examples/control_management/mgmt.theme | 1 + .../disableRightClickMenu/disable_menu.py | 176 + .../disableRightClickMenu/disable_menu.theme | 1 + superkaramba/examples/globalMouse/README | 29 + .../examples/globalMouse/extension/setup.py | 12 + .../examples/globalMouse/extension/xcursor.c | 104 + superkaramba/examples/globalMouse/eyes.py | 192 + superkaramba/examples/globalMouse/eyes.theme | 3 + .../examples/globalMouse/pics/eyes.png | Bin 0 -> 2819 bytes .../examples/globalMouse/pics/eyes.xcf | Bin 0 -> 18677 bytes .../examples/globalMouse/pics/mask.png | Bin 0 -> 495 bytes .../examples/globalMouse/pics/pupille.png | Bin 0 -> 256 bytes superkaramba/examples/globalMouse/xcursor.so | Bin 0 -> 7465 bytes superkaramba/examples/graph/graph.py | 89 + superkaramba/examples/graph/graph.theme | 26 + superkaramba/examples/image/flag.png | Bin 0 -> 1072 bytes superkaramba/examples/image/flag2.png | Bin 0 -> 2130 bytes superkaramba/examples/image/image.py | 121 + superkaramba/examples/image/image.theme | 34 + superkaramba/examples/image/test1.sh | 2 + superkaramba/examples/image/test2.sh | 2 + superkaramba/examples/input_api/input_api.py | 185 + .../examples/input_api/input_api.theme | 5 + .../examples/input_example/input_example.py | 169 + .../input_example/input_example.theme | 5 + .../examples/mouseDrag/karmix/images/bar.png | Bin 0 -> 207 bytes .../examples/mouseDrag/karmix/images/bg.png | Bin 0 -> 4719 bytes .../examples/mouseDrag/karmix/karmix.py | 190 + .../examples/mouseDrag/karmix/karmix.theme | 17 + superkaramba/examples/mouseDrop/mousedrop.py | 138 + .../examples/mouseDrop/mousedrop.theme | 5 + superkaramba/examples/openCloseTheme/1.py | 22 + superkaramba/examples/openCloseTheme/1.theme | 2 + superkaramba/examples/openCloseTheme/2.theme | 2 + superkaramba/examples/popupMenu/calendar.png | Bin 0 -> 1950 bytes superkaramba/examples/popupMenu/popupMenu.png | Bin 0 -> 6221 bytes superkaramba/examples/popupMenu/popupMenu.py | 117 + .../examples/popupMenu/popupMenu.theme | 4 + superkaramba/examples/richtext/info.png | Bin 0 -> 641 bytes .../examples/richtext/penguin_executive.png | Bin 0 -> 5159 bytes superkaramba/examples/richtext/richtext.py | 136 + superkaramba/examples/richtext/richtext.theme | 1 + superkaramba/examples/richtext/rtext.py | 99 + superkaramba/examples/richtext/rtext.theme | 26 + .../examples/service_group/service_group.py | 143 + .../service_group/service_group.theme | 4 + superkaramba/examples/setIncomingData/1.py | 27 + superkaramba/examples/setIncomingData/1.theme | 2 + superkaramba/examples/setIncomingData/2.py | 78 + superkaramba/examples/setIncomingData/2.theme | 2 + superkaramba/examples/taskBar/cleanbar/README | 25 + .../examples/taskBar/cleanbar/cleanbar.py | 267 + .../examples/taskBar/cleanbar/cleanbar.theme | 14 + .../examples/taskBar/cleanbar/pics/bar2.png | Bin 0 -> 7508 bytes .../taskBar/cleanbar/pics/rightend.png | Bin 0 -> 434 bytes .../taskBar/cleanbar/pics/rightend_new.png | Bin 0 -> 5267 bytes .../taskBar/cleanbar/pics/slickbar.png | Bin 0 -> 3130 bytes .../taskBar/cleanbar/pics/startup.png | Bin 0 -> 2584 bytes .../examples/taskBar/cleanbar/pics/task.png | Bin 0 -> 429 bytes .../taskBar/cleanbar/pics/task_new.png | Bin 0 -> 2470 bytes superkaramba/examples/template.py | 160 + superkaramba/examples/test_all.sh | 27 + superkaramba/examples/text/text.py | 110 + superkaramba/examples/text/text.theme | 35 + superkaramba/examples/unicode/unicode.py | 116 + superkaramba/examples/unicode/unicode.theme | 1 + superkaramba/icons/Makefile.am | 1 + superkaramba/icons/cr128-app-superkaramba.png | Bin 0 -> 10111 bytes .../icons/cr128-mime-superkaramba_theme.png | Bin 0 -> 9438 bytes superkaramba/icons/cr16-app-superkaramba.png | Bin 0 -> 697 bytes .../icons/cr16-mime-superkaramba_theme.png | Bin 0 -> 694 bytes superkaramba/icons/cr22-app-superkaramba.png | Bin 0 -> 1030 bytes .../icons/cr22-mime-superkaramba_theme.png | Bin 0 -> 1008 bytes superkaramba/icons/cr32-app-superkaramba.png | Bin 0 -> 1657 bytes .../icons/cr32-mime-superkaramba_theme.png | Bin 0 -> 1642 bytes superkaramba/icons/cr48-app-superkaramba.png | Bin 0 -> 2757 bytes .../icons/cr48-mime-superkaramba_theme.png | Bin 0 -> 2746 bytes superkaramba/icons/cr64-app-superkaramba.png | Bin 0 -> 4039 bytes .../icons/cr64-mime-superkaramba_theme.png | Bin 0 -> 3901 bytes superkaramba/icons/crsc-app-superkaramba.svgz | Bin 0 -> 4263 bytes .../icons/crsc-mime-superkaramba_theme.svgz | Bin 0 -> 10765 bytes superkaramba/karamba.kdevelop | 257 + superkaramba/karamba.kdevses | 29 + superkaramba/mimetypes/Makefile.am | 2 + superkaramba/mimetypes/x-superkaramba.desktop | 52 + superkaramba/src/Makefile.am | 54 + superkaramba/src/bar.cpp | 134 + superkaramba/src/bar.h | 55 + superkaramba/src/bar_python.cpp | 168 + superkaramba/src/bar_python.h | 316 + superkaramba/src/clickable.cpp | 37 + superkaramba/src/clickable.h | 46 + superkaramba/src/clickarea.cpp | 107 + superkaramba/src/clickarea.h | 69 + superkaramba/src/clickmap.cpp | 96 + superkaramba/src/clickmap.h | 43 + superkaramba/src/config_python.cpp | 182 + superkaramba/src/config_python.h | 138 + superkaramba/src/cpusensor.cpp | 167 + superkaramba/src/cpusensor.h | 44 + superkaramba/src/datesensor.cpp | 129 + superkaramba/src/datesensor.h | 47 + superkaramba/src/dcopinterface.h | 37 + superkaramba/src/disksensor.cpp | 175 + superkaramba/src/disksensor.h | 51 + superkaramba/src/graph.cpp | 74 + superkaramba/src/graph.h | 39 + superkaramba/src/graph_python.cpp | 137 + superkaramba/src/graph_python.h | 289 + superkaramba/src/imagelabel.cpp | 632 ++ superkaramba/src/imagelabel.h | 191 + superkaramba/src/imagelabel_python.cpp | 331 ++ superkaramba/src/imagelabel_python.h | 449 ++ superkaramba/src/input.cpp | 196 + superkaramba/src/input.h | 84 + superkaramba/src/input_python.cpp | 355 ++ superkaramba/src/input_python.h | 475 ++ superkaramba/src/karamba.cpp | 2098 +++++++ superkaramba/src/karamba.h | 363 ++ superkaramba/src/karamba_python.cpp | 635 ++ superkaramba/src/karamba_python.h | 85 + superkaramba/src/karambaapp.cpp | 427 ++ superkaramba/src/karambaapp.h | 95 + superkaramba/src/karambainterface.cpp | 153 + superkaramba/src/karambainterface.h | 42 + superkaramba/src/karambalistboxitem.cpp | 25 + superkaramba/src/karambalistboxitem.h | 31 + superkaramba/src/karambarootpixmap.cpp | 36 + superkaramba/src/karambarootpixmap.h | 39 + superkaramba/src/karambasessionmanaged.cpp | 63 + superkaramba/src/karambasessionmanaged.h | 30 + superkaramba/src/kwidgetlistbox.cpp | 200 + superkaramba/src/kwidgetlistbox.h | 68 + superkaramba/src/lineparser.cpp | 96 + superkaramba/src/lineparser.h | 53 + superkaramba/src/main.cpp | 156 + superkaramba/src/memsensor.cpp | 359 ++ superkaramba/src/memsensor.h | 67 + superkaramba/src/menu_python.cpp | 200 + superkaramba/src/menu_python.h | 124 + superkaramba/src/meter.cpp | 111 + superkaramba/src/meter.h | 99 + superkaramba/src/meter_python.cpp | 373 ++ superkaramba/src/meter_python.h | 44 + superkaramba/src/misc_python.cpp | 852 +++ superkaramba/src/misc_python.h | 606 ++ superkaramba/src/networksensor.cpp | 164 + superkaramba/src/networksensor.h | 47 + superkaramba/src/noatunsensor.cpp | 234 + superkaramba/src/noatunsensor.h | 48 + superkaramba/src/programsensor.cpp | 93 + superkaramba/src/programsensor.h | 38 + superkaramba/src/richtextlabel.cpp | 212 + superkaramba/src/richtextlabel.h | 64 + superkaramba/src/richtextlabel_python.cpp | 182 + superkaramba/src/richtextlabel_python.h | 338 ++ superkaramba/src/rsssensor.cpp | 136 + superkaramba/src/rsssensor.h | 39 + superkaramba/src/sensor.cpp | 64 + superkaramba/src/sensor.h | 47 + superkaramba/src/sensorparams.cpp | 34 + superkaramba/src/sensorparams.h | 48 + superkaramba/src/sensorsensor.cpp | 115 + superkaramba/src/sensorsensor.h | 49 + superkaramba/src/showdesktop.cpp | 123 + superkaramba/src/showdesktop.h | 58 + superkaramba/src/sklineedit.cpp | 82 + superkaramba/src/sklineedit.h | 57 + superkaramba/src/sknewstuff.cpp | 140 + superkaramba/src/sknewstuff.h | 53 + superkaramba/src/superkaramba.desktop | 99 + superkaramba/src/superkaramba.kcfg | 16 + superkaramba/src/superkaramba.lsm | 16 + superkaramba/src/superkarambasettings.kcfgc | 4 + superkaramba/src/superkarambaui.rc | 8 + superkaramba/src/svcgrp_python.cpp | 156 + superkaramba/src/svcgrp_python.h | 44 + superkaramba/src/systemtray.cpp | 231 + superkaramba/src/systemtray.h | 69 + superkaramba/src/systray_python.cpp | 199 + superkaramba/src/systray_python.h | 117 + superkaramba/src/task_python.cpp | 375 ++ superkaramba/src/task_python.h | 153 + superkaramba/src/taskbartest.cpp | 183 + superkaramba/src/taskbartest.h | 23 + superkaramba/src/taskmanager.cpp | 829 +++ superkaramba/src/taskmanager.h | 550 ++ superkaramba/src/textfield.cpp | 159 + superkaramba/src/textfield.h | 59 + superkaramba/src/textfilesensor.cpp | 109 + superkaramba/src/textfilesensor.h | 53 + superkaramba/src/textlabel.cpp | 379 ++ superkaramba/src/textlabel.h | 87 + superkaramba/src/textlabel_python.cpp | 235 + superkaramba/src/textlabel_python.h | 397 ++ superkaramba/src/themefile.cpp | 414 ++ superkaramba/src/themefile.h | 107 + superkaramba/src/themelocale.cpp | 438 ++ superkaramba/src/themelocale.h | 61 + superkaramba/src/themes_layout.ui | 241 + superkaramba/src/themesdlg.cpp | 543 ++ superkaramba/src/themesdlg.h | 80 + superkaramba/src/themewidget.cpp | 113 + superkaramba/src/themewidget.h | 57 + superkaramba/src/themewidget_layout.ui | 182 + superkaramba/src/uptimesensor.cpp | 119 + superkaramba/src/uptimesensor.h | 30 + superkaramba/src/widget_python.cpp | 214 + superkaramba/src/widget_python.h | 131 + superkaramba/src/xmmssensor.cpp | 149 + superkaramba/src/xmmssensor.h | 38 + 1583 files changed, 223413 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 COPYING-DOCS create mode 100644 INSTALL create mode 100644 Mainpage.dox create mode 100644 Makefile.am.in create mode 100644 Makefile.cvs create mode 100644 README create mode 100644 ark/AUTHORS create mode 100644 ark/ChangeLog create mode 100644 ark/Makefile.am create mode 100644 ark/README create mode 100644 ark/TODO create mode 100644 ark/ace.cpp create mode 100644 ark/ace.h create mode 100644 ark/addition.ui create mode 100644 ark/ar.cpp create mode 100644 ark/ar.h create mode 100644 ark/arch.cpp create mode 100644 ark/arch.h create mode 100644 ark/archiveformatdlg.cpp create mode 100644 ark/archiveformatdlg.h create mode 100644 ark/archiveformatinfo.cpp create mode 100644 ark/archiveformatinfo.h create mode 100644 ark/ark.desktop create mode 100644 ark/ark.kcfg create mode 100644 ark/ark_part.cpp create mode 100644 ark/ark_part.desktop create mode 100644 ark/ark_part.h create mode 100644 ark/ark_part.rc create mode 100644 ark/ark_part_readonly.rc create mode 100644 ark/arkapp.cpp create mode 100644 ark/arkapp.h create mode 100644 ark/arkfactory.cpp create mode 100644 ark/arkfactory.h create mode 100644 ark/arkui.rc create mode 100644 ark/arkutils.cpp create mode 100644 ark/arkutils.h create mode 100644 ark/arkviewer.cpp create mode 100644 ark/arkviewer.h create mode 100644 ark/arkwidget.cpp create mode 100644 ark/arkwidget.h create mode 100644 ark/common_texts.cpp create mode 100644 ark/compressedfile.cpp create mode 100644 ark/compressedfile.h create mode 100644 ark/configure.in.in create mode 100644 ark/extraction.ui create mode 100644 ark/extractiondialog.cpp create mode 100644 ark/extractiondialog.h create mode 100644 ark/filelistview.cpp create mode 100644 ark/filelistview.h create mode 100644 ark/general.ui create mode 100644 ark/hi128-app-ark.png create mode 100644 ark/hi16-app-ark.png create mode 100644 ark/hi22-app-ark.png create mode 100644 ark/hi32-app-ark.png create mode 100644 ark/hi48-app-ark.png create mode 100644 ark/hi64-app-ark.png create mode 100644 ark/hisc-app-ark.svgz create mode 100644 ark/lha.cpp create mode 100644 ark/lha.h create mode 100644 ark/main.cpp create mode 100644 ark/mainwindow.cpp create mode 100644 ark/mainwindow.h create mode 100644 ark/pics/Makefile.am create mode 100644 ark/pics/cr22-action-ark_adddir.png create mode 100644 ark/pics/cr22-action-ark_addfile.png create mode 100644 ark/pics/cr22-action-ark_delete.png create mode 100644 ark/pics/cr22-action-ark_extract.png create mode 100644 ark/pics/cr22-action-ark_selectall.png create mode 100644 ark/pics/cr22-action-ark_view.png create mode 100644 ark/pics/cr32-action-ark_adddir.png create mode 100644 ark/pics/cr32-action-ark_addfile.png create mode 100644 ark/pics/cr32-action-ark_delete.png create mode 100644 ark/pics/cr32-action-ark_extract.png create mode 100644 ark/pics/cr32-action-ark_view.png create mode 100644 ark/rar.cpp create mode 100644 ark/rar.h create mode 100644 ark/searchbar.cpp create mode 100644 ark/searchbar.h create mode 100644 ark/settings.kcfgc create mode 100644 ark/sevenzip.cpp create mode 100644 ark/sevenzip.h create mode 100644 ark/tar.cpp create mode 100644 ark/tar.h create mode 100644 ark/tarlistingthread.cpp create mode 100644 ark/tarlistingthread.h create mode 100644 ark/zip.cpp create mode 100644 ark/zip.h create mode 100644 ark/zoo.cpp create mode 100644 ark/zoo.h create mode 100644 charselectapplet/Makefile.am create mode 100644 charselectapplet/charselectapplet.cpp create mode 100644 charselectapplet/charselectapplet.h create mode 100644 charselectapplet/kcharselectapplet.desktop create mode 100644 configure.in.in create mode 100644 doc/KRegExpEditor/Makefile.am create mode 100644 doc/KRegExpEditor/altn.png create mode 100644 doc/KRegExpEditor/altntool.png create mode 100644 doc/KRegExpEditor/anychar.png create mode 100644 doc/KRegExpEditor/anychartool.png create mode 100644 doc/KRegExpEditor/begline.png create mode 100644 doc/KRegExpEditor/boundarytools.png create mode 100644 doc/KRegExpEditor/characters.png create mode 100644 doc/KRegExpEditor/charactertool.png create mode 100644 doc/KRegExpEditor/compound.png create mode 100644 doc/KRegExpEditor/compoundtool.png create mode 100644 doc/KRegExpEditor/endline.png create mode 100644 doc/KRegExpEditor/index.docbook create mode 100644 doc/KRegExpEditor/linestartendtool.png create mode 100644 doc/KRegExpEditor/lookaheadtools.png create mode 100644 doc/KRegExpEditor/neglookahead.png create mode 100644 doc/KRegExpEditor/nonwordboundary.png create mode 100644 doc/KRegExpEditor/poslookahead.png create mode 100644 doc/KRegExpEditor/repeat.png create mode 100644 doc/KRegExpEditor/repeattool.png create mode 100644 doc/KRegExpEditor/select.png create mode 100644 doc/KRegExpEditor/text.png create mode 100644 doc/KRegExpEditor/texttool.png create mode 100644 doc/KRegExpEditor/theEditor.png create mode 100644 doc/KRegExpEditor/wordboundary.png create mode 100644 doc/Makefile.am create mode 100644 doc/ark/Makefile.am create mode 100644 doc/ark/index.docbook create mode 100644 doc/ark/man-ark.1.docbook create mode 100644 doc/kcalc/Makefile.am create mode 100644 doc/kcalc/commands.docbook create mode 100644 doc/kcalc/index.docbook create mode 100644 doc/kcalc/kcalc_on_Aix.txt create mode 100644 doc/kcalc/kcalc_on_OSF.txt create mode 100644 doc/kcharselect/Makefile.am create mode 100644 doc/kcharselect/index.docbook create mode 100644 doc/kcontrol/Makefile.am create mode 100644 doc/kcontrol/kcmlowbatcrit/Makefile.am create mode 100644 doc/kcontrol/kcmlowbatcrit/index.docbook create mode 100644 doc/kcontrol/kcmlowbatwarn/Makefile.am create mode 100644 doc/kcontrol/kcmlowbatwarn/index.docbook create mode 100644 doc/kcontrol/laptop/Makefile.am create mode 100644 doc/kcontrol/laptop/index.docbook create mode 100644 doc/kcontrol/powerctrl/Makefile.am create mode 100644 doc/kcontrol/powerctrl/index.docbook create mode 100644 doc/kdelirc/Makefile.am create mode 100644 doc/kdelirc/irkick/Makefile.am create mode 100644 doc/kdelirc/irkick/index.docbook create mode 100644 doc/kdelirc/kcmlirc/Makefile.am create mode 100644 doc/kdelirc/kcmlirc/index.docbook create mode 100644 doc/kdf/Makefile.am create mode 100644 doc/kdf/index.docbook create mode 100644 doc/kdf/kdf.png create mode 100644 doc/kdf/kdf_config.png create mode 100644 doc/kedit/Makefile.am create mode 100644 doc/kedit/index.docbook create mode 100644 doc/kfloppy/Makefile.am create mode 100644 doc/kfloppy/index.docbook create mode 100644 doc/kgpg/Makefile.am create mode 100644 doc/kgpg/editor.png create mode 100644 doc/kgpg/index.docbook create mode 100644 doc/kgpg/keygen.png create mode 100644 doc/kgpg/keymanage.png create mode 100644 doc/kgpg/keys.png create mode 100644 doc/kgpg/kicker.png create mode 100644 doc/kgpg/options.png create mode 100644 doc/khexedit/Makefile.am create mode 100644 doc/khexedit/index.docbook create mode 100644 doc/khexedit/khexedit1.png create mode 100644 doc/kinfocenter/Makefile.am create mode 100644 doc/kinfocenter/blockdevices/Makefile.am create mode 100644 doc/kinfocenter/blockdevices/index.docbook create mode 100644 doc/kjots/Makefile.am create mode 100644 doc/kjots/index.docbook create mode 100644 doc/ksim/Makefile.am create mode 100644 doc/ksim/index.docbook create mode 100644 doc/ktimer/Makefile.am create mode 100644 doc/ktimer/index.docbook create mode 100644 doc/kwallet/Makefile.am create mode 100644 doc/kwallet/cr22-action-wallet_closed.png create mode 100644 doc/kwallet/cr22-action-wallet_open.png create mode 100644 doc/kwallet/edit1.png create mode 100644 doc/kwallet/edit2.png create mode 100644 doc/kwallet/edit3.png create mode 100644 doc/kwallet/index.docbook create mode 100644 doc/kwallet/kwalletmanager.png create mode 100644 doc/kwallet/password1.png create mode 100644 doc/kwallet/password2.png create mode 100644 doc/superkaramba/Makefile.am create mode 100644 doc/superkaramba/index.docbook create mode 100644 kcalc/ChangeLog create mode 100644 kcalc/Makefile.am create mode 100644 kcalc/README create mode 100644 kcalc/TODO create mode 100644 kcalc/colors.ui create mode 100644 kcalc/configure.in.bot create mode 100644 kcalc/configure.in.in create mode 100644 kcalc/confvalues.h create mode 100644 kcalc/constants.ui create mode 100644 kcalc/dlabel.cpp create mode 100644 kcalc/dlabel.h create mode 100644 kcalc/general.ui create mode 100644 kcalc/hi16-app-kcalc.png create mode 100644 kcalc/hi22-app-kcalc.png create mode 100644 kcalc/hi32-app-kcalc.png create mode 100644 kcalc/hi48-app-kcalc.png create mode 100644 kcalc/hi64-app-kcalc.png create mode 100644 kcalc/hisc-app-kcalc.svgz create mode 100644 kcalc/kcalc.cpp create mode 100644 kcalc/kcalc.desktop create mode 100644 kcalc/kcalc.h create mode 100644 kcalc/kcalc.kcfg create mode 100644 kcalc/kcalc_button.cpp create mode 100644 kcalc/kcalc_button.h create mode 100644 kcalc/kcalc_const_button.cpp create mode 100644 kcalc/kcalc_const_button.h create mode 100644 kcalc/kcalc_const_menu.cpp create mode 100644 kcalc/kcalc_const_menu.h create mode 100644 kcalc/kcalc_core.cpp create mode 100644 kcalc/kcalc_core.h create mode 100644 kcalc/kcalc_settings.kcfgc create mode 100644 kcalc/kcalcdisplay.cpp create mode 100644 kcalc/kcalcdisplay.h create mode 100644 kcalc/kcalcrc.upd create mode 100644 kcalc/kcalctype.h create mode 100644 kcalc/kcalcui.rc create mode 100644 kcalc/knumber/Makefile.am create mode 100644 kcalc/knumber/configure.in.in create mode 100644 kcalc/knumber/knumber.cpp create mode 100644 kcalc/knumber/knumber.h create mode 100644 kcalc/knumber/knumber_priv.cpp create mode 100644 kcalc/knumber/knumber_priv.h create mode 100644 kcalc/knumber/tests/Makefile.am create mode 100644 kcalc/knumber/tests/knumbertest.cpp create mode 100644 kcalc/knumber/tests/knumbertest.h create mode 100644 kcalc/stats.cpp create mode 100644 kcalc/stats.h create mode 100644 kcalc/version.h create mode 100644 kcharselect/KCharSelect.desktop create mode 100644 kcharselect/Makefile.am create mode 100644 kcharselect/TODO create mode 100644 kcharselect/hi16-app-kcharselect.png create mode 100644 kcharselect/hi32-app-kcharselect.png create mode 100644 kcharselect/hi48-app-kcharselect.png create mode 100644 kcharselect/kcharselect.upd create mode 100644 kcharselect/kcharselectdia.cc create mode 100644 kcharselect/kcharselectdia.h create mode 100644 kcharselect/kcharselectui.rc create mode 100644 kcharselect/main.cc create mode 100644 kdelirc/AUTHORS create mode 100644 kdelirc/COPYING create mode 100644 kdelirc/ChangeLog create mode 100644 kdelirc/Makefile.am create mode 100644 kdelirc/README create mode 100644 kdelirc/README.profile-creation create mode 100644 kdelirc/README.remote-creation create mode 100644 kdelirc/TODO create mode 100644 kdelirc/icons/Makefile.am create mode 100644 kdelirc/icons/hi16-action-ledblue.png create mode 100644 kdelirc/icons/hi16-action-ledgreen.png create mode 100644 kdelirc/icons/hi16-action-ledlightblue.png create mode 100644 kdelirc/icons/hi16-action-ledlightgreen.png create mode 100644 kdelirc/icons/hi16-action-ledorange.png create mode 100644 kdelirc/icons/hi16-action-ledpurple.png create mode 100644 kdelirc/icons/hi16-action-ledred.png create mode 100644 kdelirc/icons/hi16-action-ledyellow.png create mode 100644 kdelirc/icons/hi32-action-ledblue.png create mode 100644 kdelirc/icons/hi32-action-ledgreen.png create mode 100644 kdelirc/icons/hi32-action-ledlightblue.png create mode 100644 kdelirc/icons/hi32-action-ledlightgreen.png create mode 100644 kdelirc/icons/hi32-action-ledorange.png create mode 100644 kdelirc/icons/hi32-action-ledpurple.png create mode 100644 kdelirc/icons/hi32-action-ledred.png create mode 100644 kdelirc/icons/hi32-action-ledyellow.png create mode 100644 kdelirc/irkick/Makefile.am create mode 100644 kdelirc/irkick/hi16-app-irkick.png create mode 100644 kdelirc/irkick/hi22-app-irkick.png create mode 100644 kdelirc/irkick/hi32-app-irkick.png create mode 100644 kdelirc/irkick/icons/Makefile.am create mode 100644 kdelirc/irkick/icons/hi16-action-irkick.png create mode 100644 kdelirc/irkick/icons/hi16-action-irkickflash.png create mode 100644 kdelirc/irkick/icons/hi16-action-irkickoff.png create mode 100644 kdelirc/irkick/irkick.cpp create mode 100644 kdelirc/irkick/irkick.desktop create mode 100644 kdelirc/irkick/irkick.h create mode 100644 kdelirc/irkick/irkick.project create mode 100644 kdelirc/irkick/kdedmodule_stub.h create mode 100644 kdelirc/irkick/klircclient.cpp create mode 100644 kdelirc/irkick/klircclient.h create mode 100644 kdelirc/irkick/lo16-app-irkick.png create mode 100644 kdelirc/irkick/lo32-app-irkick.png create mode 100644 kdelirc/irkick/main.cpp create mode 100644 kdelirc/kcmlirc/Makefile.am create mode 100644 kdelirc/kcmlirc/addaction.cpp create mode 100644 kdelirc/kcmlirc/addaction.h create mode 100644 kdelirc/kcmlirc/addactionbase.ui create mode 100644 kdelirc/kcmlirc/editaction.cpp create mode 100644 kdelirc/kcmlirc/editaction.h create mode 100644 kdelirc/kcmlirc/editactionbase.ui create mode 100644 kdelirc/kcmlirc/editmode.cpp create mode 100644 kdelirc/kcmlirc/editmode.h create mode 100644 kdelirc/kcmlirc/editmodebase.ui create mode 100644 kdelirc/kcmlirc/kcmlirc.cpp create mode 100644 kdelirc/kcmlirc/kcmlirc.desktop create mode 100644 kdelirc/kcmlirc/kcmlirc.h create mode 100644 kdelirc/kcmlirc/kcmlircbase.ui create mode 100644 kdelirc/kcmlirc/kcmlircbase.ui.h create mode 100644 kdelirc/kcmlirc/modeslist.cpp create mode 100644 kdelirc/kcmlirc/modeslist.h create mode 100644 kdelirc/kcmlirc/newmode.ui create mode 100644 kdelirc/kcmlirc/newmode.ui.h create mode 100644 kdelirc/kcmlirc/selectprofile.ui create mode 100644 kdelirc/kdelirc/Makefile.am create mode 100644 kdelirc/kdelirc/arguments.cpp create mode 100644 kdelirc/kdelirc/arguments.h create mode 100644 kdelirc/kdelirc/iraction.cpp create mode 100644 kdelirc/kdelirc/iraction.h create mode 100644 kdelirc/kdelirc/iractions.cpp create mode 100644 kdelirc/kdelirc/iractions.h create mode 100644 kdelirc/kdelirc/mode.cpp create mode 100644 kdelirc/kdelirc/mode.h create mode 100644 kdelirc/kdelirc/modes.cpp create mode 100644 kdelirc/kdelirc/modes.h create mode 100644 kdelirc/kdelirc/profileserver.cpp create mode 100644 kdelirc/kdelirc/profileserver.h create mode 100644 kdelirc/kdelirc/prototype.cpp create mode 100644 kdelirc/kdelirc/prototype.h create mode 100644 kdelirc/kdelirc/remoteserver.cpp create mode 100644 kdelirc/kdelirc/remoteserver.h create mode 100644 kdelirc/profiles/Makefile.am create mode 100644 kdelirc/profiles/klauncher.profile.xml create mode 100644 kdelirc/profiles/konqueror.profile.xml create mode 100644 kdelirc/profiles/noatun.profile.xml create mode 100644 kdelirc/profiles/profile.dtd create mode 100644 kdelirc/remotes/Makefile.am create mode 100644 kdelirc/remotes/RM-0010.remote.xml create mode 100644 kdelirc/remotes/cimr100.remote.xml create mode 100644 kdelirc/remotes/hauppauge.remote.xml create mode 100644 kdelirc/remotes/remote.dtd create mode 100644 kdelirc/remotes/sherwood.remote.xml create mode 100644 kdelirc/remotes/sonytv.remote.xml create mode 100644 kdessh/LICENSE.readme create mode 100644 kdessh/Makefile.am create mode 100644 kdessh/README create mode 100644 kdessh/kdessh.cpp create mode 100644 kdessh/sshdlg.cpp create mode 100644 kdessh/sshdlg.h create mode 100644 kdeutils.lsm create mode 100644 kdf/Makefile.am create mode 100644 kdf/disklist.cpp create mode 100644 kdf/disklist.h create mode 100644 kdf/disks.cpp create mode 100644 kdf/disks.h create mode 100644 kdf/kcmdf.cpp create mode 100644 kdf/kcmdf.desktop create mode 100644 kdf/kcmdf.h create mode 100644 kdf/kconftest.cpp create mode 100644 kdf/kdf.cpp create mode 100644 kdf/kdf.desktop create mode 100644 kdf/kdf.h create mode 100644 kdf/kdfconfig.cpp create mode 100644 kdf/kdfconfig.h create mode 100644 kdf/kdfui.rc create mode 100644 kdf/kdfwidget.cpp create mode 100644 kdf/kdfwidget.h create mode 100644 kdf/kwikdisk.cpp create mode 100644 kdf/kwikdisk.desktop create mode 100644 kdf/kwikdisk.h create mode 100644 kdf/listview.cpp create mode 100644 kdf/listview.h create mode 100644 kdf/mntconfig.cpp create mode 100644 kdf/mntconfig.h create mode 100644 kdf/optiondialog.cpp create mode 100644 kdf/optiondialog.h create mode 100644 kdf/pics/Makefile.am create mode 100644 kdf/pics/cr16-app-kcmdf.png create mode 100644 kdf/pics/cr22-app-kcmdf.png create mode 100644 kdf/pics/cr32-app-kcmdf.png create mode 100644 kdf/pics/delete.png create mode 100644 kdf/pics/hi128-app-kdf.png create mode 100644 kdf/pics/hi128-app-kwikdisk.png create mode 100644 kdf/pics/hi16-app-kdf.png create mode 100644 kdf/pics/hi16-app-kwikdisk.png create mode 100644 kdf/pics/hi22-app-kdf.png create mode 100644 kdf/pics/hi22-app-kwikdisk.png create mode 100644 kdf/pics/hi32-app-kdf.png create mode 100644 kdf/pics/hi32-app-kwikdisk.png create mode 100644 kdf/pics/hi48-app-kdf.png create mode 100644 kdf/pics/hi48-app-kwikdisk.png create mode 100644 kdf/pics/hi64-app-kdf.png create mode 100644 kdf/pics/hi64-app-kwikdisk.png create mode 100644 kdf/pics/mini-root.png create mode 100644 kdf/pics/tick.png create mode 100644 kdf/stdoption.cpp create mode 100644 kdf/stdoption.h create mode 100644 kdf/unix_outputs/df-g.hpux create mode 100644 kdf/unix_outputs/df-k.digital create mode 100644 kdf/unix_outputs/df-k.hpux create mode 100644 kdf/unix_outputs/df.man.hpux create mode 100644 kdf/unix_outputs/etcfstab.digital create mode 100644 kdf/unix_outputs/etcfstab.hpux create mode 100644 kdf/unix_outputs/unix-defines.txt create mode 100644 kedit/ChangeLog create mode 100644 kedit/KEdit.desktop create mode 100644 kedit/Makefile.am create mode 100644 kedit/README create mode 100644 kedit/TODO create mode 100644 kedit/color.ui create mode 100644 kedit/kedit.cpp create mode 100644 kedit/kedit.h create mode 100644 kedit/kedit.kcfg create mode 100644 kedit/keditui.rc create mode 100644 kedit/ktextfiledlg.cpp create mode 100644 kedit/ktextfiledlg.h create mode 100644 kedit/misc.ui create mode 100644 kedit/misc.ui.h create mode 100644 kedit/pixmaps/Makefile.am create mode 100644 kedit/pixmaps/hi16-app-kedit.png create mode 100644 kedit/pixmaps/hi22-app-kedit.png create mode 100644 kedit/pixmaps/hi32-app-kedit.png create mode 100644 kedit/pixmaps/hi48-app-kedit.png create mode 100644 kedit/pixmaps/hi64-app-kedit.png create mode 100644 kedit/prefs.kcfgc create mode 100644 kedit/version.h create mode 100644 kfloppy/KFloppy.desktop create mode 100644 kfloppy/Makefile.am create mode 100644 kfloppy/README create mode 100644 kfloppy/TODO create mode 100644 kfloppy/debug.h create mode 100644 kfloppy/floppy.cpp create mode 100644 kfloppy/floppy.h create mode 100644 kfloppy/floppy_format.desktop create mode 100644 kfloppy/format.cpp create mode 100644 kfloppy/format.h create mode 100644 kfloppy/hi128-app-kfloppy.png create mode 100644 kfloppy/hi16-app-kfloppy.png create mode 100644 kfloppy/hi22-app-kfloppy.png create mode 100644 kfloppy/hi32-app-kfloppy.png create mode 100644 kfloppy/hi48-app-kfloppy.png create mode 100644 kfloppy/hi64-app-kfloppy.png create mode 100644 kfloppy/main.cpp create mode 100644 kfloppy/zip.cpp create mode 100644 kfloppy/zip.h create mode 100644 kgpg/AUTHORS create mode 100644 kgpg/ChangeLog create mode 100644 kgpg/INSTALL create mode 100644 kgpg/Makefile.am create mode 100644 kgpg/adduid.ui create mode 100644 kgpg/conf_decryption.ui create mode 100644 kgpg/conf_encryption.ui create mode 100644 kgpg/conf_encryption.ui.h create mode 100644 kgpg/conf_gpg.ui create mode 100644 kgpg/conf_misc.ui create mode 100644 kgpg/conf_servers.ui create mode 100644 kgpg/conf_ui2.ui create mode 100644 kgpg/dcopiface.h create mode 100644 kgpg/detailedconsole.cpp create mode 100644 kgpg/detailedconsole.h create mode 100644 kgpg/encryptfile.desktop create mode 100644 kgpg/encryptfolder.desktop create mode 100644 kgpg/groupedit.ui create mode 100644 kgpg/hi16-app-kgpg.png create mode 100644 kgpg/hi22-app-kgpg.png create mode 100644 kgpg/hi32-app-kgpg.png create mode 100644 kgpg/hi48-app-kgpg.png create mode 100644 kgpg/icons/Makefile.am create mode 100644 kgpg/icons/cr16-action-kgpg_key1.png create mode 100644 kgpg/icons/cr16-action-kgpg_key2.png create mode 100644 kgpg/icons/cr16-action-kgpg_key3.png create mode 100644 kgpg/icons/cr16-action-kgpg_key4.png create mode 100644 kgpg/icons/cr22-action-kgpg_edit.png create mode 100644 kgpg/icons/cr22-action-kgpg_export.png create mode 100644 kgpg/icons/cr22-action-kgpg_gen.png create mode 100644 kgpg/icons/cr22-action-kgpg_identity.png create mode 100644 kgpg/icons/cr22-action-kgpg_import.png create mode 100644 kgpg/icons/cr22-action-kgpg_info.png create mode 100644 kgpg/icons/cr22-action-kgpg_photo.png create mode 100644 kgpg/icons/cr22-action-kgpg_show.png create mode 100644 kgpg/icons/cr22-action-kgpg_sign.png create mode 100644 kgpg/icons/cr22-action-kgpg_term.png create mode 100644 kgpg/keyexport.ui create mode 100644 kgpg/keyexport.ui.h create mode 100644 kgpg/keygener.cpp create mode 100644 kgpg/keygener.h create mode 100644 kgpg/keyinfowidget.cpp create mode 100644 kgpg/keyinfowidget.h create mode 100644 kgpg/keyproperties.ui create mode 100644 kgpg/keyserver.ui create mode 100644 kgpg/keyservers.cpp create mode 100644 kgpg/keyservers.h create mode 100644 kgpg/kgpg.cpp create mode 100644 kgpg/kgpg.desktop create mode 100644 kgpg/kgpg.h create mode 100644 kgpg/kgpg.kcfg create mode 100644 kgpg/kgpg.rc create mode 100644 kgpg/kgpg_anim.gif create mode 100644 kgpg/kgpg_blank.png create mode 100644 kgpg/kgpg_docked.gif create mode 100644 kgpg/kgpg_docked.png create mode 100644 kgpg/kgpg_fill.png create mode 100644 kgpg/kgpgeditor.cpp create mode 100644 kgpg/kgpgeditor.h create mode 100644 kgpg/kgpginterface.cpp create mode 100644 kgpg/kgpginterface.h create mode 100644 kgpg/kgpglibrary.cpp create mode 100644 kgpg/kgpglibrary.h create mode 100644 kgpg/kgpgoptions.cpp create mode 100644 kgpg/kgpgoptions.h create mode 100644 kgpg/kgpgrevokewidget.ui create mode 100644 kgpg/kgpgrevokewidget.ui.h create mode 100644 kgpg/kgpgsettings.kcfgc create mode 100644 kgpg/kgpgsettings_addons.h create mode 100644 kgpg/kgpgview.cpp create mode 100644 kgpg/kgpgview.h create mode 100644 kgpg/kgpgwizard.ui create mode 100644 kgpg/listkeys.cpp create mode 100644 kgpg/listkeys.h create mode 100644 kgpg/listkeys.rc create mode 100644 kgpg/main.cpp create mode 100644 kgpg/newkey.ui create mode 100644 kgpg/newkey.ui.h create mode 100644 kgpg/popuppublic.cpp create mode 100644 kgpg/popuppublic.h create mode 100644 kgpg/searchres.ui create mode 100644 kgpg/sourceselect.ui create mode 100644 kgpg/tips create mode 100644 khexedit/Makefile.am create mode 100644 khexedit/README create mode 100644 khexedit/bitswapwidget.cc create mode 100644 khexedit/bitswapwidget.h create mode 100644 khexedit/chartabledialog.cc create mode 100644 khexedit/chartabledialog.h create mode 100644 khexedit/configure.in.in create mode 100644 khexedit/conversion.cc create mode 100644 khexedit/conversion.h create mode 100644 khexedit/converterdialog.cc create mode 100644 khexedit/converterdialog.h create mode 100644 khexedit/dialog.cc create mode 100644 khexedit/dialog.h create mode 100644 khexedit/draglabel.cc create mode 100644 khexedit/draglabel.h create mode 100644 khexedit/exportdialog.cc create mode 100644 khexedit/exportdialog.h create mode 100644 khexedit/fileinfodialog.cc create mode 100644 khexedit/fileinfodialog.h create mode 100644 khexedit/hexbuffer.cc create mode 100644 khexedit/hexbuffer.h create mode 100644 khexedit/hexclipboard.cc create mode 100644 khexedit/hexclipboard.h create mode 100644 khexedit/hexdrag.cc create mode 100644 khexedit/hexdrag.h create mode 100644 khexedit/hexeditorwidget.cc create mode 100644 khexedit/hexeditorwidget.h create mode 100644 khexedit/hexeditstate.h create mode 100644 khexedit/hexerror.cc create mode 100644 khexedit/hexerror.h create mode 100644 khexedit/hexmanagerwidget.cc create mode 100644 khexedit/hexmanagerwidget.h create mode 100644 khexedit/hexprinter.cc create mode 100644 khexedit/hexprinter.h create mode 100644 khexedit/hextoolwidget.cc create mode 100644 khexedit/hextoolwidget.h create mode 100644 khexedit/hexvalidator.cc create mode 100644 khexedit/hexvalidator.h create mode 100644 khexedit/hexviewwidget.cc create mode 100644 khexedit/hexviewwidget.h create mode 100644 khexedit/hi16-app-khexedit.png create mode 100644 khexedit/hi32-app-khexedit.png create mode 100644 khexedit/hi48-app-khexedit.png create mode 100644 khexedit/khexedit.desktop create mode 100644 khexedit/khexeditui.rc create mode 100644 khexedit/lib/Makefile.am create mode 100644 khexedit/lib/README create mode 100644 khexedit/lib/codecs/Makefile.am create mode 100644 khexedit/lib/codecs/README create mode 100644 khexedit/lib/codecs/kbinarybytecodec.cpp create mode 100644 khexedit/lib/codecs/kbinarybytecodec.h create mode 100644 khexedit/lib/codecs/kbytecodec.cpp create mode 100644 khexedit/lib/codecs/kcharcodec.cpp create mode 100644 khexedit/lib/codecs/kdecimalbytecodec.cpp create mode 100644 khexedit/lib/codecs/kdecimalbytecodec.h create mode 100644 khexedit/lib/codecs/kebcdic1047charcodec.cpp create mode 100644 khexedit/lib/codecs/kebcdic1047charcodec.h create mode 100644 khexedit/lib/codecs/khexadecimalbytecodec.cpp create mode 100644 khexedit/lib/codecs/khexadecimalbytecodec.h create mode 100644 khexedit/lib/codecs/koctalbytecodec.cpp create mode 100644 khexedit/lib/codecs/koctalbytecodec.h create mode 100644 khexedit/lib/codecs/ktextcharcodec.cpp create mode 100644 khexedit/lib/codecs/ktextcharcodec.h create mode 100644 khexedit/lib/controller/Makefile.am create mode 100644 khexedit/lib/controller/kchareditor.cpp create mode 100644 khexedit/lib/controller/kchareditor.h create mode 100644 khexedit/lib/controller/kcontroller.cpp create mode 100644 khexedit/lib/controller/kcontroller.h create mode 100644 khexedit/lib/controller/keditor.cpp create mode 100644 khexedit/lib/controller/keditor.h create mode 100644 khexedit/lib/controller/knavigator.cpp create mode 100644 khexedit/lib/controller/knavigator.h create mode 100644 khexedit/lib/controller/ktabcontroller.cpp create mode 100644 khexedit/lib/controller/ktabcontroller.h create mode 100644 khexedit/lib/controller/kvalueeditor.cpp create mode 100644 khexedit/lib/controller/kvalueeditor.h create mode 100644 khexedit/lib/helper.h create mode 100644 khexedit/lib/kadds.h create mode 100644 khexedit/lib/kbigbuffer.cpp create mode 100644 khexedit/lib/kbigbuffer.h create mode 100644 khexedit/lib/kbordercoltextexport.cpp create mode 100644 khexedit/lib/kbordercoltextexport.h create mode 100644 khexedit/lib/kbordercolumn.cpp create mode 100644 khexedit/lib/kbordercolumn.h create mode 100644 khexedit/lib/kbuffercoltextexport.cpp create mode 100644 khexedit/lib/kbuffercoltextexport.h create mode 100644 khexedit/lib/kbuffercolumn.cpp create mode 100644 khexedit/lib/kbuffercolumn.h create mode 100644 khexedit/lib/kbuffercoord.h create mode 100644 khexedit/lib/kbuffercursor.cpp create mode 100644 khexedit/lib/kbuffercursor.h create mode 100644 khexedit/lib/kbufferdrag.cpp create mode 100644 khexedit/lib/kbufferdrag.h create mode 100644 khexedit/lib/kbufferlayout.cpp create mode 100644 khexedit/lib/kbufferlayout.h create mode 100644 khexedit/lib/kbufferranges.cpp create mode 100644 khexedit/lib/kbufferranges.h create mode 100644 khexedit/lib/kbytecodec.h create mode 100644 khexedit/lib/kbytesedit.cpp create mode 100644 khexedit/lib/kbytesedit.h create mode 100644 khexedit/lib/kcharcodec.h create mode 100644 khexedit/lib/kcharcoltextexport.cpp create mode 100644 khexedit/lib/kcharcoltextexport.h create mode 100644 khexedit/lib/kcharcolumn.cpp create mode 100644 khexedit/lib/kcharcolumn.h create mode 100644 khexedit/lib/kcoltextexport.h create mode 100644 khexedit/lib/kcolumn.cpp create mode 100644 khexedit/lib/kcolumn.h create mode 100644 khexedit/lib/kcolumnsview.cpp create mode 100644 khexedit/lib/kcolumnsview.h create mode 100644 khexedit/lib/kcoordrange.h create mode 100644 khexedit/lib/kcoordrangelist.cpp create mode 100644 khexedit/lib/kcoordrangelist.h create mode 100644 khexedit/lib/kcursor.cpp create mode 100644 khexedit/lib/kcursor.h create mode 100644 khexedit/lib/kdatabuffer.cpp create mode 100644 khexedit/lib/kdatabuffer.h create mode 100644 khexedit/lib/kfixedsizebuffer.cpp create mode 100644 khexedit/lib/kfixedsizebuffer.h create mode 100644 khexedit/lib/khe.h create mode 100644 khexedit/lib/khechar.h create mode 100644 khexedit/lib/khexedit.cpp create mode 100644 khexedit/lib/khexedit.h create mode 100644 khexedit/lib/khexedit_export.h create mode 100644 khexedit/lib/koffsetcoltextexport.cpp create mode 100644 khexedit/lib/koffsetcoltextexport.h create mode 100644 khexedit/lib/koffsetcolumn.cpp create mode 100644 khexedit/lib/koffsetcolumn.h create mode 100644 khexedit/lib/koffsetformat.cpp create mode 100644 khexedit/lib/koffsetformat.h create mode 100644 khexedit/lib/kplainbuffer.cpp create mode 100644 khexedit/lib/kplainbuffer.h create mode 100644 khexedit/lib/krange.h create mode 100644 khexedit/lib/kreadonlybuffer.h create mode 100644 khexedit/lib/ksection.h create mode 100644 khexedit/lib/ksectionlist.cpp create mode 100644 khexedit/lib/ksectionlist.h create mode 100644 khexedit/lib/kselection.h create mode 100644 khexedit/lib/kvaluecoltextexport.cpp create mode 100644 khexedit/lib/kvaluecoltextexport.h create mode 100644 khexedit/lib/kvaluecolumn.cpp create mode 100644 khexedit/lib/kvaluecolumn.h create mode 100644 khexedit/lib/kwordbufferservice.cpp create mode 100644 khexedit/lib/kwordbufferservice.h create mode 100644 khexedit/lib/kwrappingrobuffer.cpp create mode 100644 khexedit/lib/kwrappingrobuffer.h create mode 100644 khexedit/listview.cc create mode 100644 khexedit/listview.h create mode 100644 khexedit/main.cc create mode 100644 khexedit/optiondialog.cc create mode 100644 khexedit/optiondialog.h create mode 100644 khexedit/parts/Makefile.am create mode 100644 khexedit/parts/README create mode 100644 khexedit/parts/kbytesedit/Makefile.am create mode 100644 khexedit/parts/kbytesedit/README create mode 100644 khexedit/parts/kbytesedit/kbyteseditwidget.cpp create mode 100644 khexedit/parts/kbytesedit/kbyteseditwidget.desktop create mode 100644 khexedit/parts/kbytesedit/kbyteseditwidget.h create mode 100644 khexedit/parts/kpart/Makefile.am create mode 100644 khexedit/parts/kpart/khebrowserextension.cpp create mode 100644 khexedit/parts/kpart/khebrowserextension.h create mode 100644 khexedit/parts/kpart/khepart.cpp create mode 100644 khexedit/parts/kpart/khepart.h create mode 100644 khexedit/parts/kpart/khepartfactory.cpp create mode 100644 khexedit/parts/kpart/khepartfactory.h create mode 100644 khexedit/parts/kpart/khexedit2part.desktop create mode 100644 khexedit/parts/kpart/khexedit2partui.rc create mode 100644 khexedit/pics/Makefile.am create mode 100644 khexedit/pics/hexdrag.png create mode 100644 khexedit/pics/hexmask.png create mode 100644 khexedit/pics/hexwrite.png create mode 100644 khexedit/printdialogpage.cc create mode 100644 khexedit/printdialogpage.h create mode 100644 khexedit/progress.h create mode 100644 khexedit/searchbar.cc create mode 100644 khexedit/searchbar.h create mode 100644 khexedit/statusbarprogress.cc create mode 100644 khexedit/statusbarprogress.h create mode 100644 khexedit/stringdialog.cc create mode 100644 khexedit/stringdialog.h create mode 100644 khexedit/toplevel.cc create mode 100644 khexedit/toplevel.h create mode 100644 khexedit/version.h create mode 100644 kjots/ANNOUNCE create mode 100644 kjots/BUGS create mode 100644 kjots/CHANGES create mode 100644 kjots/KJotsMain.cpp create mode 100644 kjots/KJotsMain.h create mode 100644 kjots/KJotsSettings.kcfgc create mode 100644 kjots/Kjots.desktop create mode 100644 kjots/Makefile.am create mode 100644 kjots/README create mode 100644 kjots/confpagefont.ui create mode 100644 kjots/confpagemisc.ui create mode 100644 kjots/icons/Makefile.am create mode 100644 kjots/icons/README create mode 100644 kjots/icons/filedel.png create mode 100644 kjots/icons/hi16-app-kjots.png create mode 100644 kjots/icons/hi22-app-kjots.png create mode 100644 kjots/icons/hi32-app-kjots.png create mode 100644 kjots/icons/hi48-app-kjots.png create mode 100644 kjots/icons/hi64-app-kjots.png create mode 100644 kjots/kjots.kcfg create mode 100644 kjots/kjotsbookmarks.cpp create mode 100644 kjots/kjotsbookmarks.h create mode 100644 kjots/kjotsedit.cpp create mode 100644 kjots/kjotsedit.h create mode 100644 kjots/kjotsentry.cpp create mode 100644 kjots/kjotsentry.h create mode 100644 kjots/kjotsui.rc create mode 100644 kjots/main.cpp create mode 100644 klaptopdaemon/Makefile.am create mode 100644 klaptopdaemon/README create mode 100644 klaptopdaemon/acpi.cpp create mode 100644 klaptopdaemon/acpi.h create mode 100644 klaptopdaemon/acpi_helper.cpp create mode 100644 klaptopdaemon/apm.cpp create mode 100644 klaptopdaemon/apm.h create mode 100644 klaptopdaemon/applnk/.directory create mode 100644 klaptopdaemon/applnk/Makefile.am create mode 100644 klaptopdaemon/applnk/klaptopdaemon.desktop create mode 100644 klaptopdaemon/applnk/laptop.desktop create mode 100644 klaptopdaemon/applnk/pcmcia.desktop create mode 100644 klaptopdaemon/battery.cpp create mode 100644 klaptopdaemon/battery.h create mode 100644 klaptopdaemon/buttons.cpp create mode 100644 klaptopdaemon/buttons.h create mode 100644 klaptopdaemon/checkcrc.h create mode 100644 klaptopdaemon/configure.in.bot create mode 100644 klaptopdaemon/configure.in.in create mode 100644 klaptopdaemon/daemon_state.cpp create mode 100644 klaptopdaemon/daemon_state.h create mode 100644 klaptopdaemon/daemondock.cpp create mode 100644 klaptopdaemon/daemondock.h create mode 100644 klaptopdaemon/kpcmcia.cpp create mode 100644 klaptopdaemon/kpcmcia.h create mode 100644 klaptopdaemon/kpcmciainfo.cpp create mode 100644 klaptopdaemon/kpcmciainfo.h create mode 100644 klaptopdaemon/krichtextlabel.cpp create mode 100644 klaptopdaemon/krichtextlabel.h create mode 100644 klaptopdaemon/laptop_check.cpp create mode 100644 klaptopdaemon/laptop_daemon.cpp create mode 100644 klaptopdaemon/laptop_daemon.h create mode 100644 klaptopdaemon/linux/bulkmem.h create mode 100644 klaptopdaemon/linux/ciscode.h create mode 100644 klaptopdaemon/linux/cisreg.h create mode 100644 klaptopdaemon/linux/cistpl.h create mode 100644 klaptopdaemon/linux/cs.h create mode 100644 klaptopdaemon/linux/cs_types.h create mode 100644 klaptopdaemon/linux/driver_ops.h create mode 100644 klaptopdaemon/linux/ds.h create mode 100644 klaptopdaemon/linux/ftl.h create mode 100644 klaptopdaemon/linux/k_compat.h create mode 100644 klaptopdaemon/linux/mem_op.h create mode 100644 klaptopdaemon/linux/memory.h create mode 100644 klaptopdaemon/linux/ss.h create mode 100644 klaptopdaemon/linux/version.h create mode 100644 klaptopdaemon/main.cpp create mode 100644 klaptopdaemon/main.h create mode 100644 klaptopdaemon/makecrc.cpp create mode 100644 klaptopdaemon/pcmcia.cpp create mode 100644 klaptopdaemon/pcmcia.h create mode 100644 klaptopdaemon/pics/Makefile.am create mode 100644 klaptopdaemon/pics/README create mode 100644 klaptopdaemon/pics/actions/Makefile.am create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt2_laptop_nobattery.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt2_laptop_nocharge.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt2_laptop_power.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt3_laptop_nocharge.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt3_laptop_power.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt_laptop_nocharge.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-alt_laptop_power.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-laptop_charge.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-laptop_nobattery.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-laptop_nocharge.png create mode 100644 klaptopdaemon/pics/actions/cr16-action-power.png create mode 100644 klaptopdaemon/pics/actions/cr22-action-laptop_charge.png create mode 100644 klaptopdaemon/pics/actions/cr22-action-laptop_nobattery.png create mode 100644 klaptopdaemon/pics/actions/cr22-action-laptop_nocharge.png create mode 100644 klaptopdaemon/pics/actions/cr22-action-laptop_power.png create mode 100644 klaptopdaemon/pics/actions/cr32-action-power.png create mode 100644 klaptopdaemon/pics/cr128-app-laptop_battery.png create mode 100644 klaptopdaemon/pics/cr16-app-laptop_battery.png create mode 100644 klaptopdaemon/pics/cr16-app-laptop_pcmcia.png create mode 100644 klaptopdaemon/pics/cr32-app-laptop_battery.png create mode 100644 klaptopdaemon/pics/cr32-app-laptop_pcmcia.png create mode 100644 klaptopdaemon/pics/cr48-app-laptop_battery.png create mode 100644 klaptopdaemon/pics/cr48-app-laptop_pcmcia.png create mode 100644 klaptopdaemon/pics/cr64-app-laptop_battery.png create mode 100644 klaptopdaemon/pics/crsc-app-laptop_battery.svgz create mode 100644 klaptopdaemon/portable.cpp create mode 100644 klaptopdaemon/portable.h create mode 100644 klaptopdaemon/power.cpp create mode 100644 klaptopdaemon/power.h create mode 100644 klaptopdaemon/profile.cpp create mode 100644 klaptopdaemon/profile.h create mode 100644 klaptopdaemon/smapi.h create mode 100644 klaptopdaemon/smapibios.h create mode 100644 klaptopdaemon/smapidev.c create mode 100644 klaptopdaemon/smapidev.h create mode 100644 klaptopdaemon/sony.cpp create mode 100644 klaptopdaemon/sony.h create mode 100644 klaptopdaemon/thinkpad_common.h create mode 100644 klaptopdaemon/version.h create mode 100644 klaptopdaemon/wake_laptop.cpp create mode 100644 klaptopdaemon/warning.cpp create mode 100644 klaptopdaemon/warning.h create mode 100644 klaptopdaemon/xautolock.cc create mode 100644 klaptopdaemon/xautolock.h create mode 100644 klaptopdaemon/xautolock_c.h create mode 100644 klaptopdaemon/xautolock_diy.c create mode 100644 klaptopdaemon/xautolock_engine.c create mode 100644 kmilo/Makefile.am create mode 100644 kmilo/README create mode 100644 kmilo/TODO create mode 100644 kmilo/asus/Makefile.am create mode 100644 kmilo/asus/README create mode 100644 kmilo/asus/asus.cpp create mode 100644 kmilo/asus/asus.h create mode 100644 kmilo/asus/kmilo_asus.desktop create mode 100644 kmilo/configure.in.in create mode 100644 kmilo/delli8k/Makefile.am create mode 100644 kmilo/delli8k/README create mode 100644 kmilo/delli8k/delli8k.cpp create mode 100644 kmilo/delli8k/delli8k.h create mode 100644 kmilo/delli8k/i8k.h create mode 100644 kmilo/delli8k/kmilo_delli8k.desktop create mode 100644 kmilo/demo/Makefile.am create mode 100644 kmilo/demo/demo.cpp create mode 100644 kmilo/demo/demo.h create mode 100644 kmilo/demo/kmilo_demo.desktop create mode 100644 kmilo/generic/Makefile.am create mode 100644 kmilo/generic/README create mode 100644 kmilo/generic/generic_monitor.cpp create mode 100644 kmilo/generic/generic_monitor.h create mode 100644 kmilo/generic/kmilo_generic.desktop create mode 100644 kmilo/kmilo_kvaio/Makefile.am create mode 100644 kmilo/kmilo_kvaio/README.sonypi.h create mode 100644 kmilo/kmilo_kvaio/kcmkvaio/Makefile.am create mode 100644 kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui create mode 100644 kmilo/kmilo_kvaio/kcmkvaio/kcmkvaio_general.ui.h create mode 100644 kmilo/kmilo_kvaio/kcmkvaio/kvaio.desktop create mode 100644 kmilo/kmilo_kvaio/kcmkvaio/main.cpp create mode 100644 kmilo/kmilo_kvaio/kcmkvaio/main.h create mode 100644 kmilo/kmilo_kvaio/kmilo_kvaio.cpp create mode 100644 kmilo/kmilo_kvaio/kmilo_kvaio.desktop create mode 100644 kmilo/kmilo_kvaio/kmilo_kvaio.h create mode 100644 kmilo/kmilo_kvaio/kvaio.cpp create mode 100644 kmilo/kmilo_kvaio/kvaio.h create mode 100644 kmilo/kmilo_kvaio/kvaiodriverinterface.cpp create mode 100644 kmilo/kmilo_kvaio/kvaiodriverinterface.h create mode 100644 kmilo/kmilo_kvaio/sonypi.h create mode 100644 kmilo/kmilod/Makefile.am create mode 100644 kmilo/kmilod/defaultskin.cpp create mode 100644 kmilo/kmilod/defaultskin.h create mode 100644 kmilo/kmilod/defaultwidget.ui create mode 100644 kmilo/kmilod/displayskin.cpp create mode 100644 kmilo/kmilod/displayskin.h create mode 100644 kmilo/kmilod/kmilod.cpp create mode 100644 kmilo/kmilod/kmilod.desktop create mode 100644 kmilo/kmilod/kmilod.h create mode 100644 kmilo/kmilod/kmilointerface.cpp create mode 100644 kmilo/kmilod/kmilointerface.h create mode 100644 kmilo/kmilod/kmilopluginsvc.desktop create mode 100644 kmilo/kmilod/monitor.cpp create mode 100644 kmilo/kmilod/monitor.h create mode 100644 kmilo/powerbook/Makefile.am create mode 100644 kmilo/powerbook/kmilo_powerbook.desktop create mode 100644 kmilo/powerbook/pb_monitor.cpp create mode 100644 kmilo/powerbook/pb_monitor.h create mode 100644 kmilo/powerbook2/Makefile.am create mode 100644 kmilo/powerbook2/kmilo_powerbook.desktop create mode 100644 kmilo/powerbook2/pb_monitor.cpp create mode 100644 kmilo/powerbook2/pb_monitor.h create mode 100644 kmilo/thinkpad/Makefile.am create mode 100644 kmilo/thinkpad/README create mode 100644 kmilo/thinkpad/kcmthinkpad/Makefile.am create mode 100644 kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui create mode 100644 kmilo/thinkpad/kcmthinkpad/kcmthinkpad_general.ui.h create mode 100644 kmilo/thinkpad/kcmthinkpad/main.cpp create mode 100644 kmilo/thinkpad/kcmthinkpad/main.h create mode 100644 kmilo/thinkpad/kcmthinkpad/thinkpad.desktop create mode 100644 kmilo/thinkpad/kmilo_thinkpad.desktop create mode 100644 kmilo/thinkpad/thinkpad.cpp create mode 100644 kmilo/thinkpad/thinkpad.h create mode 100644 kregexpeditor/Comments create mode 100644 kregexpeditor/KMultiFormListBox/Makefile.am create mode 100644 kregexpeditor/KMultiFormListBox/TODO create mode 100644 kregexpeditor/KMultiFormListBox/ccp.cpp create mode 100644 kregexpeditor/KMultiFormListBox/ccp.h create mode 100644 kregexpeditor/KMultiFormListBox/idx.xbm create mode 100644 kregexpeditor/KMultiFormListBox/indexWindow.cpp create mode 100644 kregexpeditor/KMultiFormListBox/indexWindow.h create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox-multivisible.cpp create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox-multivisible.h create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox-shower.h create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox-windowed.cpp create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox-windowed.h create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox.cpp create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistbox.h create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistboxentry.cpp create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistboxentry.h create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistboxfactory.cpp create mode 100644 kregexpeditor/KMultiFormListBox/kmultiformlistboxfactory.h create mode 100644 kregexpeditor/KMultiFormListBox/widgetwindow.cpp create mode 100644 kregexpeditor/KMultiFormListBox/widgetwindow.h create mode 100644 kregexpeditor/KMultiFormListBox/windowlistboxitem.cpp create mode 100644 kregexpeditor/KMultiFormListBox/windowlistboxitem.h create mode 100644 kregexpeditor/KWidgetStreamer/Makefile.am create mode 100644 kregexpeditor/KWidgetStreamer/kwidgetstreamer.cpp create mode 100644 kregexpeditor/KWidgetStreamer/kwidgetstreamer.h create mode 100644 kregexpeditor/Makefile.am create mode 100644 kregexpeditor/TODO create mode 100644 kregexpeditor/altnregexp.cpp create mode 100644 kregexpeditor/altnregexp.h create mode 100644 kregexpeditor/altnwidget.cpp create mode 100644 kregexpeditor/altnwidget.h create mode 100644 kregexpeditor/auxbuttons.cpp create mode 100644 kregexpeditor/auxbuttons.h create mode 100644 kregexpeditor/characterswidget.cpp create mode 100644 kregexpeditor/characterswidget.h create mode 100644 kregexpeditor/charselector.cpp create mode 100644 kregexpeditor/charselector.h create mode 100644 kregexpeditor/compoundregexp.cpp create mode 100644 kregexpeditor/compoundregexp.h create mode 100644 kregexpeditor/compoundwidget.cpp create mode 100644 kregexpeditor/compoundwidget.h create mode 100644 kregexpeditor/concregexp.cpp create mode 100644 kregexpeditor/concregexp.h create mode 100644 kregexpeditor/concwidget.cpp create mode 100644 kregexpeditor/concwidget.h create mode 100644 kregexpeditor/dcbutton.cpp create mode 100644 kregexpeditor/dcbutton.h create mode 100644 kregexpeditor/dotregexp.cpp create mode 100644 kregexpeditor/dotregexp.h create mode 100644 kregexpeditor/drag.cpp create mode 100644 kregexpeditor/drag.h create mode 100644 kregexpeditor/dragaccepter.cpp create mode 100644 kregexpeditor/dragaccepter.h create mode 100644 kregexpeditor/editorwindow.cpp create mode 100644 kregexpeditor/editorwindow.h create mode 100644 kregexpeditor/emacsregexpconverter.cpp create mode 100644 kregexpeditor/emacsregexpconverter.h create mode 100644 kregexpeditor/errormap.cpp create mode 100644 kregexpeditor/errormap.h create mode 100755 kregexpeditor/extractrc-from-regexp create mode 100644 kregexpeditor/gen_qregexplexer.cpp create mode 100644 kregexpeditor/gen_qregexpparser.cc create mode 100644 kregexpeditor/gen_qregexpparser.hh create mode 100644 kregexpeditor/hi128-app-kregexpeditor.png create mode 100644 kregexpeditor/hi16-app-kregexpeditor.png create mode 100644 kregexpeditor/hi22-app-kregexpeditor.png create mode 100644 kregexpeditor/hi32-app-kregexpeditor.png create mode 100644 kregexpeditor/hi48-app-kregexpeditor.png create mode 100644 kregexpeditor/hi64-app-kregexpeditor.png create mode 100644 kregexpeditor/infopage.cpp create mode 100644 kregexpeditor/infopage.h create mode 100644 kregexpeditor/kregexpeditor.desktop create mode 100644 kregexpeditor/kregexpeditor.svgz create mode 100644 kregexpeditor/kregexpeditorfactory.cpp create mode 100644 kregexpeditor/kregexpeditorgui.cpp create mode 100644 kregexpeditor/kregexpeditorgui.desktop create mode 100644 kregexpeditor/kregexpeditorgui.h create mode 100644 kregexpeditor/kregexpeditorprivate.cpp create mode 100644 kregexpeditor/kregexpeditorprivate.h create mode 100644 kregexpeditor/limitedcharlineedit.cpp create mode 100644 kregexpeditor/limitedcharlineedit.h create mode 100644 kregexpeditor/lookaheadregexp.cpp create mode 100644 kregexpeditor/lookaheadregexp.h create mode 100644 kregexpeditor/lookaheadwidget.cpp create mode 100644 kregexpeditor/lookaheadwidget.h create mode 100644 kregexpeditor/main.cpp create mode 100644 kregexpeditor/multicontainerwidget.cpp create mode 100644 kregexpeditor/multicontainerwidget.h create mode 100644 kregexpeditor/myfontmetrics.cpp create mode 100644 kregexpeditor/myfontmetrics.h create mode 100644 kregexpeditor/pair.h create mode 100644 kregexpeditor/picts/Makefile.am create mode 100644 kregexpeditor/picts/altn.png create mode 100644 kregexpeditor/picts/anychar.png create mode 100644 kregexpeditor/picts/autoverify.png create mode 100644 kregexpeditor/picts/begline.png create mode 100644 kregexpeditor/picts/characters.png create mode 100644 kregexpeditor/picts/compound.png create mode 100644 kregexpeditor/picts/endline.png create mode 100644 kregexpeditor/picts/error.png create mode 100644 kregexpeditor/picts/neglookahead.png create mode 100644 kregexpeditor/picts/nonwordboundary.png create mode 100644 kregexpeditor/picts/poslookahead.png create mode 100644 kregexpeditor/picts/repeat.png create mode 100644 kregexpeditor/picts/select.png create mode 100644 kregexpeditor/picts/text.png create mode 100644 kregexpeditor/picts/verify.png create mode 100644 kregexpeditor/picts/wordboundary.png create mode 100644 kregexpeditor/positionregexp.cpp create mode 100644 kregexpeditor/positionregexp.h create mode 100644 kregexpeditor/predefined/General/Makefile.am create mode 100644 kregexpeditor/predefined/General/anything.regexp create mode 100644 kregexpeditor/predefined/General/spaces.regexp create mode 100644 kregexpeditor/predefined/Makefile.am create mode 100644 kregexpeditor/predefined/README create mode 100644 kregexpeditor/qregexpparser.l create mode 100644 kregexpeditor/qregexpparser.y create mode 100755 kregexpeditor/qt-only/clean create mode 100644 kregexpeditor/qt-only/compat.cpp create mode 100644 kregexpeditor/qt-only/compat.h create mode 100755 kregexpeditor/qt-only/compile create mode 100644 kregexpeditor/qt-only/qt-only.pro create mode 100644 kregexpeditor/qt-only/win-release.bat create mode 100644 kregexpeditor/qtregexpconverter.cpp create mode 100644 kregexpeditor/qtregexpconverter.h create mode 100644 kregexpeditor/qtregexphighlighter.cpp create mode 100644 kregexpeditor/qtregexphighlighter.h create mode 100644 kregexpeditor/regexp.cpp create mode 100644 kregexpeditor/regexp.h create mode 100644 kregexpeditor/regexpbuttons.cpp create mode 100644 kregexpeditor/regexpbuttons.h create mode 100644 kregexpeditor/regexpconverter.cpp create mode 100644 kregexpeditor/regexpconverter.h create mode 100644 kregexpeditor/regexphighlighter.cpp create mode 100644 kregexpeditor/regexphighlighter.h create mode 100644 kregexpeditor/regexpwidget.cpp create mode 100644 kregexpeditor/regexpwidget.h create mode 100644 kregexpeditor/repeatregexp.cpp create mode 100644 kregexpeditor/repeatregexp.h create mode 100644 kregexpeditor/repeatwidget.cpp create mode 100644 kregexpeditor/repeatwidget.h create mode 100644 kregexpeditor/scrollededitorwindow.cpp create mode 100644 kregexpeditor/scrollededitorwindow.h create mode 100644 kregexpeditor/selectablelineedit.cpp create mode 100644 kregexpeditor/selectablelineedit.h create mode 100644 kregexpeditor/singlecontainerwidget.cpp create mode 100644 kregexpeditor/singlecontainerwidget.h create mode 100644 kregexpeditor/test-without-dl/Makefile.am create mode 100644 kregexpeditor/test-without-dl/main.cpp create mode 100644 kregexpeditor/textrangeregexp.cpp create mode 100644 kregexpeditor/textrangeregexp.h create mode 100644 kregexpeditor/textregexp.cpp create mode 100644 kregexpeditor/textregexp.h create mode 100644 kregexpeditor/textwidget.cpp create mode 100644 kregexpeditor/textwidget.h create mode 100644 kregexpeditor/triple.h create mode 100644 kregexpeditor/userdefinedregexps.cpp create mode 100644 kregexpeditor/userdefinedregexps.h create mode 100644 kregexpeditor/util.cpp create mode 100644 kregexpeditor/util.h create mode 100644 kregexpeditor/verifier.cpp create mode 100644 kregexpeditor/verifier.h create mode 100644 kregexpeditor/verifybuttons.cpp create mode 100644 kregexpeditor/verifybuttons.h create mode 100644 kregexpeditor/widgetfactory.cpp create mode 100644 kregexpeditor/widgetfactory.h create mode 100644 kregexpeditor/zerowidgets.cpp create mode 100644 kregexpeditor/zerowidgets.h create mode 100644 ksim/AUTHORS create mode 100644 ksim/BUGS create mode 100644 ksim/COPYING create mode 100644 ksim/ChangeLog create mode 100644 ksim/Makefile.am create mode 100644 ksim/README create mode 100644 ksim/TODO create mode 100644 ksim/baselist.h create mode 100644 ksim/configure.in.in create mode 100644 ksim/generalprefs.cpp create mode 100644 ksim/generalprefs.h create mode 100644 ksim/ksim.cpp create mode 100644 ksim/ksim.desktop create mode 100644 ksim/ksim.h create mode 100644 ksim/ksim_panelextensionrc create mode 100644 ksim/ksimframe.cpp create mode 100644 ksim/ksimframe.h create mode 100644 ksim/ksimpref.cpp create mode 100644 ksim/ksimpref.h create mode 100644 ksim/ksimsysinfo.cpp create mode 100644 ksim/ksimsysinfo.h create mode 100644 ksim/ksimview.cpp create mode 100644 ksim/ksimview.h create mode 100644 ksim/library/Makefile.am create mode 100644 ksim/library/chart.cpp create mode 100644 ksim/library/chart.h create mode 100644 ksim/library/common.cpp create mode 100644 ksim/library/common.h create mode 100644 ksim/library/ksimconfig.cpp create mode 100644 ksim/library/ksimconfig.h create mode 100644 ksim/library/label.cpp create mode 100644 ksim/library/label.h create mode 100644 ksim/library/led.cpp create mode 100644 ksim/library/led.h create mode 100644 ksim/library/pluginglobal.cpp create mode 100644 ksim/library/pluginglobal.h create mode 100644 ksim/library/pluginloader.cpp create mode 100644 ksim/library/pluginloader.h create mode 100644 ksim/library/pluginmodule.cpp create mode 100644 ksim/library/pluginmodule.h create mode 100644 ksim/library/progress.cpp create mode 100644 ksim/library/progress.h create mode 100644 ksim/library/themeloader.cpp create mode 100644 ksim/library/themeloader.h create mode 100644 ksim/library/themetypes.h create mode 100644 ksim/monitorprefs.cpp create mode 100644 ksim/monitorprefs.h create mode 100644 ksim/monitors/Makefile.am create mode 100644 ksim/monitors/cpu/Makefile.am create mode 100644 ksim/monitors/cpu/cpu.desktop create mode 100644 ksim/monitors/cpu/cr16-device-ksim_cpu.png create mode 100644 ksim/monitors/cpu/ksimcpu.cpp create mode 100644 ksim/monitors/cpu/ksimcpu.h create mode 100644 ksim/monitors/disk/Makefile.am create mode 100644 ksim/monitors/disk/configure.in.in create mode 100644 ksim/monitors/disk/disk.desktop create mode 100644 ksim/monitors/disk/ksimdisk.cpp create mode 100644 ksim/monitors/disk/ksimdisk.h create mode 100644 ksim/monitors/filesystem/DFree.desktop create mode 100644 ksim/monitors/filesystem/Makefile.am create mode 100644 ksim/monitors/filesystem/configure.in.in create mode 100644 ksim/monitors/filesystem/filesystemstats.cpp create mode 100644 ksim/monitors/filesystem/filesystemstats.h create mode 100644 ksim/monitors/filesystem/filesystemwidget.cpp create mode 100644 ksim/monitors/filesystem/filesystemwidget.h create mode 100644 ksim/monitors/filesystem/fsystemconfig.cpp create mode 100644 ksim/monitors/filesystem/fsystemconfig.h create mode 100644 ksim/monitors/filesystem/fsystemiface.h create mode 100644 ksim/monitors/filesystem/ksimfsystem.cpp create mode 100644 ksim/monitors/filesystem/ksimfsystem.h create mode 100644 ksim/monitors/i8k/Makefile.am create mode 100644 ksim/monitors/i8k/i8k.desktop create mode 100644 ksim/monitors/i8k/ksimi8k.cpp create mode 100644 ksim/monitors/i8k/ksimi8k.h create mode 100644 ksim/monitors/lm_sensors/Lm_sensors.desktop create mode 100644 ksim/monitors/lm_sensors/Makefile.am create mode 100644 ksim/monitors/lm_sensors/NVCtrl.c create mode 100644 ksim/monitors/lm_sensors/NVCtrl.h create mode 100644 ksim/monitors/lm_sensors/NVCtrlLib.h create mode 100644 ksim/monitors/lm_sensors/ksimsensors.cpp create mode 100644 ksim/monitors/lm_sensors/ksimsensors.h create mode 100644 ksim/monitors/lm_sensors/ksimsensorsiface.h create mode 100644 ksim/monitors/lm_sensors/nv_control.h create mode 100644 ksim/monitors/lm_sensors/sensorbase.cpp create mode 100644 ksim/monitors/lm_sensors/sensorbase.h create mode 100644 ksim/monitors/lm_sensors/sensorsconfig.cpp create mode 100644 ksim/monitors/lm_sensors/sensorsconfig.h create mode 100644 ksim/monitors/mail/Makefile.am create mode 100644 ksim/monitors/mail/ksimmail.cpp create mode 100644 ksim/monitors/mail/ksimmail.h create mode 100644 ksim/monitors/mail/mail.desktop create mode 100644 ksim/monitors/net/Makefile.am create mode 100644 ksim/monitors/net/Net.desktop create mode 100644 ksim/monitors/net/ksimnet.cpp create mode 100644 ksim/monitors/net/ksimnet.h create mode 100644 ksim/monitors/net/netconfig.cpp create mode 100644 ksim/monitors/net/netconfig.h create mode 100644 ksim/monitors/net/netdevices.h create mode 100644 ksim/monitors/net/netdialog.cpp create mode 100644 ksim/monitors/net/netdialog.h create mode 100644 ksim/monitors/snmp/Makefile.am create mode 100644 ksim/monitors/snmp/Snmp.desktop create mode 100644 ksim/monitors/snmp/browsedialog.cpp create mode 100644 ksim/monitors/snmp/browsedialog.h create mode 100644 ksim/monitors/snmp/browsedialogbase.ui create mode 100644 ksim/monitors/snmp/chartmonitor.cpp create mode 100644 ksim/monitors/snmp/chartmonitor.h create mode 100644 ksim/monitors/snmp/configpage.cpp create mode 100644 ksim/monitors/snmp/configpage.h create mode 100644 ksim/monitors/snmp/configure.in.in create mode 100644 ksim/monitors/snmp/configwidget.ui create mode 100644 ksim/monitors/snmp/hostconfig.cpp create mode 100644 ksim/monitors/snmp/hostconfig.h create mode 100644 ksim/monitors/snmp/hostdialog.cpp create mode 100644 ksim/monitors/snmp/hostdialog.h create mode 100644 ksim/monitors/snmp/hostdialogbase.ui create mode 100644 ksim/monitors/snmp/identifier.cpp create mode 100644 ksim/monitors/snmp/identifier.h create mode 100644 ksim/monitors/snmp/labelmonitor.cpp create mode 100644 ksim/monitors/snmp/labelmonitor.h create mode 100644 ksim/monitors/snmp/monitor.cpp create mode 100644 ksim/monitors/snmp/monitor.h create mode 100644 ksim/monitors/snmp/monitorconfig.cpp create mode 100644 ksim/monitors/snmp/monitorconfig.h create mode 100644 ksim/monitors/snmp/monitordialog.cpp create mode 100644 ksim/monitors/snmp/monitordialog.h create mode 100644 ksim/monitors/snmp/monitordialogbase.ui create mode 100644 ksim/monitors/snmp/pdu.cpp create mode 100644 ksim/monitors/snmp/pdu.h create mode 100644 ksim/monitors/snmp/plugin.cpp create mode 100644 ksim/monitors/snmp/plugin.h create mode 100644 ksim/monitors/snmp/probedialog.cpp create mode 100644 ksim/monitors/snmp/probedialog.h create mode 100644 ksim/monitors/snmp/proberesultdialog.cpp create mode 100644 ksim/monitors/snmp/proberesultdialog.h create mode 100644 ksim/monitors/snmp/proberesultdialogbase.ui create mode 100644 ksim/monitors/snmp/session.cpp create mode 100644 ksim/monitors/snmp/session.h create mode 100644 ksim/monitors/snmp/snmp.cpp create mode 100644 ksim/monitors/snmp/snmp.h create mode 100644 ksim/monitors/snmp/snmp_p.h create mode 100644 ksim/monitors/snmp/snmplib.cpp create mode 100644 ksim/monitors/snmp/snmplib.h create mode 100644 ksim/monitors/snmp/value.cpp create mode 100644 ksim/monitors/snmp/value.h create mode 100644 ksim/monitors/snmp/value_p.h create mode 100644 ksim/monitors/snmp/view.cpp create mode 100644 ksim/monitors/snmp/view.h create mode 100644 ksim/monitors/snmp/walker.cpp create mode 100644 ksim/monitors/snmp/walker.h create mode 100644 ksim/pics/Makefile.am create mode 100644 ksim/pics/cr16-app-ksim.png create mode 100644 ksim/pics/cr32-app-ksim.png create mode 100644 ksim/pics/cr48-app-ksim.png create mode 100644 ksim/pics/misc/Makefile.am create mode 100644 ksim/pics/misc/clock.png create mode 100644 ksim/pics/misc/uptime.png create mode 100644 ksim/systeminfo.cpp create mode 100644 ksim/systeminfo.h create mode 100644 ksim/themeprefs.cpp create mode 100644 ksim/themeprefs.h create mode 100644 ksim/themes/Makefile.am create mode 100644 ksim/themes/ksim/Makefile.am create mode 100644 ksim/themes/ksim/bg_chart.png create mode 100644 ksim/themes/ksim/bg_grid.png create mode 100644 ksim/themes/ksim/bg_meter.png create mode 100644 ksim/themes/ksim/bg_panel.png create mode 100644 ksim/themes/ksim/decal_net_leds.png create mode 100644 ksim/themes/ksim/frame_bottom.png create mode 100644 ksim/themes/ksim/frame_left.png create mode 100644 ksim/themes/ksim/frame_right.png create mode 100644 ksim/themes/ksim/frame_top.png create mode 100644 ksim/themes/ksim/gkrellmrc create mode 100644 ksim/themes/ksim/gkrellmrc_ksim create mode 100644 ksim/themes/ksim/host/Makefile.am create mode 100644 ksim/themes/ksim/host/bg_meter.png create mode 100644 ksim/themes/ksim/krell_meter.png create mode 100644 ksim/themes/ksim/krell_panel.png create mode 100644 ksim/themes/ksim/krell_slider.png create mode 100644 ksim/themes/ksim/mail/Makefile.am create mode 100644 ksim/themes/ksim/mail/decal_mail.png create mode 100644 ksim/themes/ksim/mail/krell_mail.png create mode 100644 ksim/themes/ksim/mail/krell_mail_daemon.png create mode 100644 ktimer/Makefile.am create mode 100644 ktimer/hi128-app-ktimer.png create mode 100644 ktimer/hi16-app-ktimer.png create mode 100644 ktimer/hi32-app-ktimer.png create mode 100644 ktimer/hi48-app-ktimer.png create mode 100644 ktimer/ktimer.cpp create mode 100644 ktimer/ktimer.desktop create mode 100644 ktimer/ktimer.h create mode 100644 ktimer/main.cpp create mode 100644 ktimer/prefwidget.ui create mode 100644 kwallet/Makefile.am create mode 100644 kwallet/TODO create mode 100644 kwallet/allyourbase.cpp create mode 100644 kwallet/allyourbase.h create mode 100644 kwallet/hi128-app-kwalletmanager.png create mode 100644 kwallet/hi128-app-kwalletmanager2.png create mode 100644 kwallet/hi16-app-kwalletmanager.png create mode 100644 kwallet/hi16-app-kwalletmanager2.png create mode 100644 kwallet/hi22-app-kwalletmanager.png create mode 100644 kwallet/hi32-app-kwalletmanager.png create mode 100644 kwallet/hi32-app-kwalletmanager2.png create mode 100644 kwallet/hi48-app-kwalletmanager.png create mode 100644 kwallet/hi48-app-kwalletmanager2.png create mode 100644 kwallet/hi64-app-kwalletmanager.png create mode 100644 kwallet/hi64-app-kwalletmanager2.png create mode 100644 kwallet/icons/Makefile.am create mode 100644 kwallet/icons/cr22-action-folder_closed.png create mode 100644 kwallet/icons/cr22-action-folder_open.png create mode 100644 kwallet/icons/cr22-action-wallet_closed.png create mode 100644 kwallet/icons/cr22-action-wallet_open.png create mode 100644 kwallet/kbetterthankdialogbase.ui create mode 100644 kwallet/kbetterthankdialogbase.ui.h create mode 100644 kwallet/konfigurator/Makefile.am create mode 100644 kwallet/konfigurator/konfigurator.cpp create mode 100644 kwallet/konfigurator/konfigurator.h create mode 100644 kwallet/konfigurator/kwallet_config.desktop create mode 100644 kwallet/konfigurator/kwalletconfig.desktop create mode 100644 kwallet/konfigurator/kwalletmanager_show.desktop create mode 100644 kwallet/konfigurator/walletconfigwidget.ui create mode 100644 kwallet/kwalleteditor.cpp create mode 100644 kwallet/kwalleteditor.h create mode 100644 kwallet/kwalleteditor.rc create mode 100644 kwallet/kwalletmanager-kwalletd.desktop create mode 100644 kwallet/kwalletmanager.cpp create mode 100644 kwallet/kwalletmanager.desktop create mode 100644 kwallet/kwalletmanager.h create mode 100644 kwallet/kwalletmanager.rc create mode 100644 kwallet/kwalletpopup.cpp create mode 100644 kwallet/kwalletpopup.h create mode 100644 kwallet/kwmapeditor.cpp create mode 100644 kwallet/kwmapeditor.h create mode 100644 kwallet/main.cpp create mode 100644 kwallet/walletwidget.ui create mode 100644 superkaramba/AUTHORS create mode 100644 superkaramba/COPYING create mode 100644 superkaramba/ChangeLog create mode 100644 superkaramba/Doxyfile create mode 100644 superkaramba/INSTALL create mode 100644 superkaramba/Makefile.am create mode 100644 superkaramba/NEWS create mode 100644 superkaramba/README create mode 100644 superkaramba/TODO create mode 100644 superkaramba/configure.in.bot create mode 100644 superkaramba/configure.in.in create mode 100644 superkaramba/doc/Makefile.am create mode 100644 superkaramba/doc/faq/faq.css create mode 100644 superkaramba/doc/faq/faq.dat create mode 100644 superkaramba/doc/faq/faq.html create mode 100644 superkaramba/doc/faq/faq.txt create mode 100644 superkaramba/doc/faq/faqfooter.html create mode 100644 superkaramba/doc/faq/faqfooter.txt create mode 100644 superkaramba/doc/faq/faqheader.html create mode 100644 superkaramba/doc/faq/faqheader.txt create mode 100644 superkaramba/doc/python_api/api.css create mode 100644 superkaramba/doc/python_api/api_html.rc create mode 100755 superkaramba/doc/python_api/make_api_doc.sh create mode 100644 superkaramba/examples/API create mode 100644 superkaramba/examples/README create mode 100644 superkaramba/examples/api.html create mode 100644 superkaramba/examples/autoHide/main.py create mode 100644 superkaramba/examples/autoHide/main.theme create mode 100644 superkaramba/examples/autoHide/pics/MSN-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/MSN-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_House-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_House-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Mail-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Mail-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Mozilla-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Mozilla-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Sherlock-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Sherlock-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Terminal-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_Terminal-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_iPhoto-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/Tux_iPhoto-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/bar3.png create mode 100644 superkaramba/examples/autoHide/pics/bar4.png create mode 100644 superkaramba/examples/autoHide/pics/calendar.png create mode 100644 superkaramba/examples/autoHide/pics/ctrl center-64x64.png create mode 100644 superkaramba/examples/autoHide/pics/ctrl center-96x96.png create mode 100644 superkaramba/examples/autoHide/pics/iconbarback.png create mode 100644 superkaramba/examples/autoHide/pics/label3.png create mode 100644 superkaramba/examples/autoHide/pics/label4.png create mode 100644 superkaramba/examples/autoHide/pics/osxbarback.png create mode 100644 superkaramba/examples/autoHide/pics/osxbarbackBig.png create mode 100644 superkaramba/examples/autoHide/pics/pointer.png create mode 100644 superkaramba/examples/bar/bar.py create mode 100644 superkaramba/examples/bar/bar.theme create mode 100644 superkaramba/examples/bar/hor.png create mode 100644 superkaramba/examples/bar/ver.png create mode 100644 superkaramba/examples/change_interval/interval.py create mode 100644 superkaramba/examples/change_interval/interval.theme create mode 100644 superkaramba/examples/control_management/mgmt.py create mode 100644 superkaramba/examples/control_management/mgmt.theme create mode 100644 superkaramba/examples/disableRightClickMenu/disable_menu.py create mode 100644 superkaramba/examples/disableRightClickMenu/disable_menu.theme create mode 100644 superkaramba/examples/globalMouse/README create mode 100644 superkaramba/examples/globalMouse/extension/setup.py create mode 100644 superkaramba/examples/globalMouse/extension/xcursor.c create mode 100644 superkaramba/examples/globalMouse/eyes.py create mode 100644 superkaramba/examples/globalMouse/eyes.theme create mode 100644 superkaramba/examples/globalMouse/pics/eyes.png create mode 100644 superkaramba/examples/globalMouse/pics/eyes.xcf create mode 100644 superkaramba/examples/globalMouse/pics/mask.png create mode 100644 superkaramba/examples/globalMouse/pics/pupille.png create mode 100755 superkaramba/examples/globalMouse/xcursor.so create mode 100644 superkaramba/examples/graph/graph.py create mode 100644 superkaramba/examples/graph/graph.theme create mode 100644 superkaramba/examples/image/flag.png create mode 100644 superkaramba/examples/image/flag2.png create mode 100644 superkaramba/examples/image/image.py create mode 100644 superkaramba/examples/image/image.theme create mode 100755 superkaramba/examples/image/test1.sh create mode 100755 superkaramba/examples/image/test2.sh create mode 100644 superkaramba/examples/input_api/input_api.py create mode 100644 superkaramba/examples/input_api/input_api.theme create mode 100644 superkaramba/examples/input_example/input_example.py create mode 100644 superkaramba/examples/input_example/input_example.theme create mode 100644 superkaramba/examples/mouseDrag/karmix/images/bar.png create mode 100644 superkaramba/examples/mouseDrag/karmix/images/bg.png create mode 100644 superkaramba/examples/mouseDrag/karmix/karmix.py create mode 100644 superkaramba/examples/mouseDrag/karmix/karmix.theme create mode 100644 superkaramba/examples/mouseDrop/mousedrop.py create mode 100644 superkaramba/examples/mouseDrop/mousedrop.theme create mode 100644 superkaramba/examples/openCloseTheme/1.py create mode 100644 superkaramba/examples/openCloseTheme/1.theme create mode 100644 superkaramba/examples/openCloseTheme/2.theme create mode 100644 superkaramba/examples/popupMenu/calendar.png create mode 100644 superkaramba/examples/popupMenu/popupMenu.png create mode 100644 superkaramba/examples/popupMenu/popupMenu.py create mode 100644 superkaramba/examples/popupMenu/popupMenu.theme create mode 100644 superkaramba/examples/richtext/info.png create mode 100644 superkaramba/examples/richtext/penguin_executive.png create mode 100644 superkaramba/examples/richtext/richtext.py create mode 100644 superkaramba/examples/richtext/richtext.theme create mode 100644 superkaramba/examples/richtext/rtext.py create mode 100644 superkaramba/examples/richtext/rtext.theme create mode 100644 superkaramba/examples/service_group/service_group.py create mode 100644 superkaramba/examples/service_group/service_group.theme create mode 100644 superkaramba/examples/setIncomingData/1.py create mode 100644 superkaramba/examples/setIncomingData/1.theme create mode 100644 superkaramba/examples/setIncomingData/2.py create mode 100644 superkaramba/examples/setIncomingData/2.theme create mode 100644 superkaramba/examples/taskBar/cleanbar/README create mode 100644 superkaramba/examples/taskBar/cleanbar/cleanbar.py create mode 100644 superkaramba/examples/taskBar/cleanbar/cleanbar.theme create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/bar2.png create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/rightend.png create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/rightend_new.png create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/slickbar.png create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/startup.png create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/task.png create mode 100644 superkaramba/examples/taskBar/cleanbar/pics/task_new.png create mode 100644 superkaramba/examples/template.py create mode 100755 superkaramba/examples/test_all.sh create mode 100644 superkaramba/examples/text/text.py create mode 100644 superkaramba/examples/text/text.theme create mode 100644 superkaramba/examples/unicode/unicode.py create mode 100644 superkaramba/examples/unicode/unicode.theme create mode 100644 superkaramba/icons/Makefile.am create mode 100644 superkaramba/icons/cr128-app-superkaramba.png create mode 100644 superkaramba/icons/cr128-mime-superkaramba_theme.png create mode 100644 superkaramba/icons/cr16-app-superkaramba.png create mode 100644 superkaramba/icons/cr16-mime-superkaramba_theme.png create mode 100644 superkaramba/icons/cr22-app-superkaramba.png create mode 100644 superkaramba/icons/cr22-mime-superkaramba_theme.png create mode 100644 superkaramba/icons/cr32-app-superkaramba.png create mode 100644 superkaramba/icons/cr32-mime-superkaramba_theme.png create mode 100644 superkaramba/icons/cr48-app-superkaramba.png create mode 100644 superkaramba/icons/cr48-mime-superkaramba_theme.png create mode 100644 superkaramba/icons/cr64-app-superkaramba.png create mode 100644 superkaramba/icons/cr64-mime-superkaramba_theme.png create mode 100644 superkaramba/icons/crsc-app-superkaramba.svgz create mode 100644 superkaramba/icons/crsc-mime-superkaramba_theme.svgz create mode 100644 superkaramba/karamba.kdevelop create mode 100644 superkaramba/karamba.kdevses create mode 100644 superkaramba/mimetypes/Makefile.am create mode 100644 superkaramba/mimetypes/x-superkaramba.desktop create mode 100644 superkaramba/src/Makefile.am create mode 100644 superkaramba/src/bar.cpp create mode 100644 superkaramba/src/bar.h create mode 100644 superkaramba/src/bar_python.cpp create mode 100644 superkaramba/src/bar_python.h create mode 100644 superkaramba/src/clickable.cpp create mode 100644 superkaramba/src/clickable.h create mode 100644 superkaramba/src/clickarea.cpp create mode 100644 superkaramba/src/clickarea.h create mode 100644 superkaramba/src/clickmap.cpp create mode 100644 superkaramba/src/clickmap.h create mode 100644 superkaramba/src/config_python.cpp create mode 100644 superkaramba/src/config_python.h create mode 100644 superkaramba/src/cpusensor.cpp create mode 100644 superkaramba/src/cpusensor.h create mode 100644 superkaramba/src/datesensor.cpp create mode 100644 superkaramba/src/datesensor.h create mode 100644 superkaramba/src/dcopinterface.h create mode 100644 superkaramba/src/disksensor.cpp create mode 100644 superkaramba/src/disksensor.h create mode 100644 superkaramba/src/graph.cpp create mode 100644 superkaramba/src/graph.h create mode 100644 superkaramba/src/graph_python.cpp create mode 100644 superkaramba/src/graph_python.h create mode 100644 superkaramba/src/imagelabel.cpp create mode 100644 superkaramba/src/imagelabel.h create mode 100644 superkaramba/src/imagelabel_python.cpp create mode 100644 superkaramba/src/imagelabel_python.h create mode 100644 superkaramba/src/input.cpp create mode 100644 superkaramba/src/input.h create mode 100644 superkaramba/src/input_python.cpp create mode 100644 superkaramba/src/input_python.h create mode 100644 superkaramba/src/karamba.cpp create mode 100644 superkaramba/src/karamba.h create mode 100644 superkaramba/src/karamba_python.cpp create mode 100644 superkaramba/src/karamba_python.h create mode 100644 superkaramba/src/karambaapp.cpp create mode 100644 superkaramba/src/karambaapp.h create mode 100644 superkaramba/src/karambainterface.cpp create mode 100644 superkaramba/src/karambainterface.h create mode 100644 superkaramba/src/karambalistboxitem.cpp create mode 100644 superkaramba/src/karambalistboxitem.h create mode 100644 superkaramba/src/karambarootpixmap.cpp create mode 100644 superkaramba/src/karambarootpixmap.h create mode 100644 superkaramba/src/karambasessionmanaged.cpp create mode 100644 superkaramba/src/karambasessionmanaged.h create mode 100644 superkaramba/src/kwidgetlistbox.cpp create mode 100644 superkaramba/src/kwidgetlistbox.h create mode 100644 superkaramba/src/lineparser.cpp create mode 100644 superkaramba/src/lineparser.h create mode 100644 superkaramba/src/main.cpp create mode 100644 superkaramba/src/memsensor.cpp create mode 100644 superkaramba/src/memsensor.h create mode 100644 superkaramba/src/menu_python.cpp create mode 100644 superkaramba/src/menu_python.h create mode 100644 superkaramba/src/meter.cpp create mode 100644 superkaramba/src/meter.h create mode 100644 superkaramba/src/meter_python.cpp create mode 100644 superkaramba/src/meter_python.h create mode 100644 superkaramba/src/misc_python.cpp create mode 100644 superkaramba/src/misc_python.h create mode 100644 superkaramba/src/networksensor.cpp create mode 100644 superkaramba/src/networksensor.h create mode 100644 superkaramba/src/noatunsensor.cpp create mode 100644 superkaramba/src/noatunsensor.h create mode 100644 superkaramba/src/programsensor.cpp create mode 100644 superkaramba/src/programsensor.h create mode 100644 superkaramba/src/richtextlabel.cpp create mode 100644 superkaramba/src/richtextlabel.h create mode 100644 superkaramba/src/richtextlabel_python.cpp create mode 100644 superkaramba/src/richtextlabel_python.h create mode 100644 superkaramba/src/rsssensor.cpp create mode 100644 superkaramba/src/rsssensor.h create mode 100644 superkaramba/src/sensor.cpp create mode 100644 superkaramba/src/sensor.h create mode 100644 superkaramba/src/sensorparams.cpp create mode 100644 superkaramba/src/sensorparams.h create mode 100644 superkaramba/src/sensorsensor.cpp create mode 100644 superkaramba/src/sensorsensor.h create mode 100644 superkaramba/src/showdesktop.cpp create mode 100644 superkaramba/src/showdesktop.h create mode 100644 superkaramba/src/sklineedit.cpp create mode 100644 superkaramba/src/sklineedit.h create mode 100644 superkaramba/src/sknewstuff.cpp create mode 100644 superkaramba/src/sknewstuff.h create mode 100644 superkaramba/src/superkaramba.desktop create mode 100644 superkaramba/src/superkaramba.kcfg create mode 100644 superkaramba/src/superkaramba.lsm create mode 100644 superkaramba/src/superkarambasettings.kcfgc create mode 100644 superkaramba/src/superkarambaui.rc create mode 100644 superkaramba/src/svcgrp_python.cpp create mode 100644 superkaramba/src/svcgrp_python.h create mode 100644 superkaramba/src/systemtray.cpp create mode 100644 superkaramba/src/systemtray.h create mode 100644 superkaramba/src/systray_python.cpp create mode 100644 superkaramba/src/systray_python.h create mode 100644 superkaramba/src/task_python.cpp create mode 100644 superkaramba/src/task_python.h create mode 100644 superkaramba/src/taskbartest.cpp create mode 100644 superkaramba/src/taskbartest.h create mode 100644 superkaramba/src/taskmanager.cpp create mode 100644 superkaramba/src/taskmanager.h create mode 100644 superkaramba/src/textfield.cpp create mode 100644 superkaramba/src/textfield.h create mode 100644 superkaramba/src/textfilesensor.cpp create mode 100644 superkaramba/src/textfilesensor.h create mode 100644 superkaramba/src/textlabel.cpp create mode 100644 superkaramba/src/textlabel.h create mode 100644 superkaramba/src/textlabel_python.cpp create mode 100644 superkaramba/src/textlabel_python.h create mode 100644 superkaramba/src/themefile.cpp create mode 100644 superkaramba/src/themefile.h create mode 100644 superkaramba/src/themelocale.cpp create mode 100644 superkaramba/src/themelocale.h create mode 100644 superkaramba/src/themes_layout.ui create mode 100644 superkaramba/src/themesdlg.cpp create mode 100644 superkaramba/src/themesdlg.h create mode 100644 superkaramba/src/themewidget.cpp create mode 100644 superkaramba/src/themewidget.h create mode 100644 superkaramba/src/themewidget_layout.ui create mode 100644 superkaramba/src/uptimesensor.cpp create mode 100644 superkaramba/src/uptimesensor.h create mode 100644 superkaramba/src/widget_python.cpp create mode 100644 superkaramba/src/widget_python.h create mode 100644 superkaramba/src/xmmssensor.cpp create mode 100644 superkaramba/src/xmmssensor.h diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..4c064a3 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,28 @@ +Program Person held responsible +======================================= +ark Emily Ezust +kab (discontinued) Mirko Boehm +karm Sirtaj Singh Kang +kcalc Bernd Johannes Wuebben +kcharselect Reginald Stadlbauer +kdepasswd Geert Jansen +kdessh Geert Jansen +kdf Michael Kropfberger +kedit Bernd Johannes Wuebben +kfind Carsten Pfeiffer +kfloppy Bernd Johannes Wuebben +kfontmanager Hans Petter Bieker +kgpg Jean-Baptiste Mardelle +khexedit Espen Sand +kjots Christoph Neerfeld +klaptopdaemon Paul Campbell +klipper Carsten Pfeiffer +kljettool Bernd Johannes Wuebben +klpq Bernd Johannes Wuebben +kpm Mario Weilguni +ktimemon Dirk A. Mueller +ktop Chris Schlaeger +kwrite Jochen Wilhelmy + +Look in the subdirs to get more info about the authors. +The package is maintained by Matthias Elter diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..5185fd3 --- /dev/null +++ b/COPYING @@ -0,0 +1,346 @@ +NOTE! The GPL below is copyrighted by the Free Software Foundation, but +the instance of code that it refers to (the kde programs) are copyrighted +by the authors who actually wrote it. + +--------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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/COPYING-DOCS b/COPYING-DOCS new file mode 100644 index 0000000..4a0fe1c --- /dev/null +++ b/COPYING-DOCS @@ -0,0 +1,397 @@ + GNU Free Documentation License + Version 1.2, November 2002 + + + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document 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. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation 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. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..f8bad0c --- /dev/null +++ b/INSTALL @@ -0,0 +1,176 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes a while. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/kde/bin', `/usr/local/kde/lib', etc. You can specify an +installation prefix other than `/usr/local/kde' by giving `configure' +the option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/Mainpage.dox b/Mainpage.dox new file mode 100644 index 0000000..3334ae2 --- /dev/null +++ b/Mainpage.dox @@ -0,0 +1,11 @@ +/** @mainpage KDE Utilities +* +* The KDE Utilities SVN module collects together an enormous amount +* of small shoddy utilities of dubious value that fall under the +* 'desk utilities' category and that you would normally get for +* free in a box of cereal. These include: +* +* - kfloppy, a floppy disk formatter +* - superkaramba, a form of eyecandy +* +*/ diff --git a/Makefile.am.in b/Makefile.am.in new file mode 100644 index 0000000..f5a67f1 --- /dev/null +++ b/Makefile.am.in @@ -0,0 +1,10 @@ +## kdebase/Makefile.am +## (C) 1997 Stephan Kulow + +AUTOMAKE_OPTIONS = foreign 1.6.1 +DISTCLEANFILES = inst-apps + +MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 SUBDIRS +include admin/deps.am +include admin/Doxyfile.am + diff --git a/Makefile.cvs b/Makefile.cvs new file mode 100644 index 0000000..be59a86 --- /dev/null +++ b/Makefile.cvs @@ -0,0 +1,14 @@ +all: + @echo "This Makefile is only for the CVS repository" + @echo "This will be deleted before making the distribution" + @echo "" + @if test ! -d admin; then \ + echo "Please recheckout this module!" ;\ + echo "for cvs: use checkout once and after that update again" ;\ + echo "for cvsup: checkout kde-common from cvsup and" ;\ + echo " link kde-common/admin to ./admin" ;\ + exit 1 ;\ + fi + $(MAKE) -f admin/Makefile.common cvs + +.SILENT: diff --git a/README b/README new file mode 100644 index 0000000..9e3708e --- /dev/null +++ b/README @@ -0,0 +1,51 @@ +In this file: + +* What it is +* Common Mistakes +* Debugging +* More Info + +What it is +---------- + +* ark: manager for compressed files and archives +* kcalc: scientific calculator +* kcharselect: select special characters from any fonts and put them into + the clipboard +* charselectapplet: dito, but as a Kicker applet +* kdepasswd: like 'passwd', a graphical password changer +* kdessh: front end to ssh +* kdf: like 'df', a graphical free disk space viewer +* kedit: a simple text editor, without formatting like bold, italics etc +* kfloppy: format a floppy disks with this app +* khexedit: binary file editor +* kjots: manages several "books" with a subject and notes +* klaptopdaemon: battery and power management, including KControl plugins +* kregexpeditor: graphical regular expression editor +* ktimer: execute programs after some time + +Common Mistakes +--------------- + +If configure claims Qt cannot be found, have a look at http://www.trolltech.com +to get latest copy of Qt 3.3.x version. If you have peeked there already, +grab the CVS module qt-copy from anoncvs.kde.org, or a snapshot thereof. + +Debugging +--------- + +You can use --enable-debug with the configure script, if you want to have +debug code in your KDE apps and libs. I recommend to do this, since this +is alpha software and this makes debugging things a whole lot easier. + +More Info +--------- + +Have a look at the individual subdirectories, if you want to know, what +versions of apps are included. + +Please direct any bug reports to our bug list by visiting +http://bugs.kde.org. + +General KDE discussions should go to the KDE mailing list (kde@kde.org). + diff --git a/ark/AUTHORS b/ark/AUTHORS new file mode 100644 index 0000000..0de587e --- /dev/null +++ b/ark/AUTHORS @@ -0,0 +1,5 @@ +Rob Palmbos palm9744@kettering.edu +Francois-Xavier Duranceau duranceau@kde.org +Emily Ezust emilye@corel.com +Roberto Selbach Teixeira maragato@kde.org +Helio Chissini de Castro helio@kde.org diff --git a/ark/ChangeLog b/ark/ChangeLog new file mode 100644 index 0000000..cd5b4de --- /dev/null +++ b/ark/ChangeLog @@ -0,0 +1,277 @@ + $Id$ + +2001-10-24: Roberto Selbach Teixeira + * Renamed all .cc files to .cpp to make things more logic. + +2001-06-23: Roberto Selbach Teixeira + * Fixed a bug in tar addition with non-compressed tar archives + +2001-06-10: Roberto Selbach Teixeira + * Made extraction use KURL instead of QString. + * Made extractDlg use a KHistoryCombo. + +2001-05-31 Roberto Selbach Teixeira + * Fixed a bug that made the file list freeze. + * Fixed extractDlg size to use QLayout + +2001-05-30 Roberto Selbach Teixeira + * Began using KMimeMagic to figure file types + * Began cleaning up Ark's code a bit. + +2001-05-29 Roberto Selbach Teixeira + + * compressedfile.cc (unarchFile): move to fromLocal8Bit() to allow + non-Latin1 characters in filenames. + + * ar.cc (unarchFile): .latin1() to .local8Bit() + + * zip.cc (unarchFile): .latin1() to .local8Bit() + +2000-07-10: Emily Ezust + * Added checks for available disk space + +2000-07-05: Emily Ezust + * Added some more mimetype magic. + +2000-06-28: Emily Ezust + * Made Extract dialog prettier + +2000-06-27: Emily Ezust + * Added code to let users load rar, lha, ar and tar archives that + do not have the standard extensions. You can also "Save As" into + a file with no extension provided the original is rar, lha or ar. + Zip and zoo don't like having no extension. Tar doesn't mind but + I haven't explored that tangle yet. It's complicated with all the + compressors! + * Made shell output dialog a tiny bit prettier. + +2000-06-22: Emily Ezust + * Overhaul of Directories Preferences dialog + * For Save As, ark will add proper extension if user does not have one. + +2000-06-13: Emily Ezust + * Fixed "Save As" code so that it prevents the user from saving a + zip as a tar + * Fixed bug preventing you from opening a network file after having + opened one before in the same session. + * Added a check for utilities (it will notify you e.g. that + "The utility zip is not in your PATH. Please + install it or contact your system administrator."). + * Added support for drag/adding files or drag/opening network archives + from konqy. + +2000-06-12: Emily Ezust + * Began adding network transparency + * Added a Save As option so that people can rename arks that are + temporary files + +2000-05-23: Emily Ezust + * Odds and ends: fixed problem with selecting multiple files in Add + File; added some better option enabling in the extract dialog. + +2000-05-16: Emily Ezust + * Fixed a bug in ArArch - wasn't reading TOCs properly + +2000-05-12: Emily Ezust + * Added some code to notify the user about file(s) that were not + extracted. This happens when the user disallows overwrites and + then extracts file(s) that already exist in the destination + directory. The notification happens before the extract, so that + the user can decide whether to continue or not. + * Fixed a possible memory corruption having to do with the lists passed + via the stack to unarchFile which cease to exist because unarchFile + returns before the job is done. + +2000-05-04: Emily Ezust + * Added control/shift LMB selection rules + * Added code to allow drag/extract but it doesn't work yet. Commented + it out. Not too sure about when to start the drag anyhow... have to + extract first! + * Added an "Edit With" option to let you edit files in the archive. + It would be too complicated to let the user edit more than one + file at a time, so like view, this freezes the app until the user + quits the editor. + + It even works with files that have paths! (I think - haven't + tested thoroughly) + +2000-04-27: Emily Ezust + * Got rid of a segfault that occured whenever you closed an archive + (I was deleting something that the statusbar needed (but had not + needed before KStatusBar was adopted by QStatusBar!)) + * Added code to let users drag files to extract them. Not working + yet: when I drag to konqy, it requests a filename for + clipboard content. + +2000-04-18: Emily Ezust + * Added some code to prevent tar from adding duplicate filenames + (having duplicates really screws up deletion and particular extracts) + * More archive-specific options (for all types: update only with + newer files; tar: keep absolute paths; zip, rar: store file as + symlinks (although my version of rar doesn't seem to know how + to extract a symlink??) + +2000-04-06: Emily Ezust + * Switched to KListView + * Some work on settings and archive-specific actions + * Couldn't load LHA archives with files that were symlinks; fixed + * Added more entries to the Settings and RMB menu. Toggle menu bar will + display help in the titlebar for getting the menubar back (just as + konsole does) + * Seems I need a KFileOpenWithHandler for OpenWith now... + * Moved archive column header strings from archive classes to the base + class header file on Francois-Xavier Duranceau's suggestion. + +2000-04-03: Emily Ezust + * Struggling with the Recent Files popup (fixed next day with help of + Kurt Granroth) + * Ar had a problem with some of my files; fixed + * ArkWidget destructor was never being called; fixed + +2000-03-29: Emily Ezust + * Extra GUI tweaks + * Fixed faulty drop/add into compressed file (if you chose to create a + real archive, it didn't actually add the files, just the compressed + file). + +2000-03-23: Emily Ezust + * Began migration to the XML-GUI framework. RMB menus disabled for + the moment... + +2000-03-20: Emily Ezust + * Fixed up Ar format. + +2000-03-20: Emily Ezust + * Added Rar format. Added disabling of buttons and menu entries during + operations + +2000-03-16: Emily Ezust + * Added Zoo format + +2000-03-15: Emily Ezust + * Added the class CompressedFile to the hierarchy. This + allows ark to be used to view, create, and extract compressed files. + The user will be asked if he/she wants to create a real archive if + she/he tries to add a file to the thing when there's already + a file in there. + * Added an Open With option (RMB and Action menu) + * Made use of statusbar improvements + * Made the time and date stamp in LHA sortable + +2000-03-09: Emily Ezust + * Fixed TarArch so that it warns the user before deleting the + contents of a directory. (Delete a directory entry in tar and + tar deletes everything in it, unlike zip & lha!!) + * Finished TarArch so that extract and view work. + * Added LHA format + * Simplified the Arch API a little (got rid of useless return values) + +2000-03-06: Emily Ezust + * Fixed TarArch so that the other compressors work + * Dealt with readonly archives (if the user views an archive from + within an archive, it is extracted to the /tmp directory, so all + changes will be lost.) + +2000-03-06: Emily Ezust + * Got rid of KProcess data member in Arch - no need for it with the + new way that KProcess does its work: we are always passing it + around to the functions that need it. This way we won't get + confused when there are more than one processes happening. + * Made tar more asynchronous, redid the temp file creation & updating. + +2000-03-03: Emily Ezust + * Made zip fully asynchronous. + +2000-03-02: Emily Ezust + * add and delete now work for tar files, although I'll probably + change how temp files are created from compressed tars and + how they are used to update the original archive... + Note: ark uses KTar for display and shell process for everything + else. + * Reduced the number of calls of slotSelectionChanged + * OK, _now_ I'm done with the enable/disable stuff - I swear! + * Other miscellaneous abstractions with zip->arch code + +2000-02-24: Emily Ezust + * Got showFile interface working (see zip) + * Started using KTar in tar. Seems to display OK. + No other functionality yet for tar. + +2000-02-22: Emily Ezust + * More work on the abstract base class for archives - moved lots of + slots dealing with the KProcess from zip.cpp to arch.cpp + * Some work on tar. Doesn't work yet. + +2000-02-16: Emily Ezust + * More consistent disabling/enabling of menu items and toolbar buttons. + * Added "add directory" - might need some more tweaking in zip so it + doesn't flatten the files out. + +2000-02-15: Emily Ezust + * Added drop support. Doesn't seem to work with directories though. + * Toolbar icons stopped working briefly - renamed them to ensure no + ambiguity. + +2000-02-14: Emily Ezust + * Separated GUI and backend in zip, which will be the model + for the other formats once it's just-right. Next I'll make sure + drag and drop works. + +2000-02-09: Emily Ezust + * Finally have Add and Extract working for zip + +2000-02-07: Emily Ezust + * new locking scheme to prevent users from opening the same archive + in two different windows. Handles symlinks. But I can't figure out + why raise() alone doesn't do it - I hide and show the window + instead - blech! + * made classes more const correct + * add dialog still doesn't work. Problem with KFileView? + +2000-01-18: Emily Ezust + * KUniqueApplication stuff was enabled by waba, with KCmdLineArgs + code. Modified it to work according to Cooperating-SDI model. + * Moved windowList to ArkApplication (accessed through a static + function). ArkApplication is now modelled on the singleton pattern. + +2000-01-10: Emily Ezust + * Finished renaming ArkData to ArkSettings. + * Tried using KDialogBase for Add dialog - not working too well. + +2000-01-6: Emily Ezust + * Disabled KUniqueApplication stuff for now... was interfering with + development with crashes. Will add later. + * Asks "Are you sure?" when you try to "New" over an existing zip + * Began work on new extract dialog - old one doesn't work any longer + due to kdelibs changes. Doesn't do anything yet - just trying out + for look&feel with error-checking. + Idea of extract: highlight the ones to be extracted and then + let the right archiver grab all the highlighted files (or current). + + +1999-12-16 Emily Ezust + * created ArkApplication : public KUniqueApplication + * Code now to follow the Co-operating SDI model. + * Some problems with dcop still... exiting the last window doesn't + get you back the prompt! + +1999-12-13 Emily Ezust + * fixed up icons, continued with merge: enabling toolbar buttons + and menu items. Close enables don't work yet... + * Fixed status bar totals for selection, number and size. + +1999-12-09 Emily Ezust + * started merge with Corel Linux code. + * added toolbar icons (with two more on the way), lock files, + and fixed the sorting for numeric column data. + * added preliminary code to count number of files and total sizes + in the status bar, but it does nothing so far. + * created a new problem: action_add in zip now segfaults. + +1999-07-05 Francois-Xavier Duranceau + * added selection with regular expressions + +1999-04-11 Francois-Xavier Duranceau + + * created this file + diff --git a/ark/Makefile.am b/ark/Makefile.am new file mode 100644 index 0000000..b97b034 --- /dev/null +++ b/ark/Makefile.am @@ -0,0 +1,54 @@ +# set the include path for X, qt and KDE +AM_CPPFLAGS = -D_LARGEFILE64_SOURCE $(all_includes) + +SUBDIRS = pics + +# The binary name. Changed from kzip to ark +bin_PROGRAMS = +kdeinit_LTLIBRARIES = ark.la +lib_LTLIBRARIES = + +ark_la_SOURCES = main.cpp arkapp.cpp mainwindow.cpp +ark_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN) +ark_la_LIBADD = libark_common.la $(LIB_KPARTS) +ark_la_COMPILE_FIRST = settings.h + +noinst_LTLIBRARIES = libark_common.la + +libark_common_la_SOURCES = settings.kcfgc archiveformatinfo.cpp +libark_common_la_LDFLAGS = $(all_libraries) -no-undefined +libark_common_la_LIBADD = $(LIB_KFILE) + +kde_module_LTLIBRARIES = libarkpart.la +libarkpart_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) +libarkpart_la_LIBADD = libark_common.la $(LIB_KPARTS) +libarkpart_la_COMPILE_FIRST = settings.h + +libarkpart_la_SOURCES = ark_part.cpp arkfactory.cpp zip.cpp tar.cpp \ + filelistview.cpp arch.cpp lha.cpp \ + compressedfile.cpp zoo.cpp rar.cpp \ + ar.cpp arkutils.cpp archiveformatdlg.cpp \ + arkwidget.cpp searchbar.cpp \ + addition.ui extraction.ui general.ui \ + arkviewer.cpp sevenzip.cpp extractiondialog.cpp \ + ace.cpp tarlistingthread.cpp + +METASOURCES = AUTO + +rcdir = $(kde_datadir)/ark +rc_DATA = arkui.rc ark_part.rc ark_part_readonly.rc + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/ark.pot + +KDE_ICON = ark + +xdg_apps_DATA = ark.desktop +kde_kcfg_DATA = ark.kcfg + +parts_DATA = ark_part.desktop +partsdir = $(kde_servicesdir) + +#konqservice_DATA = arkservicemenu.desktop ark_directory_service.desktop +#konqservicedir = $(kde_datadir)/konqueror/servicemenus + diff --git a/ark/README b/ark/README new file mode 100644 index 0000000..156c2bb --- /dev/null +++ b/ark/README @@ -0,0 +1,4 @@ +This is Ark version 2.3.x. + +Ark is KDE archive handling tool, part of the kdeutils package. + diff --git a/ark/TODO b/ark/TODO new file mode 100644 index 0000000..cc3d455 --- /dev/null +++ b/ark/TODO @@ -0,0 +1,11 @@ +TODO +----- + +Feature-wise: +- Rename option +- Behavior-compatibility with the Konqueror filemanager + +For KDE 4.0: +- Use KArchive to handle archives +- Add support for split files +- Add support for more archive formats (ace, iso, rpm) diff --git a/ark/ace.cpp b/ark/ace.cpp new file mode 100644 index 0000000..d9cce52 --- /dev/null +++ b/ark/ace.cpp @@ -0,0 +1,181 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2005: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ace.h" +#include "arkwidget.h" +#include "settings.h" + +AceArch::AceArch( ArkWidget *gui, const QString &filename ) + : Arch( gui, filename ) +{ + //m_archiver_program = m_unarchiver_program = "/usr/local/bin/unace"; + m_archiver_program = m_unarchiver_program = "/home/henrique/ArkTest/teste.sh"; + verifyCompressUtilityIsAvailable( m_archiver_program ); + + m_headerString = "Date ³Time ³Packed ³Size ³Ratio³File"; + + m_repairYear = 5; m_fixMonth = 6; m_fixDay = 7; m_fixTime = 8; + m_dateCol = 3; + m_numCols = 5; + + m_archCols.append( new ArchColumns( 7, QRegExp( "[0-3][0-9]" ), 2 ) ); // Day + m_archCols.append( new ArchColumns( 6, QRegExp( "[01][0-9]" ), 2 ) ); // Month + m_archCols.append( new ArchColumns( 5, QRegExp( "[0-9][0-9]" ), 4 ) ); // Year + m_archCols.append( new ArchColumns( 8, QRegExp( "[0-9:]+" ), 8 ) ); // Time + m_archCols.append( new ArchColumns( 2, QRegExp( "[0-9]+" ) ) ); // Compressed Size + m_archCols.append( new ArchColumns( 1, QRegExp( "[0-9]+" ) ) ); // Size + m_archCols.append( new ArchColumns( 9, QRegExp( "[0-9][0-9]%" ) ) ); // Ratio + m_archCols.append( new ArchColumns( 0, QRegExp( "[^\\n]+" ), 4096 ) ); // Name +} + +AceArch::~AceArch() +{ +} + +void AceArch::setHeaders() +{ + ColumnList list; + list.append( FILENAME_COLUMN ); + list.append( SIZE_COLUMN ); + list.append( PACKED_COLUMN ); + list.append( TIMESTAMP_COLUMN ); + + emit headers( list ); +} + +void AceArch::open() +{ + kdDebug(1601) << "+AceArch::open()" << endl; + setHeaders(); + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_archiver_program << "v" << m_filename; + //kp->setUseShell( true ); + + kdDebug() << "AceArch::open(): kp->args(): " << kp->args() << endl; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedTOC(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotOpenExited(KProcess*) ) ); + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + this, SLOT( catchMeIfYouCan(KProcess*, char*, int) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigOpen( this, false, QString::null, 0 ); + } +} + +void AceArch::create() +{ + emit sigCreate( this, true, m_filename, + Arch::Extract | Arch::View ); +} + +void AceArch::addFile( const QStringList & urls ) +{ +} + +void AceArch::addDir( const QString & dirName ) +{ +} + +void AceArch::remove( QStringList *list ) +{ +} + +void AceArch::unarchFileInternal( ) +{ + if ( m_destDir.isEmpty() || m_destDir.isNull() ) + { + kdError( 1601 ) << "There was no extract directory given." << endl; + return; + } + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + // extract (and maybe overwrite) + *kp << m_unarchiver_program << "x" << "-y"; + + if ( ArkSettings::extractOverwrite() ) + { + *kp << "-o"; + } + + *kp << m_filename; + + *kp << m_destDir ; + + // if the file list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if ( m_fileList ) + { + QStringList::Iterator it; + for ( it = m_fileList->begin(); it != m_fileList->end(); ++it ) + { + *kp << (*it); + } + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotExtractExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigExtract( false ); + } +} + +void AceArch::catchMeIfYouCan( KProcess*, char *buffer, int buflen ) +{ + QString myBuf = QString::fromLatin1( buffer, buflen ); + kdDebug(1601) << " Wololo!: " << myBuf << endl; +} + +#include "ace.moc" diff --git a/ark/ace.h b/ark/ace.h new file mode 100644 index 0000000..7aed56c --- /dev/null +++ b/ark/ace.h @@ -0,0 +1,55 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2005: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARK_ACE_H +#define ARK_ACE_H + +#include "arch.h" + +class KProcess; // TODO: Remove me! + +class AceArch : public Arch +{ + Q_OBJECT + public: + AceArch( ArkWidget *, const QString & ); + virtual ~AceArch(); + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + + virtual void remove( QStringList * ); + virtual void unarchFileInternal( ); + + private slots: + void catchMeIfYouCan( KProcess*, char*, int ); + + private: + void setHeaders(); +}; + +#endif // ARK_ACE_H diff --git a/ark/addition.ui b/ark/addition.ui new file mode 100644 index 0000000..a8f51d8 --- /dev/null +++ b/ark/addition.ui @@ -0,0 +1,79 @@ + +Addition + + + Addition + + + + 0 + 0 + 365 + 268 + + + + + unnamed + + + + kcfg_replaceOnlyWithNewer + + + Replace old files only &with newer files + + + + + kcfg_forceMSDOS + + + Force &MS-DOS short filenames (Zip) + + + + + kcfg_convertLF2CRLF + + + Translate &LF to DOS CRLF (Zip) + + + + + kcfg_rarStoreSymlinks + + + &Store symlinks as links (Zip, Rar) + + + + + kcfg_rarRecurseSubdirs + + + &Recursively add subfolders (Zip, Rar) + + + + + spacer2 + + + Vertical + + + Expanding + + + + 20 + 51 + + + + + + + diff --git a/ark/ar.cpp b/ark/ar.cpp new file mode 100644 index 0000000..71f44e0 --- /dev/null +++ b/ark/ar.cpp @@ -0,0 +1,263 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// C includes +#include +#include +#include +#include +#include + +// QT includes +#include + +// KDE includes +#include +#include +#include +#include + +// ark includes +#include "arkwidget.h" +#include "settings.h" +#include "ar.h" + +ArArch::ArArch( ArkWidget *_gui, const QString & _fileName ) + : Arch(_gui, _fileName ) +{ + m_archiver_program = m_unarchiver_program = "ar"; + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + + // Do not set headerString - there is none for Ar + m_numCols = 5; + m_dateCol = 4; m_fixYear = 8; m_repairMonth = 5; m_fixDay = 6; m_fixTime = 7; + + m_archCols.append(new ArchColumns(1, QRegExp("[a-zA-Z-]+"), 12)); // Perms + m_archCols.append(new ArchColumns(2, QRegExp("[^\\s]+"), 128)); //User/grp + m_archCols.append(new ArchColumns(3, QRegExp("[0-9]+"))); // Size + m_archCols.append(new ArchColumns(5, QRegExp("[a-zA-Z]+"), 4)); // Month + m_archCols.append(new ArchColumns(6, QRegExp("[0-9]+"), 2)); // Day + m_archCols.append(new ArchColumns(7, QRegExp("[0-9:]+"), 6)); // Time + m_archCols.append(new ArchColumns(8, QRegExp("[0-9]+"), 5)); // Year + m_archCols.append(new ArchColumns(0, QRegExp("[^\\s][^\\n]+"), 4096));// File + + kdDebug(1601) << "ArArch constructor" << endl; +} + +void ArArch::setHeaders() +{ + ColumnList list; + list.append( FILENAME_COLUMN ); + list.append( PERMISSION_COLUMN ); + list.append( OWNER_GROUP_COLUMN ); + list.append( SIZE_COLUMN ); + list.append( TIMESTAMP_COLUMN ); + + emit headers( list ); +} + +void ArArch::open() +{ + kdDebug(1601) << "+ArArch::open" << endl; + setHeaders(); + + m_buffer = ""; + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_archiver_program << "vt" << m_filename; + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedTOC(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotOpenExited(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigOpen(this, false, QString::null, 0 ); + } + kdDebug(1601) << "-ArArch::open" << endl; +} + +void ArArch::create() +{ + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + *kp << m_archiver_program << "c" << m_filename; + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + if (kp->start(KProcess::Block) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigCreate(this, false, m_filename, + Arch::Extract | Arch::Delete | Arch::Add + | Arch::View); + } + else + emit sigCreate(this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add + | Arch::View); +} + +void ArArch::addFile( const QStringList &urls ) +{ + kdDebug(1601) << "+ArArch::addFile" << endl; + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + *kp << m_archiver_program; + + if (ArkSettings::replaceOnlyWithNewer()) + *kp << "ru"; + else + *kp << "r"; + + *kp << m_filename; + + QStringList::ConstIterator iter; + KURL url( urls.first() ); + QDir::setCurrent( url.directory() ); + for (iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL fileURL( *iter ); + *kp << fileURL.fileName(); + } + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotAddExited(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigAdd(false); + } + + kdDebug(1601) << "-ArArch::addFile" << endl; +} + +void ArArch::unarchFileInternal() +{ + // if m_fileList is empty, we extract all. + // if m_destDir is empty, abort with error. + + kdDebug(1601) << "+ArArch::unarchFile" << endl; + QString dest; + + if (m_destDir.isEmpty() || m_destDir.isNull()) + { + kdError(1601) << "There was no extract directory given." << endl; + return; + } + else dest = m_destDir; + + // ar has no option to specify the destination directory + // so I have to change to it. + + bool ret = QDir::setCurrent(dest); + // I already checked the validity of the dir before coming here + Q_ASSERT(ret); + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program; + *kp << "vx"; + *kp << m_filename; + + // if the list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if (m_fileList) + { + for ( QStringList::Iterator it = m_fileList->begin(); + it != m_fileList->end(); ++it ) + { + *kp << (*it); + } + } + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotExtractExited(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigExtract(false); + } +} + +void ArArch::remove(QStringList *list) +{ + kdDebug(1601) << "+ArArch::remove" << endl; + + if (!list) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "d" << m_filename; + for ( QStringList::Iterator it = list->begin(); + it != list->end(); ++it ) + { + QString str = *it; + *kp << str; + } + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotDeleteExited(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigDelete(false); + } + + kdDebug(1601) << "-ArArch::remove" << endl; +} + + +#include "ar.moc" diff --git a/ark/ar.h b/ark/ar.h new file mode 100644 index 0000000..1a5f00f --- /dev/null +++ b/ark/ar.h @@ -0,0 +1,61 @@ +// -*-C++-*- emacs magic for .h files +/* + + $Id$ + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARARCH_H +#define ARARCH_H + +class QString; +class QCString; +class QStringList; + +class Arch; +class ArkWidget; + +class ArArch : public Arch +{ + Q_OBJECT +public: + ArArch( ArkWidget *_gui, + const QString & _fileName ); + virtual ~ArArch() {} + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir(const QString &) {} // never gets called + + virtual void remove(QStringList *); + virtual void unarchFileInternal(); + +private: + void setHeaders(); +}; + +#endif /* ARARCH_H */ diff --git a/ark/arch.cpp b/ark/arch.cpp new file mode 100644 index 0000000..8ff6a2b --- /dev/null +++ b/ark/arch.cpp @@ -0,0 +1,403 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2002: Helio Chissini de Castro + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1997-1999: Rob Palmbos palm9744@kettering.edu + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// C includes +#include +#include + +// QT includes +#include +#include + +// KDE includes +#include +#include +#include +#include +#include +#include +#include + +// ark includes +#include "arch.h" +#include "arkwidget.h" +#include "arkutils.h" +#include "filelistview.h" + +// the archive types +#include "tar.h" +#include "zip.h" +#include "lha.h" +#include "compressedfile.h" +#include "zoo.h" +#include "rar.h" +#include "ar.h" +#include "sevenzip.h" +#include "ace.h" + +Arch::ArchColumns::ArchColumns( int col, QRegExp reg, int length, bool opt ) + : colRef( col ), pattern( reg ), maxLength( length ), optional( opt ) +{ +} + +Arch::Arch( ArkWidget *gui, const QString &filename ) + : m_filename( filename ), m_buffer( "" ), m_gui( gui ), + m_bReadOnly( false ), m_bNotifyWhenDeleteFails( true ), + m_header_removed( false ), m_finished( false ), + m_numCols( 0 ), m_dateCol( -1 ), m_fixYear( -1 ), m_fixMonth( -1 ), + m_fixDay( -1 ), m_fixTime( -1 ), m_repairYear( -1 ), m_repairMonth( -1 ), + m_repairTime( -1 ), m_currentProcess( 0 ) +{ + m_archCols.setAutoDelete( true ); // To check: it still leaky here??? +} + +Arch::~Arch() +{ + if ( m_currentProcess ) + m_currentProcess->kill(); +} + +//Check if a compress utility exists +void Arch::verifyCompressUtilityIsAvailable( const QString &utility ) +{ + // see if the utility is in the PATH of the user. + QString cmd = KGlobal::dirs()->findExe( utility ); + m_bArchUtilityIsAvailable = !cmd.isEmpty(); +} + +//Check if a utility can uncompress files +void Arch::verifyUncompressUtilityIsAvailable( const QString &utility ) +{ + // see if the utility is in the PATH of the user. + QString cmd = KGlobal::dirs()->findExe( utility ); + m_bUnarchUtilityIsAvailable = !cmd.isEmpty(); +} + +void Arch::slotOpenExited( KProcess* _kp ) +{ + int exitStatus = 100; // arbitrary bad exit status + + if ( _kp->normalExit() ) + exitStatus = _kp->exitStatus(); + + if ( exitStatus == 1 ) + { + exitStatus = 0; // because 1 means empty archive - not an error. + // Is this a safe assumption? + } + + if ( !exitStatus ) + emit sigOpen( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); + else + emit sigOpen( this, false, QString::null, 0 ); + + delete _kp; + _kp = m_currentProcess = 0; +} + +void Arch::slotDeleteExited( KProcess *_kp ) +{ + bool success = ( _kp->normalExit() && ( _kp->exitStatus() == 0 ) ); + + if ( !success ) + { + QApplication::restoreOverrideCursor(); + + QString msg = i18n( "The deletion operation failed." ); + + if ( !getLastShellOutput().isNull() ) + { + QStringList list = QStringList::split( "\n", getLastShellOutput() ); + KMessageBox::errorList( m_gui, msg, list ); + clearShellOutput(); + } + else + { + KMessageBox::error( m_gui, msg ); + } + } + + emit sigDelete( success ); + delete _kp; + _kp = m_currentProcess = 0; +} + +void Arch::slotExtractExited( KProcess *_kp ) +{ + bool success = ( _kp->normalExit() && ( _kp->exitStatus() == 0 ) ); + + if( !success ) + { + if ( passwordRequired() ) + { + QString msg; + if ( !m_password.isEmpty() ) + msg = i18n("The password was incorrect. "); + if (KPasswordDialog::getPassword( m_password, msg+i18n("You must enter a password to extract the file:") ) == KPasswordDialog::Accepted ) + { + delete _kp; + _kp = m_currentProcess = 0; + clearShellOutput(); + unarchFileInternal(); // try to extract the file again with a password + return; + } + m_password = ""; + emit sigExtract( false ); + delete _kp; + _kp = m_currentProcess = 0; + return; + } + else if ( m_password.isEmpty() || _kp->exitStatus() > 1 ) + { + QApplication::restoreOverrideCursor(); + + QString msg = i18n( "The extraction operation failed." ); + + if ( !getLastShellOutput().isNull() ) + { + //getLastShellOutput() is a QString. errorList is expecting QStringLists to show in multiple lines + QStringList list = QStringList::split( "\n", getLastShellOutput() ); + KMessageBox::errorList( m_gui, msg, list ); + clearShellOutput(); + } + else + { + KMessageBox::error( m_gui, msg ); + } + } + } + m_password = ""; + delete _kp; + _kp = m_currentProcess = 0; + emit sigExtract( success ); +} + +void Arch::unarchFile( QStringList *fileList, const QString & destDir, + bool viewFriendly ) +{ + m_fileList = fileList; + m_destDir = destDir; + m_viewFriendly = viewFriendly; + unarchFileInternal(); +} + +void Arch::slotAddExited( KProcess *_kp ) +{ + bool success = ( _kp->normalExit() && ( _kp->exitStatus() == 0 ) ); + + if( !success ) + { + QApplication::restoreOverrideCursor(); + + QString msg = i18n( "The addition operation failed." ); + + if ( !getLastShellOutput().isNull() ) + { + QStringList list = QStringList::split( "\n", getLastShellOutput() ); + KMessageBox::errorList( m_gui, msg, list ); + clearShellOutput(); + } + else + { + KMessageBox::error( m_gui, msg ); + } + } + + emit sigAdd( success ); + delete _kp; + _kp = m_currentProcess = 0; +} + +void Arch::slotReceivedOutput( KProcess*, char* data, int length ) +{ + char c = data[ length ]; + data[ length ] = '\0'; + + appendShellOutputData( data ); + data[ length ] = c; +} + + +void Arch::slotReceivedTOC( KProcess*, char* data, int length ) +{ + char c = data[ length ]; + data[ length ] = '\0'; + + appendShellOutputData( data ); + + int lfChar, startChar = 0; + + while ( !m_finished ) + { + for ( lfChar = startChar; data[ lfChar ] != '\n' && lfChar < length; + lfChar++ ); + + if ( data[ lfChar ] != '\n') + break; // We are done all the complete lines + + data[ lfChar ] = '\0'; + m_buffer.append( data + startChar ); + data[ lfChar ] = '\n'; + startChar = lfChar + 1; + + if ( m_headerString.isEmpty() ) + { + processLine( m_buffer ); + } + else if ( m_buffer.find( m_headerString ) == -1 ) + { + if ( m_header_removed && !m_finished ) + { + if ( !processLine( m_buffer ) ) + { + // Have faith - maybe it wasn't a header? + m_header_removed = false; + m_error = true; + } + } + } + else if ( !m_header_removed ) + { + m_header_removed = true; + } + else + { + m_finished = true; + } + + m_buffer = ""; + } + + if ( !m_finished ) + m_buffer.append( data + startChar); // Append what's left of the buffer + + data[ length ] = c; +} + +bool Arch::processLine( const QCString &line ) +{ + QString columns[ 11 ]; + unsigned int pos = 0; + int strpos, len; + + // Go through our columns, try to pick out data, return silently on failure + for ( QPtrListIterator col( m_archCols ); col.current(); ++col ) + { + ArchColumns *curCol = *col; + + strpos = curCol->pattern.search( line, pos ); + len = curCol->pattern.matchedLength(); + + if ( ( strpos == -1 ) || ( len > curCol->maxLength ) ) + { + if ( curCol->optional ) + continue; // More? + else + { + kdDebug(1601) << "processLine failed to match critical column" << endl; + return false; + } + } + + pos = strpos + len; + + columns[curCol->colRef] = QString::fromLocal8Bit( line.mid(strpos, len) ); + } + + + if ( m_dateCol >= 0 ) + { + QString year = ( m_repairYear >= 0 ) ? + ArkUtils::fixYear( columns[ m_repairYear ].ascii()) + : columns[ m_fixYear ]; + QString month = ( m_repairMonth >= 0 ) ? + QString( "%1" ) + .arg( ArkUtils::getMonth( columns[ m_repairMonth ].ascii() ) ) + : columns[ m_fixMonth ]; + QString timestamp = QString::fromLatin1( "%1-%2-%3 %4" ) + .arg( year ) + .arg( month ) + .arg( columns[ m_fixDay ] ) + .arg( columns[ m_fixTime ] ); + + columns[ m_dateCol ] = timestamp; + } + + QStringList list; + + for ( int i = 0; i < m_numCols; ++i ) + { + list.append( columns[ i ] ); + } + + m_gui->fileList()->addItem( list ); // send the entry to the GUI + + return true; +} + + +Arch *Arch::archFactory( ArchType aType, + ArkWidget *parent, const QString &filename, + const QString &openAsMimeType ) +{ + switch( aType ) + { + case TAR_FORMAT: + return new TarArch( parent, filename, openAsMimeType ); + + case ZIP_FORMAT: + return new ZipArch( parent, filename ); + + case LHA_FORMAT: + return new LhaArch( parent, filename ); + + case COMPRESSED_FORMAT: + return new CompressedFile( parent, filename, openAsMimeType ); + + case ZOO_FORMAT: + return new ZooArch( parent, filename ); + + case RAR_FORMAT: + return new RarArch( parent, filename ); + + case AA_FORMAT: + return new ArArch( parent, filename ); + + case SEVENZIP_FORMAT: + return new SevenZipArch( parent, filename ); + + case ACE_FORMAT: + return new AceArch( parent, filename ); + + case UNKNOWN_FORMAT: + default: + return 0; + } +} +#include "arch.moc" diff --git a/ark/arch.h b/ark/arch.h new file mode 100644 index 0000000..1a38a2c --- /dev/null +++ b/ark/arch.h @@ -0,0 +1,221 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* The following class is the base class for all of the archive types. + * In order for it to work properly with the KProcess, you have to + * connect the ProcessExited signal appropriately before spawning + * the core operations. Then the signal that the process exited can + * be intercepted by the viewer (in ark, ArkWidget) and dealt with + * appropriately. See LhaArch or ZipArch for a good model. Don't use + * TarArch or CompressedFile as models - they're too complicated! + * + * Don't forget to set m_archiver_program and m_unarchiver_program + * and add a call to + * verifyUtilityIsAvailable(m_archiver_program, m_unarchiver_program); + * in the constructor of your class. It's OK to leave out the second argument. + * + * To add a new archive type: + * 1. Create a new header file and a source code module + * 2. Add an entry to the ArchType enum in arch.h. + * 3. Add appropriate types to buildFormatInfo() in archiveformatinfo.cpp + * and archFactory() in arch.cpp + */ + + +#ifndef ARCH_H +#define ARCH_H + +#include +#include // Some very annoying hackery in arkwidgetpart +#include +#include +#include +#include + +class QCString; +class QStringList; +class KProcess; + +class FileListView; +class ArkWidget; + +enum ArchType { UNKNOWN_FORMAT, ZIP_FORMAT, TAR_FORMAT, AA_FORMAT, + LHA_FORMAT, RAR_FORMAT, ZOO_FORMAT, COMPRESSED_FORMAT, + SEVENZIP_FORMAT, ACE_FORMAT }; + +typedef QValueList< QPair< QString, Qt::AlignmentFlags > > ColumnList; + +/** + * Pure virtual base class for archives - provides a framework as well as + * useful common functionality. + */ +class Arch : public QObject +{ + Q_OBJECT + + protected: + /** + * A struct representing column data. This makes it possible to abstract + * archive output, and save writing the same function for every archive + * type. It is also much more robust than sscanf (which was breaking). + */ + struct ArchColumns + { + int colRef; // Which column to load to in processLine + QRegExp pattern; + int maxLength; + bool optional; + + ArchColumns( int col, QRegExp reg, int length = 64, bool opt = false ); + }; + + public: + Arch( ArkWidget *_viewer, const QString & _fileName ); + virtual ~Arch(); + + virtual void open() = 0; + virtual void create() = 0; + virtual void remove( QStringList * ) = 0; + + virtual void addFile( const QStringList & ) = 0; + virtual void addDir( const QString & ) = 0; + + // unarch the files in m_fileList or all files if m_fileList is empty. + // if m_destDir is empty, abort with error. + // m_viewFriendly forces certain options like directory junking required by view/edit + virtual void unarchFileInternal() = 0; + // returns true if a password is required + virtual bool passwordRequired() { return false; } + + void unarchFile( QStringList *, const QString & _destDir, + bool viewFriendly = false ); + + QString fileName() const { return m_filename; } + + enum EditProperties{ Add = 1, Delete = 2, Extract = 4, + View = 8, Integrity = 16 }; + + // is the archive readonly? + bool isReadOnly() { return m_bReadOnly; } + void setReadOnly( bool bVal ) { m_bReadOnly = bVal; } + + bool isError() { return m_error; } + void resetError() { m_error = false; } + + // check to see if the utility exists in the PATH of the user + void verifyUtilityIsAvailable( const QString &, + const QString & = QString::null ); + + void verifyCompressUtilityIsAvailable( const QString &utility ); + + void verifyUncompressUtilityIsAvailable( const QString &utility ); + + bool archUtilityIsAvailable() { return m_bArchUtilityIsAvailable; } + + bool unarchUtilityIsAvailable() { return m_bUnarchUtilityIsAvailable; } + + QString getArchUtility() { return m_archiver_program; } + + QString getUnarchUtility() { return m_unarchiver_program; } + + void appendShellOutputData( const char * data ) { m_lastShellOutput.append( QString::fromLocal8Bit( data ) ); } + void clearShellOutput() { m_lastShellOutput.truncate( 0 ); } + const QString& getLastShellOutput() const { return m_lastShellOutput; } + + static Arch *archFactory( ArchType aType, ArkWidget *parent, + const QString &filename, + const QString &openAsMimeType = QString::null ); + + protected slots: + void slotOpenExited( KProcess* ); + void slotExtractExited( KProcess* ); + void slotDeleteExited( KProcess* ); + void slotAddExited( KProcess* ); + + void slotReceivedOutput( KProcess *, char*, int ); + + virtual bool processLine( const QCString &line ); + virtual void slotReceivedTOC( KProcess *, char *, int ); + + signals: + void sigOpen( Arch * archive, bool success, const QString &filename, int ); + void sigCreate( Arch *, bool, const QString &, int ); + void sigDelete( bool ); + void sigExtract( bool ); + void sigAdd( bool ); + void headers( const ColumnList& columns ); + + protected: // data + QString m_filename; + QString m_lastShellOutput; + QCString m_buffer; + ArkWidget *m_gui; + bool m_bReadOnly; // for readonly archives + bool m_error; + + // lets tar delete unsuccessfully before adding without confusing the user + bool m_bNotifyWhenDeleteFails; + + // set to whether if the compressing utility is in the user's PATH + bool m_bArchUtilityIsAvailable; + + // set to whether if the uncompressing utility is in the user's PATH + bool m_bUnarchUtilityIsAvailable; + + QString m_archiver_program; + QString m_unarchiver_program; + + // Archive parsing information + QCString m_headerString; + bool m_header_removed, m_finished; + QPtrList m_archCols; + int m_numCols, m_dateCol, m_fixYear, m_fixMonth, m_fixDay, m_fixTime; + int m_repairYear, m_repairMonth, m_repairTime; + KProcess *m_currentProcess; + QStringList *m_fileList; + QString m_destDir; + bool m_viewFriendly; + QCString m_password; +}; + +// Columns +// don't forget to change common_texts.cpp if you change something here +#define FILENAME_COLUMN qMakePair( i18n(" Filename "), Qt::AlignLeft ) +#define PERMISSION_COLUMN qMakePair( i18n(" Permissions "), Qt::AlignLeft ) +#define OWNER_GROUP_COLUMN qMakePair( i18n(" Owner/Group "), Qt::AlignLeft ) +#define SIZE_COLUMN qMakePair( i18n(" Size "), Qt::AlignRight ) +#define TIMESTAMP_COLUMN qMakePair( i18n(" Timestamp "), Qt::AlignRight ) +#define LINK_COLUMN qMakePair( i18n(" Link "), Qt::AlignLeft ) +#define PACKED_COLUMN qMakePair( i18n(" Size Now "), Qt::AlignRight ) +#define RATIO_COLUMN qMakePair( i18n(" Ratio "), Qt::AlignRight ) +#define CRC_COLUMN qMakePair( i18n("Cyclic Redundancy Check"," CRC "), Qt::AlignLeft ) +#define METHOD_COLUMN qMakePair( i18n(" Method "), Qt::AlignLeft ) +#define VERSION_COLUMN qMakePair( i18n(" Version "), Qt::AlignLeft ) +#define OWNER_COLUMN qMakePair( i18n(" Owner "), Qt::AlignLeft ) +#define GROUP_COLUMN qMakePair( i18n(" Group "), Qt::AlignLeft ) + +#endif /* ARCH_H */ diff --git a/ark/archiveformatdlg.cpp b/ark/archiveformatdlg.cpp new file mode 100644 index 0000000..be046fb --- /dev/null +++ b/ark/archiveformatdlg.cpp @@ -0,0 +1,71 @@ +/* + ark -- archiver for the KDE project + + Copyright (C) 2003: Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include "archiveformatdlg.h" +#include "archiveformatinfo.h" +#include "arch.h" + +#include + +#include +#include + +ArchiveFormatDlg::ArchiveFormatDlg( QWidget * parent, const QString & defaultType ) + :KDialogBase( parent, "archiveformatdialog", true, + i18n( "Choose Archive Format" ), + KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok), + m_combo( 0 ) +{ + QString defaultDescription = ArchiveFormatInfo::self()->descriptionForMimeType( defaultType ); + QString text; + if ( defaultDescription.isNull() ) + text = i18n( "This file appears to be of type %1,\n" + "which is not a supported archive format.\n" + "In order to proceed, please choose the format\n" + "of the file." ).arg( defaultType ); + else + text = i18n( "You are about to open a file that has a non-standard extension.\n" + "Ark has detected the format: %1\n" + "If this is not correct, please choose " + "the appropriate format." ).arg( defaultDescription ); + + QVBox * page = makeVBoxMainWidget(); + + QLabel * label; + label = new QLabel( text, page ); + + m_combo = new KComboBox( page ); + QStringList list = ArchiveFormatInfo::self()->allDescriptions(); + list.sort(); + m_combo->insertStringList( list ); + m_combo->setCurrentItem( list.findIndex( defaultDescription ) ); +} + +QString ArchiveFormatDlg::mimeType() +{ + if (m_combo && !m_combo->currentText().isEmpty()) + return ArchiveFormatInfo::self()->mimeTypeForDescription( m_combo->currentText() ); + else + return QString(); +} + +#include "archiveformatdlg.moc" + diff --git a/ark/archiveformatdlg.h b/ark/archiveformatdlg.h new file mode 100644 index 0000000..c8a2e46 --- /dev/null +++ b/ark/archiveformatdlg.h @@ -0,0 +1,39 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) 2003: Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef ARCHIVEFORMATDLG_H +#define ARCHIVEFORMATDLG_H + +#include +#include + +class ArchiveFormatDlg: public KDialogBase +{ + Q_OBJECT +public: + ArchiveFormatDlg( QWidget * parent, const QString & defaultType ); + QString mimeType(); + +private: + KComboBox * m_combo; +}; +#endif // ARCHIVEFORMATDLG_H + diff --git a/ark/archiveformatinfo.cpp b/ark/archiveformatinfo.cpp new file mode 100644 index 0000000..f2ac14d --- /dev/null +++ b/ark/archiveformatinfo.cpp @@ -0,0 +1,278 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) 2003 Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include "arch.h" +#include "archiveformatinfo.h" +#include "settings.h" + +#include +#include +#include +#include + +#include + +ArchiveFormatInfo * ArchiveFormatInfo::m_pSelf = 0; + +ArchiveFormatInfo::ArchiveFormatInfo() + :m_lastExtensionUnknown( false ) +{ + buildFormatInfos(); +} + +ArchiveFormatInfo * ArchiveFormatInfo::self() +{ + if ( !m_pSelf ) + m_pSelf = new ArchiveFormatInfo(); + return m_pSelf; +} + +void ArchiveFormatInfo::buildFormatInfos() +{ + addFormatInfo( TAR_FORMAT, "application/x-tgz", ".tar.gz" ); + addFormatInfo( TAR_FORMAT, "application/x-tzo", ".tar.lzo" ); + addFormatInfo( TAR_FORMAT, "application/x-tarz", ".tar.z" ); + addFormatInfo( TAR_FORMAT, "application/x-tbz", ".tar.bz2" ); + addFormatInfo( TAR_FORMAT, "application/x-tbz2", ".tar.bz2" ); + // x-tar as the last one to get its comment for all the others, too + addFormatInfo( TAR_FORMAT, "application/x-tar", ".tar" ); + + addFormatInfo( LHA_FORMAT, "application/x-lha", ".lha" ); + + addFormatInfo( ZIP_FORMAT, "application/x-jar", ".jar" ); + addFormatInfo( ZIP_FORMAT, "application/x-zip", ".zip" ); + addFormatInfo( ZIP_FORMAT, "application/x-zip-compressed", ".zip" ); + + addFormatInfo( COMPRESSED_FORMAT, "application/x-gzip", ".gz" ); + addFormatInfo( COMPRESSED_FORMAT, "application/x-bzip", ".bz" ); + addFormatInfo( COMPRESSED_FORMAT, "application/x-bzip2", ".bz2" ); + addFormatInfo( COMPRESSED_FORMAT, "application/x-lzop", ".lzo" ); + addFormatInfo( COMPRESSED_FORMAT, "application/x-compress", ".Z" ); + find( COMPRESSED_FORMAT ).description = i18n( "Compressed File" ); + + addFormatInfo( ZOO_FORMAT, "application/x-zoo", ".zoo" ); + + addFormatInfo( RAR_FORMAT, "application/x-rar", ".rar" ); + addFormatInfo( RAR_FORMAT, "application/x-rar-compressed", ".rar" ); + + addFormatInfo( AA_FORMAT, "application/x-deb", ".deb" ); + addFormatInfo( AA_FORMAT, "application/x-archive",".a" ); + + addFormatInfo( SEVENZIP_FORMAT, "application/x-7z", ".7z" ); + + if ( ArkSettings::aceSupport() ) + addFormatInfo( ACE_FORMAT, "application/x-ace", ".ace" ); +} + +void ArchiveFormatInfo::addFormatInfo( ArchType type, QString mime, QString stdExt ) +{ + FormatInfo & info = find( type ); + + KDesktopFile * desktopFile = new KDesktopFile( mime + ".desktop", true, "mime" ); + if( !desktopFile ) + kdWarning( 1601 ) << "MimeType " << mime << " seems to be missing." << endl; + KMimeType mimeType( desktopFile ); + info.mimeTypes.append( mimeType.name() ); + info.extensions += mimeType.patterns(); + info.defaultExtensions += stdExt; + info.allDescriptions.append( mimeType.comment() ); + info.description = mimeType.comment(); + + delete desktopFile; +} + + +QString ArchiveFormatInfo::filter() +{ + QStringList allExtensions; + QString filter; + InfoList::Iterator it; + for ( it = m_formatInfos.begin(); it != m_formatInfos.end(); ++it ) + { + allExtensions += (*it).extensions; + filter += "\n" + (*it).extensions.join( " " ) + '|' + (*it).description; + } + return allExtensions.join( " " ) + '|' + i18n( "All Valid Archives\n" ) + + "*|" + i18n( "All Files" ) + + filter; +} + +const QStringList ArchiveFormatInfo::supportedMimeTypes( bool includeCompressed ) +{ + QStringList list; + + InfoList::Iterator end = m_formatInfos.end(); + for ( InfoList::Iterator it = m_formatInfos.begin(); it != end; ++it ) + { + if ( includeCompressed || ( *it ).type != COMPRESSED_FORMAT ) + { + list += ( *it ).mimeTypes; + } + } + + return list; +} + +QStringList ArchiveFormatInfo::allDescriptions() +{ + QStringList descriptions; + InfoList::Iterator it; + for ( it = m_formatInfos.begin(); it != m_formatInfos.end(); ++it ) + descriptions += (*it).allDescriptions; + return descriptions; +} + +ArchiveFormatInfo::FormatInfo & ArchiveFormatInfo::find( ArchType type ) +{ + InfoList::Iterator it = m_formatInfos.begin(); + for( ; it != m_formatInfos.end(); ++it ) + if( (*it).type == type ) + return (*it); + + FormatInfo info; + info.type = type; + return ( *m_formatInfos.append( info ) ); +} + +ArchType ArchiveFormatInfo::archTypeByExtension( const QString & archname ) +{ + InfoList::Iterator it = m_formatInfos.begin(); + QStringList::Iterator ext; + for( ; it != m_formatInfos.end(); ++it ) + { + ext = (*it).extensions.begin(); + for( ; ext != (*it).extensions.end(); ++ext ) + if( archname.endsWith( (*ext).remove( '*' ) ) ) + return (*it).type; + } + return UNKNOWN_FORMAT; +} + +ArchType ArchiveFormatInfo::archTypeForMimeType( const QString & mimeType ) +{ + InfoList::Iterator it = m_formatInfos.begin(); + for( ; it != m_formatInfos.end(); ++it ) + { + int index = (*it).mimeTypes.findIndex( mimeType ); + if( index != -1 ) + return (*it).type; + } + return UNKNOWN_FORMAT; +} + +ArchType ArchiveFormatInfo::archTypeForURL( const KURL & url ) +{ + m_lastExtensionUnknown = false; + + if( url.isEmpty() ) + return UNKNOWN_FORMAT; + + if( !QFile::exists( url.path() ) ) + return archTypeByExtension( url.path() ); + + QString mimeType = KMimeType::findByURL( url, 0, true, true )->name(); + kdDebug( 1601 ) << "find by url: " << mimeType << endl; + if( mimeType == KMimeType::defaultMimeType() ) + { + m_lastExtensionUnknown = true; + mimeType = KMimeType::findByFileContent( url.path() )->name(); + } + + ArchType archType = archTypeForMimeType( mimeType ); + if ( archType == UNKNOWN_FORMAT ) + m_lastExtensionUnknown = true; + + return archType; +} + + +QString ArchiveFormatInfo::findMimeType( const KURL & url ) +{ + QString mimeType = KMimeType::findByURL( url )->name(); + if ( mimeType != "application/x-bzip2" && mimeType != "application/x-gzip" ) + return mimeType; + + QIODevice * dev = KFilterDev::deviceForFile( url.path(), mimeType ); + if ( !dev ) + return mimeType; + + char buffer[ 0x200 ]; + + dev->open( IO_ReadOnly ); + Q_LONG n = dev->readBlock( buffer, 0x200 ); + delete dev; + + if ( n == 0x200 && buffer[0] != 0 && !strncmp(buffer + 257, "ustar", 5) ) + { + if (mimeType == "application/x-bzip2") + return "application/x-tbz"; + else + return "application/x-tgz"; + } + + return mimeType; +} + +QString ArchiveFormatInfo::mimeTypeForDescription( const QString & description ) +{ + InfoList::Iterator it = m_formatInfos.begin(); + int index; + for( ; it != m_formatInfos.end(); ++it ) + { + index = (*it).allDescriptions.findIndex( description ); + if ( index != -1 ) + return (* (*it).mimeTypes.at( index ) ); + } + return QString::null; +} + +QString ArchiveFormatInfo::descriptionForMimeType( const QString & mimeType ) +{ + InfoList::Iterator it = m_formatInfos.begin(); + int index; + for( ; it != m_formatInfos.end(); ++it ) + { + index = (*it).mimeTypes.findIndex( mimeType ); + if ( index != -1 ) + return (* (*it).allDescriptions.at( index ) ); + } + return QString::null; +} + +QString ArchiveFormatInfo::defaultExtension( const QString & mimeType ) +{ + InfoList::Iterator it = m_formatInfos.begin(); + int index; + for( ; it != m_formatInfos.end(); ++it ) + { + index = (*it).mimeTypes.findIndex( mimeType ); + if ( index != -1 ) + return (* (*it).defaultExtensions.at( index ) ); + } + return QString::null; +} + +bool ArchiveFormatInfo::wasUnknownExtension() +{ + return m_lastExtensionUnknown; +} + diff --git a/ark/archiveformatinfo.h b/ark/archiveformatinfo.h new file mode 100644 index 0000000..5682a11 --- /dev/null +++ b/ark/archiveformatinfo.h @@ -0,0 +1,73 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) 2003 Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARCHIVEFORMATINFO_H +#define ARCHIVEFORMATINFO_H + +#include "arch.h" +#include + +class ArchiveFormatInfo +{ +private: + ArchiveFormatInfo(); + +public: + static ArchiveFormatInfo * self(); + QString filter(); + const QStringList supportedMimeTypes( bool includeCompressed = true ); + QStringList allDescriptions(); + ArchType archTypeForMimeType( const QString & mimeType ); + ArchType archTypeByExtension( const QString & archname ); + ArchType archTypeForURL( const KURL & url ); + QString mimeTypeForDescription( const QString & description ); + QString findMimeType( const KURL & url ); + QString descriptionForMimeType( const QString & mimeType ); + QString defaultExtension( const QString & mimeType ); + bool wasUnknownExtension(); + +private: + void buildFormatInfos(); + void addFormatInfo( ArchType type, QString mime, QString stdExt ); + + struct FormatInfo + { + QStringList extensions; + QStringList mimeTypes; + QStringList allDescriptions; + QStringList defaultExtensions; + QString description; + enum ArchType type; + }; + + FormatInfo & find ( ArchType type ); + + typedef QValueList InfoList; + InfoList m_formatInfos; + + bool m_lastExtensionUnknown; + + static ArchiveFormatInfo * m_pSelf; +}; + +#endif // ARCHIVEFORMATINFO_H + diff --git a/ark/ark.desktop b/ark/ark.desktop new file mode 100644 index 0000000..d3615fe --- /dev/null +++ b/ark/ark.desktop @@ -0,0 +1,87 @@ +[Desktop Entry] +MimeType=application/x-gzip;application/x-lha;application/x-tar;application/x-tgz;application/x-tbz;application/x-tbz2;application/x-zip;application/zip;application/x-bzip;application/x-tzo;application/x-lzop;application/x-rar;application/x-zoo;application/x-tarz;application/x-archive;application/x-bzip2;application/x-jar;application/x-deb;application/x-ace;application/x-7z;application/x-arc;application/x-arj;application/x-compress;application/x-cpio;application/x-pak;application/x-zip-compressed +GenericName=Archiving Tool +GenericName[af]=Argiveer Program +GenericName[ar]=أداة أرشÙØ© +GenericName[bg]=Работа Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¸ +GenericName[br]=Ostilh merañ an Dielloù +GenericName[bs]=Alat za arhiviranje +GenericName[ca]=Eina d'arxivament +GenericName[cs]=ArchivaÄní nástroj +GenericName[cy]=Erfyn Archifo +GenericName[da]=Arkiveringsværktøj +GenericName[de]=Archivprogramm +GenericName[el]=ΕÏγαλείο αÏχειοθέτησης +GenericName[eo]=ArÄ¥ivilo +GenericName[es]=Archivador +GenericName[et]=Arhiivide haldamise rakendus +GenericName[eu]=Artxibaketa Tresna +GenericName[fa]=ابزار بایگانی +GenericName[fi]=Pakettienhallintatyökalu +GenericName[fr]=Outil de manipulation d'archives +GenericName[ga]=Uirlis Chartlannaithe +GenericName[he]=כלי לניהול ××¨×›×™×•× ×™× +GenericName[hi]=अभिलेख औज़ार +GenericName[hr]=Uslužni program za arhiviranje +GenericName[hu]=FájltömörítÅ‘ +GenericName[is]=Vinna með safnskrár +GenericName[it]=Strumento di archiviazione +GenericName[ja]=アーカイãƒãƒ„ール +GenericName[ka]=áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბთáƒáƒœ სáƒáƒ›áƒ£áƒ¨áƒáƒ უტილიტრ+GenericName[kk]=Ðрхивтеу құралы +GenericName[km]=ឧបករណáŸâ€‹áž”áŸážŽáŸ’ណសារ +GenericName[lt]=Archyvavimo priemonÄ— +GenericName[lv]=ArhivÄ“Å¡anas RÄ«ks +GenericName[mk]=Ðлатка за архивирање +GenericName[ms]=Alatan Pengarkiban +GenericName[mt]=Għodda tal-arkivji +GenericName[nb]=Arkiveringsverktøy +GenericName[nds]=Archivwarktüüch +GenericName[ne]=उपकरण सङà¥à¤—à¥à¤°à¤¹ गरà¥à¤¦à¥ˆ +GenericName[nl]=Archiefgereedschap +GenericName[nn]=Arkiveringsverktøy +GenericName[pa]=ਪà©à¨°à¨¾à¨²à©‡à¨– ਸੰਦ +GenericName[pl]=NarzÄ™dzie do archiwizacji +GenericName[pt]=Ferramenta de Armazenamento +GenericName[pt_BR]=Ferramenta de Arquivamento +GenericName[ro]=Utilitar de arhivare +GenericName[ru]=Ðрхиватор +GenericName[sk]=ArchivaÄný nástroj +GenericName[sl]=Orodje za ravnanje z arhivi +GenericName[sr]=Ðлат за архивирање +GenericName[sr@Latn]=Alat za arhiviranje +GenericName[sv]=Arkiveringsverktyg +GenericName[ta]=காபà¯à®ªà®• கரà¯à®µà®¿ +GenericName[tg]=ÐÑбобҳои Бойгонӣ +GenericName[th]=เครื่องมือจัดà¸à¸²à¸£à¹à¸Ÿà¹‰à¸¡à¸šà¸µà¸šà¸­à¸±à¸” +GenericName[tr]=ArÅŸivleme Aracı +GenericName[uk]=ЗаÑіб роботи з архівами +GenericName[uz]=Arxivlash vositasi +GenericName[uz@cyrillic]=Ðрхивлаш воÑитаÑи +GenericName[ven]=Tshishumiswa tsha fhethu huno vhulungelwa hone zwithu zwa kale +GenericName[vi]=Công cụ nén +GenericName[wa]=Usteye d' årtchivaedje +GenericName[xh]=Isixhobo Sokuphatha i Archive +GenericName[zh_CN]=文件压缩归档工具 +GenericName[zh_TW]=壓縮工具 +GenericName[zu]=Ithuluzi Lomqulu +Name=Ark +Name[ar]=أرك +Name[eo]=ArÄ¥ivilo +Name[hi]=आरà¥à¤• +Name[ne]=आरà¥à¤• +Name[nso]=Areka +Name[pa]=ਆਕ +Name[ta]=ஆரà¯à®•à¯ +Name[th]=อาร์ค +Exec=ark -caption "%c" %i %m %U +Icon=ark +Path= +DocPath=ark/index.html +Type=Application +Terminal=false +SwallowExec= +SwallowTitle= +X-DCOP-ServiceType=Unique +X-KDE-HasTempFileOption=true +Categories=Qt;KDE;Utility;X-KDE-Utilities-File; diff --git a/ark/ark.kcfg b/ark/ark.kcfg new file mode 100644 index 0000000..1c134a4 --- /dev/null +++ b/ark/ark.kcfg @@ -0,0 +1,90 @@ + + + + + + + + + + If this option is enabled and you add filenames that already exist in an archive, only replace the old files if the added files are newer than them + false + + + + Overwrite any files that have matching names on disk with the one from the archive + false + + + + + + Save the user, group, and permission settings on files. Use with care, as this may result in files being extracted that do not belong to any valid user on your computer + false + + + + + + Force names of files in Zip archives to the DOS 8.3 format + false + + + + false + + + + Extract all the files into the extraction folder, ignoring any folder structure in the archive. + false + + + + + + true + + + + true + + + + false + + + + false + + + + + + true + + + + Enables integration with Konqueror's context menus, letting you easily archive or unarchive files. This option will only work if you have the kdeaddons package installed. + true + + + + true + + + + tar + + + + false + + + + false + + + diff --git a/ark/ark_part.cpp b/ark/ark_part.cpp new file mode 100644 index 0000000..a574217 --- /dev/null +++ b/ark/ark_part.cpp @@ -0,0 +1,533 @@ +/* + Copyright (C) + + 2001: Macadamian Technologies Inc (author: Jian Huang, jian@macadamian.com) + 2003: Georg Robbers + 2005: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include "ark_part.h" +#include "arkfactory.h" +#include "arkwidget.h" +#include "settings.h" +#include "filelistview.h" +#include "searchbar.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +KAboutData *ArkPart::createAboutData() +{ + KAboutData *about = new KAboutData("ark", I18N_NOOP("ark"), + "1.0", + I18N_NOOP("Ark KParts Component"), + KAboutData::License_GPL, + I18N_NOOP( "(c) 1997-2003, The Various Ark Developers" )); + about->addAuthor("Robert Palmbos",0, "palm9744@kettering.edu"); + about->addAuthor("Francois-Xavier Duranceau",0, "duranceau@kde.org"); + about->addAuthor("Corel Corporation (author: Emily Ezust)",0, + "emilye@corel.com"); + about->addAuthor("Corel Corporation (author: Michael Jarrett)", 0, + "michaelj@corel.com"); + about->addAuthor("Jian Huang"); + about->addAuthor( "Roberto Teixeira", 0, "maragato@kde.org" ); + + return about; +} + + + +ArkPart::ArkPart( QWidget *parentWidget, const char * /*widgetName*/, QObject *parent, + const char *name, const QStringList &, bool readWrite ) + : KParts::ReadWritePart(parent, name) +{ + kdDebug(1601)<<"ArkPart::ArkPart"<fileList(), SLOT(selectAll()), actionCollection(), "select_all"); + + deselectAllAction = new KAction(i18n("&Unselect All"), 0, awidget->fileList(), SLOT(unselectAll()), actionCollection(), "deselect_all"); + + invertSelectionAction = new KAction(i18n("&Invert Selection"), 0, awidget->fileList(), SLOT(invertSelection()), actionCollection(), "invert_selection"); + + saveAsAction = KStdAction::saveAs(this, SLOT(file_save_as()), actionCollection()); + + //KStdAction::preferences(awidget, SLOT(showSettings()), actionCollection()); + + ( void ) new KAction( i18n( "Configure &Ark..." ), "configure" , 0, awidget, + SLOT( showSettings() ), actionCollection(), "options_configure_ark" ); + + + showSearchBar = new KToggleAction( i18n( "Show Search Bar" ), KShortcut(), actionCollection(), "options_show_search_bar" ); + showSearchBar->setCheckedState(i18n("Hide Search Bar")); + + showSearchBar->setChecked( ArkSettings::showSearchBar() ); + + connect( showSearchBar, SIGNAL( toggled( bool ) ), awidget, SLOT( slotShowSearchBarToggled( bool ) ) ); + + initialEnables(); +} + + +void ArkPart::fixEnables() +{ + bool bHaveFiles = ( awidget->getNumFilesInArchive() > 0 ); + bool bReadOnly = false; + bool bAddDirSupported = true; + QString extension; + if ( awidget->archiveType() == ZOO_FORMAT || awidget->archiveType() == AA_FORMAT + || awidget->archiveType() == COMPRESSED_FORMAT) + bAddDirSupported = false; + + if (awidget->archive()) + bReadOnly = awidget->archive()->isReadOnly(); + + saveAsAction->setEnabled(bHaveFiles); + selectAllAction->setEnabled(bHaveFiles); + deselectAllAction->setEnabled(bHaveFiles); + invertSelectionAction->setEnabled(bHaveFiles); + + deleteAction->setEnabled(bHaveFiles && awidget->numSelectedFiles() > 0 + && awidget->archive() && !bReadOnly); + addFileAction->setEnabled(awidget->isArchiveOpen() && + !bReadOnly); + addDirAction->setEnabled(awidget->isArchiveOpen() && + !bReadOnly && bAddDirSupported); + extractAction->setEnabled(bHaveFiles); + awidget->searchBar()->setEnabled(bHaveFiles); + + bool b = ( bHaveFiles + && (awidget->numSelectedFiles() == 1) + && (awidget->fileList()->currentItem()->childCount() == 0) + ); + viewAction->setEnabled( b ); + openWithAction->setEnabled( b ); + editAction->setEnabled( b && !bReadOnly ); // You can't edit files in read-only archives + emit fixActionState( bHaveFiles ); +} + +void ArkPart::initialEnables() +{ + saveAsAction->setEnabled( false ); + selectAllAction->setEnabled(false); + deselectAllAction->setEnabled(false); + invertSelectionAction->setEnabled(false); + + viewAction->setEnabled(false); + + deleteAction->setEnabled(false); + extractAction->setEnabled(false); + addFileAction->setEnabled(false); + addDirAction->setEnabled(false); + openWithAction->setEnabled(false); + editAction->setEnabled(false); + + awidget->searchBar()->setEnabled(false); +} + +void ArkPart::disableActions() +{ + saveAsAction->setEnabled(false); + selectAllAction->setEnabled(false); + deselectAllAction->setEnabled(false); + invertSelectionAction->setEnabled(false); + + viewAction->setEnabled(false); + deleteAction->setEnabled(false); + extractAction->setEnabled(false); + addFileAction->setEnabled(false); + addDirAction->setEnabled(false); + openWithAction->setEnabled(false); + editAction->setEnabled(false); + awidget->searchBar()->setEnabled(false); +} + +bool ArkPart::openURL( const KURL & url ) +{ + awidget->setRealURL( url ); + return KParts::ReadWritePart::openURL( KIO::NetAccess::mostLocalURL( url, awidget ) ); +} + +bool ArkPart::openFile() +{ + KURL url; + url.setPath( m_file ); + if( !QFile::exists( m_file ) ) + { + emit setWindowCaption( QString::null ); + emit removeRecentURL( awidget->realURL() ); + return false; + } + emit addRecentURL( awidget->realURL() ); + awidget->setModified( false ); + awidget->file_open( url ); + return true; +} + +void ArkPart::file_save_as() +{ + KURL u = awidget->getSaveAsFileName(); + if ( u.isEmpty() ) // user canceled + return; + + if ( !awidget->allowedArchiveName( u ) ) + awidget->convertTo( u ); + else if ( awidget->file_save_as( u ) ) + m_ext->slotOpenURLRequested( u ); + else + kdWarning( 1601 ) << "Save As failed." << endl; +} + +bool ArkPart::saveFile() +{ + return true; +} + +bool ArkPart::closeArchive() +{ + awidget->file_close(); + awidget->setModified( false ); + return ReadWritePart::closeURL(); +} + +bool ArkPart::closeURL() +{ + if ( !isReadWrite() || !awidget->isModified() || awidget->realURL().isLocalFile() ) + return closeArchive(); + + QString docName = awidget->realURL().prettyURL(); + + int res = KMessageBox::warningYesNoCancel( widget(), + i18n( "The archive \"%1\" has been modified.\n" + "Do you want to save it?" ).arg( docName ), + i18n( "Save Archive?" ), KStdGuiItem::save(), KStdGuiItem::discard() ); + + switch ( res ) + { + case KMessageBox::Yes : + return awidget->file_save_as( awidget->realURL() ) && closeArchive(); + + case KMessageBox::No : + return closeArchive(); + + default : // case KMessageBox::Cancel + return false; + } +} + +void ArkPart::slotFilePopup( const QPoint &pPoint ) +{ + if ( factory() ) + static_cast(factory()->container("file_popup", this))->popup(pPoint); +} + +void ArkPart::transferStarted( KIO::Job *job ) +{ + m_job = job; + + m_bar->slotSetBusy( i18n( "Downloading %1..." ).arg( m_url.prettyURL() ), + (job != 0), (job != 0) ); + + if ( job ) + { + disableActions(); + connect( job, SIGNAL( percent(KIO::Job*, unsigned long) ), + SLOT( progressInformation(KIO::Job*, unsigned long) ) ); + connect( m_bar->cancelButton(), SIGNAL( clicked() ), + SLOT( cancelTransfer() ) ); + } +} + +void ArkPart::transferCompleted() +{ + if ( m_job ) + { + disconnect( m_job, SIGNAL( percent(KIO::Job*, unsigned long) ), + this, SLOT( progressInformation(KIO::Job*, unsigned long) ) ); + m_job = 0; + } + + m_bar->slotSetReady(); +} + +void ArkPart::transferCanceled( const QString& errMsg ) +{ + m_job = 0; + if ( !errMsg.isEmpty() ) + { + KMessageBox::error( awidget, errMsg ); + } + initialEnables(); + m_bar->slotSetReady(); +} + +void ArkPart::progressInformation( KIO::Job *, unsigned long progress ) +{ + m_bar->setProgress( progress ); +} + +void ArkPart::cancelTransfer() +{ + disconnect( m_bar->cancelButton(), SIGNAL( clicked() ), + this, SLOT( cancelTransfer() ) ); + if ( m_job ) + { + m_job->kill( false ); + transferCanceled( QString() ); + } +} + +ArkBrowserExtension::ArkBrowserExtension( KParts::ReadOnlyPart * parent, const char * name ) + : KParts::BrowserExtension( parent, name ) +{ +} + +void ArkBrowserExtension::slotOpenURLRequested( const KURL & url ) +{ + emit openURLRequest( url, KParts::URLArgs() ); +} + +ArkStatusBarExtension::ArkStatusBarExtension( KParts::ReadWritePart * parent ) + : KParts::StatusBarExtension( parent ), + m_bBusy( false ), + m_pStatusLabelSelect( 0 ), + m_pStatusLabelTotal( 0 ), + m_pBusyText( 0 ), + m_cancelButton( 0 ), + m_pProgressBar( 0 ), + m_pTimer( 0 ) +{ +} + +ArkStatusBarExtension::~ArkStatusBarExtension() +{ +} + +void ArkStatusBarExtension::setupStatusBar() +{ + if ( m_pTimer // setup already done + || !statusBar() ) + { + return; + } + + m_pTimer = new QTimer( this ); + connect( m_pTimer, SIGNAL( timeout() ), this, SLOT( slotProgress() ) ); + + m_pStatusLabelTotal = new KSqueezedTextLabel( statusBar(), "StatusLabelTotal" ); + m_pStatusLabelTotal->setFrameStyle( QFrame::NoFrame ); + m_pStatusLabelTotal->setAlignment( AlignRight ); + m_pStatusLabelTotal->setText( i18n( "Total: 0 files" ) ); + + m_pStatusLabelSelect = new QLabel( statusBar(), "StatusLabelSelect" ); + m_pStatusLabelSelect->setFrameStyle( QFrame::NoFrame ); + m_pStatusLabelSelect->setAlignment( AlignLeft ); + m_pStatusLabelSelect->setText(i18n( "0 files selected" ) ); + + m_cancelButton = new KPushButton( SmallIcon( "cancel" ), QString(), statusBar(), "CancelButton" ); + + addStatusBarItem( m_pStatusLabelSelect, 3000, false ); + addStatusBarItem( m_pStatusLabelTotal, 3000, false ); +} + +void ArkStatusBarExtension::slotSetStatusBarText( const QString & text ) +{ + if ( !statusBar() ) + return; + + setupStatusBar(); + m_pStatusLabelTotal->setText( text ); +} + +void ArkStatusBarExtension::slotSetStatusBarSelectedFiles( const QString & text ) +{ + + if ( !statusBar() ) + return; + + setupStatusBar(); + m_pStatusLabelSelect->setText( text ); +} + +void ArkStatusBarExtension::slotSetBusy( const QString & text, bool showCancelButton, bool detailedProgress ) +{ + if ( m_bBusy || !statusBar() ) + return; + + setupStatusBar(); + if ( !m_pBusyText ) + { + m_pBusyText = new QLabel( statusBar() ); + + m_pBusyText->setAlignment( AlignLeft ); + m_pBusyText->setFrameStyle( QFrame::Panel | QFrame::Raised ); + } + + if ( !m_pProgressBar ) + { + m_pProgressBar = new KProgress( statusBar() ); + m_pProgressBar->setFixedHeight( m_pBusyText->fontMetrics().height() ); + } + + if ( !detailedProgress ) + { + m_pProgressBar->setTotalSteps( 0 ); + m_pProgressBar->setPercentageVisible( false ); + } + else + { + m_pProgressBar->setTotalSteps(100); + m_pProgressBar->setPercentageVisible( true ); + } + + m_pBusyText->setText( text ); + + removeStatusBarItem( m_pStatusLabelSelect ); + removeStatusBarItem( m_pStatusLabelTotal ); + + addStatusBarItem( m_pBusyText, 5, true ); + addStatusBarItem( m_pProgressBar, 1, true ); + if ( showCancelButton ) + { + addStatusBarItem( m_cancelButton, 0, true ); + } + + if ( !detailedProgress ) + { + m_pTimer->start( 200, false ); + } + m_bBusy = true; +} + +void ArkStatusBarExtension::slotSetReady() +{ + if ( !m_bBusy || !statusBar() ) + return; + + setupStatusBar(); + m_pTimer->stop(); + m_pProgressBar->setProgress( 0 ); + + removeStatusBarItem( m_pBusyText ); + removeStatusBarItem( m_pProgressBar ); + removeStatusBarItem( m_cancelButton ); + + addStatusBarItem( m_pStatusLabelSelect, 3000, false ); + addStatusBarItem( m_pStatusLabelTotal, 3000, false ); + + m_bBusy = false; +} + +void ArkStatusBarExtension::slotProgress() +{ + if ( !statusBar() ) + return; + + setupStatusBar(); + m_pProgressBar->setProgress( m_pProgressBar->progress() + 4 ); +} + +void ArkStatusBarExtension::setProgress( unsigned long progress ) +{ + if ( m_pProgressBar && ( m_pProgressBar->totalSteps() != 0 ) ) + { + m_pProgressBar->setProgress( progress ); + } +} + +#include "ark_part.moc" diff --git a/ark/ark_part.desktop b/ark/ark_part.desktop new file mode 100644 index 0000000..e167f26 --- /dev/null +++ b/ark/ark_part.desktop @@ -0,0 +1,135 @@ +[Desktop Entry] +MimeType=application/x-gzip;application/x-lha;application/x-tar;application/x-tgz;application/x-tbz;application/x-tbz2;application/x-zip;application/x-bzip;application/x-tzo;application/x-lzop;application/x-rar;application/x-zoo;application/x-tarz;application/x-archive;application/x-bzip2;application/x-jar;application/x-deb;application/x-ace;application/x-7z;application/x-arc;application/x-arj;application/x-compress;application/x-cpio;application/x-pak +Comment=Archive Handling Tool +Comment[af]=Argief Handtering Program +Comment[ar]=أداة التعامل مع الملÙات المضغوطة +Comment[az]=Arxiv Ä°ÅŸlÉ™mÉ™ VasitÉ™si +Comment[bg]=Работа Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¸ +Comment[br]=Ostilh merañ an dielloù +Comment[bs]=Uslužni program za arhiviranje +Comment[ca]=Eina per a treballar amb arxius +Comment[cs]=Program pro práci s archívy +Comment[cy]=Erfyn Triniaeth Archif +Comment[da]=Arkivbehandlingsværktøj +Comment[de]=Archiv-Verwaltung +Comment[el]=ΕÏγαλείο χειÏÎ¹ÏƒÎ¼Î¿Ï Î±Ïχειοθηκών +Comment[eo]=Administrilo por arÄ¥ivoj +Comment[es]=Herramienta para archivos comprimidos +Comment[et]=Arhiivide haldamise rakendus +Comment[eu]=Artxiboak Kudeatzeko tresna +Comment[fa]=ابزار گرداندن بایگانی +Comment[fi]=Pakettienhallintatyökalu +Comment[fr]=Outil de manipulation d'archives +Comment[ga]=Uirlis Láimhseála Cartlainne +Comment[gl]=Ferramenta de Manexo de Arquivos +Comment[he]=כלי לניהול ××¨×›×™×•× ×™× +Comment[hi]=अभिलेख संभाल औज़ार +Comment[hr]=Uslužni program za arhiviranje +Comment[hu]=Tömörítóprogram +Comment[id]=Program bantu menangani archive +Comment[is]=Vinna með safnskrár +Comment[it]=Gestione degli archivi +Comment[ja]=アーカイãƒãƒ„ール +Comment[ka]=áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბთáƒáƒœ სáƒáƒ›áƒ£áƒ¨áƒáƒ ხელსáƒáƒ¬áƒ§áƒ +Comment[kk]=Ðрхивпен айналыÑу құралы +Comment[km]=ឧបករណáŸâ€‹áž‚្រប់គ្រង​បáŸážŽáŸ’ណសារ +Comment[lt]=Archyvo valdymo priemonÄ— +Comment[lv]=ArhÄ«vu ApstrÄdes RÄ«ks +Comment[mk]=Ðлатка за Ñправување Ñо архивирани датотеки +Comment[ms]=Alatan Pengendalian Arkib +Comment[mt]=Għodda biex tuża l-arkivji +Comment[nb]=Arkivbehandlingsverktøy +Comment[nds]=En Warktüüch för de Archivpleeg +Comment[ne]=हà¥à¤¯à¤¾à¤¨à¥à¤¡à¤²à¤¿à¤™ उपकरण सङà¥à¤—à¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ +Comment[nl]=Hulpprogramma voor het beheer van archieven +Comment[nn]=Verktøy for arkivhandsaming +Comment[pa]=ਪà©à¨°à¨¾à¨²à©‡à¨– ਬਣਾਉਣ ਸੰਦ +Comment[pl]=Program obsÅ‚ugi archiwów +Comment[pt]=Programa de gestão de arquivos +Comment[pt_BR]=Gerenciador de arquivos empacotados +Comment[ro]=Utilitar de manipulare arhive +Comment[ru]=Программа работы Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ð¼Ð¸ +Comment[sk]=Program na prácu s archívmi +Comment[sl]=Orodje za ravnanje z arhivi +Comment[sr]=Ðлат за руковање архивама +Comment[sr@Latn]=Alat za rukovanje arhivama +Comment[sv]=Verktyg för att hantera filarkiv +Comment[ta]= காபà¯à®ªà®•à®¤à¯à®¤à¯ˆ கையாளà¯à®®à¯ கரà¯à®µà®¿ +Comment[tg]=ÐÑбобҳои ДаÑткории Бойгонӣ +Comment[th]=เครื่องมือจัดà¸à¸²à¸£à¹à¸Ÿà¹‰à¸¡à¸šà¸µà¸šà¸­à¸±à¸”ทั้งหลาย +Comment[tr]=ArÅŸiv Ä°ÅŸleme Aracı +Comment[uk]=ЗаÑіб роботи з архівами +Comment[uz]=Arxiv uchun vosita +Comment[uz@cyrillic]=Ðрхив учун воÑита +Comment[ven]=Tshishumiswa tshau fara tsha fhethu huno vhulungwa zwa kale +Comment[vi]=Công cụ xá»­ lí các file nén +Comment[wa]=Usteye po-z apougnî les Ã¥rtchives +Comment[xh]=Isixhobo sokuphatha i Archive +Comment[zh_CN]=文件压缩归档处ç†å·¥å…· +Comment[zh_TW]=壓縮檔案處ç†å·¥å…· +Comment[zu]=Ithuluzi Lokuphatha Umqulu +Name=Archiver +Name[af]=Argifeerder +Name[ar]=الضاغط +Name[az]=Arxivci +Name[br]=Dieller +Name[bs]=Arhiver +Name[ca]=Arxivador +Name[cs]=Archivátor +Name[cy]=Archifydd +Name[da]=Arkivbehandler +Name[de]=Archivprogramm +Name[el]=ΠÏόγÏαμμα αÏχειοθέτησης +Name[eo]=ArÄ¥ivilo +Name[es]=Archivador +Name[et]=Arhiveerija +Name[eu]=Artxibalaria +Name[fa]=بایگانی‌کننده +Name[fr]=Archiveur +Name[gl]=Arquivador +Name[he]=מנהל ×”××¨×›×™×•× ×™× +Name[hi]=अभिलेखक +Name[hr]=Arhiver +Name[hu]=Ark fájltömörítÅ‘ +Name[is]=Skráasafnari +Name[it]=Utilità di archiviazione +Name[ja]=アーカイム+Name[ka]=áƒáƒ áƒ¥áƒ˜áƒ•áƒáƒ áƒ˜áƒ£áƒ¡áƒ˜ +Name[kk]=Ðрхивтегіш +Name[km]=កម្មវិធី​បáŸážŽáŸ’ណសារ +Name[lt]=Archyvatorius +Name[lv]=Arhivators +Name[mk]=Ðрхивер +Name[ms]=Pengarkib +Name[nb]=Arkivbehandler +Name[ne]=पà¥à¤°à¤¾à¤²à¥‡à¤–क +Name[nl]=Archiefgereedschap +Name[nn]=Arkiverar +Name[pa]=ਆਕੀਵਰ +Name[pl]=Ark +Name[pt]=Ark +Name[pt_BR]=Arquivador +Name[ro]=Arhivator +Name[ru]=Ðрхиватор +Name[sk]=Archivátor +Name[sl]=Arhivar +Name[sr]=Ðрхивер +Name[sr@Latn]=Arhiver +Name[sv]=Arkiverare +Name[ta]= காபà¯à®ªà®•à®®à¯ +Name[tg]=Бойгонигар +Name[th]=อาร์ไคว์ฟเออร์ +Name[tr]=ArÅŸivci +Name[uk]=Ðрхіватор +Name[uz]=Arxivlagich +Name[uz@cyrillic]=Ðрхивлагич +Name[ven]=Muvhulungi nwa zwithu zwa kale +Name[vi]=LuÆ° trữ +Name[wa]=Ã…rtchiveu +Name[xh]=Umenzi woshicilelo lukawonke-wonke noxwebhu lweMbali +Name[zh_CN]=压缩存档工具 +Name[zu]=Umqulu +Icon=ark +Type=Service +ServiceTypes=KParts/ReadOnlyPart +X-KDE-Library=libarkpart diff --git a/ark/ark_part.h b/ark/ark_part.h new file mode 100644 index 0000000..b5b7f6f --- /dev/null +++ b/ark/ark_part.h @@ -0,0 +1,148 @@ +/* + Copyright (C) + + 2001: Macadamian Technologies Inc (author: Jian Huang, jian@macadamian.com) + 2005: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARK_PART_H +#define ARK_PART_H + +#include +#include +#include +#include +#include +#include + +#include + +class KAboutData; +class KPushButton; + +class ArkWidget; + +namespace KIO +{ + class Job; +} + + +class ArkBrowserExtension: public KParts::BrowserExtension +{ + Q_OBJECT +public: + ArkBrowserExtension( KParts::ReadOnlyPart * parent, const char * name = 0L ); +public slots: + void slotOpenURLRequested( const KURL & url ); +}; + +class ArkStatusBarExtension: public KParts::StatusBarExtension +{ + Q_OBJECT +public: + ArkStatusBarExtension( KParts::ReadWritePart * parent ); + ~ArkStatusBarExtension(); + + void setProgress( unsigned long progress ); + KPushButton* cancelButton() const { return m_cancelButton; } + +public slots: + void slotSetStatusBarSelectedFiles( const QString & text ); + void slotSetStatusBarText( const QString & text ); + void slotSetBusy( const QString & text, bool showCancelButton = false, bool detailedProgress = false ); + void slotSetReady(); + void slotProgress(); + +protected: + void setupStatusBar(); + +private: + bool m_bBusy; + QLabel *m_pStatusLabelSelect; // How many files are selected + QLabel *m_pStatusLabelTotal; // How many files in archive + QLabel *m_pBusyText; + KPushButton *m_cancelButton; // Cancel an operation + KProgress *m_pProgressBar; + QTimer *m_pTimer; +}; + + +class ArkPart: public KParts::ReadWritePart +{ + Q_OBJECT +public: + ArkPart( QWidget *parentWidget, const char *widgetName, QObject *parent, + const char *name, const QStringList &, bool readWrite ); + virtual ~ArkPart(); + + static KAboutData* createAboutData(); + +public slots: + void fixEnables();//rename to slotFixEnables()... + void disableActions(); + void slotFilePopup( const QPoint & pPoint ); + void file_save_as(); + bool saveFile(); + bool openURL( const KURL & url ); + bool closeURL(); + void transferStarted( KIO::Job * ); + void transferCompleted(); + void transferCanceled( const QString& errMsg ); + void progressInformation( KIO::Job *, unsigned long ); + void cancelTransfer(); + +signals: + void fixActionState( const bool & bHaveFiles ); + void removeRecentURL( const KURL & url ); + void addRecentURL( const KURL & url ); + +protected: + virtual bool openFile(); //Opening an archive file + bool closeArchive(); + void setupActions(); + void initialEnables(); + void init(); + +private: + ArkWidget *awidget; + ArkBrowserExtension *m_ext; + ArkStatusBarExtension *m_bar; + + KAction *saveAsAction; + KAction *addFileAction; + KAction *addDirAction; + KAction *extractAction; + KAction *deleteAction; + KAction *selectAllAction; + KAction *viewAction; + KAction *helpAction; + KAction *openWithAction; + KAction *deselectAllAction; + KAction *invertSelectionAction; + KAction *editAction; + + // the following have different enable rules from the above KActions + KAction *popupViewAction; + KAction *popupOpenWithAction; + KToggleAction *showSearchBar; + + KIO::Job *m_job; +}; + +#endif // ARK_PART_H diff --git a/ark/ark_part.rc b/ark/ark_part.rc new file mode 100644 index 0000000..ff0a894 --- /dev/null +++ b/ark/ark_part.rc @@ -0,0 +1,57 @@ + + + + + + + &File + + + &Edit + + + + + + &Action + + + + + + + + + + &Settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ark/ark_part_readonly.rc b/ark/ark_part_readonly.rc new file mode 100644 index 0000000..c124aae --- /dev/null +++ b/ark/ark_part_readonly.rc @@ -0,0 +1,42 @@ + + + + + + + &File + + + &Edit + + + + + + &Action + + + + + + &Settings + + + + + + + + + + + + + + + + + + + + diff --git a/ark/arkapp.cpp b/ark/arkapp.cpp new file mode 100644 index 0000000..c117d0b --- /dev/null +++ b/ark/arkapp.cpp @@ -0,0 +1,294 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2002-2003: Helio Chissini de Castro + 2003: Georg Robbers + 1999-2000: Corel Corporation (author: Emily Ezust emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include +#include +#include +#include +#include +#include +#include + + +#include "arkapp.h" + +ArkApplication *ArkApplication::mInstance = NULL; + +// a helper function to follow a symlink and obtain the real filename +// Used in the ArkApplication functions that use the archive filename +// to make sure an archive isn't opened twice in different windows +// Now, readlink only gives one level so this function recurses. + +static QString resolveFilename(const QString & _arkname) +{ + char *buff; + int nread; + int iter = 1; + + while ( true ) + { + buff = new char[BUFSIZ*iter]; + nread = readlink( QFile::encodeName(_arkname), buff, BUFSIZ); + if (-1 == nread) + { + if ( EINVAL == errno ) // not a symbolic link. Stopping condition. + { + delete [] buff; + return _arkname; + } + else if ( ENAMETOOLONG == errno ) + { + kdDebug(1601) << "resolveFilename: have to reallocate - name too long!" << endl; + iter++; + delete [] buff; + continue; + } + else + { + delete [] buff; + // the other errors will be taken care of already in simply + // // opening the archive (i.e., the user will be notified) + return ""; + } + } + else + { + buff[nread] = '\0'; // readlink doesn't null terminate + QString name = QFile::decodeName( buff ); + delete [] buff; + + // watch out for relative pathnames + if (name.at(0) != '/') + { + // copy the path from _arkname + int index = _arkname.findRev('/'); + name = _arkname.left(index + 1) + name; + } + kdDebug(1601) << "Now resolve " << name << endl; + + return resolveFilename( name ); + } + } +} + + +ArkApplication * ArkApplication::getInstance() +{ + if (mInstance == NULL) + { + mInstance = new ArkApplication(); + } + return mInstance; +} + +ArkApplication::ArkApplication() + : KUniqueApplication(), m_windowCount(0) +{ + m_mainwidget = new QWidget; + setMainWidget(m_mainwidget); +} + +int +ArkApplication::newInstance() +{ + + // If we are restored by session management, we don't need to open + // another window on startup. + if (restoringSession()) return 0; + + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + if ( args->isSet( "extract-to" ) ) + { + if ( args->count() == 2 ) + { + MainWindow *arkWin = new MainWindow(); + + arkWin->extractTo( args->url( 0 ), args->url( 1 ), args->isSet( "guess-name" ) ); + return 0; + } + else + { + KCmdLineArgs::usage( i18n( "Wrong number of arguments specified" ) ); + return 0; + } + } + + if ( args->isSet( "add-to" ) && ( !args->isSet( "add" ) ) ) + { + if ( args->count() < 2 ) + { + KCmdLineArgs::usage( i18n( "You need to specify at least one file to be added to the archive." ) ); + return 0; + } + else + { + KURL::List URLList; + for ( int c = 0; c < args->count()-1 ; c++ ) + URLList.append( args->url( c ) ); + + MainWindow *arkWin = new MainWindow(); + + arkWin->addToArchive( URLList, args->cwd(), args->url( args->count()-1 ) ); + return 0; + } + } + + if ( args->isSet( "add" ) && args->isSet( "add-to" ) ) // HACK + { + bool oneFile = (args->count() == 2 ) ; + + QString extension = args->arg( 0 ); + KURL archiveName = args->url( 1 ); // the filename + + // if more than one file -> use directory name + if ( !oneFile ) + archiveName.setPath( archiveName.directory() ); + + archiveName.setFileName( archiveName.fileName() + extension ); + KURL::List URLList; + for ( int c = 1; c < args->count(); c++ ) + URLList.append( args->url( c ) ); + + MainWindow *arkWin = new MainWindow(); + + arkWin->addToArchive( URLList, args->cwd(), archiveName, !oneFile ); + return 0; + } + + + if ( args->isSet( "add" ) && ( !args->isSet( "add-to" ) ) ) + { + if ( args->count() < 1 ) + { + KCmdLineArgs::usage( i18n( "You need to specify at least one file to be added to the archive." ) ); + return 0; + } + else + { + KURL::List URLList; + for ( int c = 0; c < args->count() ; c++ ) + URLList.append( args->url( c ) ); + + MainWindow *arkWin = new MainWindow(); + + arkWin->addToArchive( URLList, args->cwd() ); + return 0; + } + } + + + int i = 0; + KURL url; + bool doAutoExtract = args->isSet("extract"); + bool tempFile = KCmdLineArgs::isTempFileSet(); + do + { + if (args->count() > 0) + { + url = args->url(i); + } + MainWindow *arkWin = new MainWindow(); + arkWin->show(); + if(doAutoExtract) + { + arkWin->setExtractOnly(true); + } + if (!url.isEmpty()) + { + arkWin->openURL(url, tempFile); + } + + ++i; + } while (i < args->count()); + + args->clear(); + return 0; +} + + +void +ArkApplication::addOpenArk(const KURL & _arkname, MainWindow *_ptr) +{ + QString realName; + if( _arkname.isLocalFile() ) + { + realName = resolveFilename( _arkname.path() ); // follow symlink + kdDebug(1601) << " Real name of " << _arkname.prettyURL() << " is " << realName << endl; + } + else + realName = _arkname.prettyURL(); + openArksList.append(realName); + m_windowsHash.replace(realName, _ptr); + kdDebug(1601) << "Saved ptr " << _ptr << " added open ark: " << realName << endl; +} + +void +ArkApplication::removeOpenArk(const KURL & _arkname) +{ + QString realName; + if ( _arkname.isLocalFile() ) + realName = resolveFilename( _arkname.path() ); // follow symlink + else + realName = _arkname.prettyURL(); + kdDebug(1601) << "Removing name " << _arkname.prettyURL() << endl; + openArksList.remove(realName); + m_windowsHash.remove(realName); +} + +void +ArkApplication::raiseArk(const KURL & _arkname) +{ + kdDebug( 1601 ) << "ArkApplication::raiseArk " << endl; + MainWindow *window; + QString realName; + if( _arkname.isLocalFile() ) + realName = resolveFilename(_arkname.path()); // follow symlink + else + realName = _arkname.prettyURL(); + window = m_windowsHash[realName]; + kdDebug(1601) << "ArkApplication::raiseArk " << window << endl; + // raise didn't seem to be enough. Not sure why! + // This might be annoying though. + //window->hide(); + //window->show(); + window->raise(); +} + +bool +ArkApplication::isArkOpenAlready(const KURL & _arkname) +{ + QString realName; + if ( _arkname.isLocalFile() ) + realName = resolveFilename(_arkname.path()); // follow symlink + else + realName = _arkname.prettyURL(); + return ( openArksList.findIndex(realName) != -1 ); +} + +#include "arkapp.moc" + diff --git a/ark/arkapp.h b/ark/arkapp.h new file mode 100644 index 0000000..1d1b474 --- /dev/null +++ b/ark/arkapp.h @@ -0,0 +1,93 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2002: Helio Chissini de Castro + 1999-2000: Corel Corporation (author: Emily Ezust emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARKAPP_H +#define ARKAPP_H + +#include "mainwindow.h" + +// QT includes +#include + +// KDE includes +#include + +class QString; +class QStringList; + +class EqualKey +{ + public: + bool operator()(const QString & str1, const QString & str2) const + { + return (str1 == str2); + } +}; + + +// This class follows the singleton pattern. +class ArkApplication : public KUniqueApplication +{ + Q_OBJECT + public: + virtual int newInstance(); + virtual ~ArkApplication() {} + + // keep track of windows so we know when to quit + int windowCount() { return m_windowCount; } + int addWindow() { ++m_windowCount; return m_windowCount; } + void removeWindow() { --m_windowCount;} + + // keep track of open archive names so we don't open one twice + // note that ArkWidget is not a pointer to const because raise() + // requires later a pointer to nonconst. + void addOpenArk(const KURL & _arkname, MainWindow * _ptr); + void removeOpenArk(const KURL & _arkname); + + bool isArkOpenAlready(const KURL & _arkname); + + void raiseArk(const KURL & _arkname); + + // use this function to access data from other modules. + static ArkApplication *getInstance(); + + protected: + ArkApplication(); + + private: + QWidget *m_mainwidget; // to be the parent of all ArkWidgets + int m_windowCount; + + QStringList openArksList; + + // a hash to obtain the window associated with a filename. + // given a QString key, you get an ArkWidget * pointer. + QDict m_windowsHash; + + static ArkApplication *mInstance; +}; + +#endif // ARKAPP_H diff --git a/ark/arkfactory.cpp b/ark/arkfactory.cpp new file mode 100644 index 0000000..8fcd262 --- /dev/null +++ b/ark/arkfactory.cpp @@ -0,0 +1,68 @@ +/* + ark -- archiver for the KDE project + + Copyright (C) 2003: Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include +#include + +#include "ark_part.h" +#include "arkfactory.h" + +KInstance* ArkFactory::s_instance = 0L; +KAboutData* ArkFactory::s_about = 0L; +int ArkFactory::instanceNumber = 0; + +K_EXPORT_COMPONENT_FACTORY( libarkpart, ArkFactory ) + +ArkFactory::~ArkFactory() +{ + delete s_instance; + delete s_about; + s_instance = 0L; +} + +KParts::Part * ArkFactory::createPartObject( QWidget *parentWidget, + const char *widgetName, QObject *parent, + const char *name, const char *classname, + const QStringList &args ) +{ + bool readWrite = false; // for e.g. Browser/View or KParts::ReadOnlyPart + if ( QCString( classname ) == "KParts::ReadWritePart" + || QCString( classname ) == "ArkPart" ) + { + readWrite = true; + } + ArkPart* obj = new ArkPart( parentWidget, widgetName, parent, name, + args, readWrite ); + //kdDebug( 1601 ) << "classname is: " << QCString( classname ) << endl; + return obj; +} + +KInstance* ArkFactory::instance() +{ + instanceNumber++; + if( !s_instance ) + { + s_about = ArkPart::createAboutData(); + s_instance = new KInstance( s_about ); + } + return s_instance; +} + diff --git a/ark/arkfactory.h b/ark/arkfactory.h new file mode 100644 index 0000000..ec3534a --- /dev/null +++ b/ark/arkfactory.h @@ -0,0 +1,43 @@ +/* + ark -- archiver for the KDE project + + Copyright (C) 2003: Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARKFACTORY_H +#define ARKFACTORY_H +#include + +class ArkFactory : public KParts::Factory +{ +public: + ArkFactory() : KParts::Factory() {} + virtual ~ArkFactory(); + virtual KParts::Part *createPartObject( + QWidget *parentWidget = 0,const char *widgetName = 0, + QObject *parent = 0, const char *name = 0, + const char *classname = "KParts::Part", + const QStringList &args = QStringList() ); + static KInstance* instance(); + private: + static KInstance* s_instance; + static KAboutData* s_about; + static int instanceNumber; +}; + +#endif diff --git a/ark/arkui.rc b/ark/arkui.rc new file mode 100644 index 0000000..335abc8 --- /dev/null +++ b/ark/arkui.rc @@ -0,0 +1,22 @@ + + + + &File + + + + + + + + + + + + + + + + + + diff --git a/ark/arkutils.cpp b/ark/arkutils.cpp new file mode 100644 index 0000000..1b4ed0a --- /dev/null +++ b/ark/arkutils.cpp @@ -0,0 +1,230 @@ +/* + + $Id$ + + ark -- archiver for the KDE project + + Copyright (C) + + 2002: Helio Chissini de Castro + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1997-1999: Rob Palmbos palm9744@kettering.edu + 2003: Hans Petter Bieker + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include + +// C includes +#include +#include + +#include +#include +#include +#include + +#include +#include + +#ifdef _HPUX_SOURCE +#include +#endif + +// for statfs: +#ifdef BSD4_4 +#include +#elif defined(__linux__) +#include +#elif defined(__sun) +#include +#define STATFS statvfs +#elif defined(_AIX) +#include +#endif + +#ifndef STATFS +#define STATFS statfs +#endif + +// KDE includes +#include +#include +#include +#include + +// Qt includes +#include + +#include "arkutils.h" + +QString ArkUtils::getTimeStamp(const QString &_month, + const QString &_day, + const QString &_yearOrTime) +{ + // Make the date format sortable. + // Month is in _month, day is in _day. + // In _yearOrTime is either a year or a time. + // If it's March, we'll see the year for all dates up to October 1999. + // (five months' difference - e.g., if it's Apr, then get years up to Nov) + + char month[4]; + strncpy(month, _month.ascii(), 3); + month[3] = '\0'; + int nMonth = getMonth(month); + int nDay = _day.toInt(); + + kdDebug(1601) << "Month is " << nMonth << ", Day is " << nDay << endl; + + time_t t = time(0); + if (t == -1) + exit(1); + struct tm *now = localtime(&t); + int thisYear = now->tm_year + 1900; + int thisMonth = now->tm_mon + 1; + + QString year, timestamp; + + if (_yearOrTime.contains(":")) + // it has a timestamp so we have to figure out the year + { + year.sprintf("%d", ArkUtils::getYear(nMonth, thisYear, thisMonth)); + timestamp = _yearOrTime; + } + else + { + year = _yearOrTime; + if (year.right(1) == " ") + year = year.left(4); + if (year.left(1) == " ") + year = year.right(4); + + timestamp = "??:??"; + } + + QString retval; + retval.sprintf("%s-%.2d-%.2d %s", + year.utf8().data(), nMonth, nDay, + timestamp.utf8().data()); + return retval; +} + +int ArkUtils::getMonth(const char *strMonth) + // returns numeric value for three-char month string +{ + static char months[13][4] = { "", "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + int nIndex; + for (nIndex = 1; nIndex < 13; ++nIndex) + { + if (0 == strcmp(strMonth, months[nIndex])) + return nIndex; + } + return 0; +} + +// This function gets the year from an LHA or ls -l timestamp. +// Note: LHA doesn't seem to display the year if the file is more +// than 6 months into the future, so this will fail to give the correct +// year (of course it is hoped that there are not too many files lying +// around from the future). + +int ArkUtils::getYear(int theMonth, int thisYear, int thisMonth) +{ + int monthDiff = QABS(thisMonth - theMonth); + if (monthDiff > 6) + return (thisYear - 1); + else + return thisYear; +} + +QString ArkUtils::fixYear(const QString& strYear) +{ + // returns 4-digit year by guessing from two-char year string. + // Remember: this is used for file timestamps. There probably aren't any + // files that were created before 1970, so that's our cutoff. Of course, + // in 2070 we'll have some problems.... + + if ( strYear.length() != 2 ) return strYear; + + bool ok; + int y = strYear.toInt( &ok ); + + if ( ok ) + { + if ( y > 70 ) + y += 1900; + else + y += 2000; + + return QString::number( y ); + } + else + return QString::null; +} + +bool +ArkUtils::haveDirPermissions( const QString &strFile ) +{ + return ( access( QFile::encodeName( strFile ), W_OK ) == 0 ); +} + +bool +ArkUtils::diskHasSpace(const QString &dir, KIO::filesize_t size) + // check if disk has enough space to accommodate (a) new file(s) of + // the given size in the partition containing the given directory +{ + kdDebug( 1601 ) << "diskHasSpace() " << "dir: " << dir << " Size: " << size << endl; + + struct STATFS buf; + if (STATFS(QFile::encodeName(dir), &buf) == 0) + { + double nAvailable = (double)buf.f_bavail * buf.f_bsize; + if ( nAvailable < (double)size ) + { + KMessageBox::error(0, i18n("You have run out of disk space.")); + return false; + } + } + else + { + // something bad happened + kdWarning( 1601 ) << "diskHasSpace() failed" << endl; + // Q_ASSERT(0); + } + return true; +} + +KIO::filesize_t +ArkUtils::getSizes(QStringList *list) +{ + KIO::filesize_t sum = 0; + QString str; + KDE_struct_stat st; + + for ( QStringList::Iterator it = list->begin(); it != list->end(); ++it) + { + str = *it; + str = str.right(str.length()-5); + if (KDE_stat(QFile::encodeName(str), &st ) < 0) + continue; + sum += st.st_size; + } + return sum; +} diff --git a/ark/arkutils.h b/ark/arkutils.h new file mode 100644 index 0000000..4ddea65 --- /dev/null +++ b/ark/arkutils.h @@ -0,0 +1,56 @@ +// -*-C++-*- emacs magic for .h files +/* + + $Id$ + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 2003: Hans Petter Bieker + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARKUTILS_H +#define ARKUTILS_H + +#include + +#include + +class QStringList; + +// various functions for massaging timestamps +namespace ArkUtils +{ + int getYear(int theMonth, int thisYear, int thisMonth); + int getMonth(const char *strMonth); + QString fixYear(const QString& strYear); + + QString getTimeStamp(const QString &month, + const QString &day, + const QString &year); + bool haveDirPermissions(const QString &strFile); + bool diskHasSpace(const QString &dir, KIO::filesize_t size); + KIO::filesize_t getSizes(QStringList *list); +} + +#endif diff --git a/ark/arkviewer.cpp b/ark/arkviewer.cpp new file mode 100644 index 0000000..1ea76ac --- /dev/null +++ b/ark/arkviewer.cpp @@ -0,0 +1,103 @@ +/* + * ark: A program for modifying archives via a GUI. + * + * Copyright (C) 2004, Henrique Pinto + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "arkviewer.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +ArkViewer::ArkViewer( QWidget * parent, const char * name ) + : KDialogBase( parent, name, false, QString::null, Close ), m_part( 0 ) +{ + m_widget = new QVBox( this ); + m_widget->layout()->setSpacing( 10 ); + + connect( this, SIGNAL( finished() ), this, SLOT( slotFinished() ) ); + + setMainWidget( m_widget ); +} + +ArkViewer::~ArkViewer() +{ + saveDialogSize( "ArkViewer" ); +} + +void ArkViewer::slotFinished() +{ + delete m_part; + m_part = 0; + delayedDestruct(); +} + +bool ArkViewer::view( const KURL& filename ) +{ + KMimeType::Ptr mimetype = KMimeType::findByURL( filename, 0, true ); + + setCaption( filename.fileName() ); + + QSize size = configDialogSize( "ArkViewer" ); + if (size.width() < 200) + size = QSize(560, 400); + setInitialSize( size ); + + QFrame *header = new QFrame( m_widget ); + QHBoxLayout *headerLayout = new QHBoxLayout( header ); + headerLayout->setAutoAdd( true ); + + QLabel *iconLabel = new QLabel( header ); + iconLabel->setPixmap( mimetype->pixmap( KIcon::Desktop ) ); + iconLabel->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum ); + + QVBox *headerRight = new QVBox( header ); + new QLabel( QString( "%1" ) + .arg( filename.fileName() ), headerRight + ); + new QLabel( mimetype->comment(), headerRight ); + + header->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum ); + + m_part = KParts::ComponentFactory::createPartInstanceFromQuery( mimetype->name(), QString::null, m_widget, 0, this ); + + if ( m_part ) + { + m_part->openURL( filename ); + show(); + return true; + } + else + { + return false; + } +} + +#include "arkviewer.moc" diff --git a/ark/arkviewer.h b/ark/arkviewer.h new file mode 100644 index 0000000..e0fda83 --- /dev/null +++ b/ark/arkviewer.h @@ -0,0 +1,47 @@ +#ifndef ARKVIEWER_H +#define ARKVIEWER_H + +/* + * ark: A program for modifying archives via a GUI. + * + * Copyright (C) 2004, Henrique Pinto + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include + +class ArkViewer : public KDialogBase +{ + Q_OBJECT + + public: + ArkViewer( QWidget* parent = 0, const char * name = 0 ); + ~ArkViewer(); + + bool view( const KURL& filename ); + + protected slots: + void slotFinished(); + + private: + KParts::ReadOnlyPart *m_part; + QWidget *m_widget; +}; + +#endif // ARKVIEWER_H + diff --git a/ark/arkwidget.cpp b/ark/arkwidget.cpp new file mode 100644 index 0000000..d0fa3d4 --- /dev/null +++ b/ark/arkwidget.cpp @@ -0,0 +1,2262 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2004-2005: Henrique Pinto + 2003: Georg Robbers + 2002-2003: Helio Chissini de Castro + 2001-2002: Roberto Teixeira + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1997-1999: Rob Palmbos palm9744@kettering.edu + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include +#include + +// Qt includes +#include +#include +#include +#include +#include + +// KDE includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// settings +#include "settings.h" +#include "general.h" +#include "addition.h" +#include "extraction.h" +#include +#include + +// ark includes +#include "arkapp.h" +#include "archiveformatdlg.h" +#include "extractiondialog.h" +#include "arkwidget.h" +#include "filelistview.h" +#include "arkutils.h" +#include "archiveformatinfo.h" +#include "compressedfile.h" +#include "searchbar.h" +#include "arkviewer.h" + +static void viewInExternalViewer( ArkWidget* parent, const KURL& filename ) +{ + QString mimetype = KMimeType::findByURL( filename )->name(); + bool view = true; + + if ( KRun::isExecutable( mimetype ) ) + { + QString text = i18n( "The file you're trying to view may be an executable. Running untrusted executables may compromise your system's security.\nAre you sure you want to run that file?" ); + view = ( KMessageBox::warningContinueCancel( parent, text, QString::null, i18n("Run Nevertheless") ) == KMessageBox::Continue ); + } + + if ( view ) + KRun::runURL( filename, mimetype ); + +} + +//---------------------------------------------------------------------- +// +// Class ArkWidget starts here +// +//---------------------------------------------------------------------- + +ArkWidget::ArkWidget( QWidget *parent, const char *name ) + : QVBox(parent, name), m_bBusy( false ), m_bBusyHold( false ), + m_extractOnly( false ), m_extractRemote(false), + m_openAsMimeType(QString::null), m_pTempAddList(NULL), + m_bArchivePopupEnabled( false ), + m_convert_tmpDir( NULL ), m_convertSuccess( false ), + m_createRealArchTmpDir( NULL ), m_extractRemoteTmpDir( NULL ), + m_modified( false ), m_searchToolBar( 0 ), m_searchBar( 0 ), + arch( 0 ), m_archType( UNKNOWN_FORMAT ), m_fileListView( 0 ), + m_nSizeOfFiles( 0 ), m_nSizeOfSelectedFiles( 0 ), m_nNumFiles( 0 ), + m_nNumSelectedFiles( 0 ), m_bIsArchiveOpen( false ), + m_bIsSimpleCompressedFile( false ), + m_bDropSourceIsSelf( false ), m_extractList( 0 ) +{ + m_tmpDir = new KTempDir( locateLocal( "tmp", "ark" ) ); + + if ( m_tmpDir->status() != 0 ) + { + kdWarning( 1601 ) << "Could not create a temporary directory. status() returned " + << m_tmpDir->status() << "." << endl; + m_tmpDir = NULL; + } + + m_searchToolBar = new KToolBar( this, "searchBar" ); + m_searchToolBar->boxLayout()->setSpacing( KDialog::spacingHint() ); + + QLabel * l1 = new QLabel( i18n( "&Search:" ), m_searchToolBar, "kde toolbar widget" ); + m_searchBar = new SearchBar( m_searchToolBar, 0 ); + l1->setBuddy( m_searchBar ); + + m_searchToolBar->setStretchableWidget( m_searchBar ); + + if ( !ArkSettings::showSearchBar() ) + m_searchToolBar->hide(); + + createFileListView(); + + m_searchBar->setListView( m_fileListView ); + + // enable DnD + setAcceptDrops(true); + setFocusProxy(m_searchBar); +} + +ArkWidget::~ArkWidget() +{ + cleanArkTmpDir(); + ready(); + delete m_pTempAddList; + delete m_fileListView; + m_fileListView = 0; + delete arch; + ArkSettings::writeConfig(); +} + +void ArkWidget::cleanArkTmpDir() +{ + removeDownloadedFiles(); + if ( m_tmpDir ) + { + m_tmpDir->unlink(); + delete m_tmpDir; + m_tmpDir = NULL; + } +} + +void ArkWidget::closeArch() +{ + if ( isArchiveOpen() ) + { + delete arch; + arch = 0; + m_bIsArchiveOpen = false; + } + + if ( m_fileListView ) + { + m_fileListView->clear(); + m_fileListView->clearHeaders(); + } +} + +//////////////////////////////////////////////////////////////////// +///////////////////////// updateStatusTotals /////////////////////// +//////////////////////////////////////////////////////////////////// + +void +ArkWidget::updateStatusTotals() +{ + m_nNumFiles = m_fileListView->totalFiles(); + m_nSizeOfFiles = m_fileListView->totalSize(); + + QString strInfo = i18n( "%n file %1", "%n files %1", m_nNumFiles ) + .arg( KIO::convertSize( m_nSizeOfFiles ) ); + emit setStatusBarText(strInfo); +} + +void +ArkWidget::busy( const QString & text ) +{ + emit setBusy( text ); + + if ( m_bBusy ) + return; + + m_fileListView->setEnabled( false ); + + QApplication::setOverrideCursor( waitCursor ); + m_bBusy = true; +} + +void +ArkWidget::holdBusy() +{ + if ( !m_bBusy || m_bBusyHold ) + return; + + m_bBusyHold = true; + QApplication::restoreOverrideCursor(); +} + +void +ArkWidget::resumeBusy() +{ + if ( !m_bBusyHold ) + return; + + m_bBusyHold = false; + QApplication::setOverrideCursor( waitCursor ); +} + +void +ArkWidget::ready() +{ + if ( !m_bBusy ) + return; + + m_fileListView->setEnabled( true ); + + QApplication::restoreOverrideCursor(); + emit setReady(); + m_bBusyHold = false; + m_bBusy = false; +} + +////////////////////////////////////////////////////////////////////// +////////////////////// file_save_as ////////////////////////////////// +////////////////////////////////////////////////////////////////////// + +KURL +ArkWidget::getSaveAsFileName() +{ + QString defaultMimeType; + if ( m_openAsMimeType.isNull() ) + defaultMimeType = KMimeType::findByPath( m_strArchName )->name(); + else + defaultMimeType = m_openAsMimeType; + + KURL u; + QString suggestedName; + if ( m_realURL.isLocalFile() ) + suggestedName = m_realURL.url(); + else + suggestedName = m_realURL.fileName( false ); + + do + { + u = getCreateFilename( i18n( "Save Archive As" ), defaultMimeType, true, suggestedName ); + if ( u.isEmpty() ) + return u; + if( allowedArchiveName( u ) || ( ArchiveFormatInfo::self()->archTypeByExtension( u.path() ) != UNKNOWN_FORMAT ) ) + break; + KMessageBox::error( this, i18n( "Please save your archive in the same format as the original.\nHint: Use one of the suggested extensions." ) ); + } + while ( true ); + return u; +} + +bool +ArkWidget::file_save_as( const KURL & u ) +{ + bool success = KIO::NetAccess::upload( m_strArchName, u, this ); + if ( m_modified && success ) + m_modified = false; + return success; +} + +void +ArkWidget::convertTo( const KURL & u ) +{ + busy( i18n( "Saving..." ) ); + m_convert_tmpDir = new KTempDir( tmpDir() + "convtmp" ); + m_convert_tmpDir->setAutoDelete( true ); + connect( arch, SIGNAL( sigExtract( bool ) ), this, SLOT( convertSlotExtractDone( bool ) ) ); + m_convert_saveAsURL = u; + arch->unarchFile( 0, m_convert_tmpDir->name() ); +} + +void +ArkWidget::convertSlotExtractDone( bool ) +{ + kdDebug( 1601 ) << k_funcinfo << endl; + disconnect( arch, SIGNAL( sigExtract( bool ) ), this, SLOT( convertSlotExtractDone( bool ) ) ); + QTimer::singleShot( 0, this, SLOT( convertSlotCreate() ) ); +} + +void +ArkWidget::convertSlotCreate() +{ + file_close(); + connect( this, SIGNAL( createDone( bool ) ), this, SLOT( convertSlotCreateDone( bool ) ) ); + QString archToCreate; + if ( m_convert_saveAsURL.isLocalFile() ) + archToCreate = m_convert_saveAsURL.path(); + else + archToCreate = tmpDir() + m_convert_saveAsURL.fileName(); + + createArchive( archToCreate ); +} + + +void +ArkWidget::convertSlotCreateDone( bool success ) +{ + disconnect( this, SIGNAL( createDone( bool ) ), this, SLOT( convertSlotCreateDone( bool ) ) ); + kdDebug( 1601 ) << k_funcinfo << endl; + if ( !success ) + { + kdWarning( 1601 ) << "Error while converting. (convertSlotCreateDone)" << endl; + return; + } + QDir dir( m_convert_tmpDir->name() ); + QStringList entries = dir.entryList(); + entries.remove( ".." ); + entries.remove( "." ); + QStringList::Iterator it = entries.begin(); + for ( ; it != entries.end(); ++it ) + { + /////////////////////////////////////////////////////// + // BIG TODO: get rid of 'the assume // + // 'file:/', do some black magic // + // to find the basedir, chdir there, // + // and break the rest of the world' // + // hack. See also action_edit ... // + // addFile should be: // + // addFile( const QString & baseDir, // + // const QStringList & filesToAdd ) // + ////////////////////////////////////////////////////// + *it = QString::fromLatin1( "file:" )+ m_convert_tmpDir->name() + *it; + } + bool bOldRecVal = ArkSettings::rarRecurseSubdirs(); + connect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( convertSlotAddDone( bool ) ) ); + arch->addFile( entries ); + ArkSettings::setRarRecurseSubdirs( bOldRecVal ); +} + +void +ArkWidget::convertSlotAddDone( bool success ) +{ + disconnect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( convertSlotAddDone( bool ) ) ); + kdDebug( 1601 ) << k_funcinfo << endl; + m_convertSuccess = success; + // needed ? (TarArch, lzo) + QTimer::singleShot( 0, this, SLOT( convertFinish() ) ); +} + +void +ArkWidget::convertFinish() +{ + kdDebug( 1601 ) << k_funcinfo << endl; + delete m_convert_tmpDir; + m_convert_tmpDir = NULL; + + ready(); + if ( m_convertSuccess ) + { + if ( m_convert_saveAsURL.isLocalFile() ) + { + emit openURLRequest( m_convert_saveAsURL ); + } + else + { + KIO::NetAccess::upload( tmpDir() + + m_convert_saveAsURL.fileName(), m_convert_saveAsURL, this ); + // TODO: save bandwidth - we already have a local tmp file ... + emit openURLRequest( m_convert_saveAsURL ); + } + } + else + { + kdWarning( 1601 ) << "Error while converting (convertSlotAddDone)" << endl; + } +} + +bool +ArkWidget::allowedArchiveName( const KURL & u ) +{ + if (u.isEmpty()) + return false; + + QString archMimeType = KMimeType::findByURL( m_url )->name(); + if ( !m_openAsMimeType.isNull() ) + archMimeType = m_openAsMimeType; + QString newArchMimeType = KMimeType::findByPath( u.path() )->name(); + if ( archMimeType == newArchMimeType ) + return true; + + return false; +} + +void +ArkWidget::extractTo( const KURL & targetDirectory, const KURL & archive, bool bGuessName ) +{ + m_extractTo_targetDirectory = targetDirectory; + + if ( bGuessName ) // suggest an extract directory based on archive name + { + const QString fileName = guessName( archive ); + m_extractTo_targetDirectory.setPath( targetDirectory.path( 1 ) + fileName + '/' ); + } + + if ( !KIO::NetAccess::exists( m_extractTo_targetDirectory, false, this ) ) + { + if ( !KIO::NetAccess::mkdir( m_extractTo_targetDirectory, this ) ) + { + KMessageBox::error( 0, i18n( "Could not create the folder %1" ).arg( + targetDirectory.prettyURL() ) ); + emit request_file_quit(); + return; + } + } + + connect( this, SIGNAL( openDone( bool ) ), this, SLOT( extractToSlotOpenDone( bool ) ) ); +} + +const QString +ArkWidget::guessName( const KURL &archive ) +{ + QString fileName = archive.fileName(); + QStringList list = KMimeType::findByPath( fileName )->patterns(); + QStringList::Iterator it = list.begin(); + QString ext; + for ( ; it != list.end(); ++it ) + { + ext = (*it).remove( '*' ); + if ( fileName.endsWith( ext ) ) + { + fileName = fileName.left( fileName.findRev( ext ) ); + break; + } + } + + return fileName; +} + +void +ArkWidget::extractToSlotOpenDone( bool success ) +{ + disconnect( this, SIGNAL( openDone( bool ) ), this, SLOT( extractToSlotOpenDone( bool ) ) ); + if ( !success ) + { + KMessageBox::error( this, i18n( "An error occurred while opening the archive %1." ).arg( m_url.prettyURL() ) ); + emit request_file_quit(); + return; + } + + QString extractDir = m_extractTo_targetDirectory.path(); + // little code duplication from action_extract(): + if ( !m_extractTo_targetDirectory.isLocalFile() ) + { + m_extractRemoteTmpDir = new KTempDir( tmpDir() + "extremote" ); + m_extractRemoteTmpDir->setAutoDelete( true ); + + extractDir = m_extractRemoteTmpDir->name(); + m_extractRemote = true; + + if ( m_extractRemoteTmpDir->status() != 0 ) + { + kdWarning(1601) << "Unable to create " << extractDir << endl; + m_extractRemote = false; + emit request_file_quit(); + return; + } + } + + QStringList empty; + QStringList alreadyExisting = existingFiles( extractDir, empty ); + kdDebug( 1601 ) << "Already existing files count: " << existingFiles( extractDir, empty ).count() << endl; + bool keepGoing = true; + if ( !ArkSettings::extractOverwrite() && !alreadyExisting.isEmpty() ) + { + keepGoing = ( KMessageBox::Continue == KMessageBox::warningContinueCancelList( this, + i18n( "The following files will not be extracted\nbecause they " + "already exist:" ), alreadyExisting ) ); + } + + if ( keepGoing ) // if the user's OK with those failures, go ahead + { + // unless we have no space! + if ( ArkUtils::diskHasSpace( extractDir, m_nSizeOfFiles ) ) + { + disableAll(); + connect( arch, SIGNAL( sigExtract( bool ) ), this, SLOT( extractToSlotExtractDone( bool ) ) ); + arch->unarchFile( 0, extractDir ); + } + else + { + KMessageBox::error( this, i18n( "Not enough free disc space to extract the archive." ) ); + emit request_file_quit(); + return; + } + } + else + emit request_file_quit(); +} + +void +ArkWidget::extractToSlotExtractDone( bool success ) +{ + disconnect( arch, SIGNAL( sigExtract( bool ) ), this, SLOT( extractToSlotExtractDone( bool ) ) ); + if ( !success ) + { + kdDebug( 1601 ) << "Last Shell Output" << arch->getLastShellOutput() << endl; + KMessageBox::error( this, i18n( "An error occurred while extracting the archive." ) ); + emit request_file_quit(); + return; + } + + if ( m_extractRemote ) + { + connect( this, SIGNAL( extractRemoteMovingDone() ), this, SIGNAL( request_file_quit() ) ); + extractRemoteInitiateMoving( m_extractTo_targetDirectory ); + } + else + emit request_file_quit(); +} + +bool +ArkWidget::addToArchive( const KURL::List & filesToAdd, const KURL & archive) +{ + m_addToArchive_filesToAdd = filesToAdd; + m_addToArchive_archive = archive; + if ( !KIO::NetAccess::exists( archive, false, this ) ) + { + if ( !m_openAsMimeType.isEmpty() ) + { + QStringList extensions = KMimeType::mimeType( m_openAsMimeType )->patterns(); + QStringList::Iterator it = extensions.begin(); + QString file = archive.path(); + for ( ; it != extensions.end() && !file.endsWith( ( *it ).remove( '*' ) ); ++it ) + ; + + if ( it == extensions.end() ) + { + file += ArchiveFormatInfo::self()->defaultExtension( m_openAsMimeType ); + const_cast< KURL & >( archive ).setPath( file ); + } + } + + connect( this, SIGNAL( createDone( bool ) ), this, SLOT( addToArchiveSlotCreateDone( bool ) ) ); + + // TODO: remote Archives should be handled by createArchive + if ( archive.isLocalFile() ) + { + if ( !createArchive( archive.path() ) ) + return false; + } + else + { + if ( !createArchive( tmpDir() + archive.fileName() ) ) + return false; + } + return true; + + } + connect( this, SIGNAL( openDone( bool ) ), this, SLOT( addToArchiveSlotOpenDone( bool ) ) ); + return true; +} + +void +ArkWidget::addToArchiveSlotCreateDone( bool success ) +{ + disconnect( this, SIGNAL( createDone( bool ) ), this, SLOT( addToArchiveSlotCreateDone( bool ) ) ); + if ( !success ) + { + kdDebug( 1601 ) << "Could not create the archive" << endl; + emit request_file_quit(); + return; + } + addToArchiveSlotOpenDone( true ); +} + +void +ArkWidget::addToArchiveSlotOpenDone( bool success ) +{ + kdDebug( 1601 ) << k_funcinfo << endl; + disconnect( this, SIGNAL( openDone( bool ) ), this, SLOT( addToArchiveSlotOpenDone( bool ) ) ); + // TODO: handle dirs with addDir ( or better+easier: get rid of the need to do that entirely ) + if ( !success ) + { + emit request_file_quit(); + return; + } + + if ( m_bIsSimpleCompressedFile && (m_nNumFiles == 1)) + { + QString strFilename; + KURL url = askToCreateRealArchive(); + strFilename = url.path(); + if (!strFilename.isEmpty()) + { + connect( this, SIGNAL( createRealArchiveDone( bool ) ), this, SLOT( addToArchiveSlotAddDone( bool ) ) ); + createRealArchive( strFilename, m_addToArchive_filesToAdd.toStringList() ); + return; + } + else + { + emit request_file_quit(); + return; + } + } + +/* QStringList list = m_addToArchive_filesToAdd.toStringList(); + if ( !ArkUtils::diskHasSpace( tmpDir(), ArkUtils::getSizes( &list ) ) ) + { + KMessageBox::error( this, i18n( "Not enough free disc space to extract the archive." ) ); + emit request_file_quit(); + return; + }*/ + + disableAll(); + // if they are URLs, we have to download them, replace the URLs + // with filenames, and remember to delete the temporaries later. +/* for ( QStringList::Iterator it = list.begin(); + it != list.end(); ++it) + { + QString str = *it; + KURL url( toLocalFile( str ) ); + *it = url.prettyURL(); + } +*/ + KURL::List list = m_addToArchive_filesToAdd; + + + // Remote URLs need to be downloaded. + KURL::List::Iterator end( list.end() ); + for ( KURL::List::Iterator it = list.begin(); it != end; ++it ) + { + if (!(*it).isLocalFile()) + { + *it = toLocalFile( *it ); + } + } + + kdDebug( 1601 ) << "Adding: " << list << endl; + + connect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( addToArchiveSlotAddDone( bool ) ) ); + arch->addFile( list.toStringList() ); +} + +void +ArkWidget::addToArchiveSlotAddDone( bool success ) +{ + kdDebug( 1601 ) << k_funcinfo << endl; + disconnect( this, SLOT( addToArchiveSlotAddDone( bool ) ) ); + if ( !success ) + { + KMessageBox::error( this, i18n( "An error occurred while adding the files to the archive." ) ); + } + if ( !m_addToArchive_archive.isLocalFile() ) + KIO::NetAccess::upload( m_strArchName, m_addToArchive_archive, this ); + emit request_file_quit(); + return; +} + +void ArkWidget::setOpenAsMimeType( const QString & mimeType ) +{ + m_openAsMimeType = mimeType; +} + +void +ArkWidget::file_open(const KURL& url) +{ + if ( url.isEmpty() ) + { + kdDebug( 1601 ) << "file_open: url empty" << endl; + return; + } + + if ( isArchiveOpen() ) + file_close(); // close old arch. If we don't, our temp file is wrong! + + if ( !url.isLocalFile() ) + { + kdWarning ( 1601 ) << url.prettyURL() << " is not a local URL in ArkWidget::file_open( KURL). Aborting. " << endl; + return; + } + + + QString strFile = url.path(); + + kdDebug( 1601 ) << "File to open: " << strFile << endl; + + QFileInfo fileInfo( strFile ); + if ( !fileInfo.exists() ) + { + KMessageBox::error(this, i18n("The archive %1 does not exist.").arg(strFile)); + emit removeRecentURL( m_realURL ); + return; + } + else if ( !fileInfo.isReadable() ) + { + KMessageBox::error(this, i18n("You do not have permission to access that archive.") ); + emit removeRecentURL( m_realURL ); + return; + } + + // see if the user is just opening the same file that's already + // open (erm...) + + if (strFile == m_strArchName && m_bIsArchiveOpen) + { + kdDebug( 1601 ) << "file_open: strFile == m_strArchName" << endl; + return; + } + + // no errors if we made it this far. + + // Set the current archive filename to the filename + m_strArchName = strFile; + m_url = url; + //arch->clearShellOutput(); + + openArchive( strFile ); +} + + +// File menu ///////////////////////////////////////////////////////// + +KURL +ArkWidget::getCreateFilename(const QString & _caption, + const QString & _defaultMimeType, + bool allowCompressed, + const QString & _suggestedName ) +{ + int choice=0; + bool fileExists = true; + QString strFile; + KURL url; + + KFileDialog dlg( ":ArkSaveAsDialog", QString::null, this, "SaveAsDialog", true ); + dlg.setCaption( _caption ); + dlg.setOperationMode( KFileDialog::Saving ); + dlg.setMimeFilter( ArchiveFormatInfo::self()->supportedMimeTypes( allowCompressed ), + _defaultMimeType.isNull() ? "application/x-tgz" : _defaultMimeType ); + if ( !_suggestedName.isEmpty() ) + dlg.setSelection( _suggestedName ); + + while ( fileExists ) + // keep asking for filenames as long as the user doesn't want to + // overwrite existing ones; break if they agree to overwrite + // or if the file doesn't already exist. Return if they cancel. + // Also check for proper extensions. + { + dlg.exec(); + url = dlg.selectedURL(); + strFile = url.path(); + + if (strFile.isEmpty()) + return QString::null; + + //the user chose to save as the current archive + //or wanted to create a new one with the same name + //no need to do anything + if (strFile == m_strArchName && m_bIsArchiveOpen) + return QString::null; + + QStringList extensions = dlg.currentFilterMimeType()->patterns(); + QStringList::Iterator it = extensions.begin(); + for ( ; it != extensions.end() && !strFile.endsWith( ( *it ).remove( '*' ) ); ++it ) + ; + + if ( it == extensions.end() ) + { + strFile += ArchiveFormatInfo::self()->defaultExtension( dlg.currentFilterMimeType()->name() ); + url.setPath( strFile ); + } + + kdDebug(1601) << "Trying to create an archive named " << strFile << endl; + fileExists = QFile::exists( strFile ); + if( fileExists ) + { + choice = KMessageBox::warningYesNoCancel(0, + i18n("Archive already exists. Do you wish to overwrite it?"), + i18n("Archive Already Exists"), i18n("Overwrite"), i18n("Do Not Overwrite")); + + if ( choice == KMessageBox::Yes ) + { + QFile::remove( strFile ); + break; + } + else if ( choice == KMessageBox::Cancel ) + { + return QString::null; + } + else + { + continue; + } + } + // if we got here, the file does not already exist. + if ( !ArkUtils::haveDirPermissions( url.directory() ) ) + { + KMessageBox::error( this, + i18n( "You do not have permission" + " to write to the directory %1" ).arg(url.directory() ) ); + return QString::null; + } + } // end of while loop + + return url; +} + +void +ArkWidget::file_new() +{ + QString strFile; + KURL url = getCreateFilename(i18n("Create New Archive") ); + strFile = url.path(); + if (!strFile.isEmpty()) + { + file_close(); + createArchive( strFile ); + } +} + +void +ArkWidget::extractOnlyOpenDone() +{ + bool done = action_extract(); + + // last extract dir is still set, but this is not a problem + if( !done ) + { + emit request_file_quit(); + } + +} + +void +ArkWidget::slotExtractDone(bool success) +{ + disconnect( arch, SIGNAL( sigExtract( bool ) ), + this, SLOT( slotExtractDone(bool) ) ); + ready(); + + if(m_extractList != 0) + delete m_extractList; + m_extractList = 0; + + if( m_fileListView ) // avoid race condition, don't do updates if application is exiting + { + m_fileListView->setUpdatesEnabled(true); + fixEnables(); + } + + if ( m_extractRemote ) + { + extractRemoteInitiateMoving( m_extractURL ); + } + else if( m_extractOnly ) + { + emit request_file_quit(); + } + + if ( success && ArkSettings::openDestinationFolder() ) + { + KRun::runURL( m_extractURL, "inode/directory" ); + } + + kdDebug(1601) << "-ArkWidget::slotExtractDone" << endl; +} + +void +ArkWidget::extractRemoteInitiateMoving( const KURL & target ) +{ + KURL srcDirURL; + KURL src; + QString srcDir; + + srcDir = m_extractRemoteTmpDir->name(); + srcDirURL.setPath( srcDir ); + + QDir dir( srcDir ); + dir.setFilter( QDir::All | QDir::Hidden ); + QStringList lst( dir.entryList() ); + lst.remove( "." ); + lst.remove( ".." ); + + KURL::List srcList; + for( QStringList::ConstIterator it = lst.begin(); it != lst.end() ; ++it) + { + src = srcDirURL; + src.addPath( *it ); + srcList.append( src ); + } + + m_extractURL.adjustPath( 1 ); + + KIO::CopyJob *job = KIO::copy( srcList, target, this ); + connect( job, SIGNAL(result(KIO::Job*)), + this, SLOT(slotExtractRemoteDone(KIO::Job*)) ); + + m_extractRemote = false; +} + +void +ArkWidget::slotExtractRemoteDone(KIO::Job *job) +{ + delete m_extractRemoteTmpDir; + m_extractRemoteTmpDir = NULL; + + if ( job->error() ) + job->showErrorDialog(); + + emit extractRemoteMovingDone(); + + if ( m_extractOnly ) + emit request_file_quit(); +} + + +void +ArkWidget::disableAll() // private +{ + emit disableAllActions(); + m_fileListView->setUpdatesEnabled(true); +} + +void +ArkWidget::fixEnables() // private +{ + emit fixActions(); //connected to the part +} + +void +ArkWidget::file_close() +{ + if ( isArchiveOpen() ) + { + closeArch(); + emit setWindowCaption( QString::null ); + emit removeOpenArk( m_strArchName ); + updateStatusTotals(); + updateStatusSelection(); + fixEnables(); + } + else + { + closeArch(); + } + + m_strArchName = QString::null; + m_url = KURL(); +} + + +KURL +ArkWidget::askToCreateRealArchive() +{ + // ask user whether to create a real archive from a compressed file + // returns filename if so + KURL url; + int choice = + KMessageBox::warningYesNo(0, i18n("You are currently working with a simple compressed file.\nWould you like to make it into an archive so that it can contain multiple files?\nIf so, you must choose a name for your new archive."), i18n("Warning"),i18n("Make Into Archive"),i18n("Do Not Make")); + if (choice == KMessageBox::Yes) + { + url = getCreateFilename( i18n("Create New Archive"), + QString::null, false ); + } + else + url.setPath( QString::null ); + return url; +} + +void +ArkWidget::createRealArchive( const QString & strFilename, const QStringList & filesToAdd ) +{ + Arch * newArch = getNewArchive( strFilename ); + busy( i18n( "Creating archive..." ) ); + if ( !newArch ) + return; + if ( !filesToAdd.isEmpty() ) + m_pTempAddList = new QStringList( filesToAdd ); + m_compressedFile = static_cast< CompressedFile * >( arch )->tempFileName(); + KURL u1, u2; + u1.setPath( m_compressedFile ); + m_createRealArchTmpDir = new KTempDir( tmpDir() + "create_real_arch" ); + u2.setPath( m_createRealArchTmpDir->name() + u1.fileName() ); + KIO::NetAccess::copy( u1, u2, this ); + m_compressedFile = "file:" + u2.path(); // AGAIN THE 5 SPACES Hack :-( + connect( newArch, SIGNAL( sigCreate( Arch *, bool, const QString &, int ) ), + this, SLOT( createRealArchiveSlotCreate( Arch *, bool, + const QString &, int ) ) ); + file_close(); + newArch->create(); +} + +void +ArkWidget::createRealArchiveSlotCreate( Arch * newArch, bool success, + const QString & fileName, int nbr ) +{ + slotCreate( newArch, success, fileName, nbr ); + + if ( !success ) + return; + + QStringList listForCompressedFile; + listForCompressedFile.append(m_compressedFile); + disableAll(); + + connect( newArch, SIGNAL( sigAdd( bool ) ), this, + SLOT( createRealArchiveSlotAddDone( bool ) ) ); + + newArch->addFile(listForCompressedFile); +} + +void +ArkWidget::createRealArchiveSlotAddDone( bool success ) +{ + kdDebug( 1601 ) << "createRealArchiveSlotAddDone+, success:" << success << endl; + disconnect( arch, SIGNAL( sigAdd( bool ) ), this, + SLOT( createRealArchiveSlotAddDone( bool ) ) ); + + m_createRealArchTmpDir->unlink(); + delete m_createRealArchTmpDir; + m_createRealArchTmpDir = NULL; + + + if ( !success ) + return; + + ready(); + + if ( m_pTempAddList == NULL ) + { + // now get the files to be added + // we don't know which files to add yet + action_add(); + } + else + { + connect( arch, SIGNAL( sigAdd( bool ) ), this, + SLOT( createRealArchiveSlotAddFilesDone( bool ) ) ); + // files were dropped in + addFile( m_pTempAddList ); + } +} + +void +ArkWidget::createRealArchiveSlotAddFilesDone( bool success ) +{ + //kdDebug( 1601 ) << "createRealArchiveSlotAddFilesDone+, success:" << success << endl; + disconnect( arch, SIGNAL( sigAdd( bool ) ), this, + SLOT( createRealArchiveSlotAddFilesDone( bool ) ) ); + delete m_pTempAddList; + m_pTempAddList = NULL; + emit createRealArchiveDone( success ); +} + + + + +// Action menu ///////////////////////////////////////////////////////// + +void +ArkWidget::action_add() +{ + if (m_bIsSimpleCompressedFile && (m_nNumFiles == 1)) + { + QString strFilename; + KURL url = askToCreateRealArchive(); + strFilename = url.path(); + if (!strFilename.isEmpty()) + { + createRealArchive(strFilename); + } + return; + } + + KFileDialog fileDlg( ":ArkAddDir", QString::null, this, "adddlg", true ); + fileDlg.setMode( KFile::Mode( KFile::Files | KFile::ExistingOnly ) ); + fileDlg.setCaption(i18n("Select Files to Add")); + + if(fileDlg.exec()) + { + KURL::List addList; + addList = fileDlg.selectedURLs(); + QStringList * list = new QStringList(); + //Here we pre-calculate the end of the list + KURL::List::ConstIterator endList = addList.end(); + for (KURL::List::ConstIterator it = addList.begin(); it != endList; ++it) + list->append( KURL::decode_string( (*it).url() ) ); + + if ( list->count() > 0 ) + { + if ( m_bIsSimpleCompressedFile && list->count() > 1 ) + { + QString strFilename; + KURL url = askToCreateRealArchive(); + strFilename = url.path(); + if (!strFilename.isEmpty()) + { + createRealArchive(strFilename); + } + delete list; + return; + } + addFile( list ); + } + delete list; + } +} + +void +ArkWidget::addFile(QStringList *list) +{ + if ( !ArkUtils::diskHasSpace( tmpDir(), ArkUtils::getSizes( list ) ) ) + return; + + disableAll(); + busy( i18n( "Adding files..." ) ); + // if they are URLs, we have to download them, replace the URLs + // with filenames, and remember to delete the temporaries later. + for (QStringList::Iterator it = list->begin(); it != list->end(); ++it) + { + QString str = *it; + *it = toLocalFile(KURL(str)).prettyURL(); + + } + + connect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( slotAddDone( bool ) ) ); + arch->addFile( ( *list ) ); +} + +void +ArkWidget::action_add_dir() +{ + KURL u = KDirSelectDialog::selectDirectory( ":ArkAddDir", + false, this, + i18n("Select Folder to Add")); + + QString dir = KURL::decode_string( u.url(-1) ); + if ( !dir.isEmpty() ) + { + busy( i18n( "Adding folder..." ) ); + disableAll(); + u = toLocalFile(u); + connect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( slotAddDone( bool ) ) ); + arch->addDir( u.prettyURL() ); + } + +} + +void +ArkWidget::slotAddDone(bool _bSuccess) +{ + disconnect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( slotAddDone( bool ) ) ); + m_fileListView->setUpdatesEnabled(true); + m_fileListView->triggerUpdate(); + ready(); + + if (_bSuccess) + { + m_modified = true; + //simulate reload + KURL u; + u.setPath( arch->fileName() ); + file_close(); + file_open( u ); + emit setWindowCaption( u.path() ); + } + removeDownloadedFiles(); + fixEnables(); +} + + + +KURL +ArkWidget::toLocalFile( const KURL& url ) +{ + KURL localURL = url; + + if(!url.isLocalFile()) + { + QString strURL = url.prettyURL(); + + QString tempfile = tmpDir(); + tempfile += strURL.right(strURL.length() - strURL.findRev("/") - 1); + deleteAfterUse(tempfile); // remember for deletion + KURL tempurl; tempurl.setPath( tempfile ); + if( !KIO::NetAccess::dircopy(url, tempurl, this) ) + return KURL(); + localURL = tempfile; + } + return localURL; +} + +void +ArkWidget::deleteAfterUse( const QString& path ) +{ + mpDownloadedList.append( path ); +} + +void +ArkWidget::removeDownloadedFiles() +{ + if (!mpDownloadedList.isEmpty()) + { + // It is necessary to remove those files even if tmpDir() is getting deleted: + // not all files in mpDownloadedList are from tmpDir() - e.g. when using --tempfile + // But of course we could decide to not add files from tmpDir() into mpDownloadedList. + QStringList::ConstIterator it = mpDownloadedList.begin(); + QStringList::ConstIterator end = mpDownloadedList.end(); + for ( ; it != end ; ++it ) + QFile::remove( *it ); + mpDownloadedList.clear(); + } +} + +void +ArkWidget::action_delete() +{ + // remove selected files and create a list to send to the archive + // Warn the user if he/she/it tries to delete a directory entry in + // a tar file - it actually deletes the contents of the directory + // as well. + + if (m_fileListView->isSelectionEmpty()) + { + return; // shouldn't happen - delete should have been disabled! + } + + QStringList list = m_fileListView->selectedFilenames(); + + // ask for confirmation + if ( KMessageBox::warningContinueCancelList( this, + i18n( "Do you really want to delete the selected items?" ), + list, + QString::null, + KStdGuiItem::del(), + "confirmDelete" ) + != KMessageBox::Continue) + { + return; + } + + // Remove the entries from the list view + QListViewItemIterator it( m_fileListView ); + while ( it.current() ) + { + if ( it.current()->isSelected() ) + delete *it; + else + ++it; + } + + disableAll(); + busy( i18n( "Removing..." ) ); + connect( arch, SIGNAL( sigDelete( bool ) ), this, SLOT( slotDeleteDone( bool ) ) ); + arch->remove(&list); + kdDebug(1601) << "-ArkWidget::action_delete" << endl; +} + +void +ArkWidget::slotDeleteDone(bool _bSuccess) +{ + disconnect( arch, SIGNAL( sigDelete( bool ) ), this, SLOT( slotDeleteDone( bool ) ) ); + kdDebug(1601) << "+ArkWidget::slotDeleteDone" << endl; + m_fileListView->setUpdatesEnabled(true); + m_fileListView->triggerUpdate(); + if (_bSuccess) + { + m_modified = true; + updateStatusTotals(); + updateStatusSelection(); + } + // disable the select all and extract options if there are no files left + fixEnables(); + ready(); + kdDebug(1601) << "-ArkWidget::slotDeleteDone" << endl; + +} + + + +void +ArkWidget::slotOpenWith() +{ + connect( arch, SIGNAL( sigExtract( bool ) ), this, + SLOT( openWithSlotExtractDone( bool ) ) ); + + showCurrentFile(); +} + +void +ArkWidget::openWithSlotExtractDone( bool success ) +{ + disconnect( arch, SIGNAL( sigExtract( bool ) ), this, + SLOT( openWithSlotExtractDone( bool ) ) ); + + if ( success ) + { + KURL::List list; + list.append(m_viewURL); + KOpenWithDlg l( list, i18n("Open with:"), QString::null, (QWidget*)0L); + if ( l.exec() ) + { + KService::Ptr service = l.service(); + if ( !!service ) + { + KRun::run( *service, list ); + } + else + { + QString exec = l.text(); + exec += " %f"; + KRun::run( exec, list ); + } + } + } + + if( m_fileListView ) + { + m_fileListView->setUpdatesEnabled(true); + fixEnables(); + } +} + + +void +ArkWidget::prepareViewFiles( const QStringList & fileList ) +{ + QString destTmpDirectory; + destTmpDirectory = tmpDir(); + + // Make sure to delete previous file already there... + for(QStringList::ConstIterator it = fileList.begin(); + it != fileList.end(); ++it) + QFile::remove(destTmpDirectory + *it); + + m_viewList = new QStringList( fileList ); + arch->unarchFile( m_viewList, destTmpDirectory, true); +} + +bool +ArkWidget::reportExtractFailures( const QString & _dest, QStringList *_list ) +{ + // reports extract failures when Overwrite = False and the file + // exists already in the destination directory. + // If list is null, it means we are extracting all files. + // Otherwise the list contains the files we are to extract. + + bool redoExtraction = false; + QString strFilename; + + QStringList list = *_list; + QStringList filesExisting = existingFiles( _dest, list ); + + int numFilesToReport = filesExisting.count(); + + // now report on the contents + holdBusy(); + if (numFilesToReport != 0) + { + redoExtraction = ( KMessageBox::Cancel == KMessageBox::warningContinueCancelList( this, + i18n( "The following files will not be extracted\nbecause they " + "already exist:" ), filesExisting ) ); + } + resumeBusy(); + return redoExtraction; +} + +QStringList +ArkWidget::existingFiles( const QString & _dest, QStringList & _list ) +{ + QString strFilename, tmp; + + QString strDestDir = _dest; + + // make sure the destination directory has a / at the end. + if ( !strDestDir.endsWith( "/" ) ) + { + strDestDir += '/'; + } + + if (_list.isEmpty()) + { + _list = m_fileListView->fileNames(); + } + + QStringList existingFiles; + // now the list contains all the names we must verify. + for (QStringList::Iterator it = _list.begin(); it != _list.end(); ++it) + { + strFilename = *it; + QString strFullName = strDestDir + strFilename; + + // if the filename ends with an "/", it means it is a directory + if ( QFile::exists( strFullName ) && !strFilename.endsWith("/") ) + { + existingFiles.append( strFilename ); + } + } + return existingFiles; +} + + + + + +bool +ArkWidget::action_extract() +{ + KURL fileToExtract; + fileToExtract.setPath( arch->fileName() ); + + //before we start, make sure the archive is still there + if (!KIO::NetAccess::exists( fileToExtract.prettyURL(), true, this ) ) + { + KMessageBox::error(0, i18n("The archive to extract from no longer exists.")); + return false; + } + + //if more than one entry in the archive is root level, suggest a path prefix + QString prefix = m_fileListView->childCount() > 1 ? + QChar( '/' ) + guessName( realURL() ) + : QString(); + + // Should the extraction dialog show an option for extracting only selected files? + bool enableSelected = ( m_nNumSelectedFiles > 0 ) && + ( m_fileListView->totalFiles() > 1); + + QString base = ArkSettings::extractionHistory().isEmpty()? + QString() : ArkSettings::extractionHistory().first(); + if ( base.isEmpty() ) + { + // Perhaps the KDE Documents folder is a better choice? + base = QDir::homeDirPath(); + } + + // Default URL shown in the extraction dialog; + KURL defaultDir( base ); + + if ( m_extractOnly ) + { + defaultDir = KURL::fromPathOrURL( QDir::currentDirPath() ); + } + + ExtractionDialog *dlg = new ExtractionDialog( this, 0, enableSelected, defaultDir, prefix, m_url.fileName() ); + + bool bRedoExtract = false; + + // list of files to be extracted + m_extractList = new QStringList; + if ( dlg->exec() ) + { + //m_extractURL will always be the location the user chose to + //m_extract to, whether local or remote + m_extractURL = dlg->extractionDirectory(); + + //extractDir will either be the real, local extract dir, + //or in case of a extract to remote location, a local tmp dir + QString extractDir; + + if ( !m_extractURL.isLocalFile() ) + { + m_extractRemoteTmpDir = new KTempDir( tmpDir() + "extremote" ); + m_extractRemoteTmpDir->setAutoDelete( true ); + + extractDir = m_extractRemoteTmpDir->name(); + m_extractRemote = true; + if ( m_extractRemoteTmpDir->status() != 0 ) + { + kdWarning( 1601 ) << "Unable to create temporary directory" << extractDir << endl; + m_extractRemote = false; + delete dlg; + return false; + } + } + else + { + extractDir = m_extractURL.path(); + } + + // if overwrite is false, then we need to check for failure of + // extractions. + bool bOvwrt = ArkSettings::extractOverwrite(); + + if ( dlg->selectedOnly() == false ) + { + if (!bOvwrt) // send empty list to indicate we're extracting all + { + bRedoExtract = reportExtractFailures(extractDir, m_extractList); + } + + if (!bRedoExtract) // if the user's OK with those failures, go ahead + { + // unless we have no space! + if ( ArkUtils::diskHasSpace( extractDir, m_nSizeOfFiles ) ) + { + disableAll(); + busy( i18n( "Extracting..." ) ); + connect( arch, SIGNAL( sigExtract( bool ) ), this, SLOT( slotExtractDone(bool) ) ); + arch->unarchFile(0, extractDir); + } + } + } + else + { + KIO::filesize_t nTotalSize = 0; + // make a list to send to unarchFile + QStringList selectedFiles = m_fileListView->selectedFilenames(); + for ( QStringList::const_iterator it = selectedFiles.constBegin(); + it != selectedFiles.constEnd(); + ++it ) + { + m_extractList->append( QFile::encodeName( *it ) ); + } + + if (!bOvwrt) + { + bRedoExtract = reportExtractFailures(extractDir, m_extractList); + } + if (!bRedoExtract) + { + if (ArkUtils::diskHasSpace(extractDir, nTotalSize)) + { + disableAll(); + busy( i18n( "Extracting..." ) ); + connect( arch, SIGNAL( sigExtract( bool ) ), + this, SLOT( slotExtractDone(bool) ) ); + arch->unarchFile(m_extractList, extractDir); // extract selected files + } + } + } + + delete dlg; + } + else + { + delete dlg; + return false; + } + + // user might want to change some options or the selection... + if (bRedoExtract) + { + return action_extract(); + } + + return true; +} + +void +ArkWidget::action_edit() +{ + // begin an edit. This is like a view, but once the process exits, + // the file is put back into the archive. If the user tries to quit or + // close the archive, there will be a warning that any changes to the + // files open under "Edit" will be lost unless the archive remains open. + // [hmm, does that really make sense? I'll leave it for now.] + + busy( i18n( "Extracting..." ) ); + connect( arch, SIGNAL( sigExtract( bool ) ), this, + SLOT( editSlotExtractDone() ) ); + showCurrentFile(); +} + +void +ArkWidget::editSlotExtractDone() +{ + disconnect( arch, SIGNAL( sigExtract( bool ) ), + this, SLOT( editSlotExtractDone() ) ); + ready(); + editStart(); + + // avoid race condition, don't do updates if application is exiting + if( m_fileListView ) + { + m_fileListView->setUpdatesEnabled(true); + fixEnables(); + } +} + +void +ArkWidget::editStart() +{ + kdDebug(1601) << "Edit in progress..." << endl; + KURL::List list; + // edit will be in progress until the KProcess terminates. + KOpenWithDlg l( list, i18n("Edit with:"), + QString::null, (QWidget*)0L ); + if ( l.exec() ) + { + KProcess *kp = new KProcess; + + *kp << l.text() << m_strFileToView; + connect( kp, SIGNAL(processExited(KProcess *)), + this, SLOT(slotEditFinished(KProcess *)) ); + if ( kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false ) + { + KMessageBox::error(0, i18n("Trouble editing the file...")); + } + } +} + +void +ArkWidget::slotEditFinished(KProcess *kp) +{ + kdDebug(1601) << "+ArkWidget::slotEditFinished" << endl; + connect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( editSlotAddDone( bool ) ) ); + delete kp; + QStringList list; + // now put the file back into the archive. + list.append(m_strFileToView); + disableAll(); + + + // BUG: this puts any edited file back at the archive toplevel... + // there's only one file, and it's in the temp directory. + // If the filename has more than three /'s then we should + // change to the first level directory so that the paths + // come out right. + QStringList::Iterator it = list.begin(); + QString filename = *it; + QString path; + if (filename.contains('/') > 3) + { + kdDebug(1601) << "Filename is originally: " << filename << endl; + int i = filename.find('/', 5); + path = filename.left(1+i); + kdDebug(1601) << "Changing to dir: " << path << endl; + QDir::setCurrent(path); + filename = filename.right(filename.length()-i-1); + // HACK!! We need a relative path. If I have "file:", it + // will look like an absolute path. So five spaces here to get + // chopped off later.... + filename = " " + filename; + *it = filename; + } + + busy( i18n( "Readding edited file..." ) ); + arch->addFile( list ); + + kdDebug(1601) << "-ArkWidget::slotEditFinished" << endl; +} + +void +ArkWidget::editSlotAddDone( bool success ) +{ + ready(); + disconnect( arch, SIGNAL( sigAdd( bool ) ), this, SLOT( editSlotAddDone( bool ) ) ); + slotAddDone( success ); +} + +void +ArkWidget::action_view() +{ + connect( arch, SIGNAL( sigExtract( bool ) ), this, + SLOT( viewSlotExtractDone( bool ) ) ); + busy( i18n( "Extracting file to view" ) ); + showCurrentFile(); +} + +void +ArkWidget::viewSlotExtractDone( bool success ) +{ + if ( success ) + { + chmod( QFile::encodeName( m_strFileToView ), 0400 ); + bool view = true; + + if ( ArkSettings::useIntegratedViewer() ) + { + ArkViewer * viewer = new ArkViewer( this, "viewer" ); + + if ( !viewer->view( m_viewURL ) ) + { + QString text = i18n( "The internal viewer is not able to display this file. Would you like to view it using an external program?" ); + view = ( KMessageBox::warningYesNo( this, text, QString::null, i18n("View Externally"), i18n("Do Not View") ) == KMessageBox::Yes ); + + if ( view ) + viewInExternalViewer( this, m_viewURL ); + } + } + else + { + viewInExternalViewer( this, m_viewURL ); + } + } + + disconnect( arch, SIGNAL( sigExtract( bool ) ), this, + SLOT( viewSlotExtractDone( bool ) ) ); + + delete m_viewList; + + // avoid race condition, don't do updates if application is exiting + if( m_fileListView ) + { + m_fileListView->setUpdatesEnabled(true); + fixEnables(); + } + ready(); +} + + +void +ArkWidget::showCurrentFile() +{ + if ( !m_fileListView->currentItem() ) + return; + + QString name = m_fileListView->currentItem()->fileName(); + + QString fullname = tmpDir(); + fullname += name; + + if(fullname.contains("../")) + fullname.remove("../"); + + //Convert the QString filename to KURL to escape the bad characters + m_viewURL.setPath(fullname); + + m_strFileToView = fullname; + kdDebug(1601) << "File to be extracted: " << m_viewURL << endl; + + QStringList extractList; + extractList.append(name); + + if (ArkUtils::diskHasSpace( tmpDir(), m_fileListView->currentItem()->fileSize() ) ) + { + disableAll(); + prepareViewFiles( extractList ); + } +} + +// Popup ///////////////////////////////////////////////////////////// + +void +ArkWidget::setArchivePopupEnabled( bool b ) +{ + m_bArchivePopupEnabled = b; +} + +void +ArkWidget::doPopup( QListViewItem *pItem, const QPoint &pPoint, int nCol ) // slot +// do the right-click popup menus +{ + if ( nCol == 0 || !m_bArchivePopupEnabled ) + { + m_fileListView->setCurrentItem(pItem); + m_fileListView->setSelected(pItem, true); + emit signalFilePopup( pPoint ); + } + else // clicked anywhere else but the name column + { + emit signalArchivePopup( pPoint ); + } +} + + +void +ArkWidget::viewFile( QListViewItem* item ) // slot +// show contents when double click +{ + // Preview, if it is a file + if ( item->childCount() == 0) + emit action_view(); + else // Change opened state if it is a dir + item->setOpen( !item->isOpen() ); +} + + +// Service functions ///////////////////////////////////////////////// + +void +ArkWidget::slotSelectionChanged() +{ + updateStatusSelection(); +} + + +//////////////////////////////////////////////////////////////////// +//////////////////// updateStatusSelection ///////////////////////// +//////////////////////////////////////////////////////////////////// + +void +ArkWidget::updateStatusSelection() +{ + m_nNumSelectedFiles = m_fileListView->selectedFilesCount(); + m_nSizeOfSelectedFiles = m_fileListView->selectedSize(); + + QString strInfo; + if (m_nNumSelectedFiles == 0) + { + strInfo = i18n("0 files selected"); + } + else if (m_nNumSelectedFiles != 1) + { + strInfo = i18n("%1 files selected %2") + .arg(KGlobal::locale()->formatNumber(m_nNumSelectedFiles, 0)) + .arg(KIO::convertSize(m_nSizeOfSelectedFiles)); + } + else + { + strInfo = i18n("1 file selected %2") + .arg(KIO::convertSize(m_nSizeOfSelectedFiles)); + } + + emit setStatusBarSelectedFiles(strInfo); + fixEnables(); +} + + +// Drag & Drop //////////////////////////////////////////////////////// + +void +ArkWidget::dragMoveEvent(QDragMoveEvent *e) +{ + if (KURLDrag::canDecode(e) && !m_bDropSourceIsSelf) + { + e->accept(); + } +} + + +void +ArkWidget::dropEvent(QDropEvent* e) +{ + kdDebug( 1601 ) << "+ArkWidget::dropEvent" << endl; + + KURL::List list; + + if ( KURLDrag::decode( e, list ) ) + { + QStringList urlList = list.toStringList(); + dropAction( urlList ); + } + + kdDebug(1601) << "-dropEvent" << endl; +} + +////////////////////////////////////////////////////////////////////// +///////////////////////// dropAction ///////////////////////////////// +////////////////////////////////////////////////////////////////////// + +void +ArkWidget::dropAction( QStringList & list ) +{ + // Called by dropEvent + + // The possibilities treated are as follows: + // drop a regular file into a window with + // * an open archive - add it. + // * no open archive - ask user to open an archive for adding file or cancel + // drop an archive into a window with + // * an open archive - ask user to add to open archive or to open it freshly + // * no open archive - open it + // drop many files (can be a mix of archives and regular) into a window with + // * an open archive - add them. + // * no open archive - ask user to open an archive for adding files or cancel + + // and don't forget about gzip files. + + QString str; + QStringList urls; // to be sent to addFile + + str = list.first(); + + if ( 1 == list.count() && + ( UNKNOWN_FORMAT != ArchiveFormatInfo::self()->archTypeByExtension( str ) ) ) + { + // if there's one thing being dropped and it's an archive + if (isArchiveOpen()) + { + // ask them if they want to add the dragged archive to the current + // one or open it as the new current archive + int nRet = KMessageBox::warningYesNoCancel(this, + i18n("Do you wish to add this to the current archive or open it as a new archive?"), + QString::null, + i18n("&Add"), i18n("&Open")); + if (KMessageBox::Yes == nRet) // add it + { + if (m_bIsSimpleCompressedFile && (m_nNumFiles == 1)) + { + QString strFilename; + KURL url = askToCreateRealArchive(); + strFilename = url.path(); + if (!strFilename.isEmpty()) + { + createRealArchive( strFilename, list ); + } + return; + } + + addFile( &list ); + return; + } + else if (KMessageBox::Cancel == nRet) // cancel + { + return; + } + } + + // if I made it here, there's either no archive currently open + // or they selected "Open". + KURL url = str; + + emit openURLRequest( url ); + } + else + { + if (isArchiveOpen()) + { + if (m_bIsSimpleCompressedFile && (m_nNumFiles == 1)) + { + QString strFilename; + KURL url = askToCreateRealArchive(); + strFilename = url.path(); + if (!strFilename.isEmpty()) + { + createRealArchive( strFilename, list ); + } + return; + } + // add the files to the open archive + addFile( &list ); + } + else + { + // no archive is open, so we ask if the user wants to open one + // for this/these file/files. + + QString str; + str = (list.count() > 1) + ? i18n("There is no archive currently open. Do you wish to create one now for these files?") + : i18n("There is no archive currently open. Do you wish to create one now for this file?"); + int nRet = KMessageBox::warningYesNo(this, str, QString::null, i18n("Create Archive"), i18n("Do Not Create")); + if (nRet == KMessageBox::Yes) // yes + { + file_new(); + if (isArchiveOpen()) // they still could have canceled! + { + addFile( &list ); + } + } + // else // basically a cancel on the drop. + } + } +} + +void +ArkWidget::startDrag( const QStringList & fileList ) +{ + mDragFiles = fileList; + connect( arch, SIGNAL( sigExtract( bool ) ), this, SLOT( startDragSlotExtractDone( bool ) ) ); + prepareViewFiles( fileList ); +} + +void +ArkWidget::startDragSlotExtractDone( bool ) +{ + disconnect( arch, SIGNAL( sigExtract( bool ) ), + this, SLOT( startDragSlotExtractDone( bool ) ) ); + + KURL::List list; + + for (QStringList::Iterator it = mDragFiles.begin(); it != mDragFiles.end(); ++it) + { + KURL url; + url.setPath( tmpDir() + *it ); + list.append( url ); + } + + KURLDrag *drg = new KURLDrag(list, m_fileListView->viewport(), "Ark Archive Drag" ); + m_bDropSourceIsSelf = true; + drg->dragCopy(); + m_bDropSourceIsSelf = false; +} + + +void +ArkWidget::arkWarning(const QString& msg) +{ + KMessageBox::information(this, msg); +} + +void +ArkWidget::createFileListView() +{ + kdDebug(1601) << "ArkWidget::createFileListView" << endl; + if ( !m_fileListView ) + { + m_fileListView = new FileListView(this); + + connect( m_fileListView, SIGNAL( selectionChanged() ), + this, SLOT( slotSelectionChanged() ) ); + connect( m_fileListView, SIGNAL( rightButtonPressed(QListViewItem *, const QPoint &, int) ), + this, SLOT(doPopup(QListViewItem *, const QPoint &, int))); + connect( m_fileListView, SIGNAL( startDragRequest( const QStringList & ) ), + this, SLOT( startDrag( const QStringList & ) ) ); + connect( m_fileListView, SIGNAL( executed(QListViewItem *, const QPoint &, int ) ), + this, SLOT( viewFile(QListViewItem*) ) ); + connect( m_fileListView, SIGNAL( returnPressed(QListViewItem * ) ), + this, SLOT( viewFile(QListViewItem*) ) ); + } + m_fileListView->clear(); +} + + +Arch * ArkWidget::getNewArchive( const QString & _fileName, const QString& _mimetype ) +{ + Arch * newArch = 0; + + QString type = _mimetype.isNull()? KMimeType::findByURL( KURL::fromPathOrURL(_fileName) )->name() : _mimetype; + ArchType archtype = ArchiveFormatInfo::self()->archTypeForMimeType(type); + kdDebug( 1601 ) << "archtype is recognised as: " << archtype << endl; + if(0 == (newArch = Arch::archFactory(archtype, this, + _fileName, _mimetype))) + { + KMessageBox::error(this, i18n("Unknown archive format or corrupted archive") ); + emit request_file_quit(); + return NULL; + } + + if (!newArch->archUtilityIsAvailable()) + { + KMessageBox::error(this, i18n("The utility %1 is not in your PATH.\nPlease install it or contact your system administrator.").arg(newArch->getArchUtility())); + return NULL; + } + + connect( newArch, SIGNAL(headers(const ColumnList&)), + m_fileListView, SLOT(setHeaders(const ColumnList&))); + + m_archType = archtype; + m_fileListView->setUpdatesEnabled(true); + return newArch; +} + +////////////////////////////////////////////////////////////////////// +////////////////////// createArchive ///////////////////////////////// +////////////////////////////////////////////////////////////////////// + + +bool +ArkWidget::createArchive( const QString & _filename ) +{ + Arch * newArch = getNewArchive( _filename ); + if ( !newArch ) + return false; + + busy( i18n( "Creating archive..." ) ); + connect( newArch, SIGNAL(sigCreate(Arch *, bool, const QString &, int) ), + this, SLOT(slotCreate(Arch *, bool, const QString &, int) ) ); + + newArch->create(); + return true; +} + +void +ArkWidget::slotCreate(Arch * _newarch, bool _success, const QString & _filename, int) +{ + kdDebug( 1601 ) << k_funcinfo << endl; + disconnect( _newarch, SIGNAL( sigCreate( Arch *, bool, const QString &, int ) ), + this, SLOT(slotCreate(Arch *, bool, const QString &, int) ) ); + ready(); + if ( _success ) + { + //file_close(); already called in ArkWidget::file_new() + m_strArchName = _filename; + // for the hack in compressedfile; needed when creating a compressedfile + // then directly adding a file + KURL u; + u.setPath( _filename ); + setRealURL( u ); + + emit setWindowCaption( _filename ); + emit addRecentURL( u ); + createFileListView(); + m_fileListView->show(); + m_bIsArchiveOpen = true; + arch = _newarch; + m_bIsSimpleCompressedFile = + (m_archType == COMPRESSED_FORMAT); + fixEnables(); + } + else + { + KMessageBox::error(this, i18n("An error occurred while trying to create the archive.") ); + } + emit createDone( _success ); +} + +////////////////////////////////////////////////////////////////////// +//////////////////////// openArchive ///////////////////////////////// +////////////////////////////////////////////////////////////////////// + +void +ArkWidget::openArchive( const QString & _filename ) +{ + Arch *newArch = 0; + ArchType archtype; + ArchiveFormatInfo * info = ArchiveFormatInfo::self(); + if ( m_openAsMimeType.isNull() ) + { + archtype = info->archTypeForURL( m_url ); + if ( info->wasUnknownExtension() ) + { + ArchiveFormatDlg * dlg = new ArchiveFormatDlg( this, info->findMimeType( m_url ) ); + if ( !dlg->exec() == QDialog::Accepted ) + { + emit setWindowCaption( QString::null ); + emit removeRecentURL( m_realURL ); + delete dlg; + file_close(); + return; + } + m_openAsMimeType = dlg->mimeType(); + archtype = info->archTypeForMimeType( m_openAsMimeType ); + delete dlg; + } + } + else + { + archtype = info->archTypeForMimeType( m_openAsMimeType ); + } + + kdDebug( 1601 ) << "m_openAsMimeType is: " << m_openAsMimeType << endl; + if( 0 == ( newArch = Arch::archFactory( archtype, this, + _filename, m_openAsMimeType) ) ) + { + emit setWindowCaption( QString::null ); + emit removeRecentURL( m_realURL ); + KMessageBox::error( this, i18n("Unknown archive format or corrupted archive") ); + return; + } + + if (!newArch->unarchUtilityIsAvailable()) + { + KMessageBox::error(this, i18n("The utility %1 is not in your PATH.\nPlease install it or contact your system administrator.").arg(newArch->getUnarchUtility())); + return; + } + + m_archType = archtype; + + connect( newArch, SIGNAL(sigOpen(Arch *, bool, const QString &, int)), + this, SLOT(slotOpen(Arch *, bool, const QString &,int)) ); + connect( newArch, SIGNAL(headers(const ColumnList&)), + m_fileListView, SLOT(setHeaders(const ColumnList&))); + + disableAll(); + + busy( i18n( "Opening the archive..." ) ); + m_fileListView->setUpdatesEnabled( false ); + arch = newArch; + newArch->open(); + emit addRecentURL( m_url ); +} + +void +ArkWidget::slotOpen( Arch * /* _newarch */, bool _success, const QString & _filename, int ) +{ + ready(); + m_fileListView->setUpdatesEnabled(true); + m_fileListView->triggerUpdate(); + + m_fileListView->show(); + + if ( _success ) + { + QFileInfo fi( _filename ); + QString path = fi.dirPath( true ); + + if ( !fi.isWritable() ) + { + arch->setReadOnly(true); + KMessageBox::information(this, i18n("This archive is read-only. If you want to save it under a new name, go to the File menu and select Save As."), i18n("Information"), "ReadOnlyArchive"); + } + updateStatusTotals(); + m_bIsArchiveOpen = true; + m_bIsSimpleCompressedFile = ( m_archType == COMPRESSED_FORMAT ); + + if ( m_extractOnly ) + { + extractOnlyOpenDone(); + return; + } + m_fileListView->adjustColumns(); + emit addOpenArk( _filename ); + } + else + { + emit removeRecentURL( m_realURL ); + emit setWindowCaption( QString::null ); + KMessageBox::error( this, i18n( "An error occurred while trying to open the archive %1" ).arg( _filename ) ); + + if ( m_extractOnly ) + emit request_file_quit(); + } + + fixEnables(); + emit openDone( _success ); +} + + +void ArkWidget::slotShowSearchBarToggled( bool b ) +{ + if ( b ) + { + m_searchToolBar->show(); + ArkSettings::setShowSearchBar( true ); + } + else + { + m_searchToolBar->hide(); + ArkSettings::setShowSearchBar( false ); + } +} + +/** + * Show Settings dialog. + */ +void ArkWidget::showSettings(){ + if(KConfigDialog::showDialog("settings")) + return; + + KConfigDialog *dialog = new KConfigDialog(this, "settings", ArkSettings::self()); + + General* genPage = new General(0, "General"); + dialog->addPage(genPage, i18n("General"), "ark", i18n("General Settings")); + dialog->addPage(new Addition(0, "Addition"), i18n("Addition"), "ark_addfile", i18n("File Addition Settings")); + dialog->addPage(new Extraction(0, "Extraction"), i18n("Extraction"), "ark_extract", i18n("Extraction Settings")); + + KTrader::OfferList offers; + + offers = KTrader::self()->query( "KonqPopupMenu/Plugin", "Library == 'libarkplugin'" ); + + if ( offers.isEmpty() ) + genPage->kcfg_KonquerorIntegration->setEnabled( false ); + else + genPage->konqIntegrationLabel->setText( QString::null ); + + dialog->show(); +} + +#include "arkwidget.moc" diff --git a/ark/arkwidget.h b/ark/arkwidget.h new file mode 100644 index 0000000..d64bbd0 --- /dev/null +++ b/ark/arkwidget.h @@ -0,0 +1,318 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2003: Georg Robbers + 2002: Helio Chissini de Castro + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1997-1999: Rob Palmbos palm9744@kettering.edu + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARKWIDGET_H +#define ARKWIDGET_H + +#include +#include + +#include +#include "arch.h" + +class QPoint; +class QString; +class QStringList; +class QLabel; +class QListViewItem; +class QDragMoveEvent; +class QDropEvent; + +class KPopupMenu; +class KProcess; +class KURL; +class KRun; +class KTempFile; +class KTempDir; +class KToolBar; + +class FileListView; +class SearchBar; + + +class ArkWidget : public QVBox +{ + Q_OBJECT +public: + ArkWidget( QWidget *parent=0, const char *name=0 ); + virtual ~ArkWidget(); + + bool isArchiveOpen() const { return m_bIsArchiveOpen; } + int getNumFilesInArchive() const { return m_nNumFiles; } + + int getArkInstanceId() const { return m_arkInstanceId; } + void setArkInstanceId( int aid ) { m_arkInstanceId = aid; } + + void cleanArkTmpDir(); + virtual QString getArchName() const { return m_strArchName; } + + const KURL& realURL() const { return m_realURL; } + void setRealURL( const KURL& url ) { m_realURL = url; } + + QString tmpDir() const { return m_tmpDir ? m_tmpDir->name() : QString::null; } + + FileListView * fileList() const { return m_fileListView; } + SearchBar * searchBar() const { return m_searchBar; } + Arch * archive() const { return arch; } + ArchType archiveType() const { return m_archType; } + int numSelectedFiles() const { return m_nNumSelectedFiles; } + + /** + * Miscellaneous tasks involved in closing an archive. + */ + void closeArch(); + + virtual void setExtractOnly(bool extOnly) { m_extractOnly = extOnly; } + virtual void deleteAfterUse( const QString& path ); + bool allowedArchiveName( const KURL & u ); + bool file_save_as( const KURL & u ); + virtual KURL getSaveAsFileName(); + virtual void setOpenAsMimeType( const QString & mimeType ); + QString & openAsMimeType(){ return m_openAsMimeType; } + void prepareViewFiles( const QStringList & fileList ); + virtual void setArchivePopupEnabled( bool b ); + + virtual void extractTo( const KURL & targetDirectory, const KURL & archive, bool bGuessName ); + virtual bool addToArchive( const KURL::List & filesToAdd, const KURL & archive = KURL() ); + void convertTo( const KURL & u ); + + bool isModified() { return m_modified; } + void setModified( bool b ) { m_modified = b; } + +public slots: + void file_open( const KURL& url); + virtual void file_close(); + virtual void file_new(); + void slotShowSearchBarToggled( bool b ); + void showSettings(); + +protected slots: + void action_add(); + void action_add_dir(); + void action_view(); + void action_delete(); + bool action_extract(); + void slotOpenWith(); + void action_edit(); + + void doPopup(QListViewItem *, const QPoint &, int); // right-click menus + void viewFile(QListViewItem*); // doubleClick view files + + void slotSelectionChanged(); + void slotOpen(Arch *, bool, const QString &, int); + void slotCreate(Arch *, bool, const QString &, int); + void slotDeleteDone(bool); + void slotExtractDone(bool); + void slotExtractRemoteDone(KIO::Job *job); + void slotAddDone(bool); + void slotEditFinished(KProcess *); +signals: + void openURLRequest( const KURL & url ); + void request_file_quit(); + void setBusy( const QString & ); + void setReady(); + void fixActions(); + void disableAllActions(); + void signalFilePopup( const QPoint & pPoint ); + void signalArchivePopup( const QPoint & pPoint ); + void setStatusBarText( const QString & text ); + void setStatusBarSelectedFiles( const QString & text ); + void removeRecentURL( const KURL & url ); + void addRecentURL( const KURL & url ); + void setWindowCaption( const QString &caption ); + void removeOpenArk( const KURL & ); + void addOpenArk( const KURL & ); + void createDone( bool ); + void openDone( bool ); + void createRealArchiveDone( bool ); + void extractRemoteMovingDone(); + +protected: + + // DND + void dragMoveEvent(QDragMoveEvent *e); + void dropEvent(QDropEvent* event); + void dropAction(QStringList & list); + +private: // methods + // disabling/enabling of buttons and menu items + void fixEnables(); + + // disable all (temporarily, during operations) + void disableAll(); + void updateStatusSelection(); + void updateStatusTotals(); + void addFile(QStringList *list); + void removeDownloadedFiles(); + + // make sure that str is a local file/dir + KURL toLocalFile(const KURL& url); + + // ask user whether to create a real archive from a compressed file + // returns filename if so. Otherwise, empty. + KURL askToCreateRealArchive(); + Arch * getNewArchive( const QString & _fileName, const QString& _mimetype = QString() ); + void createRealArchive( const QString &strFilename, + const QStringList & filesToAdd = QStringList() ); + KURL getCreateFilename( const QString & _caption, + const QString & _defaultMimeType = QString::null, + bool allowCompressed = true, + const QString & _suggestedName = QString::null ); + + bool reportExtractFailures(const QString & _dest, QStringList *_list); + QStringList existingFiles( const QString & _dest, QStringList & _list ); + + void extractOnlyOpenDone(); + void extractRemoteInitiateMoving( const KURL & target ); + void editStart(); + + void busy( const QString & text ); + void holdBusy(); + void resumeBusy(); + void ready(); + + //suggests an extract directory based on archive name + const QString guessName( const KURL & archive ); + +private slots: + void startDrag( const QStringList & fileList ); + void startDragSlotExtractDone( bool ); + void editSlotExtractDone(); + void editSlotAddDone( bool success ); + void viewSlotExtractDone( bool success ); + void openWithSlotExtractDone( bool success ); + + void createRealArchiveSlotCreate( Arch * newArch, bool success, + const QString & fileName, int nbr ); + void createRealArchiveSlotAddDone( bool success ); + void createRealArchiveSlotAddFilesDone( bool success ); + + void convertSlotExtractDone( bool success ); + void convertSlotCreate(); + void convertSlotCreateDone( bool success ); + void convertSlotAddDone( bool success ); + void convertFinish(); + + void extractToSlotOpenDone( bool success ); + void extractToSlotExtractDone( bool success ); + + void addToArchiveSlotOpenDone( bool success ); + void addToArchiveSlotCreateDone( bool success ); + void addToArchiveSlotAddDone( bool success ); + +protected: + void arkWarning(const QString& msg); + void arkError(const QString& msg); + + void newCaption(const QString& filename); + void createFileListView(); + + bool createArchive(const QString & name); + void openArchive(const QString & name); + + void showCurrentFile(); + +private: // data + + bool m_bBusy; + bool m_bBusyHold; + + // for use in the edit methods: the url. + QString m_strFileToView; + + // the compressed file to be added into the new archive + QString m_compressedFile; + + // Set to true if we are doing an "Extract to Folder" + bool m_extractOnly; + + // Set to true if we are extracting to a remote location + bool m_extractRemote; + + // URL to extract to. + KURL m_extractURL; + + // URL to view + KURL m_viewURL; + + // the mimetype the user wants to open this archive as + QString m_openAsMimeType; + + // if they're dragging in files, this is the temporary list for when + // we have to create an archive: + QStringList *m_pTempAddList; + + KRun *m_pKRunPtr; + + QStringList mpDownloadedList; + + bool m_bArchivePopupEnabled; + + KTempDir * m_convert_tmpDir; + KURL m_convert_saveAsURL; + bool m_convertSuccess; + + KURL m_extractTo_targetDirectory; + + KURL::List m_addToArchive_filesToAdd; + KURL m_addToArchive_archive; + + KTempDir * m_createRealArchTmpDir; + KTempDir * m_extractRemoteTmpDir; + + bool m_modified; + + KToolBar * m_searchToolBar; + SearchBar * m_searchBar; + + Arch * arch; + QString m_strArchName; + KURL m_realURL; + KURL m_url; + ArchType m_archType; + FileListView * m_fileListView; + + KIO::filesize_t m_nSizeOfFiles; + KIO::filesize_t m_nSizeOfSelectedFiles; + unsigned int m_nNumFiles; + int m_nNumSelectedFiles; + int m_arkInstanceId; + + bool m_bIsArchiveOpen; + bool m_bIsSimpleCompressedFile; + bool m_bDropSourceIsSelf; + + QStringList mDragFiles; + QStringList *m_extractList; + QStringList *m_viewList; + KTempDir *m_tmpDir; +}; + +#endif /* ARKWIDGET_H*/ + diff --git a/ark/common_texts.cpp b/ark/common_texts.cpp new file mode 100644 index 0000000..cc64b82 --- /dev/null +++ b/ark/common_texts.cpp @@ -0,0 +1,35 @@ +i18n(" Filename ") +i18n(" Permissions ") +i18n(" Owner/Group ") +i18n(" Size ") +i18n(" Timestamp ") +i18n(" Link ") +i18n(" Size Now ") +i18n(" Ratio ") +i18n("acronym for Cyclic Redundancy Check"," CRC ") +i18n(" Method ") +i18n(" Version ") +i18n(" Owner ") +i18n(" Group ") +i18n("(used as part of a sentence)","start-up folder") +i18n("folder for opening files (used as part of a sentence)","open folder") +i18n("folder for extracting files (used as part of a sentence)","extract folder") +i18n("folder for adding files (used as part of a sentence)","add folder") + +i18n("Settings") +i18n("&Adding") +i18n("&Extracting") +i18n("&Folders") +i18n("Add Settings") +i18n("Extract Settings") +i18n("Replace &old files only with newer files") +i18n("Keep entries &generic (Lha)") +i18n("Force &MS-DOS short filenames (Zip)") +i18n("Translate LF to DOS &CRLF (Zip)") +i18n("&Recursively add subfolders (Zip, Rar)") +i18n("&Store symlinks as links (Zip, Rar)") +i18n("O&verwrite files (Zip, Tar, Zoo, Rar)") +i18n("&Preserve permissions (Tar)") +i18n("&Ignore folder names (Zip)") +i18n("Convert filenames to &lowercase (Zip, Rar)") +i18n("Convert filenames to &uppercase (Rar)") diff --git a/ark/compressedfile.cpp b/ark/compressedfile.cpp new file mode 100644 index 0000000..9ebe283 --- /dev/null +++ b/ark/compressedfile.cpp @@ -0,0 +1,376 @@ +/* + ark: A program for modifying archives via a GUI. + + Copyright (C) + + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 2003: Georg Robbers + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// C includes +#include +#include +#include + +// Qt includes +#include + +// KDE includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ark includes +#include "arkwidget.h" +#include "filelistview.h" +#include "compressedfile.h" + +// encapsulates the idea of a compressed file + +CompressedFile::CompressedFile( ArkWidget *_gui, const QString & _fileName, const QString & _openAsMimeType ) + : Arch( _gui, _fileName ) +{ + m_tempDirectory = NULL; + m_openAsMimeType = _openAsMimeType; + kdDebug(1601) << "CompressedFile constructor" << endl; + m_tempDirectory = new KTempDir( _gui->tmpDir() + + QString::fromLatin1( "compressed_file_temp" ) ); + m_tempDirectory->setAutoDelete( true ); + m_tmpdir = m_tempDirectory->name(); + initData(); + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + + if (!QFile::exists(_fileName)) + { + KMessageBox::information(0, + i18n("You are creating a simple compressed archive which contains only one input file.\n" + "When uncompressed, the file name will be based on the name of the archive file.\n" + "If you add more files you will be prompted to convert it to a real archive."), + i18n("Simple Compressed Archive"), "CreatingCompressedArchive"); + } +} + +CompressedFile::~CompressedFile() +{ + if ( m_tempDirectory ) + delete m_tempDirectory; +} + +void CompressedFile::setHeaders() +{ + ColumnList list; + list.append(FILENAME_COLUMN); + list.append(PERMISSION_COLUMN); + list.append(OWNER_COLUMN); + list.append(GROUP_COLUMN); + list.append(SIZE_COLUMN); + + emit headers(list); +} + +void CompressedFile::initData() +{ + m_unarchiver_program = QString::null; + m_archiver_program = QString::null; + + QString mimeType; + if ( !m_openAsMimeType.isNull() ) + mimeType = m_openAsMimeType; + else + mimeType = KMimeType::findByPath( m_filename )->name(); + + if ( mimeType == "application/x-gzip" ) + { + m_unarchiver_program = "gunzip"; + m_archiver_program = "gzip"; + m_defaultExtensions << ".gz" << "-gz" << ".z" << "-z" << "_z" << ".Z"; + } + if ( mimeType == "application/x-bzip" ) + { + m_unarchiver_program = "bunzip"; + m_archiver_program = "bzip"; + m_defaultExtensions << ".bz"; + } + if ( mimeType == "application/x-bzip2" ) + { + m_unarchiver_program = "bunzip2"; + m_archiver_program = "bzip2"; + m_defaultExtensions << ".bz2" << ".bz"; + } + if ( mimeType == "application/x-lzop" ) + { m_unarchiver_program = "lzop"; + m_archiver_program = "lzop"; + m_defaultExtensions << ".lzo"; + } + if ( mimeType == "application/x-compress" ) + { + m_unarchiver_program = KGlobal::dirs()->findExe( "uncompress" ).isNull()? "gunzip" : "uncompress"; + m_archiver_program = "compress"; + m_defaultExtensions = ".Z"; + } + +} + +QString CompressedFile::extension() +{ + QStringList::Iterator it = m_defaultExtensions.begin(); + for( ; it != m_defaultExtensions.end(); ++it ) + if( m_filename.endsWith( *it ) ) + return QString::null; + return m_defaultExtensions.first(); +} + +void CompressedFile::open() +{ + kdDebug(1601) << "+CompressedFile::open" << endl; + setHeaders(); + + // We copy the file into the temporary directory, uncompress it, + // and when the uncompression is done, list it + // (that code is in the slot slotOpenDone) + + m_tmpfile = m_gui->realURL().fileName(); + if ( m_tmpfile.isEmpty() ) + m_tmpfile = m_filename; + m_tmpfile += extension(); + m_tmpfile = m_tmpdir + m_tmpfile; + + KURL src, target; + src.setPath( m_filename ); + target.setPath( m_tmpfile ); + + KIO::NetAccess::copy( src, target, m_gui ); + kdDebug(1601) << "Temp file name is " << target << endl; + + if ( !KIO::NetAccess::exists( target, true, NULL ) ) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + *kp << m_unarchiver_program << "-f" ; + if ( m_unarchiver_program == "lzop") + { + *kp << "-d"; + // lzop hack, see comment in tar.cpp createTmp() + kp->setUsePty( KProcess::Stdin, false ); + } + // gunzip 1.3 seems not to like original names with directories in them + // testcase: https://listman.redhat.com/pipermail/valhalla-list/2006-October.txt.gz + /*if ( m_unarchiver_program == "gunzip" ) + *kp << "-N"; + */ + *kp << m_tmpfile; + + kdDebug(1601) << "Command is " << m_unarchiver_program << " " << m_tmpfile<< endl; + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotUncompressDone(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigOpen(this, false, QString::null, 0 ); + } + + kdDebug(1601) << "-CompressedFile::open" << endl; +} + +void CompressedFile::slotUncompressDone(KProcess *_kp) +{ + bool bSuccess = false; + kdDebug(1601) << "normalExit = " << _kp->normalExit() << endl; + if( _kp->normalExit() ) + kdDebug(1601) << "exitStatus = " << _kp->exitStatus() << endl; + + if( _kp->normalExit() && (_kp->exitStatus()==0) ) + { + bSuccess = true; + } + + delete _kp; + _kp = m_currentProcess = 0; + + if ( !bSuccess ) + { + emit sigOpen( this, false, QString::null, 0 ); + return; + } + + QDir dir( m_tmpdir ); + QStringList lst( dir.entryList() ); + lst.remove( ".." ); + lst.remove( "." ); + KURL url; + url.setPath( m_tmpdir + lst.first() ); + m_tmpfile = url.path(); + KIO::UDSEntry udsInfo; + KIO::NetAccess::stat( url, udsInfo, m_gui ); + KFileItem fileItem( udsInfo, url ); + QStringList list; + list << fileItem.name(); + list << fileItem.permissionsString(); + list << fileItem.user(); + list << fileItem.group(); + list << KIO::number( fileItem.size() ); + m_gui->fileList()->addItem(list); // send to GUI + + emit sigOpen( this, bSuccess, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); +} + +void CompressedFile::create() +{ + emit sigCreate(this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add + | Arch::View); +} + +void CompressedFile::addFile( const QStringList &urls ) +{ + // only used for adding ONE file to an EMPTY gzip file, i.e., one that + // has just been created + + kdDebug(1601) << "+CompressedFile::addFile" << endl; + + Q_ASSERT(m_gui->getNumFilesInArchive() == 0); + Q_ASSERT(urls.count() == 1); + + KURL url = KURL::fromPathOrURL(urls.first()); + Q_ASSERT(url.isLocalFile()); + + QString file; + file = url.path(); + + KProcess proc; + proc << "cp" << file << m_tmpdir; + proc.start(KProcess::Block); + + m_tmpfile = file.right(file.length() + - file.findRev("/")-1); + m_tmpfile = m_tmpdir + '/' + m_tmpfile; + + kdDebug(1601) << "Temp file name is " << m_tmpfile << endl; + + kdDebug(1601) << "File is " << file << endl; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + // lzop hack, see comment in tar.cpp createTmp() + if ( m_archiver_program == "lzop") + kp->setUsePty( KProcess::Stdin, false ); + + QString compressor = m_archiver_program; + + *kp << compressor << "-c" << file; + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotAddInProgress(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotAddDone(KProcess*))); + + int f_desc = KDE_open(QFile::encodeName(m_filename), O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (f_desc != -1) + fd = fdopen( f_desc, "w" ); + else + fd = NULL; + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + } + + kdDebug(1601) << "-CompressedFile::addFile" << endl; +} + +void CompressedFile::slotAddInProgress(KProcess*, char* _buffer, int _bufflen) +{ + // we're trying to capture the output of a command like this + // gzip -c myfile + // and feed the output to the compressed file + int size; + size = fwrite(_buffer, 1, _bufflen, fd); + if (size != _bufflen) + { + KMessageBox::error(0, i18n("Trouble writing to the archive...")); + exit(99); + } +} + +void CompressedFile::slotAddDone(KProcess *_kp) +{ + fclose(fd); + slotAddExited(_kp); +} + +void CompressedFile::unarchFileInternal() +{ + if (m_destDir != m_tmpdir) + { + QString dest; + if (m_destDir.isEmpty() || m_destDir.isNull()) + { + kdError(1601) << "There was no extract directory given." << endl; + return; + } + else + dest=m_destDir; + + KProcess proc; + proc << "cp" << m_tmpfile << dest; + proc.start(KProcess::Block); + } + emit sigExtract(true); +} + +void CompressedFile::remove(QStringList *) +{ + kdDebug(1601) << "+CompressedFile::remove" << endl; + QFile::remove(m_tmpfile); + + // do not delete but truncate the compressed file in case someone + // does a reload and finds it no longer exists! + truncate(QFile::encodeName(m_filename), 0); + + m_tmpfile = ""; + emit sigDelete(true); + kdDebug(1601) << "-CompressedFile::remove" << endl; +} + + + +#include "compressedfile.moc" + diff --git a/ark/compressedfile.h b/ark/compressedfile.h new file mode 100644 index 0000000..ceaee6c --- /dev/null +++ b/ark/compressedfile.h @@ -0,0 +1,86 @@ +/* + + ark: A program for modifying archives via a GUI. + + Copyright (C) + + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef COMPRESSED_FILE_H +#define COMPRESSED_FILE_H + +class QString; +class QCString; +class QStringList; +class KProcess; +class KTempDir; + +class Arch; +class ArkWidget; + +// This isn't *really* an archive, but having this class in the program +// allows people to manage gzipped files if they want. If someone tries to +// add a file, the gz-file must be empty (hozat? it could be empty by having +// just been created). Otherwise, the user will be asked to create a REAL +// archive, and then the added file(s) and the original file will be +// transferred to the new archive. +// +class CompressedFile : public Arch +{ + Q_OBJECT +public: + CompressedFile( ArkWidget *_gui, const QString & _fileName, const QString &_openAsMimeType ); + virtual ~CompressedFile(); + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList& ); + virtual void addDir(const QString &) { } + + virtual void remove(QStringList *); + virtual void unarchFileInternal(); + + QString tempFileName(){ return m_tmpfile; } + +private slots: + void slotUncompressDone(KProcess *); + void slotAddInProgress(KProcess*, char*, int); + void slotAddDone(KProcess*); + +private: + void initExtract( bool, bool, bool ); + void setHeaders(); + void initData(); + QString extension(); + + QString m_openAsMimeType; + KTempDir * m_tempDirectory; + QString m_tmpdir; + QString m_tmpfile; + QStringList m_defaultExtensions; + + // for use with addFile + FILE *fd; + +}; + + + +#endif // COMPRESSED_FILE_H diff --git a/ark/configure.in.in b/ark/configure.in.in new file mode 100644 index 0000000..e0e280a --- /dev/null +++ b/ark/configure.in.in @@ -0,0 +1,11 @@ +AC_CHECK_KDEMAXPATHLEN + +KDE_CHECK_FUNC_EXT(statfs, [ +#include +], [ + char buffer[200]; + struct statfs b; + statfs(buffer, &b); +], [ + int statfs(const char *path, struct statfs *buffer) +], [STATFS]) diff --git a/ark/extraction.ui b/ark/extraction.ui new file mode 100644 index 0000000..692692f --- /dev/null +++ b/ark/extraction.ui @@ -0,0 +1,79 @@ + +Extraction + + + Extraction + + + + 0 + 0 + 436 + 289 + + + + + unnamed + + + + kcfg_extractOverwrite + + + O&verwrite files (Zip, Tar, Zoo, Rar) + + + + + kcfg_preservePerms + + + &Preserve permissions (Tar) + + + + + kcfg_extractJunkPaths + + + &Ignore folder names (Zip) + + + + + kcfg_rarToLower + + + Convert file names to &lowercase (Zip, Rar) + + + + + kcfg_rarToUpper + + + Convert file names to &uppercase (Rar) + + + + + spacer3 + + + Vertical + + + Expanding + + + + 20 + 20 + + + + + + + diff --git a/ark/extractiondialog.cpp b/ark/extractiondialog.cpp new file mode 100644 index 0000000..7892efb --- /dev/null +++ b/ark/extractiondialog.cpp @@ -0,0 +1,195 @@ +/* + * ark -- archiver for the KDE project + * + * Copyright (C) + * + * 2005: Henrique Pinto + * 2002: Helio Chissini de Castro + * 2001: Roberto Selbach Teixeira + * 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + * 1999-2000: Corel Corporation (author: Emily Ezust emilye@corel.com) + * 1999: Francois-Xavier Duranceau duranceau@kde.org + * 1997-1999: Rob Palmbos palm9744@kettering.edu + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "extractiondialog.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "arkutils.h" +#include "settings.h" + +ExtractionDialog::ExtractionDialog( QWidget *parent, const char *name, + bool enableSelected, + const KURL& defaultExtractionDir, + const QString &prefix, + const QString &archiveName ) + : KDialogBase( parent, name, true, i18n( "Extract" ), Ok | Cancel, Ok ), + m_selectedButton( 0 ), m_allButton( 0 ), + m_selectedOnly( enableSelected ), m_extractionDirectory( defaultExtractionDir ), + m_defaultExtractionDir( defaultExtractionDir.prettyURL() ), m_prefix( prefix ) +{ + if ( !archiveName.isNull() ) + { + setCaption( i18n( "Extract Files From %1" ).arg( archiveName ) ); + } + + QVBox *vbox = makeVBoxMainWidget(); + + QHBox *header = new QHBox( vbox ); + header->layout()->setSpacing( 10 ); + + QLabel *icon = new QLabel( header ); + icon->setPixmap( DesktopIcon( "ark_extract" ) ); + icon->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum ); + + if ( enableSelected ) + { + QVBox *whichFiles = new QVBox( header ); + whichFiles->layout()->setSpacing( 6 ); + new QLabel( QString( "%1" ) + .arg( i18n( "Extract:" ) ), whichFiles ); + QHButtonGroup *filesGroup = new QHButtonGroup( whichFiles ); + m_selectedButton = new QRadioButton( i18n( "Selected files only" ), filesGroup ); + m_allButton = new QRadioButton( i18n( "All files" ), filesGroup ); + + m_selectedButton->setChecked( true ); + } + else + { + new QLabel( QString( "%1" ) + .arg( i18n( "Extract all files" ) ), header ); + } + + QHBox *destDirBox = new QHBox( vbox ); + + QLabel *destFolderLabel = new QLabel( i18n( "Destination folder: " ), destDirBox ); + destFolderLabel->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed ); + + KHistoryCombo *combobox = new KHistoryCombo( true, destDirBox ); + combobox->setPixmapProvider( new KURLPixmapProvider ); + combobox->setHistoryItems( ArkSettings::extractionHistory() ); + destFolderLabel->setBuddy( combobox ); + + KURLCompletion *comp = new KURLCompletion(); + comp->setReplaceHome( true ); + comp->setCompletionMode( KGlobalSettings::CompletionAuto ); + combobox->setCompletionObject( comp ); + combobox->setMaxCount( 20 ); + combobox->setInsertionPolicy( QComboBox::AtTop ); + + m_urlRequester = new KURLRequester( combobox, destDirBox ); + m_urlRequester->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); + m_urlRequester->setMode( KFile::Directory ); + + if (!defaultExtractionDir.prettyURL().isEmpty() ) + { + m_urlRequester->setKURL( defaultExtractionDir.prettyURL() + prefix ); + } + + m_viewFolderAfterExtraction = new QCheckBox( i18n( "Open destination folder after extraction" ), vbox ); + m_viewFolderAfterExtraction->setChecked( ArkSettings::openDestinationFolder() ); + + connect( combobox, SIGNAL( returnPressed( const QString& ) ), combobox, SLOT( addToHistory( const QString& ) ) ); + connect( combobox->lineEdit(), SIGNAL( textChanged( const QString& ) ), + this, SLOT( extractDirChanged( const QString & ) ) ); +} + +ExtractionDialog::~ExtractionDialog() +{ + ArkSettings::setExtractionHistory( ( static_cast( m_urlRequester->comboBox() ) )->historyItems() ); +} + +void ExtractionDialog::accept() +{ + + KURLCompletion uc; + uc.setReplaceHome( true ); + KURL p( uc.replacedPath( m_urlRequester->comboBox()->currentText() ) ); + + //if p isn't local KIO and friends will complain later on + if ( p.isLocalFile() ) + { + QFileInfo fi( p.path() ); + if ( !fi.isDir() && !fi.exists() ) + { + QString ltext = i18n( "Create folder %1?").arg(p.path()); + int createDir = KMessageBox::questionYesNo( this, ltext, i18n( "Missing Folder" ) , i18n("Create Folder"), i18n("Do Not Create")); + if( createDir == 4 ) + { + return; + } + // create directory using filename, make sure it has trailing slash + p.adjustPath(1); + if( !KStandardDirs::makeDir( p.path() ) ) + { + KMessageBox::error( this, i18n( "The folder could not be created. Please check permissions." ) ); + return; + } + } + if ( !ArkUtils::haveDirPermissions( p.path() ) ) + { + KMessageBox::error( this, i18n( "You do not have write permission to this folder. Please provide another folder." ) ); + return; + } + } + + m_extractionDirectory = p; + m_selectedOnly = m_selectedButton == 0? false : m_selectedButton->isChecked(); + + // Determine what exactly should be added to the extraction combo list + QString historyURL = p.prettyURL(); + if ( historyURL == KURL( m_defaultExtractionDir + m_prefix ).prettyURL() ) + { + historyURL = m_defaultExtractionDir; + } + + KHistoryCombo *combo = static_cast( m_urlRequester->comboBox() ); + // If the item was already in the list, delete it from the list and readd it at the top + combo->removeFromHistory( historyURL ); + combo->addToHistory( historyURL ); + + ArkSettings::setOpenDestinationFolder( m_viewFolderAfterExtraction->isChecked() ); + + KDialogBase::accept(); +} + +void ExtractionDialog::extractDirChanged(const QString &text ) +{ + enableButtonOK(!text.isEmpty()); +} + +#include "extractiondialog.moc" +// kate: space-indent off; tab-width 4; diff --git a/ark/extractiondialog.h b/ark/extractiondialog.h new file mode 100644 index 0000000..822c085 --- /dev/null +++ b/ark/extractiondialog.h @@ -0,0 +1,97 @@ +/* + * ark -- archiver for the KDE project + * + * Copyright (C) + * + * 1997-1999: Rob Palmbos palm9744@kettering.edu + * 1999: Francois-Xavier Duranceau duranceau@kde.org + * 1999-2000: Corel Corporation (author: Emily Ezust emilye@corel.com) + * 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + * 2001: Roberto Selbach Teixeira (maragato@conectiva.com) + * 2005: Henrique Pinto ( henrique.pinto@kdemail.net ) + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef EXTRACTIONDIALOG_H +#define EXTRACTIONDIALOG_H + +#include + +#include +#include + +class QRadioButton; + +class KURLRequester; + +class ExtractionDialog : public KDialogBase +{ + Q_OBJECT + public: + /** + * Constructor. + */ + ExtractionDialog( QWidget *parent = 0, const char *name = 0, + bool enableSelected = true, + const KURL &defaultExtractionDir = KURL(), + const QString &prefix = QString(), + const QString &archiveName = QString::null ); + + /** + * Destructor. + */ + ~ExtractionDialog(); + + + + /** + * Returns true if the user wants to extract only the selected files + */ + bool selectedOnly() const { return m_selectedOnly; } + + /** + * Returns the directory the files should be extracted to. + */ + KURL extractionDirectory() const { return m_extractionDirectory; } + + /** + * Returns true if the user wants the extraction folder to be opened after extraction + */ + bool viewFolderAfterExtraction() const { return m_viewFolderAfterExtraction->isChecked(); } + + + + public slots: + void accept(); + void extractDirChanged( const QString & ); + + + + private: + QRadioButton *m_selectedButton; + QRadioButton *m_allButton; + QCheckBox *m_viewFolderAfterExtraction; + bool m_selectedOnly; + KURL m_extractionDirectory; + KURLRequester *m_urlRequester; + QString m_defaultExtractionDir; + QString m_prefix; +}; + +#endif // EXTRACTIONDIALOG_H +// kate: space-indent off; tab-width 4; + diff --git a/ark/filelistview.cpp b/ark/filelistview.cpp new file mode 100644 index 0000000..3668d11 --- /dev/null +++ b/ark/filelistview.cpp @@ -0,0 +1,587 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2005: Henrique Pinto + 2003: Georg Robbers + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 1999: Francois-Xavier Duranceau duranceau@kde.org + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// Qt includes +#include +#include +#include + +// KDE includes +#include +#include +#include +#include +#include + +#include "filelistview.h" +#include "arch.h" + +///////////////////////////////////////////////////////////////////// +// FileLVI implementation +///////////////////////////////////////////////////////////////////// + +FileLVI::FileLVI( KListView* lv ) + : KListViewItem( lv ), m_fileSize( 0 ), m_packedFileSize( 0 ), + m_ratio( 0 ), m_timeStamp( QDateTime() ), m_entryName( QString() ) +{ + +} + +FileLVI::FileLVI( KListViewItem* lvi ) + : KListViewItem( lvi ), m_fileSize( 0 ), m_packedFileSize( 0 ), + m_ratio( 0 ), m_timeStamp( QDateTime() ), m_entryName( QString() ) +{ +} + +QString FileLVI::key( int column, bool ascending ) const +{ + if ( column == 0 ) + return fileName(); + else + return QListViewItem::key( column, ascending ); +} + +int FileLVI::compare( QListViewItem * i, int column, bool ascending ) const +{ + FileLVI * item = static_cast< FileLVI * >( i ); + + if ( ( this->childCount() > 0 ) && ( item->childCount() == 0 ) ) + return -1; + + if ( ( this->childCount() == 0 ) && ( item->childCount() > 0 ) ) + return 1; + + if ( column == 0 ) + return KListViewItem::compare( i, column, ascending ); + + columnName colName = ( static_cast< FileListView * > ( listView() ) )->nameOfColumn( column ); + switch ( colName ) + { + case sizeCol: + { + return ( m_fileSize < item->fileSize() ? -1 : + ( m_fileSize > item->fileSize() ? 1 : 0 ) + ); + break; + } + + case ratioStrCol: + { + return ( m_ratio < item->ratio() ? -1 : + ( m_ratio > item->ratio() ? 1 : 0 ) + ); + break; + } + + case packedStrCol: + { + return ( m_packedFileSize < item->packedFileSize() ? -1 : + ( m_packedFileSize > item->packedFileSize() ? 1 : 0 ) + ); + break; + } + + case timeStampStrCol: + { + return ( m_timeStamp < item->timeStamp() ? -1 : + ( m_timeStamp > item->timeStamp() ? 1 : 0 ) + ); + break; + } + + default: + return KListViewItem::compare( i, column, ascending ); + } +} + +void FileLVI::setText( int column, const QString &text ) +{ + columnName colName = ( static_cast< FileListView * > ( listView() ) )->nameOfColumn( column ); + if ( column == 0 ) + { + QString name = text; + if ( name.endsWith( "/" ) ) + name = name.left( name.length() - 1 ); + if ( name.startsWith( "/" ) ) + name = name.mid( 1 ); + int pos = name.findRev( '/' ); + if ( pos != -1 ) + name = name.right( name.length() - pos - 1 ); + QListViewItem::setText( column, name ); + m_entryName = text; + } + else if ( colName == sizeCol ) + { + m_fileSize = text.toULongLong(); + QListViewItem::setText( column, KIO::convertSize( m_fileSize ) ); + } + else if ( colName == packedStrCol ) + { + m_packedFileSize = text.toULongLong(); + QListViewItem::setText( column, KIO::convertSize( m_packedFileSize ) ); + } + else if ( colName == ratioStrCol ) + { + int l = text.length() - 1; + if ( l>0 && text[l] == '%' ) + m_ratio = text.left(l).toDouble(); + else + m_ratio = text.toDouble(); + QListViewItem::setText( column, i18n( "Packed Ratio", "%1 %" ) + .arg(KGlobal::locale()->formatNumber( m_ratio, 1 ) ) + ); + } + else if ( colName == timeStampStrCol ) + { + if ( text.isEmpty() ) + QListViewItem::setText(column, text); + else + { + m_timeStamp = QDateTime::fromString( text, ISODate ); + QListViewItem::setText( column, KGlobal::locale()->formatDateTime( m_timeStamp ) ); + } + } + else + QListViewItem::setText(column, text); +} + +static FileLVI* folderLVI( KListViewItem *parent, const QString& name ) +{ + FileLVI *folder = new FileLVI( parent ); + + folder->setText( 0, name ); + + folder->setPixmap( 0, KMimeType::mimeType( "inode/directory" )->pixmap( KIcon::Small ) ); + + return folder; +} + +static FileLVI* folderLVI( KListView *parent, const QString& name ) +{ + FileLVI *folder = new FileLVI( parent ); + folder->setText( 0, name ); + folder->setPixmap( 0, KMimeType::mimeType( "inode/directory" )->pixmap( KIcon::Small ) ); + return folder; +} + +///////////////////////////////////////////////////////////////////// +// FileListView implementation +///////////////////////////////////////////////////////////////////// + + +FileListView::FileListView(QWidget *parent, const char* name) + : KListView(parent, name) +{ + QWhatsThis::add( this, + i18n( "This area is for displaying information about the files contained within an archive." ) + ); + + setMultiSelection( true ); + setSelectionModeExt( FileManager ); + setItemsMovable( false ); + setRootIsDecorated( true ); + setShowSortIndicator( true ); + setItemMargin( 3 ); + header()->hide(); // Don't show the header until there is something to be shown in it + + m_pressed = false; +} + +int FileListView::addColumn ( const QString & label, int width ) +{ + int index = KListView::addColumn( label, width ); + if ( label == SIZE_COLUMN.first ) + { + m_columnMap[ index ] = sizeCol; + } + else if ( label == PACKED_COLUMN.first ) + { + m_columnMap[ index ] = packedStrCol; + } + else if ( label == RATIO_COLUMN.first ) + { + m_columnMap[ index ] = ratioStrCol; + } + else if ( label == TIMESTAMP_COLUMN.first ) + { + m_columnMap[ index ] = timeStampStrCol; + } + else + { + m_columnMap[ index ] = otherCol; + } + return index; +} + +void FileListView::removeColumn( int index ) +{ + for ( unsigned int i = index; i < m_columnMap.count() - 2; i++ ) + { + m_columnMap.replace( i, m_columnMap[ i + 1 ] ); + } + + m_columnMap.remove( m_columnMap[ m_columnMap.count() - 1 ] ); + KListView::removeColumn( index ); +} + +columnName FileListView::nameOfColumn( int index ) +{ + return m_columnMap[ index ]; +} + +QStringList FileListView::selectedFilenames() +{ + QStringList files; + + FileLVI *item = static_cast( firstChild() ); + + while ( item ) + { + if ( item->isSelected() ) + { + // If the item has children, add each child and the item + if ( item->childCount() > 0 ) + { + files += item->fileName(); + files += childrenOf( item ); + + /* If we got here, then the logic for "going to the next item" + * is a bit different: as we already dealt with all the children, + * the "next item" is the next sibling of the current item, not + * its first child. If the current item has no siblings, then + * the next item is the next sibling of its parent, and so on. + */ + FileLVI *nitem = static_cast( item->nextSibling() ); + while ( !nitem && item->parent() ) + { + item = static_cast( item->parent() ); + if ( item->parent() ) + nitem = static_cast( item->parent()->nextSibling() ); + } + item = nitem; + continue; + } + else + { + // If the item has no children, just add it to the list + files += item->fileName(); + } + } + // Go to the next item + item = static_cast( item->itemBelow() ); + } + + return files; +} + +QStringList FileListView::fileNames() +{ + QStringList files; + + QListViewItemIterator it( this ); + while ( it.current() ) + { + FileLVI *item = static_cast( it.current() ); + files += item->fileName(); + ++it; + } + + return files; +} + +bool FileListView::isSelectionEmpty() +{ + FileLVI * flvi = (FileLVI*)firstChild(); + + while (flvi) + { + if( flvi->isSelected() ) + return false; + else + flvi = (FileLVI*)flvi->itemBelow(); + } + return true; +} + +void +FileListView::contentsMousePressEvent(QMouseEvent *e) +{ + if( e->button()==QMouseEvent::LeftButton ) + { + m_pressed = true; + m_presspos = e->pos(); + } + + KListView::contentsMousePressEvent(e); +} + +void +FileListView::contentsMouseReleaseEvent(QMouseEvent *e) +{ + m_pressed = false; + KListView::contentsMouseReleaseEvent(e); +} + +void +FileListView::contentsMouseMoveEvent(QMouseEvent *e) +{ + if(!m_pressed) + { + KListView::contentsMouseMoveEvent(e); + } + else if( ( m_presspos - e->pos() ).manhattanLength() > KGlobalSettings::dndEventDelay() ) + { + m_pressed = false; // Prevent triggering again + if(isSelectionEmpty()) + { + return; + } + QStringList dragFiles = selectedFilenames(); + emit startDragRequest( dragFiles ); + KListView::contentsMouseMoveEvent(e); + } +} + +FileLVI* +FileListView::item(const QString& filename) const +{ + FileLVI * flvi = (FileLVI*) firstChild(); + + while (flvi) + { + QString curFilename = flvi->fileName(); + if (curFilename == filename) + return flvi; + flvi = (FileLVI*) flvi->nextSibling(); + } + + return 0; +} + +void FileListView::addItem( const QStringList & entries ) +{ + FileLVI *flvi, *parent = findParent( entries[0] ); + if ( parent ) + flvi = new FileLVI( parent ); + else + flvi = new FileLVI( this ); + + + int i = 0; + + for (QStringList::ConstIterator it = entries.begin(); it != entries.end(); ++it) + { + flvi->setText(i, *it); + ++i; + } + + KMimeType::Ptr mimeType = KMimeType::findByPath( entries.first(), 0, true ); + flvi->setPixmap( 0, mimeType->pixmap( KIcon::Small ) ); +} + +void FileListView::selectAll() +{ + QListView::selectAll( true ); +} + +void FileListView::unselectAll() +{ + QListView::selectAll( false ); +} + +void FileListView::setHeaders( const ColumnList& columns ) +{ + clearHeaders(); + + for ( ColumnList::const_iterator it = columns.constBegin(); + it != columns.constEnd(); + ++it ) + { + QPair< QString, Qt::AlignmentFlags > pair = *it; + int colnum = addColumn( pair.first ); + setColumnAlignment( colnum, pair.second ); + } + + setResizeMode( QListView::LastColumn ); + + header()->show(); +} + +void FileListView::clearHeaders() +{ + header()->hide(); + while ( columns() > 0 ) + { + removeColumn( 0 ); + } +} + +int FileListView::totalFiles() +{ + int numFiles = 0; + + QListViewItemIterator it( this ); + while ( it.current() ) + { + if ( it.current()->childCount() == 0 ) + ++numFiles; + ++it; + } + + return numFiles; +} + +int FileListView::selectedFilesCount() +{ + int numFiles = 0; + + QListViewItemIterator it( this, QListViewItemIterator::Selected ); + while ( it.current() ) + { + ++numFiles; + ++it; + } + + return numFiles; +} + +KIO::filesize_t FileListView::totalSize() +{ + KIO::filesize_t size = 0; + + QListViewItemIterator it(this); + while ( it.current() ) + { + FileLVI *item = static_cast( it.current() ); + size += item->fileSize(); + ++it; + } + + return size; +} + +KIO::filesize_t FileListView::selectedSize() +{ + KIO::filesize_t size = 0; + + QListViewItemIterator it( this, QListViewItemIterator::Selected ); + while ( it.current() ) + { + FileLVI *item = static_cast( it.current() ); + size += item->fileSize(); + ++it; + } + + return size; +} + +FileLVI* FileListView::findParent( const QString& fullname ) +{ + QString name = fullname; + + if ( name.endsWith( "/" ) ) + name = name.left( name.length() -1 ); + if ( name.startsWith( "/" ) ) + name = name.mid( 1 ); + // Checks if this entry needs a parent + if ( !name.contains( '/' ) ) + return static_cast< FileLVI* >( 0 ); + + // Get a list of ancestors + QString parentFullname = name.left( name.findRev( '/' ) ); + QStringList ancestorList = QStringList::split( '/', parentFullname ); + + // Checks if the listview contains the first item in the list of ancestors + QListViewItem *item = firstChild(); + while ( item ) + { + if ( item->text( 0 ) == ancestorList[0] ) + break; + item = item->nextSibling(); + } + + // If the list view does not contain the item, create it + if ( !item ) + { + item = folderLVI( this, ancestorList[0] ); + } + + // We've already dealt with the first item, remove it + ancestorList.pop_front(); + + while ( ancestorList.count() > 0 ) + { + QString name = ancestorList[0]; + + FileLVI *parent = static_cast< FileLVI*>( item ); + item = parent->firstChild(); + while ( item ) + { + if ( item->text(0) == name ) + break; + item = item->nextSibling(); + } + + if ( !item ) + { + item = folderLVI( parent, name ); + } + + ancestorList.pop_front(); + } + + item->setOpen( true ); + return static_cast< FileLVI* >( item ); +} + +QStringList FileListView::childrenOf( FileLVI* parent ) +{ + Q_ASSERT( parent ); + QStringList children; + + FileLVI *item = static_cast( parent->firstChild() ); + + while ( item ) + { + if ( item->childCount() == 0 ) + { + children += item->fileName(); + } + else + { + children += item->fileName(); + children += childrenOf( item ); + } + item = static_cast( item->nextSibling() ); + } + + return children; +} + +#include "filelistview.moc" +// kate: space-indent off; tab-width 4; diff --git a/ark/filelistview.h b/ark/filelistview.h new file mode 100644 index 0000000..8ea0d48 --- /dev/null +++ b/ark/filelistview.h @@ -0,0 +1,163 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 2003: Georg Robbers + 2005: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef FILELISTVIEW_H +#define FILELISTVIEW_H + +#include +#include +#include + +#include +#include + +class QString; +class QStringList; +class QRect; +class QPainter; +class QColorGroup; +class QMouseEvent; +class QPoint; + +enum columnName { sizeCol = 1 , packedStrCol, ratioStrCol, timeStampStrCol, otherCol }; + +class FileLVI : public KListViewItem +{ + public: + FileLVI( KListView* lv ); + FileLVI( KListViewItem* lvi ); + + QString fileName() const { return m_entryName; } + KIO::filesize_t fileSize() const { return m_fileSize; } + KIO::filesize_t packedFileSize() const { return m_packedFileSize; } + double ratio() const { return m_ratio; } + QDateTime timeStamp() const { return m_timeStamp; } + + int compare ( QListViewItem * i, int col, bool ascending ) const; + virtual QString key( int column, bool ) const; + virtual void setText( int column, const QString &text ); + + private: + KIO::filesize_t m_fileSize; + KIO::filesize_t m_packedFileSize; + double m_ratio; + QDateTime m_timeStamp; + QString m_entryName; +}; + +typedef QValueList< QPair< QString, Qt::AlignmentFlags > > ColumnList; + +class FileListView: public KListView +{ + Q_OBJECT + public: + FileListView( QWidget *parent = 0, const char* name = 0 ); + + FileLVI *currentItem() {return ((FileLVI *) KListView::currentItem());} + + /** + * Returns the full names of the selected files. + */ + QStringList selectedFilenames(); + + /** + * Return the full names of all files. + */ + QStringList fileNames(); + + /** + * Returns true if no file is selected + */ + bool isSelectionEmpty(); + + virtual int addColumn( const QString & label, int width = -1 ); + virtual void removeColumn( int index ); + columnName nameOfColumn( int index ); + + /** + * Returns the file item, or 0 if not found. + * @param filename The filename in question to reference in the archive + * @return The requested file's FileLVI + */ + FileLVI* item(const QString& filename) const; + + /** + * Adds a file and stats to the file listing + * @param entries A stringlist of the entries for each column of the list. + */ + void addItem( const QStringList & entries ); + + /** + * Returns the number of files in the archive. + */ + int totalFiles(); + + /** + * Returns the number of selected files. + */ + int selectedFilesCount(); + + /** + * Return the sum of the sizes of all files in the archive. + */ + KIO::filesize_t totalSize(); + + /** + * Return the sum of the sizes of the selected files. + */ + KIO::filesize_t selectedSize(); + + /** + * Adjust the size of all columns to fit their content. + */ + void adjustColumns() { for ( int i = 0; i < columns(); ++i ) adjustColumn( i ); } + + public slots: + void selectAll(); + void unselectAll(); + void setHeaders( const ColumnList& columns ); + void clearHeaders(); + + signals: + void startDragRequest( const QStringList & fileList ); + + protected: + virtual void contentsMouseReleaseEvent( QMouseEvent *e ); + virtual void contentsMousePressEvent( QMouseEvent *e ); + virtual void contentsMouseMoveEvent( QMouseEvent *e ); + + private: + FileLVI* findParent( const QString& fullname ); + QStringList childrenOf( FileLVI* parent ); + + QMap m_columnMap; + bool m_pressed; + QPoint m_presspos; // this will save the click pos to correctly recognize drag events +}; + +#endif +// kate: space-indent off; tab-width 4; diff --git a/ark/general.ui b/ark/general.ui new file mode 100644 index 0000000..d822b4c --- /dev/null +++ b/ark/general.ui @@ -0,0 +1,93 @@ + +General + + + General + + + + 0 + 0 + 323 + 251 + + + + General + + + + unnamed + + + + kcfg_UseIntegratedViewer + + + &Use integrated viewer + + + + + kcfg_KonquerorIntegration + + + &Enable Konqueror integration + + + + + layout1 + + + + unnamed + + + + spacer2 + + + Horizontal + + + Fixed + + + + 15 + 31 + + + + + + konqIntegrationLabel + + + <font size="-1"><i>Konqueror integration is only available if you install the Konqueror integration plugin from the kdeaddons package.</i></font> + + + + + + + spacer1 + + + Vertical + + + Expanding + + + + 20 + 90 + + + + + + + diff --git a/ark/hi128-app-ark.png b/ark/hi128-app-ark.png new file mode 100644 index 0000000000000000000000000000000000000000..874d33271c5bad5b32c4e72f85296ee1c5cee8e6 GIT binary patch literal 11259 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 bK+yoPzITOnB3XJM7XaLy_c=Y>O-}hgYqfEU literal 0 HcmV?d00001 diff --git a/ark/hi16-app-ark.png b/ark/hi16-app-ark.png new file mode 100644 index 0000000000000000000000000000000000000000..07391b6ec087e2c3277031d01e654c64850e2202 GIT binary patch literal 1094 zcmV-M1iAZ(P)@3pzafm_Hp6)a zGyo7lEcth(7=Ez7WY_{U;0GTA0}~qq^A}|{zF+)YT)!At7?>D18NU5slVNzvpaxWb zo`D%i{sZFw5CZ@Lh~*Q@UxuG7KoLd;2Hm%u3~~R3ExLcN;@Qlw8K{|o;SUf?39xW< zL}YUGy0!`xS`4FfjaL`o(bn=X-`+F+YK#->N3Z&)z-r@#p_XAOipbh&j$q zh~ebDZ z`~2hI1AqWx;oxAMqp2>Y^5p9AUm|?WYzq`D8Ghb5%dqj~0|o{Gpyu}s42>*?4C%~L z4DYWTW?*JxW;l56@wazh|Hy&D5Fh{mK>)u00$z{WodO9FAs0Jf2KfpY00|5X0Hrli z08slW007qj0E7cF0Ddh#02C$~0NdQ;0JXW-{oUsHGA&L zx53!CK_vP_8z(gs@8{Kk;ph7R7Bfu%COSm|0`=_} z)70Dn-t73y0suh(zW)RY1_A)>_5j!M=GM~s-t#B_1tI|6&(r`64G91^>f-?4B+id(ObZ z^pD}`gI5gSzyD|86Jlrh`t~Wq=O?EbB)C5@+i&FZ;Nliw`16$mmn*4-9|)Fo6;% z6U+dB0AjxK_&dY(r#~2u-u!ar+Vv+d^`&@R#C1$r7&t|MY2iBq13N1N1283?IQW>M ze)^R=2d}-^_UrGzQ?SGg5I`8nSe89>Ye(Rl|8F+^|Nmgh|BLe?|L1wAJ{03-n+cTm z24V@2%VFvP0thQo5@L0jn`3jUGuGsuEFar!pim$X%Ya;rt`;D`08`>#b12Aab^rhX M07*qoM6N<$f_7f)E&u=k literal 0 HcmV?d00001 diff --git a/ark/hi22-app-ark.png b/ark/hi22-app-ark.png new file mode 100644 index 0000000000000000000000000000000000000000..859b325f62e921868cd9ba4f69df250bf3aa3779 GIT binary patch literal 1431 zcmV;I1!($-P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 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 literal 0 HcmV?d00001 diff --git a/ark/hisc-app-ark.svgz b/ark/hisc-app-ark.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ec03594c0d92fa047e377dcaa1f942e9584793d2 GIT binary patch literal 7499 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 + +// C includes +#include +#include +#include +#include +#include + +// QT includes +#include +#include + +// KDE includes +#include +#include +#include +#include + +// ark includes +#include "arkwidget.h" +#include "settings.h" +#include "arch.h" +#include "lha.h" +#include "arkutils.h" +#include "filelistview.h" + +LhaArch::LhaArch( ArkWidget *_gui, const QString & _fileName ) + : Arch( _gui, _fileName ) +{ + m_archiver_program = "lha"; + verifyCompressUtilityIsAvailable( m_archiver_program ); + + m_headerString = "----"; +} + +bool LhaArch::processLine( const QCString &line ) +{ + const char *_line = ( const char * ) line; + char columns[13][80]; + char filename[4096]; + + if ( line.contains( "[generic]" ) ) + { + sscanf( _line, + " %79[]\\[generic] %79[0-9] %79[0-9] %79[0-9.%*] %10[-a-z0-9 ] %3[A-Za-z]%1[ ]%2[0-9 ]%1[ ]%5[ 0-9:]%1[ ]%4095[^\n]", + columns[0], columns[2], columns[3], columns[4], columns[5], + columns[6], columns[10], columns[7], columns[11], columns[8], + columns[9], filename ); + strcpy( columns[1], " " ); + } + else if ( line.contains( "[MS-DOS]" ) ) + { + sscanf( _line, + " %79[]\\[MS-DOS] %79[0-9] %79[0-9] %79[0-9.%*] %10[-a-z0-9 ] %3[A-Za-z]%1[ ]%2[0-9 ]%1[ ]%5[ 0-9:]%1[ ]%4095[^\n]", + columns[0], columns[2], columns[3], columns[4], columns[5], + columns[6], columns[10], columns[7], columns[11], columns[8], + columns[9], filename ); + strcpy( columns[1], " " ); + } + else + { + sscanf( _line, + " %79[-drlwxst] %79[0-9/] %79[0-9] %79[0-9] %79[0-9.%*] %10[-a-z0-9 ] %3[A-Za-z]%1[ ]%2[0-9 ]%1[ ]%5[ 0-9:]%1[ ]%4095[^\n]", + columns[0], columns[1], columns[2], columns[3], + columns[4], columns[5], columns[6], columns[10], columns[7], + columns[11], columns[8], columns[9], filename ); + } + + // make the time stamp sortable + QString massagedTimeStamp = ArkUtils::getTimeStamp( columns[6], columns[7], + columns[8] ); + strlcpy( columns[6], massagedTimeStamp.ascii(), sizeof( columns[6] ) ); + + // see if there was a link in filename + QString file = filename; + QString name, link; + bool bLink = false; + int pos = file.find( " -> " ); + if ( pos != -1 ) + { + bLink = true; + name = file.left(pos); + link = file.right(file.length()-pos-4); + } + else + { + name = file; + } + + QStringList list; + list.append( name ); + + for ( int i = 0; i < 7; i++ ) + { + list.append( QString::fromLocal8Bit( columns[i] ) ); + } + + if ( bLink ) + list.append( link ); + else + list.append( "" ); + + m_gui->fileList()->addItem( list ); // send to GUI + + return true; +} + +void LhaArch::open() +{ + setHeaders(); + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_archiver_program << "v" << m_filename; + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedTOC(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotOpenExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigOpen( this, false, QString::null, 0 ); + } +} + +void LhaArch::setHeaders() +{ + ColumnList list; + list.append( FILENAME_COLUMN); + list.append( PERMISSION_COLUMN); + list.append( OWNER_GROUP_COLUMN); + list.append( PACKED_COLUMN); + list.append( SIZE_COLUMN); + list.append( RATIO_COLUMN); + list.append( CRC_COLUMN); + list.append( TIMESTAMP_COLUMN); + list.append( LINK_COLUMN); + emit headers( list ); +} + + +void LhaArch::create() +{ + emit sigCreate( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); +} + +void LhaArch::addDir( const QString & dirName ) +{ + if ( !dirName.isEmpty() ) + { + QStringList list; + list.append( dirName ); + addFile( list ); + } +} + +void LhaArch::addFile( const QStringList &urls ) +{ + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + *kp << m_archiver_program; + + QString strOptions; + if ( ArkSettings::replaceOnlyWithNewer() ) + strOptions = "u"; + else + strOptions = "a"; + + *kp << strOptions << m_filename; + + KURL url( urls.first() ); + QDir::setCurrent( url.directory() ); + + QStringList::ConstIterator iter; + for ( iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL fileURL( *iter ); + *kp << fileURL.fileName(); + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotAddExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigAdd( false ); + } +} + +void LhaArch::unarchFileInternal() +{ + // if _fileList is empty, we extract all. + // if _destDir is empty, abort with error. + + if ( m_destDir.isEmpty() || m_destDir.isNull() ) + { + kdError( 1601 ) << "There was no extract directory given." << endl; + return; + } + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "xfw=" + m_destDir << m_filename; + + // if the list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if ( m_fileList ) + { + QStringList::Iterator it; + for ( it = m_fileList->begin(); it != m_fileList->end(); ++it ) + { + *kp << ( *it ); + } + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotExtractExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigExtract( false ); + } +} + +void LhaArch::remove( QStringList *list ) +{ + if ( !list ) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "df" << m_filename; + + QStringList::Iterator it; + for ( it = list->begin(); it != list->end(); ++it ) + { + *kp << ( *it ); + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotDeleteExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigDelete( false ); + } +} + +#include "lha.moc" diff --git a/ark/lha.h b/ark/lha.h new file mode 100644 index 0000000..98041fb --- /dev/null +++ b/ark/lha.h @@ -0,0 +1,61 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef LHA_H +#define LHA_H + +#include "arch.h" + +class QString; +class QCString; +class QStringList; + +class ArkWidget; + +class LhaArch : public Arch +{ + Q_OBJECT + public: + LhaArch( ArkWidget *, const QString & ); + virtual ~LhaArch() { } + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + + virtual void remove( QStringList * ); + virtual void unarchFileInternal(); + + protected slots: + virtual bool processLine( const QCString &line ); + + private: + void setHeaders(); +}; + +#endif // LHA_H diff --git a/ark/main.cpp b/ark/main.cpp new file mode 100644 index 0000000..a2156b4 --- /dev/null +++ b/ark/main.cpp @@ -0,0 +1,128 @@ +/* + +ark: A program for modifying archives via a GUI. + +Copyright (C) +2002-2003: Helio Chissini de Castro +2003: Georg Robbers +2001: Roberto Selbach Teixeira +1999-2000: Corel Corporation (author: Emily Ezust emilye@corel.com) +1999 Francois-Xavier Duranceau +1997-1999 Robert Palmbos + +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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// +// Note: This is a KUniqueApplication. +// To debug add --nofork to the command line. +// Be aware that newInstance() will not be called in this case, but you +// can run ark from a console, and that will invoke it in the debugger. +// + +// C includes +#include + +// KDE includes +#include +#include +#include +#include +#include +// ark includes +#include "arkapp.h" + +static KCmdLineOptions option[] = +{ + { "extract", I18N_NOOP( "Open extract dialog, quit when finished" ), 0 }, + { "extract-to", I18N_NOOP( "Extract 'archive' to 'folder'. Quit when finished.\n" + "'folder' will be created if it does not exist."), 0 }, + { "add", I18N_NOOP( "Ask for the name of the archive to add 'files' to. Quit when finished." ), 0 }, + { "add-to", I18N_NOOP( "Add 'files' to 'archive'. Quit when finished.\n'archive' " + "will be created if it does not exist." ), 0 }, + { "guess-name", I18N_NOOP( "Used with '--extract-to'. When specified, 'archive'\n" + "will be extracted to a subfolder of 'folder'\n" + "whose name will be the name of 'archive' without the filename extension."), 0 }, + { "+[folder]", I18N_NOOP( "Folder to extract to" ), 0 }, + { "+[files]", I18N_NOOP( "Files to be added" ), 0 }, + { "+[archive]", I18N_NOOP( "Open 'archive'" ), 0 }, + KCmdLineLastOption +}; + +extern "C" KDE_EXPORT int kdemain( int argc, char *argv[] ) +{ + KAboutData aboutData( "ark", I18N_NOOP( "Ark" ), + "2.6.4", I18N_NOOP( "KDE Archiving tool" ), + KAboutData::License_GPL, + I18N_NOOP( "(c) 1997-2006, The Various Ark Developers" ) + ); + + aboutData.addAuthor( "Henrique Pinto", + I18N_NOOP( "Maintainer" ), + "henrique.pinto@kdemail.net" ); + aboutData.addAuthor( "Charis Kouzinopoulos", + 0, + "kouzinopoulos@gmail.com" ); + aboutData.addAuthor( "Helio Chissini de Castro", + I18N_NOOP( "Former maintainer" ), + "helio@kde.org" ); + aboutData.addAuthor( "Georg Robbers", + 0, + "Georg.Robbers@urz.uni-hd.de" ); + aboutData.addAuthor( "Roberto Selbach Teixeira", + 0, + "maragato@kde.org" ); + aboutData.addAuthor( "Francois-Xavier Duranceau", + 0, + "duranceau@kde.org" ); + aboutData.addAuthor( "Emily Ezust (Corel Corporation)", + 0, + "emilye@corel.com" ); + aboutData.addAuthor( "Michael Jarrett (Corel Corporation)", + 0, + "michaelj@corel.com" ); + aboutData.addAuthor( "Robert Palmbos", + 0, + "palm9744@kettering.edu" ); + + aboutData.addCredit( "Bryce Corkins", + I18N_NOOP( "Icons" ), + "dbryce@attglobal.net" ); + aboutData.addCredit( "Liam Smit", + I18N_NOOP( "Ideas, help with the icons" ), + "smitty@absamail.co.za" ); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( option ); + KCmdLineArgs::addTempFileOption(); + + if ( !ArkApplication::start() ) + { + // Already running! + kdDebug( 1601 ) << "Already running" << endl; + exit( 0 ); + } + + if ( ArkApplication::getInstance()->isRestored() ) + { + kdDebug( 1601 ) << "In main: Restore..." << endl; + RESTORE( MainWindow ); + } + + return ArkApplication::getInstance()->exec(); +} + +// kate: space-indent off; tab-width 4; diff --git a/ark/mainwindow.cpp b/ark/mainwindow.cpp new file mode 100644 index 0000000..b62422c --- /dev/null +++ b/ark/mainwindow.cpp @@ -0,0 +1,481 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) 2002-2003: Georg Robbers + Copyright (C) 2003: Helio Chissini de Castro + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// QT includes +#include + +// KDE includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ark includes +#include "arkapp.h" +#include "settings.h" +#include "archiveformatinfo.h" +#include "arkwidget.h" + +MainWindow::MainWindow( QWidget * /*parent*/, const char *name ) + : KParts::MainWindow(), progressDialog( 0 ) +{ + setXMLFile( "arkui.rc" ); + m_part = KParts::ComponentFactory::createPartInstanceFromLibrary( "libarkpart", this, name, this, "ArkPart"); + if (m_part ) + { + //Since most of the functionality is still in ArkWidget: + m_widget = static_cast< ArkWidget* >( m_part->widget() ); + + setStandardToolBarMenuEnabled( true ); + setupActions(); + + connect( m_part->widget(), SIGNAL( request_file_quit() ), this, SLOT( file_quit() ) ); + connect( KParts::BrowserExtension::childObject( m_part ), SIGNAL( openURLRequestDelayed + ( const KURL &, const KParts::URLArgs & ) ), + m_part, SLOT( openURL( const KURL & ) ) ); + + m_widget->setArchivePopupEnabled( true ); + connect( m_part->widget(), SIGNAL( signalArchivePopup( const QPoint & ) ), this, + SLOT( slotArchivePopup( const QPoint & ) ) ); + + connect( m_part, SIGNAL( removeRecentURL( const KURL & ) ), this, + SLOT( slotRemoveRecentURL( const KURL & ) ) ); + connect( m_part, SIGNAL( addRecentURL( const KURL & ) ), this, + SLOT( slotAddRecentURL( const KURL & ) ) ); + connect( m_part, SIGNAL( fixActionState( const bool & ) ), this, + SLOT( slotFixActionState( const bool & ) ) ); + connect( m_widget, SIGNAL( disableAllActions() ), this, + SLOT( slotDisableActions() ) ); + + ArkApplication::getInstance()->addWindow(); + connect( m_widget, SIGNAL( removeOpenArk( const KURL &) ), this, + SLOT( slotRemoveOpenArk( const KURL & ) ) ); + connect( m_widget, SIGNAL( addOpenArk( const KURL & ) ), this, + SLOT( slotAddOpenArk( const KURL & ) ) ); + + setCentralWidget( m_part->widget() ); + createGUI( m_part ); + + if ( !initialGeometrySet() ) + { + resize( 640, 300 ); + } + setAutoSaveSettings( "MainWindow" ); + } + else + kdFatal( 1601 ) << "libark could not found. Aborting. " << endl; + +} + + + +MainWindow::~MainWindow() +{ + ArkApplication::getInstance()->removeWindow(); + delete m_part; + delete progressDialog; + progressDialog = 0; +} + +void +MainWindow::setupActions() +{ + newWindowAction = new KAction(i18n("New &Window"), "window_new", KShortcut(), this, + SLOT(file_newWindow()), actionCollection(), "new_window"); + + newArchAction = KStdAction::openNew(this, SLOT(file_new()), actionCollection()); + openAction = KStdAction::open(this, SLOT(file_open()), actionCollection()); + + reloadAction = new KAction(i18n("Re&load"), "reload", KStdAccel::shortcut( KStdAccel::Reload ), this, + SLOT(file_reload()), actionCollection(), "reload_arch"); + closeAction = KStdAction::close(this, SLOT(file_close()), actionCollection(), "file_close"); + + recent = KStdAction::openRecent(this, SLOT(openURL(const KURL&)), actionCollection()); + recent->loadEntries(kapp->config()); + + createStandardStatusBarAction(); + + KStdAction::quit(this, SLOT(window_close()), actionCollection()); + KStdAction::configureToolbars(this, SLOT(editToolbars()), actionCollection()); + KStdAction::keyBindings(this, SLOT( slotConfigureKeyBindings()), actionCollection()); + + openAction->setEnabled( true ); + recent->setEnabled( true ); + closeAction->setEnabled( false ); + reloadAction->setEnabled( false ); +} + +void +MainWindow::slotDisableActions() +{ + openAction->setEnabled(false); + newArchAction->setEnabled(false); + closeAction->setEnabled(false); + reloadAction->setEnabled(false); +} + +void +MainWindow::slotFixActionState( const bool & bHaveFiles ) +{ + openAction->setEnabled(true); + newArchAction->setEnabled(true); + closeAction->setEnabled(bHaveFiles); + reloadAction->setEnabled(bHaveFiles); +} + +void +MainWindow::file_newWindow() +{ + MainWindow *kw = new MainWindow; + kw->resize( 640, 300 ); + kw->show(); +} + +void +MainWindow::file_new() +{ + m_widget->file_new(); +} + +void +MainWindow::file_reload() +{ + KURL url( m_part->url() ); + file_close(); + m_part->openURL( url ); +} + +void +MainWindow::editToolbars() +{ + saveMainWindowSettings( KGlobal::config(), QString::fromLatin1("MainWindow") ); + KEditToolbar dlg( factory(), this ); + connect(&dlg, SIGNAL( newToolbarConfig() ), this, SLOT( slotNewToolbarConfig() )); + dlg.exec(); +} + +void +MainWindow::slotNewToolbarConfig() +{ + createGUI( m_part ); + applyMainWindowSettings( KGlobal::config(), QString::fromLatin1("MainWindow") ); +} + +void +MainWindow::slotConfigureKeyBindings() +{ + KKeyDialog dlg( true, this ); + + dlg.insert( actionCollection() ); + dlg.insert( m_part->actionCollection() ); + + dlg.configure(); +} + +void +MainWindow::slotArchivePopup( const QPoint &pPoint) +{ + static_cast(factory()->container("archive_popup", this))->popup(pPoint); +} + +// see if the ark is already open in another window +bool +MainWindow::arkAlreadyOpen( const KURL & url ) +{ + if (ArkApplication::getInstance()->isArkOpenAlready(url)) + { + if ( m_part->url() == url ) return true; + // raise the window containing the already open archive + ArkApplication::getInstance()->raiseArk(url); + + // close this window + window_close(); + + // notify the user what's going on + KMessageBox::information(0, i18n("The archive %1 is already open and has been raised.\nNote: if the filename does not match, it only means that one of the two is a symbolic link.").arg(url.prettyURL())); + return true; + } + return false; +} + + +void +MainWindow::openURL( const KURL & url, bool tempFile ) +{ + if( !arkAlreadyOpen( url ) ) + { + if ( tempFile && url.isLocalFile() ) + m_widget->deleteAfterUse( url.path() ); + m_part->openURL( url ); + } +} + +KURL +MainWindow::getOpenURL( bool addOnly, const QString & caption, + const QString & startDir, const QString & suggestedName ) +{ + kdDebug( 1601 ) << "startDir is: " << startDir << endl; + QWidget * forceFormatWidget = new QWidget( this ); + QHBoxLayout * l = new QHBoxLayout( forceFormatWidget ); + + QLabel * label = new QLabel( forceFormatWidget ); + label->setText( i18n( "Open &as:" ) ); + label->adjustSize(); + + KComboBox * combo = new KComboBox( forceFormatWidget ); + + QStringList list; + list = ArchiveFormatInfo::self()->allDescriptions(); + list.sort(); + list.prepend( i18n( "Autodetect (default)" ) ); + combo->insertStringList( list ); + + QString filter = ArchiveFormatInfo::self()->filter(); + if ( !suggestedName.isEmpty() ) + { + filter = QString::null; + combo->setCurrentItem( list.findIndex( ArchiveFormatInfo::self()->descriptionForMimeType( + KMimeType::findByPath( suggestedName, 0, true )->name() ) ) ); + } + + label->setBuddy( combo ); + + l->addWidget( label ); + l->addWidget( combo, 1 ); + + QString dir; + if ( addOnly ) + dir = startDir; + else + dir = ":ArkOpenDir"; + + KFileDialog dlg( dir, filter, this, "filedialog", true, forceFormatWidget ); + dlg.setOperationMode( addOnly ? KFileDialog::Saving + : KFileDialog::Opening ); + + dlg.setCaption( addOnly ? caption : i18n("Open") ); + dlg.setMode( addOnly ? ( KFile::File | KFile::ExistingOnly ) + : KFile::File ); + dlg.setSelection( suggestedName ); + + dlg.exec(); + + KURL url; + url = dlg.selectedURL(); + + if ( combo->currentItem() !=0 ) // i.e. != "Autodetect" + m_widget->setOpenAsMimeType( + ArchiveFormatInfo::self()->mimeTypeForDescription( combo->currentText() ) ); + else + m_widget->setOpenAsMimeType( QString::null ); + + return url; +} + +void +MainWindow::file_open() +{ + KURL url = getOpenURL(); + if( !arkAlreadyOpen( url ) ) + m_part->openURL( url ); +} + +void +MainWindow::file_close() +{ + m_part->closeURL(); +} + +void +MainWindow::window_close() +{ + file_close(); + slotSaveProperties(); + //kdDebug(1601) << "-ArkWidget::window_close" << endl; + close(); +} + +bool +MainWindow::queryClose() +{ + window_close(); + return true; +} + +void +MainWindow::file_quit() +{ + window_close(); +} + +void +MainWindow::slotSaveProperties() +{ + recent->saveEntries(kapp->config()); +} + +void +MainWindow::saveProperties( KConfig* config ) +{ + //TODO: make it work for URLS + config->writePathEntry( "SMOpenedFile",m_widget->getArchName() ); + config->sync(); +} + + +void +MainWindow::readProperties( KConfig* config ) +{ + QString file = config->readPathEntry("SMOpenedFile"); + kdDebug(1601) << "ArkWidget::readProperties( KConfig* config ) file=" << file << endl; + if ( !file.isEmpty() ) + openURL( KURL::fromPathOrURL( file ) ); +} + +void +MainWindow::slotAddRecentURL( const KURL & url ) +{ + recent->addURL( url ); + recent->saveEntries(kapp->config()); +} + +void +MainWindow::slotRemoveRecentURL( const KURL & url ) +{ + recent->removeURL( url ); + recent->saveEntries(kapp->config()); +} + +void +MainWindow::slotAddOpenArk( const KURL & _arkname ) +{ + ArkApplication::getInstance()->addOpenArk( _arkname, this ); +} + +void +MainWindow::slotRemoveOpenArk( const KURL & _arkname ) +{ + ArkApplication::getInstance()->removeOpenArk( _arkname ); +} + +void +MainWindow::setExtractOnly ( bool b ) +{ + m_widget->setExtractOnly( b ); +} + +void +MainWindow::extractTo( const KURL & targetDirectory, const KURL & archive, bool guessName ) +{ + startProgressDialog( i18n( "Extracting..." ) ); + m_widget->extractTo( targetDirectory, archive, guessName ); + m_part->openURL( archive ); +} + +void +MainWindow::addToArchive( const KURL::List & filesToAdd, const QString & /*cwd*/, + const KURL & archive, bool askForName ) +{ + KURL archiveFile; + if ( askForName || archive.isEmpty() ) + { + // user definded actions in servicemus are being started by konq + // from konqis working directory, not from the one being shown when + // the popupmenu was requested; work around that so the user + // sees a list of the archives in the diretory he is looking at. + // makes it show the 'wrong' dir when being called from the commandline + // like: /dira> ark -add /dirb/file, but well... + KURL cwdURL; + cwdURL.setPath( filesToAdd.first().path() ); + QString dir = cwdURL.directory( false ); + + archiveFile = getOpenURL( true, i18n( "Select Archive to Add Files To" ), + dir /*cwd*/, archive.fileName() ); + } + else + archiveFile = archive; + + if ( archiveFile.isEmpty() ) + { + kdDebug( 1601 ) << "no archive selected." << endl; + file_quit(); + return; + } + + startProgressDialog( i18n( "Compressing..." ) ); + + bool exists = KIO::NetAccess::exists( archiveFile, false, m_widget ); + kdDebug( 1601 ) << archiveFile << endl; + + if ( !m_widget->addToArchive( filesToAdd, archiveFile ) ) + file_quit(); + if ( exists ) + m_part->openURL( archiveFile ); +} + +void +MainWindow::startProgressDialog( const QString & text ) +{ + if ( !progressDialog ) + progressDialog = new KProgressDialog( this, "progress_dialog", QString::null, text, false ); + else + progressDialog->setLabel( text ); + +// progressDialog->setWFlags( Qt::WType_TopLevel ); + + progressDialog->setAllowCancel( true ); + progressDialog->setPlainCaption( i18n( "Please Wait" ) ); + + progressDialog->progressBar()->setTotalSteps( 0 ); + progressDialog->progressBar()->setPercentageVisible( false ); + +// progressDialog->setInitialSize( QSize(200,100), true ); + progressDialog->setMinimumDuration( 500 ); + progressDialog->show(); + KDialog::centerOnScreen( progressDialog ); + connect( progressDialog, SIGNAL( cancelClicked() ), this, SLOT( window_close() ) ); + + timer = new QTimer( this ); + connect( timer, SIGNAL( timeout() ), this, SLOT( slotProgress() ) ); + + timer->start( 200, false ); +} + +void +MainWindow::slotProgress() +{ + progressDialog->progressBar()->setProgress( progressDialog->progressBar()->progress() + 4 ); +} + + +#include "mainwindow.moc" + diff --git a/ark/mainwindow.h b/ark/mainwindow.h new file mode 100644 index 0000000..2d25ed0 --- /dev/null +++ b/ark/mainwindow.h @@ -0,0 +1,112 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) 2002-2003: Georg Robbers + Copyright (C) 2003: Helio Chissini de Castro + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ARKMAINWINDOW_H +#define ARKMAINWINDOW_H + +// QT includes +#include +#include +#include + +// KDE includes +#include +#include +#include +#include + +class ArkWidget; + +class +MainWindow: public KParts::MainWindow +{ + Q_OBJECT +public: + MainWindow( QWidget *parent=0, const char *name=0 ); + virtual ~MainWindow(); + + void setExtractOnly ( bool b ); + void extractTo( const KURL & targetDirectory, const KURL & archive, bool guessName ); + void addToArchive( const KURL::List & filesToAdd, const QString & cwd = QString::null, + const KURL & archive = KURL(), bool askForName = false ); + +public slots: + void file_newWindow(); + void file_new(); + void openURL( const KURL & url, bool tempFile = false ); + void file_open(); + void file_reload(); + void editToolbars(); + void window_close(); + void file_quit(); + void file_close(); + void slotNewToolbarConfig(); + void slotConfigureKeyBindings(); + virtual void saveProperties( KConfig* config ); + virtual void readProperties( KConfig* config ); + void slotSaveProperties(); + void slotArchivePopup( const QPoint &pPoint); + void slotRemoveRecentURL( const KURL &url ); + void slotAddRecentURL( const KURL &url ); + void slotFixActionState( const bool & bHaveFiles ); + void slotDisableActions(); + void slotAddOpenArk( const KURL & _arkname ); + void slotRemoveOpenArk( const KURL & _arkname ); + +protected: + virtual bool queryClose(); // SM + +private: // methods + // disabling/enabling of buttons and menu items + void setupActions(); + void setupMenuBar(); + + void newCaption(const QString & filename); + bool arkAlreadyOpen( const KURL & url ); + + KURL getOpenURL( bool addOnly = false , const QString & caption = QString::null, + const QString & startDir = QString::null, + const QString & suggestedName = QString::null ); + + void startProgressDialog( const QString & text ); + +private slots: + void slotProgress(); + +private: // data + KParts::ReadWritePart *m_part; + ArkWidget *m_widget; //the parts widget + + KAction *newWindowAction; + KAction *newArchAction; + KAction *openAction; + KAction *closeAction; + KAction *reloadAction; + KRecentFilesAction *recent; + + //progress dialog for konqs service menus / commmand line + KProgressDialog *progressDialog; + QTimer *timer; +}; + +#endif /* ARKMAINWINDOW_H*/ diff --git a/ark/pics/Makefile.am b/ark/pics/Makefile.am new file mode 100644 index 0000000..fc447c5 --- /dev/null +++ b/ark/pics/Makefile.am @@ -0,0 +1,2 @@ +icondir = $(kde_datadir)/ark/icons +icon_ICON = AUTO diff --git a/ark/pics/cr22-action-ark_adddir.png b/ark/pics/cr22-action-ark_adddir.png new file mode 100644 index 0000000000000000000000000000000000000000..e92bd63d2f89bc951693c38d09e4a054819f719e GIT binary patch literal 1303 zcmV+y1?c*TP)f03X_Vs^&;S4gu}MThRCt_~lWS~K1sH~( zbLs7L>o&G^W8EDBVTQpU9B4KS7%t)kBt{b=D5!)4jY=RIA~7M+A4C&Ei0%hEX4DWB zm4(OxPBb`V>I^bu8*B@^bnRN&t?OBPdT#z8AQ5Ev{{8Yk`MxjjD{v2Lv0F}8Q@sSR zW5m>Yp+0{)k9aR&C8f-jk)0NnE0`Z zBlt+;zGKBzfiq?I&GScxqNpjA_+*^eM2xhV7V92=$m1wiihSLkk-!OdO#6z1>*qD( zY}oSMtOfOoEV}Sl`T^)0?qhs>992_sd0a$@P+n9{?q7v+L(us~>DY1!ZnUX)Io~ZE3~2=asy|JO(cg(mSV@JS&fZ!2x0;F_Nhy)w8O}nU%w&Hc5Z1 zpW-YZ*`|l2rdgL7KmStS+qJ0)(jtIcakZ`3xNP<6dP6yN`2@PAW11!|%SAjMC!UBC z3WpdCjS`=XGch)S9@7cf0Z1r}CoL`*UE(rF;o2DiZ}ZJpShl(O&okX$l`dFZ_<{W% zQk#piKp7q9IuI=px9lbq4KbCPB9qS0eW@D+aOb#*nq&Mv(SbKR&YTt_s;TNu012R_ z#~OU3%Bpa9^J|-h9{FV7k5u`q7)^{48II6-zLUw+B&ke_zJWfbl2h1Do8!Ub{2J^) zOT{P{HZmn`+K%^w#_4T7d~);Ca=SyxQ%sZZJHGuUqA%3~(L_eR_>~__G(jlue5%?^@+oiHPc8ZU(K(a z>uKoLoPldP*DA}AH3udp$#jzNwJ>QtO@Y6FpdLi91;n(-qCYg@nXVk6R`Gjcqp>Pc zV)wp5^A+i67v>k8YTLRR<73;<7Zz5O&0ZKNqvUiaxsD>rYL*g-M;ML`BS{ihy}vIvh%(A9BO zP!onQ|NdgiE4_HVCKxK1Dxx$^r2#})0+$~o1tb@4#X&{BL`CgF5S^fpgPFPxl{}z3 z5rpvcV9T~h=?WgN|GH6hf*=7lh*==H{(*{4hWaNlEcAbKZad<^O7rYU@72dLy6ExG zUV!Mz2d59@EN~V8CWtcWDUFuH?VR~xuqQHMEIJcp@>b4msQ~!;C4{l0`e?5Nk@+w0UBNf>;ZxN4@(PccrYMdMhga`v<+tfPe*<3H8#a7qzyAOL N002ovPDHLkV1f=qYU%(0 literal 0 HcmV?d00001 diff --git a/ark/pics/cr22-action-ark_addfile.png b/ark/pics/cr22-action-ark_addfile.png new file mode 100644 index 0000000000000000000000000000000000000000..8108fff0df6d78ada2cb7ec527c11e5e0c48e3d3 GIT binary patch literal 1287 zcmV+i1^D`jP)f03X_Vs^&;S4gp-DtRRCt_?lzV8^Wf;dl zzu!4KciqjMZEl@2(RHzOCRA=CgGxn2672#NDY>SZp$MswDS=Rsgk{zr27#4IV47BB zktpt>nUXEHW$JEcXBW4#b3EsFzxBsZ^2}z>``?%M`{DaMJnt*;KWdk=>v)7nwT5QJ zh$S}&8_MtGac2vAoIQ0(k~19~!NS5aEyrj3?hT3|Ux*2G+MU$5*Y8jj)zTH+X&Y?I zTzE|uk#ob{Zg;Z%c^%@MN&#Z+Y7 z(Xsw@6kQ>sOQiKQ&B;^{a}+Q~|+GCAyJ z(-*5s=C7!!D=rIub~CYKTPuD))%Hz!)ts)1}A>J2f z&7n1T-Cow#ti{wd{A4gwU7R`G)US_7>u=7u?ugl#9JuynOJj@TvOUO}j3YV}dJ9Qu zDTJUvQc0pH3Ps^CDI-N{I7K8cf~F|=o$DO@;QNtGGPCJpnfU67l)Lsm=RWhyLj~(y zZeM@T#g@{TWd#Bi(_P{GV#*52Xu8luk|Z6OPDYdjx}szCSnPOy2f2YXx%O%VZMZtX3og*H$^y|wf-#@D)a<0{*?tTwVNh7!fmdsf~$Hfjh zM>R$XbE%zC%Sgkov@c%HqG$mH`8h)0 zmEQfDqD9}mY<>+OWH0u-Dm8-8KfcZYLzb zeHYF`R5c6hy>8G1KSxnO@^XRcr=&Q?&lpO(veC`l$*c6+wbQ6HEy#32{uk z+kssoc*Echfat>)$RRpOBs#MSL?0Llu#{1#%MXSJQ5bOU2(}&DQH%ioV0hFhdO>gj zHi#i`<$x)JD-EKD?yG4`8#9~Z$`+oiv`$|Bt81yDi@xG%RfygK@Z^F!1fC+m0?~yk z>m1qJ$nlfi9csd?I?;FQFEVB;01nk749os^^729(A6fdcw|r*xXky0&dOsI`IY!gb zpXGr;sqXEQ_Ws*3ZVSFq2kXeq*!f2bOCz;&SH2}Wrp8aZw%UEM!5{pVwCt55=>O#% x7kr~WUB<%`3yY50wkY(*1{QAqk#l$Q`~x0dPB(Q5lXn0B002ovPDHLkV1igTYhC~V literal 0 HcmV?d00001 diff --git a/ark/pics/cr22-action-ark_delete.png b/ark/pics/cr22-action-ark_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..4d60b28a09f6ef65bc71948d68b5d1118efcece9 GIT binary patch literal 1346 zcmV-I1-<%-P)f03X_Vs^&;S4g+(|@1RCt_))O&0cRTRhZ z@666V+b-Qcm(tQwP$;#AL_tWb5Tiszlo&9+P&8JB#Atx{2f=89k*JA@322ZgQtN|& zB1FUx+wu$+1bJ@J2HH~l*p}Vd?(FQ$?9RhKluBB_^XKp8e3El=?}Z!GkL%V|9N4(= z^Xr{`uwX&>`&FwVjVo5%dZT_}bl~jXopYMq+m_CAoD&(p-<9?G zq_iZt4)*qbG^?g&Zlu3IAz!+*W|H6k_3Wmmc?p1Fkh%BXuQQ^U zF*VIGb=}FRDq-+ffDq2l4}B)f8_%`2-VHo+Q`oJlrj^Y?Hj88!NVYBNlPCLv!5~-` zoh>a)mn2XW+D@I~ma;PO?C-yiS%o+{aA}%aQcys*qJXMWrt4ffc@iuOb$A%9r-zWP zGx+D9bj9OLm@e{lH(8zhv`ui-03s{S!VFBzc{ylKef7!H8jNb zW5-ysawS?eOG312Ujp|S`0XWlHb3lptGp`zl$4t-v<-veaF~?OM`C!GYE|WQb2CnF zFF{qMITGRih6cQTKdNC+RbM;1xVH4dYo-3DMkWV%cB<#}oCPx%-uLVSg_(hXAQntQ z%E_Uiq=ZxL?Tk+(@GAK82nAQFj?Q)RhcdgrlFDxRD_aZsLqG@0Eg z0*Eg0eOWd%e8pr%0n;$RvTz9kx7F8k+%Tw66atDuOCrIe%a@OgoX+TYr4(*E%D}~L zRa4auMpm(Ghu+wIrsGIoSKKt+9x|E+whflWKt~6K$s`O9Ln1+WG|K7L))Cmq=y-)B ztxc`UmEQQrpU9j6kiLAg~Evwsj8_#Nv53S=}x=9J<)~Wajl&e_)Upv8BuVuPl%GE3Zk{a7aSLA zzpz6(-`0ew>$Gj(&g`KfNT)dp?DKj-mU%iJXV3ceBw{g=vCBfNCnFS96jfVUV~tBR ze?f5OjXdeb$EouLi?)hIHAbJ?=*RgEO(T;0$FmH-=zB|&j&=&me;_5mCZvnW+fjbvG zMSu;0M8+`r`I|Oce(D^M6?5jnUgT??F}DKXhnI21H2;U8{JdB0TGHSttGN>#`=0@g z0WKVF=E%;y`oK{7^|dY5rt2Bkg|F6E%P6#5p*=+ts%F+dzeaS-4Er{`Y4`UGHv6sA zBQNekzftc^;j8uOB|xC?zkYXATM07*qoM6N<$ Ef@>v`ApigX literal 0 HcmV?d00001 diff --git a/ark/pics/cr22-action-ark_extract.png b/ark/pics/cr22-action-ark_extract.png new file mode 100644 index 0000000000000000000000000000000000000000..d82746d996da7e5b23e2704c9181cd71f1294f46 GIT binary patch literal 1227 zcmV;+1T_1JP)f03X_Vs^&;S4gWl2OqRCt_?)O~CdbsWd> z_uaMKx^C@QWo+P{*l>|#!vp~ZT!a~fM5B^`G12&t8RZZDP$C+UL=%m{1bqAljEM%~ zv%yIKCqbeRM+O)bHnsu6y0W$_qovp0UGM4V9~*>i2>T|#yWB7LedU`^?sqW75<<)u zLM)%^`<^MH)4IBN@4^Kdgb)iQNlM(RN1g&I_4V;uB;qartKyq)+^s?gMF=5}-917G zWn!N+aihImbQTuUr0c@Xsg~C;EE!o*LLpnREW!EnI95L4n3k=_6PkJQWI~EWhIhu} z&%AuSGbxI6n&8r<1pIyp$Mx~&35QHZBbyZ%hKt`X6j?4;T2};pxg69t4DiAGXZ$yf zV#^X5wM0*~kry})oI9&?>5@t=XK>|;KDIRW?1{2}e;NQYuTw2|EqV@0Cc&Sy68`KF z|E{{m8NY=}^TqkRi{n5%t|J7b(=Mr$PCBh~@L&epb~ti420-4_XnA19yxW^Adp1-B zUs?kSj9peY`~GQtVp+?Q$L=rbk2m2Dl~YutP+94xswzM-nPYG;MKqelaXq}gshRs) zrUTH|*Uy~lbJB*lmj`t<*OD4cHXT*1??MxK!o zm1Ob?t~(yin_2vFihbLE$)u9$EuX6NuL~0N?0npN*jpS{EWKl*qiFPY* z)x6Vh?SLDcysw_}Il)rDTv1m;B9dTa#LJKIb^LIk41iUw7ON}2#3y3RnjL27^ciAN z&3g5y*VGV(&VvPSFmL4@s8)y??@6>Fo8p;8gghCRwH5Qx zySh8cnYbY{YP77i|&7W1|LQ$@J_F9Lh?-mZwNfa;0pr|$Q}&Mr2X?wIt~oS zGFhYf$PnuF&ZMsbVD}3smo@*k($bO_?^*M_Z|2;)L5R^g@^QLz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZHehtFF0nVMf!La<53**K4 zE)1OF>I|<=FJ>SH00a;VGRM?Zo#F4_e++;A{AKv{>o<`8$MEILcLpXVCZMba(3U;_ zk32fXC~6eWKr8?VASP^rjEsz6Lz$T&7~uddhN)B6{bywSN3;b10mO(LL@*zK@bN>3 z@M^qy^#(&$aV{ev3jhL$1ziAUAqc2xYcTx#_mANp(8Axpe>433^M~R4H%O4F1Ldam zPX15G5`X|=A(_s1BKQVP1Plyw=WhRxZV5mDF`-)kivxrpcFUNV88H%pxw$sj5@dA% z0fgcMkcS_$8 zfpHHs_&>vsAHP661}`rwhL0b=GJN{eN|Z*Y)){P+cE*$)OYGc6Pc0R#|+55NXOT@Ff~|B?8}K7a+2kdOd_iHR97 z11uwE?f03X_Vs^&;S4e+et)0RCt`Vl}$)gQ5462 z?_=J)c{VP@5=k8d2~q@Ma^Xfqa62FbF5IL@8y8Wz2`!MojSvWJOJ)_VLXg>{wGhV& zY!QeMmdrSA{9wR*e$C7~E#|`+eU51KhYJ_pIlp^3_q_jsQfa^gU|k>FMdo!yli?(|{2061eLIehbLl+?=>6nM_JWMTGiLqkLPTXzG7VHn?9T3SxFx3@(^Boc{;rfC^qI1hdZ$i&1% zIj%&b(LDGa5b}DxsYD`C5;HY5B_5AwA20!?0a;mDDGL@6sjjXTVBPEWe(3M-PoMp6 z+qPJibprGQd<4X{?MuP!?d<}bsH&Qpot<@!85kIF48xdJf!kG8RbpAzrLEJ@&;a0Z z97k_$ZFP-lZf;g|U2jr>`amF{xJI2(eSJLux~@BQb#)gWo=&H0uhj60l0DzDtc65rYMT2s!AjhAruP9;^N}L(b3WUV#YmOY;$*aSMs&YttV%y^~f~M z4Ztx?^AlP7JttSA@9XQk%;**1rW>$W|7A46=`f9QI!s@1jbZv1gd%Qb{)Z2>00000 LNkvXXu0mjfOJ04+ literal 0 HcmV?d00001 diff --git a/ark/pics/cr32-action-ark_adddir.png b/ark/pics/cr32-action-ark_adddir.png new file mode 100644 index 0000000000000000000000000000000000000000..022438d666b54e724e39e5bc529d709940147ccd GIT binary patch literal 2285 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 Ef_c9OrvLx| literal 0 HcmV?d00001 diff --git a/ark/pics/cr32-action-ark_delete.png b/ark/pics/cr32-action-ark_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9e6fe388fd2f1e3b1c063f8004a1e768c8bd3a GIT binary patch literal 2284 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 O0000f03X_Vs^&;S4g2uVaiRCt`VmrqEnRT##9 zpE@~1|@m7iKPG7M55WNjHJE ziM*zaOc+@&_t`!{Lzm z`FSy7XJx^;krCrtcs-7HVw6(P<0sjIoTyuQ`NOyPljrkiJ8)CEBbl?)GRLNgatMBdY zO*^@W$l~InaU0%IT;=8Ea(Q`a8Z$mVuI7KH1iYE*I903-9ca?xZAaE-IA|mzm^-92xz!R(0st1F?q%l1`Ju2qS44?$SVzE$A zP+)dIlcKn|ST#$5g4WhnEiW&5f$Zw)Qq9JwfWpE;G)=p;fTE%z)pP-PJf4&>hB+ls z0fv>_3Whih!0mRYj4{mlUw~mH&nh6EJRuwo2R54x;AOKCdMk)XOg}d_H?6qqb7IdR zQp-6wICv%j@o`5-M=4`Ogu}x_fWM*w_V@SGN;o(;NJT{j!^6YG#pwW#A3tVhW`@ej zN@izgO*w+WAfZqQU>{%-5R1hkx~?bv|4vLy#5g0b*DD-m zYimozd;w_|B3;*|w6ruvKy`Jsu@L>Fo*Cz?tgPJNnwy(b;~znqrFeUL+teSrTrSoA z68JTKd~|g523Jc@g-zY4lA@TWq$pjb;$*6kncDp4U4o5k> zUatV6Y1$*MOSeKwOLld2B~GU^kpQD5(}3>)X=rE=zuzy%$Hy``IVsuM*}A4_XFyf_ zRsl>X!bGNYU|_&3`5)XgrOy+&H^k3<3cO*K9N;AkwtRhk{f2;xiwkLPZjLAIPQdpZ z&<}hItO1`Aamq;%y_h(iPFYx3h$&7!pYL8TCJHfEGmpn3?d|PSQ&VHK*7tTbQ+SWa zjo56@b>M66@p7tAK*VJJ0Gt9p6RF*=-er>i067MaPs3aCfdBvi07*qoM6N<$g1wsu AZ2$lO literal 0 HcmV?d00001 diff --git a/ark/rar.cpp b/ark/rar.cpp new file mode 100644 index 0000000..592ffe2 --- /dev/null +++ b/ark/rar.cpp @@ -0,0 +1,306 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2003: Helio Chissini de Castro + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// Std includes +#include +#include +#include +#include + +// QT includes +#include +#include + +// KDE includes +#include +#include +#include +#include +#include +#include + +// ark includes +#include +#include "arkwidget.h" +#include "arch.h" +#include "settings.h" +#include "rar.h" +#include "arkutils.h" +#include "filelistview.h" + +RarArch::RarArch( ArkWidget *_gui, const QString & _fileName ) + : Arch( _gui, _fileName ) +{ + // Check if rar is available + bool have_rar = !KGlobal::dirs()->findExe( "rar" ).isNull(); + + if ( have_rar ) + { + // If it is, then use it as archiver and unarchiver + m_archiver_program = m_unarchiver_program = "rar"; + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + } + else + { + // If rar is not available, try to use unrar to open the archive read-only + m_unarchiver_program = "unrar"; + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + setReadOnly( true ); + } + + + + m_headerString = "-------------------------------------------------------------------------------"; + + m_isFirstLine = true; +} + +bool RarArch::processLine( const QCString &line ) +{ + if ( m_isFirstLine ) + { + m_entryFilename = QString::fromLocal8Bit( line ); + m_entryFilename.remove( 0, 1 ); + m_isFirstLine = false; + return true; + } + + QStringList list; + + QStringList l2 = QStringList::split( ' ', line ); + + list << m_entryFilename; // filename + list << l2[ 0 ]; // size + list << l2[ 1 ]; // packed + list << l2[ 2 ]; // ratio + + QStringList date = QStringList::split( '-', l2[ 3 ] ); + list << ArkUtils::fixYear( date[ 2 ].latin1() ) + '-' + date[ 1 ] + '-' + date [ 0 ] + ' ' + l2[4]; // date + list << l2[ 5 ]; // attributes + list << l2[ 6 ]; // crc + list << l2[ 7 ]; // method + list << l2[ 8 ]; // Version + + m_gui->fileList()->addItem( list ); // send to GUI + + m_isFirstLine = true; + return true; +} + +void RarArch::open() +{ + setHeaders(); + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_unarchiver_program << "v" << "-c-" << m_filename; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedTOC(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotOpenExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigOpen( this, false, QString::null, 0 ); + } +} + +void RarArch::setHeaders() +{ + ColumnList list; + list.append( FILENAME_COLUMN ); + list.append( SIZE_COLUMN ); + list.append( PACKED_COLUMN ); + list.append( RATIO_COLUMN ); + list.append( TIMESTAMP_COLUMN ); + list.append( PERMISSION_COLUMN ); + list.append( CRC_COLUMN ); + list.append( METHOD_COLUMN ); + list.append( VERSION_COLUMN ); + + emit headers( list ); +} + +void RarArch::create() +{ + emit sigCreate( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); +} + +void RarArch::addDir( const QString & _dirName ) +{ + if ( !_dirName.isEmpty() ) + { + QStringList list; + list.append( _dirName ); + addFile( list ); + } +} + +void RarArch::addFile( const QStringList & urls ) +{ + KProcess *kp = m_currentProcess = new KProcess; + + kp->clearArguments(); + *kp << m_archiver_program; + + if ( ArkSettings::replaceOnlyWithNewer() ) + *kp << "u"; + else + *kp << "a"; + + if ( ArkSettings::rarStoreSymlinks() ) + *kp << "-ol"; + if ( ArkSettings::rarRecurseSubdirs() ) + *kp << "-r"; + + *kp << m_filename; + + KURL dir( urls.first() ); + QDir::setCurrent( dir.directory() ); + + QStringList::ConstIterator iter; + for ( iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL url( *iter ); + *kp << url.fileName(); + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotAddExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigAdd( false ); + } +} + +void RarArch::unarchFileInternal() +{ + if ( m_destDir.isEmpty() || m_destDir.isNull() ) + { + kdError( 1601 ) << "There was no extract directory given." << endl; + return; + } + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + // extract (and maybe overwrite) + *kp << m_unarchiver_program << "x"; + + if ( !m_password.isEmpty() ) + *kp << "-p" + m_password; + else + *kp << "-p-"; + + if ( !ArkSettings::extractOverwrite() ) + { + *kp << "-o+"; + } + else + { + *kp << "-o-"; + } + + *kp << m_filename; + + // if the file list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if ( m_fileList ) + { + QStringList::Iterator it; + for ( it = m_fileList->begin(); it != m_fileList->end(); ++it ) + { + *kp << (*it); + } + } + + *kp << m_destDir ; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotExtractExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigExtract( false ); + } +} + +bool RarArch::passwordRequired() +{ + return m_lastShellOutput.findRev("password incorrect ?)")+1; +} + +void RarArch::remove( QStringList *list ) +{ + if ( !list ) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "d" << m_filename; + + QStringList::Iterator it; + for ( it = list->begin(); it != list->end(); ++it ) + { + QString str = *it; + *kp << str; + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotDeleteExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigDelete( false ); + } +} + +#include "rar.moc" diff --git a/ark/rar.h b/ark/rar.h new file mode 100644 index 0000000..d8a4ab4 --- /dev/null +++ b/ark/rar.h @@ -0,0 +1,68 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef RAR_H +#define RAR_H + +#include "arch.h" + +class QString; +class QCString; +class QStringList; + +class ArkWidget; + +class RarArch : public Arch +{ + Q_OBJECT + public: + RarArch( ArkWidget *_gui, const QString & _fileName ); + virtual ~RarArch() {} + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + + virtual void remove( QStringList * ); + virtual void unarchFileInternal(); + virtual bool passwordRequired(); + + protected slots: + virtual bool processLine( const QCString & ); + + private: + void setHeaders(); + + /* + * The output of the rar command uses more than one + * line for each entry, the first containing the filename + * for the entry, the second containing additional information. + * Therefore, the variables below are needed. + */ + bool m_isFirstLine; + QString m_entryFilename; +}; + +#endif // RAR_H diff --git a/ark/searchbar.cpp b/ark/searchbar.cpp new file mode 100644 index 0000000..015a3bf --- /dev/null +++ b/ark/searchbar.cpp @@ -0,0 +1,49 @@ +/* + * ark: A program for modifying archives via a GUI. + * + * Copyright (C) 2004, Henrique Pinto + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "searchbar.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +SearchBar::SearchBar( QWidget* parent, KActionCollection* aC, const char * name ) + : KListViewSearchLine( parent, 0, name ) +{ + KAction *resetSearch = new KAction( i18n( "Reset Search" ), QApplication::reverseLayout() ? "clear_left" : "locationbar_erase", 0, this, SLOT( clear() ), aC, "reset_search" ); + + resetSearch->plug( parent ); + resetSearch->setWhatsThis( i18n( "Reset Search\n" + "Resets the search bar, so that all archive entries are shown again." ) ); +} + +SearchBar::~SearchBar() +{ +} + +#include "searchbar.moc" diff --git a/ark/searchbar.h b/ark/searchbar.h new file mode 100644 index 0000000..95857ae --- /dev/null +++ b/ark/searchbar.h @@ -0,0 +1,40 @@ +#ifndef SEARCHBAR_H +#define SEARCHBAR_H +/* + * ark: A program for modifying archives via a GUI. + * + * Copyright (C) 2004, Henrique Pinto + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include + +#include + +class KListView; +class KComboBox; +class KActionCollection; + +class SearchBar: public KListViewSearchLine +{ + Q_OBJECT + public: + SearchBar( QWidget* parent, KActionCollection* aC, const char * name = 0 ); + ~SearchBar(); +}; + +#endif // SEARCHBAR_H diff --git a/ark/settings.kcfgc b/ark/settings.kcfgc new file mode 100644 index 0000000..a8bc919 --- /dev/null +++ b/ark/settings.kcfgc @@ -0,0 +1,5 @@ +File=ark.kcfg +ClassName=ArkSettings +Singleton=true +Mutators=true +SetUserTexts=true diff --git a/ark/sevenzip.cpp b/ark/sevenzip.cpp new file mode 100644 index 0000000..30747a3 --- /dev/null +++ b/ark/sevenzip.cpp @@ -0,0 +1,367 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2004: Henrique Pinto + 2003: Helio Chissini de Castro + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "sevenzip.h" +#include "arkwidget.h" +#include "settings.h" +#include "arkutils.h" +#include "filelistview.h" + +SevenZipArch::SevenZipArch( ArkWidget *gui, const QString &filename ) + : Arch( gui, filename ), m_nameColumnPos( -1 ) +{ + // Check if 7z is available + bool have_7z = !KGlobal::dirs()->findExe( "7z" ).isNull(); + // Check if 7za is available + bool have_7za = !KGlobal::dirs()->findExe( "7za" ).isNull(); + + if ( have_7z ) + m_archiver_program = m_unarchiver_program = "7z"; // Use 7z + else if ( have_7za ) + m_archiver_program = m_unarchiver_program = "7za"; // Try 7za + else + m_archiver_program = m_unarchiver_program = "7zr"; + + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + + m_headerString = "------------------"; + + m_repairYear = 5; m_fixMonth = 6; m_fixDay = 7; m_fixTime = 8; + m_dateCol = 3; + m_numCols = 5; + + m_archCols.append( new ArchColumns( 5, QRegExp( "[0-2][0-9][0-9][0-9]" ), 4 ) ); // Year + m_archCols.append( new ArchColumns( 6, QRegExp( "[01][0-9]" ), 2 ) ); // Month + m_archCols.append( new ArchColumns( 7, QRegExp( "[0-3][0-9]" ), 2 ) ); // Day + m_archCols.append( new ArchColumns( 8, QRegExp( "[0-9:]+" ), 8 ) ); // Time + m_archCols.append( new ArchColumns( 4, QRegExp( "[^\\s]+" ) ) ); // Attributes + m_archCols.append( new ArchColumns( 1, QRegExp( "[0-9]+" ) ) ); // Size + m_archCols.append( new ArchColumns( 2, QRegExp( "[0-9]+" ), 64, true ) ); // Compressed Size +} + +SevenZipArch::~SevenZipArch() +{ +} + +void SevenZipArch::setHeaders() +{ + ColumnList columns; + columns.append( FILENAME_COLUMN ); + columns.append( SIZE_COLUMN ); + columns.append( PACKED_COLUMN ); + columns.append( TIMESTAMP_COLUMN ); + columns.append( PERMISSION_COLUMN ); + + emit headers( columns ); +} + +void SevenZipArch::open() +{ + setHeaders(); + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_archiver_program << "l" << m_filename; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedTOC(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotOpenExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigOpen( this, false, QString::null, 0 ); + } +} + +void SevenZipArch::create() +{ + emit sigCreate( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); +} + +void SevenZipArch::addFile( const QStringList & urls ) +{ + KProcess *kp = m_currentProcess = new KProcess; + + kp->clearArguments(); + *kp << m_archiver_program << "a" ; + + KURL url( urls.first() ); + QDir::setCurrent( url.directory() ); + + *kp << m_filename; + + QStringList::ConstIterator iter; + for ( iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL url( *iter ); + *kp << url.fileName(); + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotAddExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigAdd( false ); + } +} + +void SevenZipArch::addDir( const QString & dirName ) +{ + if ( !dirName.isEmpty() ) + { + QStringList list; + list.append( dirName ); + addFile( list ); + } +} + +void SevenZipArch::remove( QStringList *list ) +{ + if ( !list ) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "d" << m_filename; + + QStringList::Iterator it; + for ( it = list->begin(); it != list->end(); ++it ) + { + *kp << *it; + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotDeleteExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigDelete( false ); + } +} + +void SevenZipArch::unarchFileInternal( ) +{ + if ( m_destDir.isEmpty() || m_destDir.isNull() ) + { + kdError( 1601 ) << "There was no extract directory given." << endl; + return; + } + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + // extract (and maybe overwrite) + *kp << m_unarchiver_program << "x"; + + if ( ArkSettings::extractOverwrite() ) + { + //*kp << "-ao"; + } + + *kp << m_filename; + + // if the file list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if ( m_fileList ) + { + QStringList::Iterator it; + for ( it = m_fileList->begin(); it != m_fileList->end(); ++it ) + { + *kp << (*it); + } + } + + *kp << "-o" + m_destDir ; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotExtractExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigExtract( false ); + } +} + +bool SevenZipArch::processLine( const QCString& _line ) +{ + QCString line( _line ); + QString columns[ 11 ]; + unsigned int pos = 0; + int strpos, len; + + columns[ 0 ] = line.right( line.length() - m_nameColumnPos +1); + line.truncate( m_nameColumnPos ); + + // Go through our columns, try to pick out data, return silently on failure + for ( QPtrListIterator col( m_archCols ); col.current(); ++col ) + { + ArchColumns *curCol = *col; + + strpos = curCol->pattern.search( line, pos ); + len = curCol->pattern.matchedLength(); + + if ( ( strpos == -1 ) || ( len > curCol->maxLength ) ) + { + if ( curCol->optional ) + continue; // More? + else + { + kdDebug(1601) << "processLine failed to match critical column" << endl; + return false; + } + } + + pos = strpos + len; + + columns[ curCol->colRef ] = line.mid( strpos, len ); + } + + + if ( m_dateCol >= 0 ) + { + QString year = ( m_repairYear >= 0 ) ? + ArkUtils::fixYear( columns[ m_repairYear ].ascii()) + : columns[ m_fixYear ]; + QString month = ( m_repairMonth >= 0 ) ? + QString( "%1" ) + .arg( ArkUtils::getMonth( columns[ m_repairMonth ].ascii() ) ) + : columns[ m_fixMonth ]; + QString timestamp = QString::fromLatin1( "%1-%2-%3 %4" ) + .arg( year ) + .arg( month ) + .arg( columns[ m_fixDay ] ) + .arg( columns[ m_fixTime ] ); + + columns[ m_dateCol ] = timestamp; + } + + QStringList list; + + for ( int i = 0; i < m_numCols; ++i ) + { + list.append( columns[ i ] ); + } + + m_gui->fileList()->addItem( list ); // send the entry to the GUI + + return true; +} + +void SevenZipArch::slotReceivedTOC( KProcess*, char* data, int length ) +{ + char endchar = data[ length ]; + data[ length ] = '\0'; + + appendShellOutputData( data ); + + int startChar = 0; + + while ( !m_finished ) + { + int lfChar; + for ( lfChar = startChar; data[ lfChar ] != '\n' && lfChar < length; + lfChar++ ); + + if ( data[ lfChar ] != '\n') + break; // We are done all the complete lines + + data[ lfChar ] = '\0'; + m_buffer.append( data + startChar ); + data[ lfChar ] = '\n'; + startChar = lfChar + 1; + + // Check if the header was found + if ( m_buffer.find( m_headerString ) != -1 ) + { + if ( !m_header_removed ) + { + m_nameColumnPos = m_buffer.findRev( ' ' ) + 1; + m_header_removed = true; + } + else + { + m_finished = true; + } + } + else + { + // If the header was not found, process the line + if ( m_header_removed && !m_finished ) + { + if ( !processLine( m_buffer ) ) + { + m_header_removed = false; + m_error = true; + } + } + } + + m_buffer.resize( 0 ); + } + + if ( !m_finished ) + m_buffer.append( data + startChar); // Append what's left of the buffer + + data[ length ] = endchar; +} + +#include "sevenzip.moc" diff --git a/ark/sevenzip.h b/ark/sevenzip.h new file mode 100644 index 0000000..4a34c48 --- /dev/null +++ b/ark/sevenzip.h @@ -0,0 +1,54 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2004: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef SEVENZIP_H +#define SEVENZIP_H + +#include "arch.h" + +class SevenZipArch : public Arch +{ + Q_OBJECT + public: + SevenZipArch( ArkWidget *, const QString & ); + virtual ~SevenZipArch(); + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + + virtual void remove( QStringList * ); + virtual void unarchFileInternal( ); + + protected slots: + virtual bool processLine( const QCString& line ); + virtual void slotReceivedTOC( KProcess*, char*, int ); + + private: + void setHeaders(); + int m_nameColumnPos; +}; + +#endif // SEVENZIP_H diff --git a/ark/tar.cpp b/ark/tar.cpp new file mode 100644 index 0000000..5f104ef --- /dev/null +++ b/ark/tar.cpp @@ -0,0 +1,774 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + 2001: Roberto Selbach Teixeira + 2003: Georg Robbers + 2006: Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +// Note: When maintaining tar files with ark, the user should be +// aware that these options have been improved (IMHO). When you append a file +// to a tarchive, tar does not check if the file exists already, and just +// tacks the new one on the end. ark deletes the old one. +// When you update a file that exists in a tarchive, it does check if +// it exists, but once again, it creates a duplicate at the end (only if +// the file is newer though). ark deletes the old one in this case as well. +// +// Basically, tar files are great for creating and extracting, but +// not especially for maintaining. The original purpose of a tar was of +// course, for tape backups, so this is not so surprising! -Emily +// + +// C includes +#include +#include +#include +#include +#include + +// Qt includes +#include +#include +#include + +// KDE includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ark includes +#include "arkwidget.h" +#include "settings.h" +#include "tar.h" +#include "filelistview.h" +#include "tarlistingthread.h" + +TarArch::TarArch( ArkWidget *_gui, + const QString & _filename, const QString & _openAsMimeType) + : Arch( _gui, _filename), m_tmpDir( 0 ), createTmpInProgress(false), + updateInProgress(false), deleteInProgress(false), fd(0), + m_pTmpProc( 0 ), m_pTmpProc2( 0 ), failed( false ), + m_dotslash( false ), m_listingThread( 0 ) +{ + m_filesToAdd = m_filesToRemove = QStringList(); + m_archiver_program = m_unarchiver_program = ArkSettings::tarExe(); + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + + m_fileMimeType = _openAsMimeType; + if ( m_fileMimeType.isNull() ) + m_fileMimeType = KMimeType::findByPath( _filename )->name(); + + kdDebug(1601) << "TarArch::TarArch: mimetype is " << m_fileMimeType << endl; + + if ( m_fileMimeType == "application/x-tbz2" ) + { + // ark treats .tar.bz2 as x-tbz, instead of duplicating the mimetype + // let's just alias it to the one we already handle. + m_fileMimeType = "application/x-tbz"; + } + + if ( m_fileMimeType == "application/x-tar" ) + { + compressed = false; + } + else + { + compressed = true; + m_tmpDir = new KTempDir( _gui->tmpDir() + + QString::fromLatin1( "temp_tar" ) ); + m_tmpDir->setAutoDelete( true ); + m_tmpDir->qDir()->cd( m_tmpDir->name() ); + // build the temp file name + KTempFile *pTempFile = new KTempFile( m_tmpDir->name(), + QString::fromLatin1(".tar") ); + + tmpfile = pTempFile->name(); + delete pTempFile; + + kdDebug(1601) << "Tmpfile will be " << tmpfile << "\n" << endl; + } +} + +TarArch::~TarArch() +{ + delete m_tmpDir; + m_tmpDir = 0; + + if ( m_listingThread && m_listingThread->finished() != true ) + { + m_listingThread->wait(); + delete m_listingThread; + m_listingThread = 0; + } +} + +int TarArch::getEditFlag() +{ + return Arch::Extract; +} + +void TarArch::updateArch() +{ + if (compressed) + { + updateInProgress = true; + int f_desc = KDE_open(QFile::encodeName(m_filename), O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (f_desc != -1) + fd = fdopen( f_desc, "w" ); + else + fd = NULL; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + KProcess::Communication flag = KProcess::AllOutput; + if ( getCompressor() == "lzop" ) + { + kp->setUsePty( KProcess::Stdin, false ); + flag = KProcess::Stdout; + } + if ( !getCompressor().isNull() ) + *kp << getCompressor() << "-c" << tmpfile; + else + *kp << "cat" << tmpfile; + + + connect(kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(updateProgress( KProcess *, char *, int ))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + (Arch *)this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect(kp, SIGNAL(processExited(KProcess *)), + this, SLOT(updateFinished(KProcess *)) ); + + if ( !fd || kp->start(KProcess::NotifyOnExit, flag) == false) + { + KMessageBox::error(0, i18n("Trouble writing to the archive...")); + emit updateDone(); + } + } +} + +void TarArch::updateProgress( KProcess * _proc, char *_buffer, int _bufflen ) +{ + // we're trying to capture the output of a command like this + // gzip -c myarch.tar + // and feed the output to the archive + int size; + size = fwrite(_buffer, 1, _bufflen, fd); + if (size != _bufflen) + { + _proc->kill(); + KMessageBox::error(0, i18n("Trouble writing to the archive...")); + kdWarning( 1601 ) << "trouble updating tar archive" << endl; + //kdFatal( 1601 ) << "trouble updating tar archive" << endl; + } +} + + + +QString TarArch::getCompressor() +{ + if ( m_fileMimeType == "application/x-tarz" ) + return QString( "compress" ); + + if ( m_fileMimeType == "application/x-tgz" ) + return QString( "gzip" ); + + if ( m_fileMimeType == "application/x-tbz" ) + return QString( "bzip2" ); + + if( m_fileMimeType == "application/x-tzo" ) + return QString( "lzop" ); + + return QString::null; +} + + +QString TarArch::getUnCompressor() +{ + if ( m_fileMimeType == "application/x-tarz" ) + return QString( "uncompress" ); + + if ( m_fileMimeType == "application/x-tgz" ) + return QString( "gunzip" ); + + if ( m_fileMimeType == "application/x-tbz" ) + return QString( "bunzip2" ); + + if( m_fileMimeType == "application/x-tzo" ) + return QString( "lzop" ); + + return QString::null; +} + +void +TarArch::open() +{ + if ( compressed ) + QFile::remove(tmpfile); // just to make sure + setHeaders(); + + clearShellOutput(); + + // might as well plunk the output of tar -tvf in the shell output window... + // + // Now it's essential - used later to decide whether pathnames in the + // tar archive are plain or start with "./" + KProcess *kp = m_currentProcess = new KProcess; + + *kp << m_archiver_program; + + if ( compressed ) + { + *kp << "--use-compress-program=" + getUnCompressor(); + } + + *kp << "-tvf" << m_filename; + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + connect(kp, SIGNAL(processExited(KProcess *)), + this, SLOT(slotListingDone(KProcess *))); + connect(kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput( KProcess *, char *, int ))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + } + + // We list afterwards because we want the signals at the end + // This unconfuses Extract Here somewhat + + if ( m_fileMimeType == "application/x-tgz" + || m_fileMimeType == "application/x-tbz" || !compressed ) + { + openFirstCreateTempDone(); + } + else + { + connect( this, SIGNAL( createTempDone() ), this, SLOT( openFirstCreateTempDone() ) ); + createTmp(); + } +} + +void TarArch::openFirstCreateTempDone() +{ + if ( compressed && ( m_fileMimeType != "application/x-tgz" ) + && ( m_fileMimeType != "application/x-tbz" ) ) + { + disconnect( this, SIGNAL( createTempDone() ), this, SLOT( openFirstCreateTempDone() ) ); + } + + Q_ASSERT( !m_listingThread ); + m_listingThread = new TarListingThread( this, m_filename ); + m_listingThread->start(); +} + +void TarArch::slotListingDone(KProcess *_kp) +{ + const QString list = getLastShellOutput(); + FileListView *flv = m_gui->fileList(); + if (flv!=NULL && flv->totalFiles()>0) + { + const QString firstfile = ((FileLVI *) flv->firstChild())->fileName(); + if (list.find(QRegExp(QString("\\s\\./%1[/\\n]").arg(firstfile)))>=0) + { + m_dotslash = true; + kdDebug(1601) << k_funcinfo << "archive has dot-slash" << endl; + } + else + { + if (list.find(QRegExp(QString("\\s%1[/\\n]").arg(firstfile)))>=0) + { + // archive doesn't have dot-slash + m_dotslash = false; + } + else + { + kdDebug(1601) << k_funcinfo << "cannot match '" << firstfile << "' in listing!" << endl; + } + } + } + + delete _kp; + _kp = m_currentProcess = NULL; +} + +void TarArch::create() +{ + emit sigCreate(this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add + | Arch::View); +} + +void TarArch::setHeaders() +{ + ColumnList list; + + list.append(FILENAME_COLUMN); + list.append(PERMISSION_COLUMN); + list.append(OWNER_COLUMN); + list.append(GROUP_COLUMN); + list.append(SIZE_COLUMN); + list.append(TIMESTAMP_COLUMN); + list.append(LINK_COLUMN); + + emit headers( list ); +} + +void TarArch::createTmp() +{ + if ( compressed ) + { + if ( !QFile::exists(tmpfile) ) + { + QString strUncompressor = getUnCompressor(); + // at least lzop doesn't want to pipe zerosize/nonexistent files + QFile originalFile( m_filename ); + if ( strUncompressor != "gunzip" && strUncompressor !="bunzip2" && + ( !originalFile.exists() || originalFile.size() == 0 ) ) + { + QFile temp( tmpfile ); + temp.open( IO_ReadWrite ); + temp.close(); + emit createTempDone(); + return; + } + // the tmpfile does not yet exist, so we create it. + createTmpInProgress = true; + int f_desc = KDE_open(QFile::encodeName(tmpfile), O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (f_desc != -1) + fd = fdopen( f_desc, "w" ); + else + fd = NULL; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + kdDebug(1601) << "Uncompressor is " << strUncompressor << endl; + *kp << strUncompressor; + KProcess::Communication flag = KProcess::AllOutput; + if (strUncompressor == "lzop") + { + // setting up a pty for lzop, since it doesn't like stdin to + // be /dev/null ( "no filename allowed when reading from stdin" ) + // - but it used to work without this ? ( Feb 13, 2003 ) + kp->setUsePty( KProcess::Stdin, false ); + flag = KProcess::Stdout; + *kp << "-d"; + } + *kp << "-c" << m_filename; + + connect(kp, SIGNAL(processExited(KProcess *)), + this, SLOT(createTmpFinished(KProcess *))); + connect(kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(createTmpProgress( KProcess *, char *, int ))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + if (kp->start(KProcess::NotifyOnExit, flag ) == false) + { + KMessageBox::error(0, i18n("Unable to fork a decompressor")); + emit sigOpen( this, false, QString::null, 0 ); + } + } + else + { + emit createTempDone(); + kdDebug(1601) << "Temp tar already there..." << endl; + } + } + else + { + emit createTempDone(); + } +} + +void TarArch::createTmpProgress( KProcess * _proc, char *_buffer, int _bufflen ) +{ + // we're trying to capture the output of a command like this + // gunzip -c myarch.tar.gz + // and put the output into tmpfile. + + int size; + size = fwrite(_buffer, 1, _bufflen, fd); + if (size != _bufflen) + { + _proc->kill(); + KMessageBox::error(0, i18n("Trouble writing to the tempfile...")); + //kdFatal( 1601 ) << "Trouble writing to archive(createTmpProgress)" << endl; + kdWarning( 1601 ) << "Trouble writing to archive(createTmpProgress)" << endl; + //exit(99); + } +} + +void TarArch::deleteOldFiles(const QStringList &urls, bool bAddOnlyNew) + // because tar is broken. Used when appending: see addFile. +{ + QStringList list; + QString str; + + QStringList::ConstIterator iter; + for (iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL url( *iter ); + // find the file entry in the archive listing + const FileLVI * lv = m_gui->fileList()->item( url.fileName() ); + if ( !lv ) // it isn't in there, so skip it. + continue; + + if (bAddOnlyNew) + { + // compare timestamps. If the file to be added is newer, delete the + // old. Otherwise we aren't adding it anyway, so we can go on to the next + // file with a "continue". + + QFileInfo fileInfo( url.path() ); + QDateTime addFileMTime = fileInfo.lastModified(); + QDateTime oldFileMTime = lv->timeStamp(); + + kdDebug(1601) << "Old file: " << oldFileMTime.date().year() << '-' << + oldFileMTime.date().month() << '-' << oldFileMTime.date().day() << + ' ' << oldFileMTime.time().hour() << ':' << + oldFileMTime.time().minute() << ':' << oldFileMTime.time().second() << + endl; + kdDebug(1601) << "New file: " << addFileMTime.date().year() << '-' << + addFileMTime.date().month() << '-' << addFileMTime.date().day() << + ' ' << addFileMTime.time().hour() << ':' << + addFileMTime.time().minute() << ':' << addFileMTime.time().second() << + endl; + + if (oldFileMTime >= addFileMTime) + { + kdDebug(1601) << "Old time is newer or same" << endl; + continue; // don't add this file to the list to be deleted. + } + } + list.append(str); + + kdDebug(1601) << "To delete: " << str << endl; + } + if(!list.isEmpty()) + remove(&list); + else + emit removeDone(); +} + + +void TarArch::addFile( const QStringList& urls ) +{ + m_filesToAdd = urls; + // tar is broken. If you add a file that's already there, it gives you + // two entries for that name, whether you --append or --update. If you + // extract by name, it will give you + // the first one. If you extract all, the second one will overwrite the + // first. So we'll first delete all the old files matching the names of + // those in urls. + m_bNotifyWhenDeleteFails = false; + connect( this, SIGNAL( removeDone() ), this, SLOT( deleteOldFilesDone() ) ); + deleteOldFiles(urls, ArkSettings::replaceOnlyWithNewer()); +} + +void TarArch::deleteOldFilesDone() +{ + disconnect( this, SIGNAL( removeDone() ), this, SLOT( deleteOldFilesDone() ) ); + m_bNotifyWhenDeleteFails = true; + + connect( this, SIGNAL( createTempDone() ), this, SLOT( addFileCreateTempDone() ) ); + createTmp(); +} + +void TarArch::addFileCreateTempDone() +{ + disconnect( this, SIGNAL( createTempDone() ), this, SLOT( addFileCreateTempDone() ) ); + QStringList * urls = &m_filesToAdd; + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_archiver_program; + + if( ArkSettings::replaceOnlyWithNewer()) + *kp << "uvf"; + else + *kp << "rvf"; + + if (compressed) + *kp << tmpfile; + else + *kp << m_filename; + + QStringList::ConstIterator iter; + KURL url( urls->first() ); + QDir::setCurrent( url.directory() ); + for (iter = urls->begin(); iter != urls->end(); ++iter ) + { + KURL fileURL( *iter ); + *kp << fileURL.fileName(); + } + + // debugging info + QValueList list = kp->args(); + QValueList::Iterator strTemp; + for ( strTemp=list.begin(); strTemp != list.end(); ++strTemp ) + { + kdDebug(1601) << *strTemp << " " << endl; + } + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotAddFinished(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigAdd(false); + } +} + +void TarArch::slotAddFinished(KProcess *_kp) +{ + disconnect( _kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotAddFinished(KProcess*))); + m_pTmpProc = _kp; + m_filesToAdd = QStringList(); + if ( compressed ) + { + connect( this, SIGNAL( updateDone() ), this, SLOT( addFinishedUpdateDone() ) ); + updateArch(); + } + else + addFinishedUpdateDone(); +} + +void TarArch::addFinishedUpdateDone() +{ + if ( compressed ) + disconnect( this, SIGNAL( updateDone() ), this, SLOT( addFinishedUpdateDone() ) ); + Arch::slotAddExited( m_pTmpProc ); // this will delete _kp + m_pTmpProc = NULL; +} + +void TarArch::unarchFileInternal() +{ + QString dest; + + if (m_destDir.isEmpty() || m_destDir.isNull()) + { + kdError(1601) << "There was no extract directory given." << endl; + return; + } + else dest = m_destDir; + + QString tmp; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program; + if (compressed) + *kp << "--use-compress-program="+getUnCompressor(); + + QString options = "-x"; + if (!ArkSettings::extractOverwrite()) + options += "k"; + if (ArkSettings::preservePerms()) + options += "p"; + options += "f"; + + kdDebug(1601) << "Options were: " << options << endl; + *kp << options << m_filename << "-C" << dest; + + // if the list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if (m_fileList) + { + for ( QStringList::Iterator it = m_fileList->begin(); + it != m_fileList->end(); ++it ) + { + *kp << QString(m_dotslash ? "./" : "")+(*it); + } + } + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotExtractExited(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigExtract(false); + } + +} + +void TarArch::remove(QStringList *list) +{ + deleteInProgress = true; + m_filesToRemove = *list; + connect( this, SIGNAL( createTempDone() ), this, SLOT( removeCreateTempDone() ) ); + createTmp(); +} + +void TarArch::removeCreateTempDone() +{ + disconnect( this, SIGNAL( createTempDone() ), this, SLOT( removeCreateTempDone() ) ); + + QString name, tmp; + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + *kp << m_archiver_program << "--delete" << "-f" ; + if (compressed) + *kp << tmpfile; + else + *kp << m_filename; + + QStringList::Iterator it = m_filesToRemove.begin(); + for ( ; it != m_filesToRemove.end(); ++it ) + { + *kp << QString(m_dotslash ? "./" : "")+(*it); + } + m_filesToRemove = QStringList(); + + connect( kp, SIGNAL(receivedStdout(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + connect( kp, SIGNAL(receivedStderr(KProcess*, char*, int)), + this, SLOT(slotReceivedOutput(KProcess*, char*, int))); + + connect( kp, SIGNAL(processExited(KProcess*)), this, + SLOT(slotDeleteExited(KProcess*))); + + if (kp->start(KProcess::NotifyOnExit, KProcess::AllOutput) == false) + { + KMessageBox::error( 0, i18n("Could not start a subprocess.") ); + emit sigDelete(false); + } +} + +void TarArch::slotDeleteExited(KProcess *_kp) +{ + m_pTmpProc2 = _kp; + if ( compressed ) + { + connect( this, SIGNAL( updateDone() ), this, SLOT( removeUpdateDone() ) ); + updateArch(); + } + else + removeUpdateDone(); +} + +void TarArch::removeUpdateDone() +{ + if ( compressed ) + disconnect( this, SIGNAL( updateDone() ), this, SLOT( removeUpdateDone() ) ); + + deleteInProgress = false; + emit removeDone(); + Arch::slotDeleteExited( m_pTmpProc2 ); + m_pTmpProc = NULL; +} + +void TarArch::addDir(const QString & _dirName) +{ + QStringList list; + list.append(_dirName); + addFile(list); +} + +void TarArch::openFinished( KProcess * ) +{ + // do nothing + // turn off busy light (when someone makes one) + kdDebug(1601) << "Open finshed" << endl; +} + +void TarArch::createTmpFinished( KProcess *_kp ) +{ + createTmpInProgress = false; + fclose(fd); + delete _kp; + _kp = m_currentProcess = NULL; + + emit createTempDone(); +} + +void TarArch::updateFinished( KProcess *_kp ) +{ + fclose(fd); + updateInProgress = false; + delete _kp; + _kp = m_currentProcess = NULL; + + emit updateDone(); +} + +void TarArch::customEvent( QCustomEvent *ev ) +{ + if ( ev->type() == 65442 ) + { + ListingEvent *event = static_cast( ev ); + switch ( event->status() ) + { + case ListingEvent::Normal: + m_gui->fileList()->addItem( event->columns() ); + break; + + case ListingEvent::Error: + m_listingThread->wait(); + delete m_listingThread; + m_listingThread = 0; + emit sigOpen( this, false, QString::null, 0 ); + break; + + case ListingEvent::ListingFinished: + m_listingThread->wait(); + delete m_listingThread; + m_listingThread = 0; + emit sigOpen( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); + } + } +} + +#include "tar.moc" +// kate: space-indent on; diff --git a/ark/tar.h b/ark/tar.h new file mode 100644 index 0000000..544949a --- /dev/null +++ b/ark/tar.h @@ -0,0 +1,135 @@ +/* + +ark -- archiver for the KDE project + +Copyright (C) + +1997-1999: Rob Palmbos palm9744@kettering.edu +1999: Francois-Xavier Duranceau duranceau@kde.org +1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) +2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) +2001: Roberto Selbach Teixeira +2003: Georg Robbers +2006: Henrique Pinto + +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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef TAR_H +#define TAR_H + +#include + + +class QString; +class QStrList; + +class KProcess; +class KTempDir; +class KTarDirectory; +class KTar; + +class ArkWidget; +class Arch; +class TarListingThread; + +// TarArch can read Tar files and Tar files compressed with gzip. +// It doesn't yet know how to list Tar files compressed with other +// compressors because the listing part is done through KTar. +// If it could be listed though, the rest would work. +// The reason we use KTar for listing is that the output tar -tvf is +// of unreliable format. + +class TarArch : public Arch +{ + Q_OBJECT + public: + TarArch( ArkWidget *_gui, const QString & _filename, + const QString & _openAsMimeType ); + virtual ~TarArch(); + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + virtual void remove( QStringList* ); + virtual void unarchFileInternal(); + + virtual int getEditFlag(); + + QString getCompressor(); + QString getUnCompressor(); + + public slots: + void updateProgress( KProcess *_kp, char *_buffer, int _bufflen ); + void openFinished( KProcess * ); + void updateFinished( KProcess * ); + void createTmpFinished( KProcess * ); + void createTmpProgress( KProcess *_kp, char *_buffer, int _bufflen ); + void slotAddFinished( KProcess * ); + void slotListingDone( KProcess * ); + void slotDeleteExited( KProcess * ); + + signals: + void removeDone(); + void createTempDone(); + void updateDone(); + + private slots: + void openFirstCreateTempDone(); + void deleteOldFilesDone(); + void addFileCreateTempDone(); + void addFinishedUpdateDone(); + void removeCreateTempDone(); + void removeUpdateDone(); + + protected: + void customEvent( QCustomEvent * ); + + private: // methods + void updateArch(); + void createTmp(); + void setHeaders(); + void processDir( const KTarDirectory *tardir, const QString & root ); + void deleteOldFiles( const QStringList &list, bool bAddOnlyNew ); + QString getEntry( const QString & filename ); + + private: // data + // if the tar is compressed, this is the temporary uncompressed tar. + KTempDir * m_tmpDir; + QString tmpfile; + QString m_fileMimeType; + bool compressed; + + // for use with createTmp and updateArch + bool createTmpInProgress; + bool updateInProgress; + + // for use with deleteOldFiles + bool deleteInProgress; + FILE *fd; + QStringList m_filesToAdd; + QStringList m_filesToRemove; + KProcess * m_pTmpProc; + KProcess * m_pTmpProc2; + bool failed; + bool m_dotslash; + TarListingThread *m_listingThread; +}; + +#endif /* TAR_H */ + diff --git a/ark/tarlistingthread.cpp b/ark/tarlistingthread.cpp new file mode 100644 index 0000000..2a98375 --- /dev/null +++ b/ark/tarlistingthread.cpp @@ -0,0 +1,161 @@ +/* + This file is part of KDE. + + Copyright (c) 2006 Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. +*/ + + +#include +#include + +#include +#include +#include + +#include "tarlistingthread.h" + +// Helper function +// copied from KonqTreeViewItem::makeAccessString() +static char *makeAccessString(mode_t mode) +{ + static char buffer[10]; + + char uxbit,gxbit,oxbit; + + if ( (mode & (S_IXUSR|S_ISUID)) == (S_IXUSR|S_ISUID) ) + uxbit = 's'; + else if ( (mode & (S_IXUSR|S_ISUID)) == S_ISUID ) + uxbit = 'S'; + else if ( (mode & (S_IXUSR|S_ISUID)) == S_IXUSR ) + uxbit = 'x'; + else + uxbit = '-'; + + if ( (mode & (S_IXGRP|S_ISGID)) == (S_IXGRP|S_ISGID) ) + gxbit = 's'; + else if ( (mode & (S_IXGRP|S_ISGID)) == S_ISGID ) + gxbit = 'S'; + else if ( (mode & (S_IXGRP|S_ISGID)) == S_IXGRP ) + gxbit = 'x'; + else + gxbit = '-'; + + if ( (mode & (S_IXOTH|S_ISVTX)) == (S_IXOTH|S_ISVTX) ) + oxbit = 't'; + else if ( (mode & (S_IXOTH|S_ISVTX)) == S_ISVTX ) + oxbit = 'T'; + else if ( (mode & (S_IXOTH|S_ISVTX)) == S_IXOTH ) + oxbit = 'x'; + else + oxbit = '-'; + + buffer[0] = ((( mode & S_IRUSR ) == S_IRUSR ) ? 'r' : '-' ); + buffer[1] = ((( mode & S_IWUSR ) == S_IWUSR ) ? 'w' : '-' ); + buffer[2] = uxbit; + buffer[3] = ((( mode & S_IRGRP ) == S_IRGRP ) ? 'r' : '-' ); + buffer[4] = ((( mode & S_IWGRP ) == S_IWGRP ) ? 'w' : '-' ); + buffer[5] = gxbit; + buffer[6] = ((( mode & S_IROTH ) == S_IROTH ) ? 'r' : '-' ); + buffer[7] = ((( mode & S_IWOTH ) == S_IWOTH ) ? 'w' : '-' ); + buffer[8] = oxbit; + buffer[9] = 0; + + return buffer; +} + +TarListingThread::TarListingThread( QObject *parent, const QString& filename ) + : QThread(), m_parent( parent ) +{ + Q_ASSERT( m_parent ); + m_archive = new KTar( filename ); +} + +TarListingThread::~TarListingThread() +{ + delete m_archive; + m_archive = 0; +} + +void TarListingThread::run() +{ + if (!m_archive->open( IO_ReadOnly )) + { + ListingEvent *ev = new ListingEvent( QStringList(), ListingEvent::Error ); + qApp->postEvent( m_parent, ev ); + return; + } + + processDir( m_archive->directory(), QString() ); + + // Send an empty QStringList in an Event to signal the listing end. + ListingEvent *ev = new ListingEvent( QStringList(), ListingEvent::ListingFinished ); + qApp->postEvent( m_parent, ev ); +} + +void TarListingThread::processDir( const KTarDirectory *tardir, const QString & root ) +{ + QStringList list = tardir->entries(); + + QStringList::const_iterator itEnd = list.constEnd(); + + for ( QStringList::const_iterator it = list.constBegin(); it != itEnd; ++it ) + { + const KTarEntry* tarEntry = tardir->entry((*it)); + if (!tarEntry) + continue; + + QStringList col_list; + QString name; + if (root.isEmpty() || root.isNull()) + name = tarEntry->name(); + else + name = root + tarEntry->name(); + if ( !tarEntry->isFile() ) + name += '/'; + col_list.append( name ); + QString perms = makeAccessString(tarEntry->permissions()); + if (!tarEntry->isFile()) + perms = "d" + perms; + else if (!tarEntry->symlink().isEmpty()) + perms = "l" + perms; + else + perms = "-" + perms; + col_list.append(perms); + col_list.append( tarEntry->user() ); + col_list.append( tarEntry->group() ); + QString strSize = "0"; + if (tarEntry->isFile()) + { + strSize.sprintf("%d", ((KTarFile *)tarEntry)->size()); + } + col_list.append(strSize); + QString timestamp = tarEntry->datetime().toString(ISODate); + col_list.append(timestamp); + col_list.append(tarEntry->symlink()); + + ListingEvent *ev = new ListingEvent( col_list ); + qApp->postEvent( m_parent, ev ); + + // if it's a directory, process it. + // remember that name is root + / + the name of the directory + if ( tarEntry->isDirectory() ) + { + processDir( static_cast( tarEntry ), name ); + } + } +} diff --git a/ark/tarlistingthread.h b/ark/tarlistingthread.h new file mode 100644 index 0000000..f9de02b --- /dev/null +++ b/ark/tarlistingthread.h @@ -0,0 +1,63 @@ +/* + This file is part of KDE. + + Copyright (c) 2006 Henrique Pinto + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. +*/ + +#ifndef TARLISTINGTHREAD_H +#define TARLISTINGTHREAD_H + +#include +#include +#include + +class QString; +class KArchive; + +class ListingEvent: public QCustomEvent +{ + public: + enum Status { Normal, Error, ListingFinished }; + ListingEvent( const QStringList& data, Status st = Normal ) + : QCustomEvent( 65442 ), m_data( data ), m_status( st ) {} + + const QStringList& columns() const { return m_data; } + Status status() const { return m_status; } + + private: + QStringList m_data; + Status m_status; +}; + +class TarListingThread: public QThread +{ + public: + TarListingThread( QObject *parent, const QString& filename ); + ~TarListingThread(); + + protected: + void run(); + + private: + void processDir( const KTarDirectory *tardir, const QString & root ); + + KArchive *m_archive; + QObject *m_parent; +}; + +#endif // TARLISTINGTHREAD_H diff --git a/ark/zip.cpp b/ark/zip.cpp new file mode 100644 index 0000000..3538d11 --- /dev/null +++ b/ark/zip.cpp @@ -0,0 +1,277 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + + +// Qt includes +#include + +// KDE includes +#include +#include +#include +#include + +// ark includes +#include "zip.h" +#include "arkwidget.h" +#include "settings.h" + + +ZipArch::ZipArch( ArkWidget *_gui, const QString & _fileName ) + : Arch( _gui, _fileName ) +{ + m_archiver_program = "zip"; + m_unarchiver_program = "unzip"; + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + + m_headerString = "----"; + m_repairYear = 9; m_fixMonth = 7; m_fixDay = 8; m_fixTime = 10; + m_dateCol = 5; + m_numCols = 7; + + m_archCols.append( new ArchColumns( 1, QRegExp( "[0-9]+" ) ) ); + m_archCols.append( new ArchColumns( 2, QRegExp( "[^\\s]+" ) ) ); + m_archCols.append( new ArchColumns( 3, QRegExp( "[0-9]+" ) ) ); + m_archCols.append( new ArchColumns( 4, QRegExp( "[0-9.]+%" ) ) ); + m_archCols.append( new ArchColumns( 7, QRegExp( "[01][0-9]" ), 2 ) ); + m_archCols.append( new ArchColumns( 8, QRegExp( "[0-3][0-9]" ), 2 ) ); + m_archCols.append( new ArchColumns( 9, QRegExp( "[0-9][0-9]" ), 2 ) ); + m_archCols.append( new ArchColumns( 10, QRegExp( "[0-9:]+" ), 6 ) ); + m_archCols.append( new ArchColumns( 6, QRegExp( "[a-fA-F0-9]+ {2}" ) ) ); + m_archCols.append( new ArchColumns( 0, QRegExp( "[^\\n]+" ), 4096 ) ); + +} + +void ZipArch::setHeaders() +{ + ColumnList list; + list.append( FILENAME_COLUMN ); + list.append( SIZE_COLUMN ); + list.append( METHOD_COLUMN ); + list.append( PACKED_COLUMN ); + list.append( RATIO_COLUMN ); + list.append( TIMESTAMP_COLUMN ); + list.append( CRC_COLUMN ); + + emit headers( list ); +} + +void ZipArch::open() +{ + setHeaders(); + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + KProcess *kp = m_currentProcess = new KProcess; + + *kp << m_unarchiver_program << "-v" << m_filename; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedTOC(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotOpenExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigOpen( this, false, QString::null, 0 ); + } +} + + +void ZipArch::create() +{ + emit sigCreate( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View ); +} + +void ZipArch::addDir( const QString & _dirName ) +{ + if ( !_dirName.isEmpty() ) + { + bool bOldRecVal = ArkSettings::rarRecurseSubdirs(); + // must be true for add directory - otherwise why would user try? + ArkSettings::setRarRecurseSubdirs( true ); + + QStringList list; + list.append( _dirName ); + addFile( list ); + ArkSettings::setRarRecurseSubdirs( bOldRecVal ); // reset to old val + } +} + +void ZipArch::addFile( const QStringList &urls ) +{ + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program; + + if ( !m_password.isEmpty() ) + *kp << "-P" << m_password; + + if ( ArkSettings::rarRecurseSubdirs() ) + *kp << "-r"; + + if ( ArkSettings::rarStoreSymlinks() ) + *kp << "-y"; + + if ( ArkSettings::forceMSDOS() ) + *kp << "-k"; + if ( ArkSettings::convertLF2CRLF() ) + *kp << "-l"; + + if ( ArkSettings::replaceOnlyWithNewer() ) + *kp << "-u"; + + + *kp << m_filename; + + QStringList::ConstIterator iter; + KURL url( urls.first() ); + QDir::setCurrent( url.directory() ); + for ( iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL fileURL( *iter ); + *kp << fileURL.fileName(); + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotAddExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigAdd( false ); + } +} + +void ZipArch::unarchFileInternal() +{ + // if fileList is empty, all files are extracted. + // if destDir is empty, abort with error. + if ( m_destDir.isEmpty() || m_destDir.isNull() ) + { + kdError( 1601 ) << "There was no extract directory given." << endl; + return; + } + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_unarchiver_program; + + if ( !m_password.isEmpty() ) + *kp << "-P" << m_password; + + if ( ArkSettings::extractJunkPaths() && !m_viewFriendly ) + *kp << "-j" ; + + if ( ArkSettings::rarToLower() ) + *kp << "-L"; + + if ( ArkSettings::extractOverwrite() ) + *kp << "-o"; + else + *kp << "-n"; + + *kp << m_filename; + + // if the list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if ( m_fileList ) + { + QStringList::Iterator it; + + for ( it = m_fileList->begin(); it != m_fileList->end(); ++it ) + { + *kp << (*it); + } + } + + *kp << "-d" << m_destDir; + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotExtractExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigExtract( false ); + } +} + +bool ZipArch::passwordRequired() +{ + return m_lastShellOutput.findRev("unable to get password\n")!=-1 || m_lastShellOutput.endsWith("password inflating\n") || m_lastShellOutput.findRev("password incorrect--reenter:")!=-1 || m_lastShellOutput.endsWith("incorrect password\n"); +} + +void ZipArch::remove( QStringList *list ) +{ + if ( !list ) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "-d" << m_filename; + + QStringList::Iterator it; + for ( it = list->begin(); it != list->end(); ++it ) + { + QString str = *it; + *kp << str; + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotDeleteExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigDelete( false ); + } +} + +#include "zip.moc" diff --git a/ark/zip.h b/ark/zip.h new file mode 100644 index 0000000..721d734 --- /dev/null +++ b/ark/zip.h @@ -0,0 +1,58 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 1997-1999: Rob Palmbos palm9744@kettering.edu + 1999: Francois-Xavier Duranceau duranceau@kde.org + 1999-2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#ifndef ZIPARCH_H +#define ZIPARCH_H + +#include "arch.h" + +class QString; +class QStringList; + +class ArkWidget; + +class ZipArch : public Arch +{ + Q_OBJECT + public: + ZipArch( ArkWidget *_gui, const QString & _fileName ); + virtual ~ZipArch() { } + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + + virtual void remove( QStringList * ); + virtual void unarchFileInternal(); + virtual bool passwordRequired(); + private: + void setHeaders(); +}; + +#endif /* ZIPARCH_H */ diff --git a/ark/zoo.cpp b/ark/zoo.cpp new file mode 100644 index 0000000..9116ea5 --- /dev/null +++ b/ark/zoo.cpp @@ -0,0 +1,317 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include + +#include +#include +#include +#include +#include + +// QT includes +#include +#include + +// KDE includes +#include +#include +#include +#include + +// ark includes +#include "settings.h" +#include "arkwidget.h" +#include "arch.h" +#include "zoo.h" +#include "arkutils.h" +#include "filelistview.h" + +static QString fixTime( const QString &_strTime ); + +ZooArch::ZooArch( ArkWidget *gui, const QString & fileName ) + : Arch( gui, fileName ) +{ + m_archiver_program = m_unarchiver_program = "zoo"; + verifyCompressUtilityIsAvailable( m_archiver_program ); + verifyUncompressUtilityIsAvailable( m_unarchiver_program ); + + m_headerString = "----"; +} + +bool ZooArch::processLine( const QCString &line ) +{ + const char *_line = ( const char * )line; + char columns[11][80]; + char filename[4096]; + + // Note: I'm reversing the ratio and the length for better display + + sscanf( _line, + " %79[0-9] %79[0-9%] %79[0-9] %79[0-9] %79[a-zA-Z] %79[0-9]%79[ ]%11[ 0-9:+-]%2[C ]%4095[^\n]", + columns[1], columns[0], columns[2], columns[3], columns[7], + columns[8], columns[9], columns[4], columns[10], filename ); + + QString year = ArkUtils::fixYear( columns[8] ); + + QString strDate; + strDate.sprintf( "%s-%.2d-%.2d", year.utf8().data(), + ArkUtils::getMonth( columns[7] ), atoi( columns[3] ) ); + + strlcpy( columns[3], strDate.ascii(), sizeof( columns[3]) ); + kdDebug( 1601 ) << "New timestamp is " << columns[3] << endl; + + strlcat( columns[3], " ", sizeof( columns[3] ) ); + strlcat( columns[3], fixTime( columns[4] ).ascii(), sizeof( columns[3] ) ); + + QStringList list; + list.append( QFile::decodeName( filename ) ); + + for ( int i=0; i<4; i++ ) + { + list.append( QString::fromLocal8Bit( columns[i] ) ); + } + + m_gui->fileList()->addItem( list ); // send to GUI + + return true; +} + +void ZooArch::open() +{ + setHeaders(); + + m_buffer = ""; + m_header_removed = false; + m_finished = false; + + + KProcess *kp = m_currentProcess = new KProcess; + *kp << m_archiver_program << "l" << m_filename; + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedTOC(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotOpenExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigOpen( this, false, QString::null, 0 ); + } +} + +void ZooArch::setHeaders() +{ + ColumnList list; + list.append( FILENAME_COLUMN ); + list.append( RATIO_COLUMN ); + list.append( SIZE_COLUMN ); + list.append( PACKED_COLUMN ); + list.append( TIMESTAMP_COLUMN ); + + emit headers( list ); +} + + +void ZooArch::create() +{ + emit sigCreate( this, true, m_filename, + Arch::Extract | Arch::Delete | Arch::Add | Arch::View); +} + +void ZooArch::addDir( const QString & _dirName ) +{ + if ( ! _dirName.isEmpty() ) + { + QStringList list; + list.append( _dirName ); + addFile( list ); + } +} + +void ZooArch::addFile( const QStringList &urls ) +{ + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + *kp << m_archiver_program; + + if ( ArkSettings::replaceOnlyWithNewer() ) + *kp << "-update"; + else + *kp << "-add"; + + *kp << m_filename; + + KURL url( urls.first() ); + QDir::setCurrent( url.directory() ); + + QStringList::ConstIterator iter; + + for ( iter = urls.begin(); iter != urls.end(); ++iter ) + { + KURL fileURL( *iter ); + *kp << fileURL.fileName(); + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotAddExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigAdd( false ); + } +} + +void ZooArch::unarchFileInternal() +{ + // if _fileList is empty, we extract all. + // if _destDir is empty, abort with error. + + if ( m_destDir.isEmpty() || m_destDir.isNull() ) + { + kdError( 1601 ) << "There was no extract directory given." << endl; + return; + } + + // zoo has no option to specify the destination directory + // so we have to change to it. + + bool ret = QDir::setCurrent( m_destDir ); + // We already checked the validity of the dir before coming here + Q_ASSERT(ret); + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program; + + if ( ArkSettings::extractOverwrite() ) + { + *kp << "xOOS"; + } + else + { + *kp << "x"; + } + + *kp << m_filename; + + // if the list is empty, no filenames go on the command line, + // and we then extract everything in the archive. + if (m_fileList) + { + QStringList::Iterator it; + for ( it = m_fileList->begin(); it != m_fileList->end(); ++it ) + { + *kp << (*it); + } + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotExtractExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigExtract( false ); + } +} + +void ZooArch::remove( QStringList *list ) +{ + if (!list) + return; + + KProcess *kp = m_currentProcess = new KProcess; + kp->clearArguments(); + + *kp << m_archiver_program << "D" << m_filename; + + QStringList::Iterator it; + for ( it = list->begin(); it != list->end(); ++it ) + { + QString str = *it; + *kp << str; + } + + connect( kp, SIGNAL( receivedStdout(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( receivedStderr(KProcess*, char*, int) ), + SLOT( slotReceivedOutput(KProcess*, char*, int) ) ); + connect( kp, SIGNAL( processExited(KProcess*) ), + SLOT( slotDeleteExited(KProcess*) ) ); + + if ( !kp->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) + { + KMessageBox::error( 0, i18n( "Could not start a subprocess." ) ); + emit sigDelete( false ); + } +} + +QString fixTime( const QString &_strTime ) +{ + // it may have come from a different time zone... get rid of trailing + // +3 or -3 etc. + QString strTime = _strTime; + + if ( strTime.contains("+") || strTime.contains("-") ) + { + QCharRef c = strTime.at( 8 ); + int offset = strTime.right( strTime.length() - 9 ).toInt(); + QString strHour = strTime.left( 2 ); + int nHour = strHour.toInt(); + if ( c == '+' || c == '-' ) + { + if ( c == '+' ) + nHour = ( nHour + offset ) % 24; + else if ( c == '-' ) + { + nHour -= offset; + if ( nHour < 0 ) + nHour += 24; + } + strTime = strTime.left( 8 ); + strTime.sprintf( "%2.2d%s", nHour, strTime.right( 6 ).utf8().data() ); + } + } + else + { + strTime = strTime.left( 8 ); + } + return strTime; +} + +#include "zoo.moc" diff --git a/ark/zoo.h b/ark/zoo.h new file mode 100644 index 0000000..0e83ce1 --- /dev/null +++ b/ark/zoo.h @@ -0,0 +1,59 @@ +/* + + ark -- archiver for the KDE project + + Copyright (C) + + 2000: Corel Corporation (author: Emily Ezust, emilye@corel.com) + 2001: Corel Corporation (author: Michael Jarrett, michaelj@corel.com) + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef ZOO_H +#define ZOO_H + +#include "arch.h" + +class QString; +class QCString; +class QStringList; + +class ArkWidget; + +class ZooArch : public Arch +{ + Q_OBJECT + public: + ZooArch( ArkWidget *, const QString & ); + virtual ~ZooArch() { } + + virtual void open(); + virtual void create(); + + virtual void addFile( const QStringList & ); + virtual void addDir( const QString & ); + + virtual void remove( QStringList * ); + virtual void unarchFileInternal(); + + protected slots: + virtual bool processLine( const QCString &line ); + + private: + void setHeaders(); +}; + +#endif //ZOO_H diff --git a/charselectapplet/Makefile.am b/charselectapplet/Makefile.am new file mode 100644 index 0000000..49a70a2 --- /dev/null +++ b/charselectapplet/Makefile.am @@ -0,0 +1,19 @@ +INCLUDES = $(all_includes) + +kde_module_LTLIBRARIES = kcharselect_panelapplet.la + +kcharselect_panelapplet_la_SOURCES = charselectapplet.cpp + +METASOURCES = AUTO +noinst_HEADERS = charselectapplet.h + +lnkdir = $(kde_datadir)/kicker/applets +lnk_DATA = kcharselectapplet.desktop + +EXTRA_DIST = $(lnk_DATA) + +kcharselect_panelapplet_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module +kcharselect_panelapplet_la_LIBADD = $(LIB_KDEUI) + +messages: + $(XGETTEXT) *.cpp *.h -o $(podir)/kcharselectapplet.pot diff --git a/charselectapplet/charselectapplet.cpp b/charselectapplet/charselectapplet.cpp new file mode 100644 index 0000000..f2fccbc --- /dev/null +++ b/charselectapplet/charselectapplet.cpp @@ -0,0 +1,366 @@ +/***************************************************************** + +Copyright (c) 2001 Matthias Elter + +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 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. + +******************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "charselectapplet.h" +#include "charselectapplet.moc" + +extern "C" +{ + KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile) + { + KGlobal::locale()->insertCatalogue("kcharselectapplet"); + return new CharSelectApplet(configFile, KPanelApplet::Normal, + KPanelApplet::About | KPanelApplet::Preferences, + parent, "kcharselectapplet"); + } +} + +static int cell_width = 16; +static int cell_height = 16; +static int char_count = 0; + +CharSelectApplet::CharSelectApplet(const QString& configFile, Type type, int actions, + QWidget *parent, const char *name) + : KPanelApplet(configFile, type, actions, parent, name), + _aboutData(0), _configDialog(0) +{ + // read configuration + KConfig *c = config(); + c->setGroup("General"); + cell_width = c->readNumEntry("CellWidth", cell_width); + cell_height = c->readNumEntry("CellHeight", cell_height); + QString characters = c->readEntry("Characters", "ÄäÖöÜüß©®§"); + + // setup layout + QHBoxLayout *_layout = new QHBoxLayout(this); + _layout->setAutoAdd(true); + + // setup table view + _table = new CharTable(this); + + // insert chars + _table->setCharacters(characters); +} + +int CharSelectApplet::widthForHeight(int height) const +{ + // number of rows depends on panel size + int rows = (height - (lineWidth() * 2))/ cell_height; + if(rows <= 0) rows = 1; + + // calculate number of columns + float c = (float) char_count / rows; + int columns = (int) ceil(c); + if(columns <= 0) columns = 1; + + _table->setRowsAndColumns(rows, columns); + + // tell kicker how much space we need + return columns * cell_width + lineWidth() * 2; +} + +int CharSelectApplet::heightForWidth(int width) const +{ + // number of columns depends on panel size + int columns = (width - (lineWidth() * 2))/ cell_width; + if(columns <= 0) columns = 1; + + // calculate number of rows we need + float r = (float) char_count / columns; + int rows = (int) ceil(r); + if(rows <= 0) rows = 1; + + _table->setRowsAndColumns(rows, columns); + + return rows * cell_height + lineWidth() *2; +} + +void CharSelectApplet::preferences() +{ + if(!_configDialog) + _configDialog = new ConfigDialog(this); + + _configDialog->setCharacters(_table->characters()); + _configDialog->setCellWidth(cell_width); + _configDialog->setCellHeight(cell_height); + _configDialog->setInitialSize(QSize(300, 100)); + _configDialog->exec(); + + cell_width = _configDialog->cellWidth(); + cell_height = _configDialog->cellHeight(); + _table->setCharacters(_configDialog->characters()); + + emit updateLayout(); + + // write configuration + KConfig *c = config(); + c->setGroup("General"); + c->writeEntry("CellWidth", cell_width); + c->writeEntry("CellHeight", cell_height); + c->writeEntry("Characters", _configDialog->characters()); + c->sync(); +} + +void CharSelectApplet::about() +{ + if(!_aboutData) { + _aboutData = new KAboutData("kcharselectapplet", I18N_NOOP("KCharSelectApplet"), "1.0", + I18N_NOOP("A character picker applet.\n" + "Used to copy single characters to the X11 clipboard.\n" + "You can paste them to an application with the middle mouse button."), + KAboutData::License_BSD, "(c) 2001, Matthias Elter"); + _aboutData->addAuthor("Matthias Elter", 0, "elter@kde.org"); + } + + KAboutApplication dialog(_aboutData); + dialog.exec(); +} + +CharTable::CharTable(QWidget* parent, const char* name) + : QFrame(parent, name), _rows(2), _cols(2), + _activeRow(-1), _activeCol(-1), + _cWidth(cell_width), _cHeight(cell_height) +{ + setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); + setFocusPolicy(QWidget::NoFocus); + setBackgroundMode(QWidget::NoBackground); +} + +void CharTable::setRowsAndColumns(int r, int c) +{ + _rows = r; + _cols = c; +} + +void CharTable::insertChar(QChar c) +{ + _map.insert(char_count++, c); +} + +void CharTable::insertString(QString s) +{ + for (unsigned int i = 0; i < s.length(); i++) + insertChar(s[i]); +} + +void CharTable::setCharacters(const QString& characters) +{ + _map.clear(); + char_count = 0; + insertString(characters); +} + +QString CharTable::characters() +{ + QString characters; + for (int r = 0; r <_rows; r++) + for (int c = 0; c <_cols; c++) + characters += _map[c + r * _cols]; + + return characters; +} + +int CharTable::findRow(int y) +{ + return y / _cHeight; +} + +int CharTable::findCol(int x) +{ + return x / _cWidth; +} + +void CharTable::resizeEvent(QResizeEvent*) +{ + _cWidth = contentsRect().width() / _cols; + _cHeight = contentsRect().height() / _rows; +} + +void CharTable::paintEvent(QPaintEvent* e) +{ + QPainter p(this); + + int xoffset = contentsRect().x(); + int yoffset = contentsRect().y(); + + for (int r = 0; r <_rows; r++) { + for (int c = 0; c <_cols; c++) { + p.setViewport(xoffset + c * _cWidth, yoffset + r * _cHeight, _cWidth, _cHeight); + p.setWindow(0, 0, _cWidth, _cHeight); + paintCell(&p, r, c); + } + } + QFrame::paintEvent(e); +} + +void CharTable::repaintCell(int r, int c) +{ + QPainter p(this); + + int xoffset = contentsRect().x(); + int yoffset = contentsRect().y(); + + p.setViewport(xoffset + c * _cWidth, yoffset + r * _cHeight, _cWidth, _cHeight); + p.setWindow(0, 0, _cWidth, _cHeight); + paintCell(&p, r, c); +} + +void CharTable::paintCell(QPainter* p, int row, int col) +{ + int w = _cWidth; + int h = _cHeight; + int x2 = w - 1; + int y2 = h - 1; + + bool active = (row == _activeRow) && (col == _activeCol); + + // draw background + if (active) { + p->setBrush(QBrush(colorGroup().highlight())); + p->setPen(NoPen); + p->drawRect(0, 0, w, h); + p->setPen(colorGroup().highlightedText()); + } + else { + p->setBrush(QBrush(colorGroup().base())); + p->setPen(NoPen); + p->drawRect(0, 0, w, h); + p->setPen(colorGroup().text()); + } + + // set font + QFont f = font(); + f.setPixelSize(10); + p->setFont(f); + + // draw char + p->drawText(0, 0, x2, y2, AlignHCenter | AlignVCenter, QString(_map[col + row * _cols])); +} + +void CharTable::mousePressEvent(QMouseEvent *e) +{ + int row = findRow(e->y()); + if (row == -1) return; + + int col = findCol(e->x()); + if (col == -1) return; + + selectCell(row, col); +} + +void CharTable::mouseMoveEvent(QMouseEvent *e) +{ + if(!(e->state() & (LeftButton | RightButton | MidButton))) return; + + int row = findRow(e->y()); + if (row == -1) return; + + int col = findCol(e->x()); + if (col == -1) return; + + selectCell(row, col); +} + +void CharTable::selectCell(int row, int col) +{ + if (row >= _rows || row < 0) return; + if (col >= _cols || col < 0) return; + + int oldRow = _activeRow; + int oldCol = _activeCol; + + _activeRow = row; + _activeCol = col; + + repaintCell(oldRow, oldCol); + repaintCell(_activeRow, _activeCol); + + QClipboard *cb = QApplication::clipboard(); + QObject::disconnect( cb, SIGNAL(dataChanged()), this, SLOT(clearCell()) ); + QString text = QString(_map[col + row * _cols]); + bool oldMode = cb->selectionModeEnabled(); + cb->setSelectionMode( true ); + cb->setText( text ); + cb->setSelectionMode( false ); + cb->setText( text ); + cb->setSelectionMode( oldMode ); + QObject::connect( cb, SIGNAL(dataChanged()), this, SLOT(clearCell()) ); +} + +void CharTable::clearCell() +{ + int oldRow = _activeRow; + int oldCol = _activeCol; + + _activeRow = -1; + _activeCol = -1; + + repaintCell(oldRow, oldCol); + + QObject::disconnect( QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clearCell()) ); +} + + +ConfigDialog::ConfigDialog(QWidget* parent, const char* name) + : KDialogBase(parent, name, true, i18n("Configuration"), + Ok | Cancel, Ok, true) +{ + QVBox *page = makeVBoxMainWidget(); + + QHBox *whbox = new QHBox(page); + QHBox *hhbox = new QHBox(page); + QHBox *chbox = new QHBox(page); + + QLabel *wlabel = new QLabel(i18n("Cell width:"), whbox); + QLabel *hlabel = new QLabel(i18n("Cell height:"), hhbox); + (void) new QLabel(i18n("Characters:"), chbox); + + _widthSpinBox = new QSpinBox(whbox); + _widthSpinBox->setMinValue(1); + _heightSpinBox = new QSpinBox(hhbox); + _heightSpinBox->setMinValue(1); + _characterInput = new KLineEdit(chbox); + + whbox->setSpacing(KDialog::spacingHint()); + hhbox->setSpacing(KDialog::spacingHint()); + chbox->setSpacing(KDialog::spacingHint()); + + whbox->setStretchFactor(wlabel, 2); + hhbox->setStretchFactor(hlabel, 2); + chbox->setStretchFactor(_characterInput, 2); +} diff --git a/charselectapplet/charselectapplet.h b/charselectapplet/charselectapplet.h new file mode 100644 index 0000000..b54dc55 --- /dev/null +++ b/charselectapplet/charselectapplet.h @@ -0,0 +1,115 @@ +/***************************************************************** + +Copyright (c) 2001 Matthias Elter + +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 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. + +******************************************************************/ + +#ifndef __charselectapplet_h__ +#define __charselectapplet_h__ + +#include + +#include +#include + +class QSpinBox; +class KLineEdit; +class KAboutData; + +class ConfigDialog : public KDialogBase +{ + Q_OBJECT + +public: + ConfigDialog(QWidget* parent = 0, const char* name = 0); + + void setCharacters(const QString& s) { _characterInput->setText(s); } + void setCellWidth(int w) { _widthSpinBox->setValue(w); } + void setCellHeight(int h) { _heightSpinBox->setValue(h); } + + QString characters() { return _characterInput->text(); } + int cellWidth() { return _widthSpinBox->value(); } + int cellHeight() { return _heightSpinBox->value(); } + +private: + QSpinBox *_widthSpinBox; + QSpinBox *_heightSpinBox; + KLineEdit *_characterInput; +}; + +class CharTable : public QFrame +{ + Q_OBJECT + +public: + CharTable(QWidget* parent = 0, const char* name = 0); + + void setRowsAndColumns(int, int); + + void setCharacters(const QString&); + QString characters(); + +protected: + void paintEvent(QPaintEvent*); + void resizeEvent(QResizeEvent*); + void mousePressEvent(QMouseEvent*); + void mouseMoveEvent(QMouseEvent*); + + void paintCell(QPainter*, int, int); + void repaintCell(int, int); + void selectCell(int row, int col); + + void insertString(QString s); + void insertChar(QChar c); + + int findRow(int y); + int findCol(int x); + +protected slots: + void clearCell(); +private: + int _rows, _cols; + int _activeRow, _activeCol; + int _cWidth, _cHeight; + int _charcount; + QMap _map; +}; + +class CharSelectApplet : public KPanelApplet +{ + Q_OBJECT + +public: + CharSelectApplet(const QString& configFile, Type t = Stretch, int actions = 0, + QWidget *parent = 0, const char *name = 0); + + int widthForHeight(int height) const; + int heightForWidth(int width) const; + + void preferences(); + void about(); + +private: + CharTable *_table; + KAboutData *_aboutData; + ConfigDialog *_configDialog; +}; + +#endif diff --git a/charselectapplet/kcharselectapplet.desktop b/charselectapplet/kcharselectapplet.desktop new file mode 100644 index 0000000..029b5be --- /dev/null +++ b/charselectapplet/kcharselectapplet.desktop @@ -0,0 +1,100 @@ +[Desktop Entry] +Name=Character Selector +Name[ar]=أداة اختيار الرموز +Name[az]=Xarakter Seçici +Name[bg]=Избор на знаци +Name[br]=Dibaber arouezenn +Name[bs]=Izbor znakova +Name[ca]=Selector de caràcters +Name[cs]=VybÄ›r znaků +Name[cy]=Dewisydd Nod +Name[da]=Tegnvælger +Name[de]=Tabelle zur Zeichenauswahl +Name[el]=Επιλογέας χαÏακτήÏων +Name[eo]=Elektilo por signoj +Name[es]=Selector de caracteres +Name[et]=Sümbolite valija +Name[eu]=Karaktere autatzailea +Name[fa]=گزینندۀ نویسه +Name[fi]=Merkkivalitsin +Name[fr]=Sélecteur de caractères +Name[ga]=Roghnóir Carachtar +Name[gl]=Selector de Caracteres +Name[he]=בוחר ×ª×•×•×™× +Name[hu]=KCharselectApplet +Name[id]=Pemilih Karakter +Name[is]=Stafaval +Name[it]=Selettore di caratteri +Name[ja]=文字ã®é¸æŠž +Name[ka]=სიმბáƒáƒšáƒáƒ—რშემრჩეველი +Name[kk]=Таңба тергіш +Name[km]=កម្មវិធី​ជ្រើស​ážáž½áž¢áž€áŸ’សរ +Name[nb]=Tegnvelger +Name[nds]=Tekenutwähler +Name[ne]=कà¥à¤¯à¤¾à¤°à¥‡à¤•à¥à¤Ÿà¤° चयनकरà¥à¤¤à¤¾ +Name[nl]=Speciale tekens +Name[nn]=Teiknveljar +Name[pa]=ਅੱਖਰ ਚੋਣਕਾਰ +Name[pl]=Wybór znaku +Name[pt]=Selector de Caracteres +Name[pt_BR]=Seletor de Caracteres +Name[ru]=Выбор Ñимвола +Name[sk]=Voľba znakov +Name[sl]=Izbiranje znakov +Name[sr]=Бирач знакова +Name[sr@Latn]=BiraÄ znakova +Name[sv]=Teckenväljare +Name[ta]= எழà¯à®¤à¯à®¤à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®ªà¯à®ªà®¾à®©à¯ +Name[uk]=Вибір Ñимволів +Name[uz]=Harf tanlagich +Name[uz@cyrillic]=Ҳарф танлагич +Name[zh_CN]=字符选择器 +Name[zh_TW]=å­—å…ƒé¸æ“‡å™¨ +Icon=kcharselect +X-KDE-Library=kcharselect_panelapplet +X-KDE-UniqueApplet=true +Comment=Pick foreign and special characters for clipboard +Comment[ar]=يلتقط الرموز الأجنبية والخاصة من أجل الحاÙظة +Comment[bg]=Избор на чужди и Ñпециални знаци за копиране чрез ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€ +Comment[bs]=Izaberite posebne i meÄ‘unarodne znakove sa spiska +Comment[ca]=Selecciona caràcters estranger i especials pel porta-retalls +Comment[cs]=VýbÄ›r cizích a speciálních znaků do schránky +Comment[da]=Vælg fremmede tegn og specialtegn for klippebordet +Comment[de]=Fremdsprachige und Sonderzeichen in die Zwischenablage kopieren +Comment[el]=Επιλέξτε ειδικοÏÏ‚ χαÏακτήÏες και χαÏακτήÏες άλλης γλώσσας για το Ï€ÏόχειÏο +Comment[es]=Seleccionar caracteres extranjeros y especiales para el portapapeles +Comment[et]=Võõr- ja erisümbolite valimine lõikepuhvrisse +Comment[eu]=Hautatu atzerriko karaketereak eta karaketere bereziak arbelarentzat +Comment[fa]=انتخاب نویسه‌های خارجی Ùˆ ویژه برای تخته یادداشت +Comment[fi]=Poimi erikoismerkkejä leikepöydälle +Comment[fr]=Sélectionner des caractères étrangers et spéciaux +Comment[ga]=Roghnaigh carachtair iasachta agus speisialta don ghearrthaisce +Comment[he]=בחר ×ª×•×•×™× ×–×¨×™× ×•×ž×™×•×—×“×™× ×œ×”×“×‘×§×” +Comment[hu]=Más nyelvi és speciális karakterek másolása a vágólapra +Comment[is]=Velur útlenda og sérstaka stafi fyrir klippispjaldið +Comment[it]=Seleziona caratteri speciali e stranieri per gli appunti +Comment[ja]=クリップボードã«å¤–国語文字ã¾ãŸã¯ç‰¹æ®Šæ–‡å­—をピックアップã™ã‚‹ +Comment[ka]=გáƒáƒªáƒ•áƒšáƒ˜áƒ¡ ბუფერისთვის უცხáƒáƒ£áƒ áƒ˜ დრსპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ”ბის áƒáƒ¦áƒ”ბრ+Comment[kk]=Пернетақтада жоқ таңбаларды алмаÑу буферіне теріп алу +Comment[km]=ជ្រើស​ážáž½áž¢áž€áŸ’សរ​បរទáŸážŸ និង​ពិសáŸážŸâ€‹ážŸáž˜áŸ’រាប់​ក្ážáž¶ážšážáž˜áŸ’បៀážážáŸ’ទាស់ +Comment[lt]=Parinkite užsienietiÅ¡kus ar ypatingus simbolius talpyklei +Comment[nb]=Hent inn fremmede tegn og spesialtegn til utklippstavla +Comment[nds]=Frömdspraak- un Sünnertekens na de Twischenaflaag koperen +Comment[ne]=कà¥à¤²à¤¿à¤¬à¥‹à¤°à¥à¤¡à¤•à¤¾ लागि विदेशी र विशेष कà¥à¤¯à¤¾à¤°à¥‡à¤•à¥à¤Ÿà¤° छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ +Comment[nl]=Buitenlandse en speciale tekens van klembord halen +Comment[nn]=Kopier spesialteikn og bokstavar frÃ¥ framande sprÃ¥k til utklippstavla +Comment[pl]=Wstawia znaki specjalne albo diakrytyczne do schowka +Comment[pt]=Escolher caracteres especiais e estrangeiros para a área de transferência +Comment[pt_BR]=Lista de caracteres especiais para a área de transferência +Comment[ru]=Выбрать и помеÑтить в буфер обмена Ñпециальные Ñимволы +Comment[sk]=Vložte do schánky cudzie a Å¡peciálne znaky +Comment[sl]=Poberi tuje in posebne znake za na odložiÅ¡Äe +Comment[sr]=Бира Ñтране и Ñпецијалне знакове за клипборд +Comment[sr@Latn]=Bira strane i specijalne znakove za klipbord +Comment[sv]=Välj främmande tecken och specialtecken för klippbordet +Comment[tr]=Yabancı ve özel karakterleri panoya kopyalar +Comment[uk]=Вибрати Ñ– вÑтавити в кишеню іноземні та Ñпеціальні Ñимволи +Comment[uz]=Harf va maxsus belgilarni xotiraga olish vositasi +Comment[uz@cyrillic]=Ҳарф ва махÑÑƒÑ Ð±ÐµÐ»Ð³Ð¸Ð»Ð°Ñ€Ð½Ð¸ хотирага олиш воÑитаÑи +Comment[zh_CN]=将外语和特殊字符拾å–åˆ°å‰ªè´´æ¿ +Comment[zh_TW]=為剪貼簿é¸æ“‡å¤–國與特殊字元 diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..d031440 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,12 @@ +#MIN_CONFIG +KDE_ENABLE_HIDDEN_VISIBILITY +KDE_INIT_DOXYGEN([KDE Utils API Reference], [Version $VERSION]) + +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h sys/sysctl.h sys/param.h sys/time.h sys/types.h sys/user.h sys/vmmeter.h sys/resource.h vm/vmparam.h unistd.h) + +AC_CHECK_SETENV +AC_CHECK_UNSETENV + +CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS" diff --git a/doc/KRegExpEditor/Makefile.am b/doc/KRegExpEditor/Makefile.am new file mode 100644 index 0000000..6872b30 --- /dev/null +++ b/doc/KRegExpEditor/Makefile.am @@ -0,0 +1,5 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + +docdir = $(kde_htmldir)/$(KDE_LANG)/KRegExpEditor diff --git a/doc/KRegExpEditor/altn.png b/doc/KRegExpEditor/altn.png new file mode 100644 index 0000000000000000000000000000000000000000..900a1e95eff61976a5107bbdff506ab1e32d3a76 GIT binary patch literal 310 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 literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/begline.png b/doc/KRegExpEditor/begline.png new file mode 100644 index 0000000000000000000000000000000000000000..3465a9ec83cb535664b6f7919c2f1cefdd3b44a0 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6;RN#5=* zKpF^sI`6IrQk(@Ik;M!Q+=3v?Sf3I<5h%!B;_2(kevzGzNzsZg?wT1;sL<2JF{EP7 z+bM>84GKK2@x1Df)#jb?HZVT4@s$$ytN>qGj|$<;7uoIe4?W6PIkw{5IhG|16N<~q zoHO`C?;mxJw{U6m-JRGuyW&cQB+rJKb+rkd>SFfC&PuHePxAh8_E8Ym)-drz=PSQG fVy>UPX=$u(^Fn%7wU6Hvpydpnu6{1-oD!M<6hlpV literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/boundarytools.png b/doc/KRegExpEditor/boundarytools.png new file mode 100644 index 0000000000000000000000000000000000000000..c93d764ba4853a8ae8f0b5bc594e47d9a85ff00d GIT binary patch literal 861 zcmV-j1ETziP)0vJj)9CZkH*@ECX3uk)CiD4xPUn-;BD~M1 zg-=l=tqx#lPb(o+d8s3# zbU51IuRp_4EVdpk(TGdm;*pUK#YfWxkdH*&Zr$3EJWWfd#W80%z;FySwdG@5Gt$O6 z8oH0B28j&AV76`BT}z_0{afdMM&I3AJ3UUlHFa9o)y(t!6~LS|-cH ziPaG&Fd2qn`1%afOVU6&Fk=Qk3WlShA04-C`!Xv{19jj8<{zY{X_)XFFe4)p0~<{g zn~_FEEf?6@7x1kj?%p-18W~f^K~ErOuyC!|a)j(z1C{`W9xeGadL4eoj-FC!xx8Y3 zlM^49_-p!G?7pk%L4&H1F}CSRduOhaACB#cN+0xKaagW~{Ani}USinppGG#$6hmUNfc+&}#~qI$W&3_CNn zh)(ZB!lvI6;RN#5=* zKpF^sI`6IrQk(@Ik;M!Q+yWrXxK?>@DNvBT#M9T6{SqTHuQuFS zZzsoc9WdZ%PQIzR=fCaU(-PN?{#9r;Jd>u cFZt@c_5hDwaeSd%Hqc@QPgg&ebxsLQ0KxiDjsO4v literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/charactertool.png b/doc/KRegExpEditor/charactertool.png new file mode 100644 index 0000000000000000000000000000000000000000..16900188aa9c2fd7aaaf0cef552c8d6adac905a1 GIT binary patch literal 983 zcmeAS@N?(olHy`uVBq!ia0vp^T|gYb!3HFcDZSMNQY`6?zK#qG8~eHcB(eheY)Rhk zE)4%caKYZ?lYt_f1s;*b3=G^tAk28_ZrvZCAbW|YuPggS9!XIq;XtEHKN%R9Lp)s^ zLn`LHogJ9>MuEq5`PJx%Y4hfOtqqwdA%3P*h<%c!`>I(+N4_0s74X@At@LjtW62LW zS%y2zElffjtSSOr9tt8895fUf100wZHn2D`asnk@Iz>)*342!H+Vo zuI0Ra?W4RDAv5F2y-A($6coWm3kCx@y7KyGjJ|(wjWkt43D$BIey({t;iSQ#a;)Q9Qo0zHaOw1JG19V> zc(_X9{RJ`88Nfh^)iAqxZB_8;o@=LaBiF{Q_W2p}G4hyr=jnUPugz?H82uwPX;pbH z|J@s(W#Vqmw0pZ%YPxu|{-4fs28=1|Z-+S+K=0@3N8?LAO)^zpTZcBeK zAz+IBl9Cx#lisYbmYUu4$XIB4s$1X{kLblyF6aIXuI}6Z?*3!rtmj=@8y+QZGwn?M zA$7F+%Z;MwuyyQvs#f`{?z^_wsWbcVy2vROZpK$Rw+rsGo9SV_xt~cWn5*?>irq31 zt~2aTjGf-wKDh7ub@tz_O7TnomrnV5%-BQtl-Z=*cZ;`n-_-j2O>&Belce(#x%KDN zC#g+|$~*2|b8}C?`nt&Tzhl1M+{C$mi5jb}D}W2L!6oiDAs_KuzAjK;eMTW71Y z8b91|(0Y$txPwG}rBBd?bmd7BHp<(UI|hAdR@CHJ-i(~6A*sE^?9Ppie_~P=Zn*jF j=7$&H!lvI6;RN#5=* z4D*02hUukBd_an`z$3Dlfq`29gc;W=?=1xivX^-Jy0TwlWad>@+w;Ba)%4$~^WA24{N8AH82%UCnV9a4w=TkP%qMHPPpRruq00Y{Klu7D?q8&Sf17&Umtb4HqpEk; aG2WA6n#ZVoUydK>N(N6?KbLh*2~7aUs%Xam literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/compoundtool.png b/doc/KRegExpEditor/compoundtool.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ad43cf131a8ea48992c975acc814f57c98dc78 GIT binary patch literal 1432 zcmZ{k2~g5$6u|$Gnt5$$I$mXIjjXkq+HRC+P%4@Sx@4`OQU+>y;E{M_8oK5Yij%o6 zUXi9&2xcXOiD;!5R)`jOtd_ThvQ3fWFuv>T1gSvqWoIsZ>G`o(KS_r)sX9QC0eCLGDN=VExOX^J)r|kxfyq zez5?csryAh-GeD>%HYNeZl2B?#ac%CHfFVRt0MrQs_*86IFV2)8ysLUAqGHKoR#8C zN@MED#jg6Z=qII*o{bYIV`H-k1Wk|4Vns;#B>xDYovJttYFXU074Aw0j)GM;>q0K) z!$Ci*XzbYK4eTU?)s?BKBYZD7zPMTh6Rods+1hh9o@nWkup@;!JL0dX z<(w=2T~6eM^H~0Yk!V(!3~Nu~)^c`_G}?mT`JV&jOeFJK1ff02Pi9aNH?Utc&zB%q zBbnAk4eI9dd#~iXsg*JVhk;MH$L)}$eN!i^A1+bbO)6qTB%CzzlNc0sx&Qp-7$do~VwMn9+6i0C!mLz=9xC^|YW(*|Um|tTJAf4g@jG*UUN3ANiy80`(dDK*LGv|+O2&76f$HnldLI1f5}Ta1 zMq3yCSYq4YfJOGhq}>*jM#qq!x=G^)0-aH1y)y>NN6KTv5`+6Bmxv@jB!WiikF{sl z0QfqThoJT~5z0PYsdF)8W!TXE^Y2;Ku&n0A~aN7Ffp>e}N(tu=%_I6cS z%CgJKv9oU8#vY1WYLS~x&U1$i+eV~DZ^F1dGI4PsG;dll<%BS-*qC)mmiw1l9Rrd>cz25Dy}{c>e9Sf#6g;c&Y&;Cdb)SaM(h=?caE~zL|Lp8 zR}Z3duRQC`eD3oauXjm|Dn#$JU$F7jI3wZv#|$WjSlzvh2WCZ9G9g1Ma1P^IuRi{Z8nq%QZCUuqYj}|mJxH&QYU2X;~n&P7sQ<%6$ zoH4h%vb_z&p6HP`{f;f6@*6z4;Y`y99k({vD*K7Y=`dajM6!lvI6;RN#5=* zKpF^sI`6IrQk(@Ik;M!Q+=3v?Sf3I<5h%!B;_2(kevzGzNm0tw;M+f-P?4vLV@SoE zx04L{8WaRr*bgnwSoybQ>iJKq0f#m(2uxmBq!KX0;AH9c;&2@wx5aacr8mf2W_@p~ z)^g!AyF-s4!`$L!&*w;-6yF_mb?#R+(eC+8TMtKR<)wDj>xf + + +]> + + + + + The Regular Expression Editor Manual + + + + Jesper K. + Pedersen +
blackie@kde.org
+
+
+ + 2001-07-03 + 0.1 + + &underFDL; + + + 2001 + Jesper K. Pedersen + + + + This Handbook describes the Regular Expression Editor widget + + + + KDE + regular expression + +
+ + + + + + Introduction + + + + The regular expression editor is an editor for editing regular expression + in a graphical style (in contrast to the ASCII syntax). Traditionally + regular expressions have been typed in the ASCII syntax, which for example + looks like ^.*kde\b. The major drawbacks of + this style are: + + It is hard to understand for + non-programmers. + + It requires that you escape + certain symbols (to match a star for example, you need to type + \*). + + It requires that you remember rules for + precedence (What does x|y* + match? a single x or a number of + y, OR a number of + x and y's mixed?) + + + + + The regular expression editor, on the other hand, lets you + draw your regular expression in an unambiguous + way. The editor solves at least item two and three above. It might not make + regular expressions available for the non-programmers, though only tests by + users can tell that. So, if are you a non programmer, who has gained the + power of regular expression from this editor, then please + let me know. + + + + + + + + + What is a Regular Expression + + A regular expression is a way to specify + conditions to be fulfilled for a situation + in mind. Normally when you search in a text editor you specify + the text to search for literally, using a + regular expression, on the other hand, you tell what a given + match would look like. Examples of this include I'm + searching for the word KDE, but only at the beginning of the + line, or I'm searching for the word + the, but it must stand on its own, + or I'm searching for files starting with the word + test, followed by a number of digits, for + example test12, test107 + and test007 + + You build regular expressions from smaller regular + expressions, just like you build large Lego toys from smaller + subparts. As in the Lego world, there are a number of basic + building blocks. In the following I will describe each of these + basic building blocks using a number of examples. + + + Searching for normal text. + If you just want to search for a given text, a then regular + expression is definitely not a good choice. The reason for this is that + regular expressions assign special meaning to some characters. This + includes the following characters: .*|$. Thus if you want to + search for the text kde. (i.e. the characters + kde followed by a period), then you would need to + specify this as kde\.The regular + expression editor solves this problem by taking care of escape rules for + you. Writing \. rather than just + . is called escaping. + + + + + Matching URLs + When you select something looking like a URL in KDE, then the + program klipper will offer to start + konqueror with the selected URL. + + Klipper does this by matching the selection + against several different regular expressions, when one of the regular + expressions matches, the accommodating command will be offered. + + The regular expression for URLs says (among other things), that the + selection must start with the text http://. This is + described using regular expressions by prefixing the text + http:// with a hat (the ^ + character). + + The above is an example of matching positions using regular + expressions. Similar, the position end-of-line can + be matched using the character $ (i.e. a dollar + sign). + + + + Searching for the word <literal>the</literal>, but not + <emphasis>the</emphasis><literal>re</literal>, + <literal>brea</literal><emphasis>the</emphasis> or + <literal>ano</literal><emphasis>the</emphasis><literal>r</literal> + Two extra position types can be matches in the above way, + namely the position at a word boundary, and + the position at a non-word + boundary. The positions are specified using the text + \b (for word-boundary) and \B (for + non-word boundary) + + Thus, searching for the word the can be done + using the regular expression \bthe\b. This specifies + that we are searching for the with no letters on each + side of it (i.e. with a word boundary on each side) + + The four position matching regular expressions are inserted in the + regular expression editor using four + different positions tool + + + + Searching for either <literal>this</literal> or <literal>that</literal> + Imagine that you want to run through your document searching for + either the word this or the word + that. With a normal search method you could do this in + two sweeps, the first time around, you would search for + this, and the second time around you would search for + that. + + Using regular expression searches you would search for both in the + same sweep. You do this by searching for + this|that. I.e. separating the two words with a + vertical bar.Note on each side of the vertical bar is a + regular expression, so this feature is not only for searching for two + different pieces of text, but for searching for two different regular + expressions. + + In the regular expression editor you do not write the vertical bar + yourself, but instead select the alternative + tool, and insert the smaller regular expressions above each other. + + + + Matching anything + Regular expressions are often compared to wildcard matching in the + shell - that is the capability to specify a number of files using the + asterisk. You will most likely recognize wildcard matching from the + following examples: + + ls *.txt - here *.txt is + the shell wildcard matching every file ending with the + .txt extension. + cat test??.res - matching every file starting with + test followed by two arbitrary characters, and finally + followed by the test .res + + + + In the shell the asterisk matches any character any number of + times. In other words, the asterisk matches anything. + This is written like .* with regular expression + syntax. The dot matches any single character, i.e. just + one character, and the asterisk, says that the + regular expression prior to it should be matched any number of + times. Together this says any single character any number of + times. + + This may seem overly complicated, but when you get the larger + picture you will see the power. Let me show you another basic regular + expression: a. The letter a on its + own is a regular expression that matches a single letter, namely the + letter a. If we combine this with the asterisk, + i.e. a*, then we have a regular expression matching + any number of a's. + + We can combine several regular expression after each + other, for example ba(na)*. + (na)* just says that what is inside + the parenthesis is repeated any number of times. + Imagine you had typed this regular expression into the search field in a + text editor, then you would have found the following words (among + others): ba, bana, + banana, bananananananana + + + Given the information above, it hopefully isn't hard for you to write the + shell wildcard test??.res as a regular expression + Answer: test..\.res. The dot on its own is any + character. To match a single dot you must write + \.This is called escaping. In + other word, the regular expression \. matches a dot, + while a dot on its own matches any character. + + In the regular expression editor, a repeated regular expression is + created using the repeat tool + + + + Replacing <literal>&</literal> with + <literal>&amp;</literal> in a HTML document In + HTML the special character & must be + written as &amp; - this is similar to + escaping in regular expressions. + + Imagine that you have written an HTML document in a normal editor + (e.g. XEmacs or Kate), and you totally forgot about this rule. What you + would do when realized your mistake was to replace every occurrences of + & with &amp;. + + This can easily be done using normal search and replace, + there is, however, one glitch. Imagine that you did remember + this rule - just a bit - and did it right + in some places. Replacing unconditionally would result in + &amp; being replaced with + &amp;amp; + + What you really want to say is that & should + only be replaced if it is not followed by the letters + amp;. You can do this using regular expressions using + positive lookahead. + + The regular expression, which only matches an ampersand if it is + not followed by the letters amp; looks as follows: + &(?!amp;). This is, of course, easier to read using + the regular expression editor, where you would use the + lookahead tools. + + + + + + + + + Using the Regular Expression Editor + + + This chapter will tell you about how the regular expression editor works. + + + + + + + The organization of the screen + + + + + + The most important part of the editor is of course the editing + area, this is the area where you draw your regular expression. This + area is the larger gray one in the middle. + + Above the editing area you have two Toolbars, the first one + contains the editing actions - + much like drawing tools in a drawing program. The second Toolbar + contains the whats this button, and buttons + for undo and redo. + + Below the editing area you find the regular expression + currently build, in the so called ascii syntax. The ascii syntax + is updated while you edit the regular expression in the graphical + editor. If you rather want to update the ascii syntax then please + do, the graphical editor is updated on the fly to reflect your + changes. + + Finally to the left of the editor area you will find a number + of pre-built regular expressions. They serve two purposes: (1) When + you load the editor with a regular expression then this regular + expression is made nicer or more comprehensive + by replacing common regular expressions. In the screen dump above, + you can see how the ascii syntax ".*" have been replaced with a box + saying "anything". (2) When you insert regular expression you may + find building blocks for your own regular expression from the set of + pre build regular expressions. See the section on + user defined regular + expressions to learn how to save your own regular expressions. + + + + + + + Editing Tools + The text in this section expects that you have read the chapter + on what a regular expression + is, or have previous knowledge on this subject. + + All the editing tools are located in the tool bar above + editing area. Each of them will be described in the following. + + + + + Selection Tool + + + + The selection tool is used to + mark elements for cut-and-paste and drag-and-drop. This is very + similar to a selection tool in any drawing program. + + + + + Text Tool + + + + + + + + + + Using this tool you will insert normal text to match. The + text is matched literally, i.e. you do not have to worry about + escaping of special characters. In the example above the following + regular expression will be build: abc\*\\\) + + + + + Character Tool + + + + + + + + Using this tool you insert + character ranges. Examples includes what in ASCII text says + [0-9], [^a-zA-Z,_]. When + inserting an item with this tool a dialog will appear, in which + you specify the character ranges. + + See description of repeated + regular expressions. + + + + + Any Character Tool + + + + + + + This is the regular expression "dot" (.). It matches any + single character. + + + + + + + + Repeat Tool + + + + + + + + This is the repeated + elements. This includes what in ASCII syntax is represented + using an asterix (*), a plus (+), a question mark (?), and + ranges ({3,5}). When you insert an item using this tool, a + dialog will appear asking for the number of times to + repeat. + + You specify what to repeat by drawing the repeated content + inside the box which this tool inserts. + + Repeated elements can both be built from the outside in and + the inside + out. That is you can first draw what to be repeated, select it + and use the repeat tool to repeat it. Alternatively you can + first insert the repeat element, and draw what is to be repeated + inside it. + + See description on the repeated + regular expressions. + + + + + + Alternative Tool + + + + + + + This is the alternative regular expression (|). You specify + the alternatives by drawing each alternative on top of each other + inside the box that this tool inserts. + + See description on alternative + regular expressions + + + + + + Compound Tool + + + + + + + The compound tool does not represent any regular + expressions. It is used to group other sub parts together in a + box, which easily can be collapsed to only its title. This can be + seen in the right part of the screen dump above. + + + + + + + Line Start/End Tools + + + + + + + + + + The line start and line end tools matches the start of the + line, and the end of the line respectively. The regular + expression in the screen dump above thus matches lines only + matches spaces. + + See description of position + regular expressions. + + + + + + + Word (Non)Boundary Tools + + + + + + + + + The boundary tools matches a word boundary respectively a + non-word boundary. The regular expression in the screen dump thus + matches any words starting with the. The word + the itself is, however, not matched. + + See description of boundary + regular expressions. + + + + + + + Positive/Negative Lookahead + Tools + + + + + + + + + The look ahead tools either specify a positive or negative + regular expression to match. The match is, however, not part of + the total match. + + Note: You are only allowed to place lookaheads at the end + of the regular expressions. The Regular Expression Editor widget + does not enforce this. + + See description of look ahead + regular expressions. + + + + + + + + User Defined Regular Expressions + Located at the left of the editing area is a list box + containing user defined regular expressions. Some regular + expressions are pre-installed with your KDE installation, while + others you can save yourself. + + These regular expression serves two purposes + (see detailed + description), namely (1) to offer you a set of building + block and (2) to make common regular expressions prettier. + + You can save your own regular expressions by right clicking the + mouse button in the editing area, and choosing Save Regular + Expression. + + If the regular expression you save is within a + compound container then the + regular expression will take part in making subsequent regular + expressions prettier. + + User defined regular expressions can be deleted or renamed by + pressing the right mouse button on top of the regular expression in + question in the list box. + + + + + + + + Reporting bugs and Suggesting Features + Bug reports and feature requests should be submitted through the + KDE Bug Tracking System. Before you report a bug or suggest a feature, + please check that it hasn't already been + reported/suggested. + + + + + + + Frequently Asked Questions + + Does the regular expression editor support back references? + No currently this is not supported. It is planned for the next + version. + + + + Does the regular expression editor support showing matches? + No, hopefully this will be available in the next version. + + + + I'm the author of a KDE program, how can I use this widget in + my application? + See The documentation for the class KRegExpEditorInterface. + + + + I can't find the <emphasis>Edit Regular expression</emphasis> button in for example + konqueror on another KDE3 installation, why? + The regular expression widget is located in the package + KDE-utils. If you do not have this package installed, then the + edit regular expressions buttons will not + appear in the programs. + + + + + + + + Credits and Licenses + + + Documentation is copyright 2001, Jesper K. Pedersen + blackie@kde.org + + + + &underGPL; + &underFDL; + + + + +
+ + diff --git a/doc/KRegExpEditor/linestartendtool.png b/doc/KRegExpEditor/linestartendtool.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c1bd80e9cb92001929a28ded4c1bcd35a28077 GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^?Lh3n!3HD^xKcnAOS+@4BLl<6e(pbstUx|nlDE4H z!+#K5uy^@npa^GyM`SSr1Gf+eGhVt|_XjA*UgGKN%6^eYQjA5a=2LMK0|V1KPZ!6K ziaBrRKFm{AX@}4ET&lbkotAF*} z+WDI~s&wzY$9}P4L0cI-cPsvX4g|)Pg|b4(0VH+NW5~oaABTpYRjx|{x8kkvz`2ZyNlQx`IowQ z-|4s)T+GL-duoEMfjK+xMtz%TMNq(;IsN>Ioc7)2Ph~D{U$#7HWp(+J9kHuqT@15s zY;^jrSA0irZ~c}<;xo@{-JLl>h~uoIf(d(L$=k3ejC{pB@?kIS-ahDc+nCz=?l{o> zx$|?bcX{OB@;mtFK`!g3Ye#Ptzn$j3_WtE94H)ytHy&PcfJKtjD{) zSZ_9cvi<+b>b{=M%6COCeKOR_s8jxYt?qbqd+4tH|1P(5T$v`i_DjsRsXtxT#^=gt z?IF8#429@tJ026`a&C&A+^+q89`0of+8z5u zzCBvF`)1zLE&R#iX|M9)6nn)S?OFv+cO83qbm59K*Y^Gn39Fv6K70Md!myY7YFnqA zo+cYTyZPeDY03R>PF63l3=`SlXS3(k(O_T->5*aiG*$Y4$qnPGnyM=rA1~}(T7FsP pN%6x?PM}b^Aj9HREC33k`vEn7ZB(Y#z6B;`22WQ%mvv4FO#ty~a`pfK literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/lookaheadtools.png b/doc/KRegExpEditor/lookaheadtools.png new file mode 100644 index 0000000000000000000000000000000000000000..a986f505766b35a6cf68086483075a871bd04217 GIT binary patch literal 774 zcmV+h1Nr=kP)|2kD48=$v?DM?)#q-Kd*TjpI2eOl zaQ;uK5>bL(`eSS=b@ARG4gdwdKJ5Uo3&aJ~fVhAf5EoFxgt)eCbKAE4YwJ0__P82o z`OU?IxZa8P{?jgq_=MkP#O1vwS0@$OLR)-I`{w$@*R&sHFXvOv=aR2fTglIyf7J86 zqTF|vQ946?ILYb@Ut)Zpw&lhTebW9Cdp&)n+R}T<@3f6GR?g2HY5yU`<(y1NXA@d_ zhSQg_mHWcZphOV+lD;3eQ8rq)KJN3memQ@J6<1HBQAg8WY4xW9q}oQtOwJW3SM;xW%7nSR9qTr~Qk6fIs=Ip*Uf1-FkpY+cuGW3>W7>BEX#_xrus(7x~P`Fu8y1LlFfE#7W7v608) zA$}Iji@Bo+Fb)tGP~)=IVhcTsoEkw2W^r9% zl7NhEIoFk=SG>UD`H0)795vT&WiG|%T?04FcW9#4yB!~g&Q07*qoM6N<$ Eg3iuir2qf` literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/neglookahead.png b/doc/KRegExpEditor/neglookahead.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc02912b19a3c135edd72c39fbf91cf88333b54 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6;RN#5=* z4F5rJ!QSPQfg+p*9+AZi4BUbs%vhfiKM^R%UgGKN%6^HFnTJ`X>tMPOP-vN_i(^Q| zoVSx5`I;337}|TqYn%3G%U`oQXWzhn=v#u~r6ktJOFJh|5J*tp&3)kLQT1nmg)jJS zX}!C_Z&awHbaTdYNkPSy0FmO$n|^0bGCsNI`~bp9zYIffk$L90|U1Z2s2)~ zTlWVj$X?><>&kwSosUUeZ0juT1wbJ?PZ!6KiaE&%2iPQ-4~S@Un|U=jW?yAub2~2Z z_dmZxge;T86psbW9b6o#48e;6xO60hB)As2$T~Uv>R@B2l^1)r_1R5Dph*m#u6{1- HoD!M<2Gu!lvI6;RN#5=* z4F5rJ!QSPQfg+p*9+AZi4BUbs%vhfiKM^R%UgGKN%6^HFnTJ`Rxm;TkD74Je#WAE} z&fCe3T!$3|T<0f;Svuuims?{yr<|k7plqVnMX4kwv(_2`wy*Z-ZmrSVvu1`LU#5O! z@q@qPK_LYc<0pXV$WaqsnzogJrSOhCAwAexvEVQ-R zD!3tOf<;7h0c049WfyBw=^RW9~rlc%1Y3oTh2AP$*CcLG0>G+qP*KhPS>*-0hQV^V%toU@P16{Q#W)&` zNb;hSfjv!|TmH S*;PjX0000#$ zh7TqJybTpyqB(Kw#|#q`hP z@cicImH+PA0cG<~EbMBqn|FH4moG|WE{VoC5 z*Z&TB8J#VEW5>j2=UjDP$2>jNA)LGY+tx+XL$7TXo!gyy+vG533>TU&Mz$`p0n#N7H0rr@VZ7-^$$WZ&DVoc)oe--Cy7SeEqZSm#UTc z>Gl=(_v{NgwPsQDl8t`P-pOvlB1bheLHaflrLT9VlQu=r`epEeQa)8>g}cck&do^6v zK9(P|-23=AU-8WD)QQWc8fj#+Pib7RZ7$Ox=QV{XhBn_E84hS+4^~~5#cQ;8 zopLKZ^|<^^f75jdR?``_EYu)zP{THri-PTIJ8FZ^{uY}gDjDrcb4;DEJ zxh{FJ!~N#Er_HLTR`{ftXG?!eSdn2Q{#Wy*yU4{&sX78DiX+UHYX(pKBz!hkY4-ac z##)9a4ktk&X9sG%nCww twvP>s4ur>C{2(Fupx)y=dUAZiuPnMit$$I%Iba#V;OXk;vd$@?2>>LuFA)F$ literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/select.png b/doc/KRegExpEditor/select.png new file mode 100644 index 0000000000000000000000000000000000000000..e04ab1782fb61f0dc359066efe0258a19c3897be GIT binary patch literal 742 zcmVEp!e^_>ydH6m5dFGj2 z<+`qr$rz(3(QRTJ0IjvvT3Zo0YPDKNTq*|>;zV8=v6@c+F ztgWq04NaqvPai+9u&{6y1OaMTgzJuTH5!e{(0D*PC!|S4&dKGJIiAXC5|KtBX&fR+ z%s9t!T~|gk-6YTR@H`I@A&DcB@RB6DB8@_1#Btuw&MYoFoerz3tDK%3^XKH4@Vq~S z$I-RenZP;x`T9!^zkj3q>nB%debRVvEv{mWQF$NF0{1+RcW+-4-@D5oyd+IivaV2t z<7sMK27mRYjkT7u(^JAQRIOI)pJSNZ6?r?|}AXJ=<8t=H=ckco~ZO^_)3 zuk-hxzhJF(eBXC~8lWn!>q-y=b~O0l;9v-qlr)ZzxE!3{GJsyM=WK6pv%kN;2=u1@ zx_O?bJDpAe6p>=QySv+S9EWzhElH9*Fvi?3+AS}~_Hlkj6mSQa2YzRBPk{yy0Y8Al$}PYG3^GU+XadVwGRYqP Y0vgR((>bh$4FCWD07*qoM6N<$f@P{j@c;k- literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/text.png b/doc/KRegExpEditor/text.png new file mode 100644 index 0000000000000000000000000000000000000000..8b256ca2a9925c05fba5824c286da13affb22cb1 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6;RN#5=* zKpF^sI`6IrQk(@Ik;M!Q+=3v?Sf3I<5h%!B;_2(keukrk?vK;nEt(-AuHIy}y067yqwSs#o*WF1MH1INonzoKV`r&z zKJT18jw-E_Z*1y#A)^&EC1{)P(rL4PD;jeadS%{@5!~PV*67Kc={(tM1>_C?D~KJH zh*iqBH!1ue)Vad^;$61a6$}SbP0l+XkK+?9P8 literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/texttool.png b/doc/KRegExpEditor/texttool.png new file mode 100644 index 0000000000000000000000000000000000000000..8c925261f5dff223da9384db3eaed78d76e9ee32 GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^#z3sX!3H9Wm^gtHOS+@4BLl<6e(pbstUx|nlDE4H z!+#K5uy^@npa^GyM`SSr1Gf+eGhVt|_XjA*UgGKN%6^eYQpDU+vug7?1_nk>PZ!6K ziaBp*1oAZ-a5yC1bhIhgU+Dfp;8=eCp?z6CmxH{lRokY|(7m9MFY>(Y^)8`3E$1(@ z_8duF^T;TyP;&K-p3r?;S&tXq325udoOPonl#L-Fa+=`Q5<#bi+WR+6l_VJ&D(CIy zzO*TKcE;V+X~$C67`dWnz{ScZU3-odZ@e)vC_TwfS>xZlos)J8gwIj2XS!^3 j`X&F|4dR11)z8cm(&{;M`J>(f!->Ju)z4*}Q$iB}X&;_I literal 0 HcmV?d00001 diff --git a/doc/KRegExpEditor/theEditor.png b/doc/KRegExpEditor/theEditor.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2468f05cb2b055609ca5c59ad54cb8b143af85 GIT binary patch literal 10004 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 literal 0 HcmV?d00001 diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..6812bd2 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,5 @@ + +KDE_LANG = en +KDE_DOCS = AUTO +SUBDIRS = $(AUTODIRS) + diff --git a/doc/ark/Makefile.am b/doc/ark/Makefile.am new file mode 100644 index 0000000..bed8857 --- /dev/null +++ b/doc/ark/Makefile.am @@ -0,0 +1,5 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + +KDE_MANS = AUTO \ No newline at end of file diff --git a/doc/ark/index.docbook b/doc/ark/index.docbook new file mode 100644 index 0000000..224bc29 --- /dev/null +++ b/doc/ark/index.docbook @@ -0,0 +1,793 @@ + + + + + +]> + + + + +The &ark; Handbook + + + +&Matt.Johnston; &Matt.Johnston.mail; + + + + + + +2000 +Matt Johnston + + + +2004 +Henrique Pinto + + + +&FDLNotice; + +2004-06-19 +2.3.1 + + +&ark; is an archive manager for &kde;. + + +KDE +gzip +gunzip +tar +archive +zip +compression +lha +kdeutils +ark + + + + +Introduction + +&ark; is a program for managing various archive formats within the +&kde; environment. Archives can be viewed, extracted, created and +modified from within &ark;. The program can handle various formats such +as tar, gzip, +bzip2, zip, rar and +lha (if appropriate command-line programs are +installed). &ark; can work closely with &konqueror; in the &kde; +environment to handle archives, if you install the &konqueror; Integration plugin available in the kdeaddons package. + + + + +Using &ark; + + +Opening Archives + +To open an archive in &ark;, choose +Open from the File +menu. You can also open archive files by dragging and dropping from +&konqueror;. Archive files should be associated with &ark;, so you can +also right click a file in &konqueror; and +select &ark; to open it. + + + + +Working with Files + +Once an archive has been opened, you can perform various +operations on the files inside the archive. By +right clicking on a file within the +archive, or selecting a file and using the Action +menu, you can choose what you want to do: + + + +Extract will extract the file to a location you +specify on disk. + + +Delete will remove the currently +selected file(s) from the archive. + + +View will open the file in the integrated viewer, or in the default +viewer program in case the integrated viewer cannot view the file, or you have disabled it in the Configuration Window. + + +Open With... allows you to open the +file in a program you choose. + + +Edit With... will open the file a +program you choose. The difference between this and Open +With... is that any changes you make will be saved to the +file in the archive. + + + + + + +Extracting Archives + +Once an archive has been opened in &ark;, it can be extracted. To +extract files from an archive, you can either select +Extract... from the +Action menu or right click on the file. The Extract +dialog allows you to select where you will extract files to. You can +also select which files to extract: + + + +Current extracts the most recently +selected file. If multiple files are selected, only the most recently +selected one will be extracted. + + +All extracts the entire contents of the +archive. + + +Selected Files extracts all the files +which have been selected. + + +Pattern allows you to specify which +files will be extracted, corresponding to certain patterns, ⪚ +*.txt or *.jpg. Note that you can only use one +pattern at a time. + + + +You can specify the folder to extract files to in the +Extract to: text box. The default location is the +folder the archive is in. You may also choose to have the folder that you +extract into open in &konqueror; once the extraction is complete. + + + + +Creating Archives and Adding Files + +To create a new archive in &ark;, choose +New from the File +menu. + +You can then type the name of the archive, with the appropriate +extension (tar.gz, zip, bz2 +&etc;). To add files to the archive, choose Add +File... from the Action menu. If you +want to add an entire folder to an archive, choose Add +Folder... from the Action menu. + +An alternative way to add files to the archive is to drag a file +from &konqueror; or the desktop into the main &ark; window, and it will +be added to the current archive. + + + + + + +Configuring &ark; + + +General Settings + + + + +Use integrated viewer + +Use the integrated viewer to view files, if possible. + + + + +Enable Konqueror integration + +Enable the plugin for extracting or adding files to archives through Konqueror context menus. +This option only works if the Konqueror integration plugin from kdeaddons is installed on your system. + + + + + + + + +File Addition Settings + +Many of these options are only configurable for specific archive +formats. Other formats may behave either way and are not +configurable. + + + +Replace old files only with newer +files + +If you add filenames that already exist in an archive, only +replace them if the added files are newer than the ones already +present in the archive. + + + + +Force MS-DOS short filenames (Zip) + +Force names to the DOS 8.3 format. +Affects only zip files + + + + +Translate LF to DOS CRLF (Zip) + +Convert the line endings in text files to DOS format from UNIX +format. +Affects only zip files + + + + +Store symlinks as links (Zip, Rar) + +Save links inside the archive, instead of following them and +including the files being linked to. +Affects zip and rar archives. + + + + +Recursively add subfolders (Zip, +Rar) + +If you add a folder to an archive, also add any +subfolders inside. Affects zip and rar archives + + + + + + + +Extraction Settings + +Many of these options are only configurable for specific archive +formats. Other formats may behave either way and are not +configurable. + + + +Overwrite files (Zip, Tar, Zoo, Rar) + +Overwrite any files that have matching names on disk with the +one from the archive. + + + + +Preserve permissions (Tar) + +Save the user, group, and permission settings on files. Use +with care, as this may result in files being extracted that do not +belong to any valid user on your computer. + + + + +Ignore folder names (Zip) + +Extract all the files into the extraction folder, ignoring +any folder structure in the archive. + + + + +Convert filenames to lowercase (Zip, Rar) +Convert filenames to uppercase (Rar) + +Extract all files with all lowercase (or uppercase) names. + + + + + + + + +Folders + + + +Folders + +This shows the Folders dialog box, so you + can choose the default folders. You can configure a Common folder that will be used for all options, use the last used folder, or a custom folder. + + + + + + + + + +Command Reference + + +The <guimenu>File</guimenu> Menu + + + + &Ctrl;N +File +New + +Creates a new archive + + + + + &Ctrl;O +File +Open + +Opens an archive + + + + + +File +Open Recent + + +Shows a list of recent archives to choose +from + + + + + +File +New Window + + +Opens a new &ark; window + + + + + +F5 +File +Reload + + +Loads the current archive again from disk. This will +refresh &ark;'s view if another program has made changes to the +archive. + + + + + +File +Save As + + +Allows you to save the current archive under a new file +name + + + + + + +&Ctrl;W + + +File +Close + + +Closes the current archive + + + + + +&Ctrl; +Q +File +Quit + + +Closes &ark; + + + + + + +The <guimenu>Edit</guimenu> Menu + + + + + +Edit +Select... + + +Lets you select files according to their +filename. For example, you could use *.txt to select all text files. Note that you +can't use more than one filter at a time. + + + + + +&Ctrl; +A +Edit +Select All + + +Selects all the files in the archive + + + + + +Edit +Deselect All + + +Unselects all the files in the archive + + + + + +Edit +Invert Selection + + +Reverses which files are selected. Selected files become +unselected, and unselected files are selected. + + + + + +Edit +View Shell Output + + +Displays the Shell Output box, which +shows you the output of the most recent command(s) run +by &ark;. This is sometimes useful if you are having problems and want +to troubleshoot. + + + + + + + + +The <guimenu>Action</guimenu> Menu + + + + + +Action +Add File... + + +Shows the Select Files to Add dialog box, +where you can select files. Hold down &Ctrl; and click to select +multiple files. To go up a folder, +right click the folder box, and you can +choose Up (this will probably be improved +soon). The Advanced tab has options which are +specific to the type or archive you are working with. + + + + + +Action +Add Folder... + + +Shows the Add Folder... dialog box, where you +can choose a folder to add. Just choose a folder +and choose Open. + + + + + +Action +Delete + + +Removes the currently selected files from the +archive. + + + + + +Action +Extract + + +Shows the Extract dialog box, which allows +you to select where you will extract files to. You can +also select which files to extract: + + + +Current extracts the most recently selected +file. If multiple files are selected, only the most recently selected +one will be extracted. + + +All extracts the entire contents of the +archive. + + +Selected Files extracts all the files which +have been selected. + + +Pattern allows you to specify which files +will be extracted, corresponding to certain patterns, ⪚ +*.txt or *.jpg Note that you can only use one +pattern at a time. + + + + +You can specify the folder to extract files to in the +Extract to: text box. The default location is the +folder the archive is in. You may also choose to have the folder that you +extract into open in &konqueror; once the extraction is complete. + + + + + +Action +View + + +Opens the currently selected file in the associated viewer +program. + + + + + +Action +Open With... + + +Opens the currently selected file in a program you +choose. The Open With... dialog box lets +you choose which program to use. + + + + + +Action +Edit With... + + +Opens the currently selected file in a program you +choose. Any changes you make in the editor program will be +reflected in the archive, as it will be updated. + + + + + + + + +The <guimenu>Settings</guimenu> Menu + + + + + +Settings +Show/Hide Toolbar + + +Toggles whether the toolbar is displayed. + + + + + +Settings +Show/Hide Statusbar + + +Toggles whether the status bar is +displayed. + + + + + +Settings +Show/Hide Search Bar + + +Toggles whether the search bar is +displayed. + + + + + +Settings +Configure Shortcuts... + + +Displays the Configure Shortcuts dialog +box. This lets you choose shortcut keys for various menu +items. To change a shortcut, select an action from the list, +and then choose which keystroke to use. Clicking on the bottom right +hand Key button lets you choose which specific +key to use. Just press the new key. + + + + + +Settings +Configure Toolbars... + + +Displays a &kde; standard dialog where you can configure the +toolbar icons. + + + + + +Settings +Configure Ark... + + + +This opens the &ark; configuration dialog. The dialog contains four +modules (General, Addition, Extraction and Folders). Configuring &ark; is covered in the section Configuration + + + + + + + +The <guimenu>Help</guimenu> Menu + +&help.menu.documentation; + + + + + + + +Credits and License + +&ark; is Copyright © 1997-2004, The Various &ark; Developers + + +Authors: +Helio Chissini de Castro +helio@conectiva.com.br +Georg Robbers +Georg.Robbers@urz.uni-hd.de +Henrique Pinto +henrique.pinto@kdemail.net +Roberto Selbach Teixeira +maragato@kde.org +Robert Palmbos +palm9744@kettering.edu +Francois-Xavier Duranceau +duranceau@kde.org +Corel Corporation (author: Emily Ezust) +emilye@corel.com + + +Documentation Copyright © 2000 Matt Johnston +mattj@flashmail.com + +Documentation updated for &kde; 3.3 by Henrique Pinto +henrique.pinto@kdemail.net. + +&underFDL; +&underGPL; + + + + +Installation + + +How to obtain &ark; + +&install.intro.documentation; + + + + +Requirements + +In order to successfully use &ark;, you need &kde; +3.3. GNU Tar v1.12 and a recent +gzip are also needed if you want &ark; to handle tar archives. To handle other +file formats, you need the appropriate command line programs, such as +zip, unzip, ar, rar +and lha. + + + + +Compilation and Installation + +&install.compile.documentation; + + + + + +&documentation.index; + + + + diff --git a/doc/ark/man-ark.1.docbook b/doc/ark/man-ark.1.docbook new file mode 100644 index 0000000..ce2d6a8 --- /dev/null +++ b/doc/ark/man-ark.1.docbook @@ -0,0 +1,174 @@ + + + +]> + + + +KDE User's Manual + +Lauri +Watts + +&Lauri.Watts.mail; +February 25, 2005 +K Desktop Environment + + + +&kappname; +1 + + + +ark +A &kde; archiving tool + + + + +ark + + + + + + + +folder +files +archive +KDE Generic Options +Qt Generic Options + + + + +Description +&kappname; is a program for managing various archive formats +within the &kde; environment. Archives can be viewed, extracted, created +and modified from within &kappname;. The program can handle various +formats such as tar, +gzip, bzip2, +zip, rar and +lha (if appropriate command-line programs are +installed). &kappname; can work closely with &konqueror; in the &kde; +environment to handle archives, if you install the &konqueror; +Integration plugin available in the kdeaddons package. + + + + +Options + + + + + +Open extract dialog, quit when finished + + + + +Extract archive to +folder. Quit when finished. +folder will be created if it does not +exist. + + + + + +Ask for the name of the archive to add +files to. Quit when finished. + + + + + +Add files to +archive. Quit when finished. +archive will be created if it does not +exist. + + + + + +Used with . When specified, +archive will be extracted to a +subfolder of folder whose name will be +the name of archive without the +filename extension. + + + + + + + +Environment + + +$PATH + +The commandline programs to deal with the archives you wish to +handle in &kappname; must be available in your +$PATH. + + + + + + +Examples + + + +ark . +An-Archive.tar.bz2 + +Will extract An-Archive.tar.bz2 into a +folder named An-Archive in the +current directory. + + + +ark +*.jpg pictures.tar.bz2 + +Add all files ending in *.jpg to an archive named +pictures.tar.bz2, creating it if it doesn't +already exist. + + + + + + +See Also +tar(1), gzip(1), bzip2(1), zip(1), rar(1), lha(1) + +More detailed user documentation is available from help:/ark +(either enter this URL into &konqueror;, or run +khelpcenter +help:/ark). + + + + +Authors +&ark; is maintained by +HenriquePinto stampede@coltec.ufmg.br +This man page was written by &Lauri.Watts; +&Lauri.Watts.mail; for &kde; 3.4. + + + diff --git a/doc/kcalc/Makefile.am b/doc/kcalc/Makefile.am new file mode 100644 index 0000000..085981d --- /dev/null +++ b/doc/kcalc/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kcalc/commands.docbook b/doc/kcalc/commands.docbook new file mode 100644 index 0000000..22f20e7 --- /dev/null +++ b/doc/kcalc/commands.docbook @@ -0,0 +1,254 @@ + + +Command Reference + + +The <guimenu>File</guimenu> Menu + + + + + + +&Ctrl;Q + +File +Quit + +Quit &kcalc;. + + + + + + + +The <guimenu>Edit</guimenu> Menu + + + + + + +&Ctrl;Z + +Edit +Undo + +Go back in the result +stack. + + + + + +&Ctrl;&Shift;Z + +Edit +Redo + +Go forward in the result +stack. + + + + + + +&Ctrl;X + +Edit +Cut + +Delete the displayed result and copy it to the +clipboard. + + + + + +&Ctrl;C + +Edit +Copy + +Copy the displayed result to the +clipboard. + + + + + +&Ctrl;V + +Edit +Paste + +Insert the cut or copied result in the +display. + + + + + + + +The <guimenu>Constants</guimenu> Menu + + + + + +Constants +Mathematics + +Display Pi, Euler Number or Golder Ratio. + + + + + +Constants +Electromagnetism + +Display Light Speed, Elementary Charge, +Impedance of Vacuum, Permeability of Vacuum or Permittivity of Vacuum. + + + + + +Constants +Atomic & Nuclear + +Display Planck's Constant, Elementary Charge or +Fine-Structure Constant. + + + + + +Constants +Thermodynamics + +Display Boltzmann Constant, Atomic Mass Unit, Molar Gas +Constant, Stefan-Boltzmann Constant or Avogadro's Number. + + + + + +Constants +Gravitation + +Display Constant of Gravitation or Earth Acceleration. + + + + + + + + +The <guimenu>Settings</guimenu> Menu + + + + +Settings +Science/Engineering Buttons + +Display science and engineering buttons. + + + + + +Settings +Statistic Buttons + +Display statistic +buttons. + + + + + +Settings +Logic Buttons + +Display logic +buttons. + + + + + +Settings +Constants Buttons + +Display constants buttons. + + + + + +Settings +Show All + +Display all buttons available. + + + + + +Settings +Hide All + +Hide all extra buttons and display only +standard default buttons. + + + + + +Settings +Configure Shortcuts... + +Configure the keyboard shortcuts used by &kcalc;. + + + + + + +Settings +Configure &kcalc;... + +Display the &kcalc; settings dialog. + + + + + + + + +The <guimenu>Help</guimenu> Menu + +&help.menu.documentation; + + + + + + diff --git a/doc/kcalc/index.docbook b/doc/kcalc/index.docbook new file mode 100644 index 0000000..b881ee9 --- /dev/null +++ b/doc/kcalc/index.docbook @@ -0,0 +1,774 @@ + + + + + + +]> + + + +The &kcalc; Handbook + + + +&Bernd.Johannes.Wuebben; &Bernd.Johannes.Wuebben.mail; + + + +&Pamela.Roberts;&Pamela.Roberts.mail; + + + +&Anne-Marie.Mahfouf;&Anne-Marie.Mahfouf.mail; + + + + + + +2001 2002 2005 2006 +&Bernd.Johannes.Wuebben;, &Pamela.Roberts;, +&Anne-Marie.Mahfouf; + + +&FDLNotice; + +2006-02-13 +2.0.2 + +&kcalc; is a scientific calculator for &kde; + + +KDE +KCalc +calculator + + + + +Introduction + +This document describes &kcalc; version 1.8. + +&kcalc; offers many more mathematical functions than meet the eye +on a first glance. Please study the section on keyboard accelerators and +modes in this handbook to learn more about the many functions +available. + +In addition to the usual functionality offered by most scientific +calculators, &kcalc; offers a number of features, which I think are +worthwhile pointing out: + + + +&kcalc; provides trigonometric functions, logic operations, and it is +able to do statistical calculations. + + +&kcalc; allows you to cut and paste numbers from/into its display. + + +&kcalc; features a results-stack which lets +you conveniently recall previous results. + + +You can configure &kcalc;'s display colors and font. + + +You can configure &kcalc;'s precision and the number +of digits after the period. + + + &kcalc; offers a great number of useful +key-bindings, which make using &kcalc; without using a pointing device easy. +Hint: pressing (and holding) the &Ctrl;-key, displays on +every button, +the corresponding key-binding. + + + +Have fun with &kcalc;! + +Bernd Johannes Wuebben + + + + + +Usage + +General Usage + +General usage is straight forward and similar to the way most +simple scientific calculators operate, but take note of the following +special &kcalc; features: + + + +Result Stack +Each time you &LMB; click on the += button or press your keyboard's +Enter or = keys, the display result is +written to &kcalc;'s result stack. You can navigate through the result +stack with your keyboard's +&Ctrl;Z +and &Ctrl; &Shift;Z +keys. + + + + +Percent Function + +The percent function works somewhat differently to that on most +calculators. However, once understood, its enhanced functionality proves +quite useful. See the section about the percent function for further details. + + + +Cut and Paste + + + +Pressing &Ctrl;C +will place the displayed number on to the clipboard. + + +Pressing &Ctrl;V +will paste the clipboard content into the display if the content of the +clipboard is a valid floating point number. + + +It is still possible to copy/paste by clicking on &kcalc;'s display, +but this may disappear in future versions. + + + + + +Advanced functions + +When you start &kcalc; for the first time, the calculator will only +display buttons for basic arithmetic computations. +Under the menu entry Settings it is possible to +open extra buttons for &kcalc;: +it is for example possible to choose +Statistical or +Trigonometric buttons. + + + + + + +Statistical Mode + +In this mode the left column of buttons is allocated to statistical +functions: + Most of the functionality in this mode is centered around the Dat + button. To create a data list of numbers, enter a number into the calculator and press + Dat. A sequentially increasing number is shown on the display indicating + which position in the Data list the number occupies. A traditional calculator only + stores three values for statistical functions: The number of discrete items in a list, the sum of + the data items entered and the sum of the square of all data items in the list. &kcalc; differs by + actually storing each discrete value, allowing you to calculate the median value of the data. + + + + +Buttons +Function + + +N +Recall the number of data items entered + +Inv N +Display the sum of all data items entered + +Mea +Display the mean of the data items entered + +Inv Mea +Display the sum of the square of all data items entered + +Std +Display the standard deviation (n) + +Inv Std +Display the population standard deviation (n-1) + +Med +Display the median + +Dat +Enter a data item + +Inv Dat +Clear last data item entered + +Cst +Clear the store of all data item entered + + + + + + + +Trigonometric Mode + +In this mode the left column of buttons is allocated to trigonometric +functions: + + + +Buttons +Function + + +Hyp +Enter Hyperbolic sub mode. Hyp Sin for example is the hyperbolic sine: +sinh(x) + +Sin +Compute the sine + +Inv Sin +Compute the inverse sine + +Cos +Compute the cosine + +Inv Cos +Compute the inverse cosine + +Tan +Compute the tangent + +Inv Tan +Compute the inverse tangent + +Log +Compute the Log base 10 + +Inv Log +Compute 10 to the power of x + +Ln +Compute the natural logarithm. That is the log to base e + +Inv Ln +Compute e to the power of x + + + + + + +Memory Operations + +&kcalc; supports the memory operations given by standard +calculators plus six slots to hold constants. + + + Standard Memory Operations + +&kcalc; can remember results of operations for you, and re-use them in +later calculations. You can access these functions via several buttons +labelled MR, MS, +M+ and MC. + + + +MS +The MS button stores the currently +displayed result in memory. + + + +M+ +The M+ button adds the current result to the +one in memory. So, if you had stored a 20, and the current result is a 5, +your memory would contain 25 when you press it. If the memory is empty, it +acts like MS and simply stores the +result. + + + +MR +The MR button gets the value stored +in memory and puts it in the display. + + + +MC +The MC button clears the +memory. + + + +If a value is stored in memory a M will appear in +the status bar, next to the calculator mode indicator + + + +Constants + +The six constants buttons C1 to +C6 will only be visible after activating the +item Constants Buttons in the menu +Settings of the menu bar. + +To store the number shown in the &kcalc; display in one of the +six constants, first press Inv followed +by the desired button key C1 up to +C6. + +To use the value stored in any of the contants in a calculation, just + press the desired button (C1 to C6), + and the corresponding number will appear in the display. + +IIt is possible to change the label of the constants button to make it easier + to remember which button holds which constant. Click with the right mouse + button on one of the buttons C1 to + C6. A popup menu appears, in which you select + Set Name. + +There are many (mostly physical) predefined constants, which can +be put on any of the six buttons C1 - +C6 by selecting the desired constant in the +popup menu that appears after right clicking on one of the constant +buttons and selecting Choose from List. Though +the predefined constants can also be accessed via the +Constants in the menu bar, storing it on a +constants button is very handy, if the number is used +frequently. + + + + + + +Single Key Accelerators + +To simplify entering calculations from the keyboard &kcalc; has single key +accelerators for most functions. For example entering 7R +or 7r will calculate the reciprocal of 7 (1/7). + +During a computation, you can always press &Ctrl; to make each +button display its key-binding. + + + +Key +Function +Notes + + + +H +Hyp +Hyperbolic as in Hyp Sin, +the sinh(x) + +S +Sin + + +C +Cos + + +T +Tan + + +N +Ln +log base e + +L +Log +log base 10 + +I + Inv +Inverse, ⪚ if +you want arcsin(x) type i s + +\ ++/- +Change sign + +[ +x^2 + + +^ +x^y + + +! +x! +Factorial + +< +Lsh +Left shift. Note: Inv +Lsh is Right shift + +& +And +Logical AND + +* +X +Multiply + +/ +/ +Divide + +D +Dat +Enter data item in statistical mode + +O +Or +Logical OR. Note: Inv +Or is XOR + +R +1/x +Reciprocal + += += + + +Enter += + + +Return += + + +Page Up +C +Clear + +Esc +C +Clear + +Prior +C +Clear + +Page Down +AC +Clear all + +Next +AC +Clear all + +Del +AC +Clear all + + + + + + + +Comments on Specific Functions + + +Mod and Inv Mod + + + +Mod gives the remainder of dividing the displayed +number by the next input number. +22 Mod 8 = will give the result +6 +22.345 Mod 8 = will give the result +6.345 + + + +Inv Mod does integer +division of the displayed number by the next input number. +22 Inv Mod 8 = will give the result +2 +22.345 Inv Mod 8 = also gives 2 + + + + + + + +% + +Used instead of the = key, +% interprets the final operation carried out in the +current calculation as follows: + + + +If the final operator is + or - the second argument is interpreted as percentage of the first operand. + + + +If the final operator is * divide the result of the multiplication by 100. + + + +If the final operator is / give the left operand +as a percentage of the right operand. + + + + In all other cases the % key gives identical results to the = key. + + + + + + +Examples: + +150 + 50 % gives 225 (150 plus 50 percent of this amount) +42 * 3 % gives +1.26 (42 * 3 / 100) +45 / 55 % gives +81.81... (45 is 81.81.. percent of 55) + + + + + + + +Lsh and Inv Lsh + + +Lsh left shifts the integer part of the displayed +value (multiplies it by 2) n times, where n is the next input number, and +gives an integer result: +10 Lsh 3 = gives 80 +(10 multiplied by 2 three times). +10.345 Lsh 3 = also gives +80. + + + +Inv Lsh right shifts the +value (performs an integer divide by 2) n times. +16 Inv Lsh 2 = gives +4 (16 divided by 2 twice). +16.999 Inv Lsh 2 = also gives +4. + + + + + + + +Cmp, And, Or and Xor + +The Cmp, And and +Or functions perform bitwise logical operations and +therefore appear more meaningful if the Base is set to +Hex, Oct or Bin +rather than Dec. In the following +examples Base is set to Bin. + + + +Cmp performs a 1's complement (inverts the +bits). +101 Cmp gives +111...111010 + + + +And does a logical AND. +101 And 110 = gives +100 + + + +Or does the logical OR. +101 Or 110 = gives +111 + + + +Xor performs the logical +XOR (exclusive OR) operation. +101 Xor 110 = gives +11 + + + + + + + + +Questions and Answers + + + + + +How do I get e, the Euler number? +Type 1 Inv Ln. + + + +How do I get two fixed digits after the period? +Click on the Configure button, this will +bring up the configuration dialog. Check Set fixed +precision and adjust the spin control so that it shows a +2. + + +What about Precision? +The main factor determining the precision of &kcalc; is whether your libc and libmath +supports the C data type long double. If this is the case, &kcalc; will detect this +at compile time and use it as its fundamental data type to represent numbers. + + +Adjust the Precision in &kcalc;'s +Configure dialog so that the above computations +work correctly. I recommend a precision of 14 if the fundamental data type +for your copy of &kcalc; is long double, otherwise 8 or 10. + +Higher precision doesn't necessarily lead to better results. Play with +the precision and you will see what I mean. + + + + + + +&commands; + + +Credits and License + +&kcalc; Program Copyright ©: +Bernd Johannes Wuebben 1996-2000 +The &kde; Team 2000-2004 + + +&Bernd.Johannes.Wuebben; &Bernd.Johannes.Wuebben.mail; +&Evan.Teran; &Evan.Teran.mail; +&Espen.Sand; &Espen.Sand.mail; +&Chris.Howells; &Chris.Howells.mail; +&Aaron.J.Seigo; &Aaron.J.Seigo.mail; +&Charles.Samuels; &Charles.Samuels.mail; + + +&kcalc; was inspired by Martin Bartlett's xfrmcalc, +whose stack engine is still part of &kcalc;. + +Documentation Copyright © 2001,2002,2005, 2006: + +&Bernd.Johannes.Wuebben; &Bernd.Johannes.Wuebben.mail; +&Pamela.Roberts; &Pamela.Roberts.mail; +&J.Hall; &J.Hall.mail; +&Anne-Marie.Mahfouf;&Anne-Marie.Mahfouf.mail; + + +&underFDL; +&underGPL; + + + + +Installation + +&kcalc; is part of the kdeutils package within the &kde; project and will +normally be provided as part of a &kde; installation. For more details about +&kde; visit http://www.kde.org. + + + + +Compilation and Installation + +&install.intro.documentation; +&install.compile.documentation; + + + + +How to enable long double precision for &kcalc; + +If your machine supports the C data type long double +and if you have a working libc you can enable long double +precision for &kcalc;. + +Here is what to do: + + + + Check ../config.h and see whether +HAVE_LONG_DOUBLE is defined, &ie; you should be able to locate a +line saying: + +#define HAVE_LONG_DOUBLE 1 + +If you can't find such a line your system doesn't support long +double IEEE precision. + + +Edit the files kcalctype.h, +configdlg.cpp, kcalc.cpp and +kcalc_core.cpp and remove the lines: + + +#ifdef HAVE_LONG_DOUBLE +#undef HAVE_LONG_DOUBLE +#endif + + + + + Recompile &kcalc;. + + + + + + + + + + diff --git a/doc/kcalc/kcalc_on_Aix.txt b/doc/kcalc/kcalc_on_Aix.txt new file mode 100644 index 0000000..186e9d6 --- /dev/null +++ b/doc/kcalc/kcalc_on_Aix.txt @@ -0,0 +1,123 @@ +X-RDate: Mon, 11 Aug 1997 17:34:22 -0400 (EDT) +Return-Path: +Received: from cornell.edu (cornell.edu [132.236.56.6]) by + postoffice2.mail.cornell.edu (8.8.5/8.8.5) with ESMTP id JAA08757 for + ; Mon, 11 Aug 1997 09:50:57 -0400 (EDT) +Received: (from daemon@localhost) by cornell.edu (8.8.5/8.8.5) id JAA11825 for + bw18@postoffice3.mail.cornell.edu; Mon, 11 Aug 1997 09:50:56 -0400 (EDT) +Received: from polygon.math.cornell.edu (POLYGON.MATH.CORNELL.EDU + [128.84.234.110]) by cornell.edu (8.8.5/8.8.5) with SMTP id JAA11800 for + ; Mon, 11 Aug 1997 09:50:53 -0400 (EDT) +Received: from ibmmail.COM by polygon.math.cornell.edu (5.x/SMI-SVR4) id + AA10464; Mon, 11 Aug 1997 09:50:48 -0400 +Received: from IMXGATE.COM by ibmmail.COM (IBM VM SMTP V2R3) with BSMTP id + 5302; Mon, 11 Aug 97 09:50:47 EDT +Received: from mail.schoeck.de by imxgate.com (IBM VM SMTP V2R3) with TCP; + Mon, 11 Aug 97 09:49:44 EDT +Received: from isndj1.ag.schoeck.com by mail.schoeck.de (AIX 4.1/UCB 5.64/4.03) + id AA15070; Mon, 11 Aug 1997 15:46:57 +0100 +Message-Id: <9708111446.AA15070@mail.schoeck.de> +Comments: Authenticated sender is +X-PH: V4.1@cornell.edu (Cornell Modified) +Organization: Schoeck AG +Date: Mon, 11 Aug 1997 15:47:27 +1 +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8BIT +Comments: Sender has elected to use 8-bit data in this message. If problems + arise, refer to postmaster at sender's site. +Reply-To: diehl@mail.schoeck.de +Priority: normal +In-Reply-To: +References: <9708101509.AA13824@mail.schoeck.de> +X-Mailer: Pegasus Mail for Win32 (v2.52) +XFMstatus: 0000 +From: "Jochen Diehl" +To: Bernd Johannes Wuebben +Subject: RE: kcalc under AIX + + +> O.K Jochen, +> +> das wird jetzt aber ein bische unuebersichtlich. +> Ich schlage vor, Du findest jetzt erst mal in Ruhe eine +> Loesung die fuer AIX funktioniert. Dann sende mir Dein +> kcalc.h und ich werde meine bestes tun das einzubauen. +> Ich glaube es ist am besten wenn wir das so machen, +> ein ganzen Haufen Leute sind naemlich immer zielich sauer, +> wenn ich eine neue version von kcalc rausbringe und +> es laeuft auf ihrer platform nicht mehr richtig. + +Sowas ist in der Tat aergerlich. Langsam verstehe ich, wieso +kommerzielle Softwareschmieden sich so str?uben, auf n Plattformen zu +portieren... + +Ok. Hier also mal meine Aenderungen, sind eigentlich minimal. +Immerhin funktioniert die Trigonometrie dann bei mir. Ausser beim +ersten Start: cos 0 gibt dann 0.9932483259 irgendwas, erst wenn ich +AC druecke kommt 1 raus. Sonst klappt das erstmal. AIX scheint +uebrigens asinhl und Konsorten nicht zu kennen, obwohl sinhl bekannt +ist. Nun ja, hier der diff: +kcalc.h +72a73,81 +> #if defined(_AIX) && defined(HAVE_FABSL) +> #define __LONGDOUBLE128 +> #define pi M_PI +> #define asinhl(X) asinh(X) +> #define acoshl(X) acosh(X) +> #define atanhl(X) atanh(X) +> #endif +> +> +kcalc_core.cpp +35c35 +39d38 +< #include +40a40 +> #include +68a69 +> #ifndef _AIX +69a71 +> #endif +157a160 +> #ifndef _AIX +158a162 +> #endif +Damit bricht der Compiler wenigstens mal nicht ab. + + +Anscheinend ist IBM echt zu doof zum Rechnen (wundert mich, bei den +Preisen und den unendlich vielen Seriennummern :-), Deine Definition +von pi schluckt es nicht, da kommt dann NaNQ in die Anzeige. + +Auch sonst stimmt etwas noch nicht so, ich habe nur noch nicht +herausgefunden, woran das liegt: +Nach exp(1) zeigt kcalc e^1.5 an usw. Was am Source falsch sein +soll, ist mir absolut schleierhaft, ich habe genau denselben Code in +einem eigenen Programm und da rechnet er es richtig. Weiss der Geier. + +"0!" bringt bei mir einen core dump, schaetze mal, der modfl (IBM) +ist daran schuld. Wenn ich vorher ein cout mache, bleibt das Programm +stehen, cored aber wenigstens nicht. + +Was soll's? Da ich scheinbar der einzige bin, der Interesse an KDE +auf AIX hat, stoert mich das nicht so ungemein, will sagen: ich habe +keine Probleme xcalc zu nehmen (wenn ich ueberhaupt mal einen +Taschenrechner brauche). Ansonsten gilt natuerlich die +Standardaussage: Super, dass sich jemand hinsetzt und den Code +ueberhaupt schreibt und dann noch fuer umme weggibt. + +Fass es bitte nicht als Kritik auf, sondern einfach als Info, was +unter anderen OS so alles passieren kann :-) Was Du mit deinem Source +machst, ist natuerlich Deine Sache, ich will hier ja keinen +veraergern. + +Viele Gruesse +Jochen + + + +------------------------------------------------------------- +Jochen Diehl, R/3-Basis +Schoeck AG, Vimbucher Str. 2, 76534 Baden-Baden +Tel.: +497223967381 Fax.: +497223967352 diff --git a/doc/kcalc/kcalc_on_OSF.txt b/doc/kcalc/kcalc_on_OSF.txt new file mode 100644 index 0000000..59b6e6e --- /dev/null +++ b/doc/kcalc/kcalc_on_OSF.txt @@ -0,0 +1,62 @@ +X-RDate: Mon, 01 Sep 1997 07:45:22 -0400 (EDT) +Return-Path: +Received: from cornell.edu (cornell.edu [132.236.56.6]) by + postoffice2.mail.cornell.edu (8.8.5/8.8.5) with ESMTP id KAA06175 for + ; Tue, 26 Aug 1997 10:56:10 -0400 (EDT) +Received: (from daemon@localhost) by cornell.edu (8.8.5/8.8.5) id KAA25547 for + bw18@postoffice3.mail.cornell.edu; Tue, 26 Aug 1997 10:55:42 -0400 (EDT) +Received: from polygon.math.cornell.edu (POLYGON.MATH.CORNELL.EDU + [128.84.234.110]) by cornell.edu (8.8.5/8.8.5) with SMTP id KAA25126 for + ; Tue, 26 Aug 1997 10:55:15 -0400 (EDT) +Received: from mpimail.mpi-hd.mpg.de by polygon.math.cornell.edu (5.x/SMI-SVR4) + id AA07964; Tue, 26 Aug 1997 10:54:56 -0400 +Received: from daniel.mpi-hd.mpg.de (daniel.mpi-hd.mpg.de [149.217.1.90]) by + mpimail.mpi-hd.mpg.de (8.8.2/8.8.2) with SMTP id QAA19532 for + ; Tue, 26 Aug 1997 16:54:56 +0200 (MET DST) +Received: from localhost by daniel.mpi-hd.mpg.de + (5.65v4.0/1.1.10.5/31Jul97-0446PM) id AA04869; Tue, 26 Aug 1997 16:54:56 +0200 +Date: Tue, 26 Aug 1997 16:54:56 +0200 (MET DST) +X-PH: V4.1@cornell.edu (Cornell Modified) +Message-Id: +Mime-Version: 1.0 +Content-Type: TEXT/PLAIN; charset=US-ASCII +XFMstatus: 0002 +From: Lars Knoll +To: wuebben@math.cornell.edu +Subject: kcalc unter dec osf4.0 + +Hi, + +ich hatte ein paar Probleme, kcalc auf einer dec alpha unter osf4.0 +zu kompilieren. Das Problem ist, dass bei diesem System + sizeof(long double) = sizeof(double) +ist, und dass Routinen namens asinl, fabsl, ... existieren, aber nicht +in irgendwelchen headers definiert werden. +Zusaetzlich funktioniert fabsl() wie erwartet, asinl gibt aber leider +immer nur 0. zurueck. Der folgende patch loest das Problem bei mir. + +Lars + + +diff -c kcalc/kcalc.h kcalc.osf/kcalc.h +*** kcalc/kcalc.h Sun Aug 3 05:01:41 1997 +--- kcalc.osf/kcalc.h Tue Aug 26 16:53:12 1997 +*************** +*** 63,68 **** +--- 63,72 ---- + + /* TAKE CARE OF TH HAVE_LONG_DOUBLE defines in core.cpp*/ + ++ /* dec osf4.0 has fabsl, but not asinl... */ ++ #ifdef __osf__ ++ #undef HAVE_FABSL ++ #endif + + #ifdef HAVE_FABSL + #define CALCAMNT long double + + + +--- +Lars Knoll knoll@mpi-hd.mpg.de + PGP pub key [6DADF3D5]: finger knoll@pluto.mpi-hd.mpg.de diff --git a/doc/kcharselect/Makefile.am b/doc/kcharselect/Makefile.am new file mode 100644 index 0000000..085981d --- /dev/null +++ b/doc/kcharselect/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kcharselect/index.docbook b/doc/kcharselect/index.docbook new file mode 100644 index 0000000..cabb4d2 --- /dev/null +++ b/doc/kcharselect/index.docbook @@ -0,0 +1,66 @@ + + + + + +]> + + + + +The &kcharselect; Handbook + + + + + + + +
+
+
+ +
+ +&FDLNotice; + +2001-01-20 +0.00.00 + + + +&kcharselect; is part of the kdeutils package. + + + + + +KDE +kdeutils +kcharselect + + +
+ + +Introduction +The documentation for &kappname; was not finished when &kde; was installed on this computer. +If you need help, please check The KDE Web site for updates, or by submitting your question to The &kde; User Mailing list. +The &kde; Team + +&underFDL; +&underGPL; + + + +&documentation.index; +
+ + diff --git a/doc/kcontrol/Makefile.am b/doc/kcontrol/Makefile.am new file mode 100644 index 0000000..930c270 --- /dev/null +++ b/doc/kcontrol/Makefile.am @@ -0,0 +1,6 @@ + +SUBDIRS = $(AUTODIRS) + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kcontrol/kcmlowbatcrit/Makefile.am b/doc/kcontrol/kcmlowbatcrit/Makefile.am new file mode 100644 index 0000000..335ba2c --- /dev/null +++ b/doc/kcontrol/kcmlowbatcrit/Makefile.am @@ -0,0 +1,2 @@ +KDE_LANG=en +KDE_DOCS=kcontrol/kcmlowbatcrit \ No newline at end of file diff --git a/doc/kcontrol/kcmlowbatcrit/index.docbook b/doc/kcontrol/kcmlowbatcrit/index.docbook new file mode 100644 index 0000000..24bf9e0 --- /dev/null +++ b/doc/kcontrol/kcmlowbatcrit/index.docbook @@ -0,0 +1,47 @@ + + + +]> + +
+ + + + +&Mike.McBride; &Mike.McBride.mail; + + + + +2002-02-12 +3.00.00 + + +KDE +KControl +Battery +Power + + + + + +Low Battery Critical + + +Use +This module works in exactly the same manner as the Low battery Warning module. By convention, this module should be set to warn you or automatically perform any action necessary just prior to the loss of battery power. + + +Section Author +This section written by &Paul.Campbell; &Paul.Campbell.mail; +Converted to Docbook by &Mike.McBride; &Mike.McBride.mail; + + + + +
diff --git a/doc/kcontrol/kcmlowbatwarn/Makefile.am b/doc/kcontrol/kcmlowbatwarn/Makefile.am new file mode 100644 index 0000000..9baf4af --- /dev/null +++ b/doc/kcontrol/kcmlowbatwarn/Makefile.am @@ -0,0 +1,2 @@ +KDE_LANG=en +KDE_DOCS=kcontrol/kcmlowbatwarn \ No newline at end of file diff --git a/doc/kcontrol/kcmlowbatwarn/index.docbook b/doc/kcontrol/kcmlowbatwarn/index.docbook new file mode 100644 index 0000000..97ceaf2 --- /dev/null +++ b/doc/kcontrol/kcmlowbatwarn/index.docbook @@ -0,0 +1,104 @@ + + + +]> + +
+ + + + +&Mike.McBride; &Mike.McBride.mail; + + + + +2002-02-12 +3.00.00 + + +KDE +KControl +Battery +Power + + + + + + +The Low Battery Warning and Low Battery Critical Panels + + + +Introduction + + +These two modules work together to control what happens when a +predetermined low battery condition occurs. There are two of them, so you can +set a warning for when time is getting close, and something more desperate for +the last minute save or suspend. + + + + + + +Use + +Low trigger + +This field specifies at which point the battery low state is detected - it +is the number of minutes left (according to APM) in your batteries. When this +number is crossed the low state is triggered and one or more of the following +things will occur + + + +Run Command +This is a shell command that will be executed when the battery +low is detected. By default, this is turned off. + + +Play Sound +This specifies a sound to play when battery low is detected. Simply specify the path to the +file to have it played. By default, this is turned off. + + +System Beep +Enabling this will cause the battery monitor to beep whenever +the battery level drops below the preset value. This is probably the least +intrusive, yet still active, method of alerting the user that the battery is +low. By default, this is on. + + +Notify +Enabling this will cause Battery to pop up a window when the +battery becomes low. + + +Suspend +If you have set up /usr/bin/apm to be run +setuid (see the instructions for the Power panel) then this check box will +appear - if checked it will cause your computer to be put into Suspend +mode. + + +Standby +Like Suspend above, but it puts your computer into Standby +mode. + + + + + +Section Author +This section written by &Paul.Campbell; &Paul.Campbell.mail; +Converted to Docbook by &Mike.McBride; &Mike.McBride.mail; + + + + +
diff --git a/doc/kcontrol/laptop/Makefile.am b/doc/kcontrol/laptop/Makefile.am new file mode 100644 index 0000000..446ee8e --- /dev/null +++ b/doc/kcontrol/laptop/Makefile.am @@ -0,0 +1,2 @@ +KDE_LANG=en +KDE_DOCS=kcontrol/laptop \ No newline at end of file diff --git a/doc/kcontrol/laptop/index.docbook b/doc/kcontrol/laptop/index.docbook new file mode 100644 index 0000000..fb83afd --- /dev/null +++ b/doc/kcontrol/laptop/index.docbook @@ -0,0 +1,111 @@ + + + +]> + +
+ + + + + + +&Mike.McBride; &Mike.McBride.mail; + + + + +2002-02-12 +3.00.00 + + +KDE +KControl +Battery +level + + + + + +The Battery Monitor Panel + + + + +Introduction + +This panel controls whether or not a battery state icon appears +in &kde;'s panel. + +Once enabled a battery will appear in your docking bar as one of +3 icons - a battery with a red X through it +indicates that APM has not been installed (in +particular /proc/apm can't be read). + +The other two icons indicate the battery state - a +small plug with a bar beside it indicates your +batteries are charging - the height of the blue portion of the bar +indicate how full your batteries are. A small +battery in the dock indicates you are running on +batteries, the amount of blue in the battery indicates how full your +batteries are. + +If you left click on the docked icon a +pop-up will tell you how much time you have left in minutes. + +If you right click you get a pop-up +that lets you put your laptop into suspend or standby modes - or to +bring up the laptop configuration widget. + +All features of Battery are configured from the Setup dialog. + + + +Use + +The configuration window can be divided into 3 parts. + + + +Show Battery Monitor +This controls whether or not the battery icon appears. This is +disabled by default. + + +Poll +This setting controls how often, in seconds, the battery is +updated. +The default is 20 seconds. + + +Icons +The battery monitor uses three icons to represent the three +states: No APM, Charging, and Not Charging. The icons shown are the large +icons. To select new ones, click on the buttons and a icon loader dialog will +pop up. +If you create your own icons - they will work with the battery +monitor - but be careful. +All the exactly white pixels in the icon get filled by blue for the +battery meter - if you want some white looking pixels to stay choose a slightly +off-white or gray color for them. +The author does not claim to be a graphic artist and would love for +someone to donate some better looking icons to the cause. + + + + + + +Section Author +This section written by &Paul.Campbell; &Paul.Campbell.mail; +Converted to Docbook by &Mike.McBride; &Mike.McBride.mail; + + + + +
diff --git a/doc/kcontrol/powerctrl/Makefile.am b/doc/kcontrol/powerctrl/Makefile.am new file mode 100644 index 0000000..eefb119 --- /dev/null +++ b/doc/kcontrol/powerctrl/Makefile.am @@ -0,0 +1,2 @@ +KDE_LANG=en +KDE_DOCS=kcontrol/powerctrl \ No newline at end of file diff --git a/doc/kcontrol/powerctrl/index.docbook b/doc/kcontrol/powerctrl/index.docbook new file mode 100644 index 0000000..2a09b95 --- /dev/null +++ b/doc/kcontrol/powerctrl/index.docbook @@ -0,0 +1,77 @@ + + + +]> + +
+ + + + +&Mike.McBride; &Mike.McBride.mail; + + + + +2002-10-16 +3.1 + + +KDE +KControl +Laptop +Power + + + + +Laptop Power Control + + +Introduction + +This tab provides a screensaver-style interface to the APM +suspend/standby modes. It allows you to configure different wait +times and/or actions depending on whether or not your laptop is +plugged into the wall. It's intended to be used in addition to the +existing &kde; screensavers - you could for example disable +suspend/standby when plugged in to the wall, but enable suspend with a +shorter time than your normal screensaver kicks in while running on +batteries. + +Standby mode seems to do different things on different laptops - +in particular on some it may not stay in standby mode and your laptop may be +continually waking/sleeping if you leave it in this mode. + + + +Use + +This panel configures the power-down feature of your laptop. It works as +a sort of extreme screen saver. +You can configure different timeouts and behavior depending on whether +your computer is plugged in or running on battery power. +For both the Powered and Not Powered, you should select one of the +following options: + +Standby - Puts your laptop into standby state +Suspend - Puts your laptop into suspend state +Off - Nothing happens at the specified time. + + +Below that, is a text box labeled Wait for. Enter +the time in minutes, that your computer should remain unused, before the laptop +is powered down. + + + +Section Author +This section written by &Paul.Campbell; &Paul.Campbell.mail; +Converted to Docbook by &Mike.McBride; &Mike.McBride.mail; + + + + +
diff --git a/doc/kdelirc/Makefile.am b/doc/kdelirc/Makefile.am new file mode 100644 index 0000000..6812bd2 --- /dev/null +++ b/doc/kdelirc/Makefile.am @@ -0,0 +1,5 @@ + +KDE_LANG = en +KDE_DOCS = AUTO +SUBDIRS = $(AUTODIRS) + diff --git a/doc/kdelirc/irkick/Makefile.am b/doc/kdelirc/irkick/Makefile.am new file mode 100644 index 0000000..085981d --- /dev/null +++ b/doc/kdelirc/irkick/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kdelirc/irkick/index.docbook b/doc/kdelirc/irkick/index.docbook new file mode 100644 index 0000000..972101c --- /dev/null +++ b/doc/kdelirc/irkick/index.docbook @@ -0,0 +1,131 @@ + +IRKick"> + KDE LIRC"> + + + + +]> + + + + +&irkick;: The KDE LIRC Server Handbook + + + +Gav +Wood + +
gav@kde.org
+
+
+ +
+ +2004-01-02 +1.0 + + +2004 +Gav Wood + + +&FDLNotice; + +&kdelirc; is the infrastructure for the KDE's +Infrared Remote Control functionality; &irkick; is the server +component of that infrastructure. + + +KDE +irkick +kdelirc +kcmlirc +lirc + + +
+ + +Introduction + + +&irkick; is a background server that provides the 'glue' between +the operating system and your KDE applications for the purpose of +controlling KDE applications with your infrared remote controls. + + + +It has a configuration tool, which may be accessed either by the +KDE Control Center or directly from the menu of &irkick;. + + + +Requirements + + +For the KDELirc framework to be utilised you must have setup a LIRC +on your KDE machine. If it is properly set up, the &irkick; icon in +the system tray will light up red. If not, it will be grey and crossed +out. + + + +For more information about LIRC, visit their website at http://www.lirc.org. + + + + + + +Using &irkick; + + +&irkick; provides one main function: When a button on a remote control is +pressed, it will temporarily become lit up. Aside from this &irkick; does +little for the user directly aside from telling them of the activity of their +remote controls. + + + +Using the right-mouse-button menu, you can configure the KDE infrared remote +control framework. + + + + + +Credits and Licenses + +&kdelirc;: The KDE LIRC Framework Copyright (c) 2004 Gav Wood +gav@kde.org. + + + +&underFDL; +&underGPL; + + + + +Installation + +&install.intro.documentation; +&install.compile.documentation; + + +
+ + diff --git a/doc/kdelirc/kcmlirc/Makefile.am b/doc/kdelirc/kcmlirc/Makefile.am new file mode 100644 index 0000000..085981d --- /dev/null +++ b/doc/kdelirc/kcmlirc/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kdelirc/kcmlirc/index.docbook b/doc/kdelirc/kcmlirc/index.docbook new file mode 100644 index 0000000..e3507c3 --- /dev/null +++ b/doc/kdelirc/kcmlirc/index.docbook @@ -0,0 +1,165 @@ + +KDE LIRC Control Center Module"> + KDE LIRC"> + + + +]> + + + + +KDE Infrared Remote Control Configuration + + + +Gav +Wood + +
gav@kde.org
+
+
+ +
+ +2004-01-02 +1.0 + + +2004 +Gav Wood + + +&FDLNotice; + +&kdelirc; configuration: The infrastructure for the KDE's +Infrared Remote Control functionality. + + +KDE +irkick +kdelirc +kcmlirc +lirc + + +
+ + +Introduction + + + + + +Requirements + + +For the KDELirc framework to be utilised you must have setup a LIRC +on your KDE machine. If it is properly set up, the &kdelirc; icon in +the system tray (show icon here) will light up red. If not, it will +be grey and crossed out. + + + +For more information about LIRC, visit their website at http://www.lirc.org. + + + + + + +Usage + + +There are several sections of the configuration. The list on the left details the remote controls and modes. The selection of that dictates the contents of the right-most list, which shows button/action bindings. Flicking the main tab over to Loaded Extensions will show a list of applications and remote controls that are recognised for the advanced functionality; some data is also viewable by selecting one of the items. + + + +Remote Controls and Modes + + +Each remote control can have a number of modes. Having multiple modes allows the same button to conduct different actions in difference situations, and is how many remote controls handle many different appliances with a limited number of buttons. A good example are the TV/Video/Satellite/DVD multi-purpose remote controls - rather than having several sets of number buttons for each appliance they have only one set which works for the currently selected appliance only. + + + +Each remote control can be in at most one mode at once (it may also be in no mode at all). The remote control also has a "default mode", which is the mode that it starts in, and the mode that it gets reset to normally. This may be set by using the Edit button. + + + +The list contains any remote controls detected on your system. Modes may be added and removed by selecting the desired remote control and using the buttons directly below the list Add, Remove. Modes may be renamed "inline" in the standard KDE fashion by first selecting the mode in the list box, and then clicking it again after a short pause. The Edit button allows mode names to be edited, and also allows you to define an icon that will show up in the system tray when that mode is entered. + + + + + +Action-Button Bindings + + +An action/button binding ("action") is a connection between a button press and an effect. The effect may be to switch modes, to start a KDE program or to execute a function in a KDE program (using DCOP). + + + +Actions may be associated with a mode of the remote control; if it is, the action will only have effect when the remote control is in that mode. Actions may also be placed out of any mode. Such actions will always have their desired effect no matter what mode that remote control happens to be in. + + + +To add an action/button binding simply use the Add button. Removal may be performed by selecting the action(s) to be removed and clicking the Remove button. Actions may be Edited with the Edit button, and moved to different modes by dragging and dropping onto the desired mode in the remotes/modes list. + + + +Actions may also be "automatically" populated. This handles the instance when you have a supported remote control and you wish to map its buttons to a supported application's functions. &kdelirc; can attempt to match buttons to functions for you; this behaviour may have to be tweaked, however. + + + + + +Loaded Extensions + + +There is another tab available named "Loaded Extensions". This details the applications and remote controls that &kdelirc; recognises. &kdelirc; can also use unsupported remote controls and applications, but the Auto-Populate function will not work as well (if at all). + + + +By clicking on an entry you can see information on it such as the author's details. + + + + + + + +Credits and Licenses + +&kdelirc; KDE LIRC Framework Copyright (c) 2004 Gav Wood +gav@kde.org. + +Documentation Copyright (c) 2004 by Gav Wood +gav@kde.org. + +&underFDL; +&underGPL; + + + + +Installation + +&install.intro.documentation; +&install.compile.documentation; + + +
+ + diff --git a/doc/kdf/Makefile.am b/doc/kdf/Makefile.am new file mode 100644 index 0000000..085981d --- /dev/null +++ b/doc/kdf/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kdf/index.docbook b/doc/kdf/index.docbook new file mode 100644 index 0000000..672ef81 --- /dev/null +++ b/doc/kdf/index.docbook @@ -0,0 +1,266 @@ + + + + + +]> + + + + +The &kdiskfree; Handbook + + + +&Jonathan.Singer; &Jonathan.Singer.mail; + + + +&Michael.Kropfberger; &Michael.Kropfberger.mail; + + + + + + + +2000-2002 +&Jonathan.Singer; + + +&FDLNotice; + +2003-09-16 +0. + +&kdiskfree; displays available file devices, along with +information about them. + + + + +KDE +kdf +kdeutils +disks +devices +mount +unmount + + + + + +Introduction + +&kdiskfree; displays the available file devices (hard drive +partitions, floppy and &CD; drives, &etc;) along with information on +their capacity, free space, type and mount point. It also allows you +to mount and unmount drives and view them in a file manager. + +&kdiskfree; is similar to the &kcontrol; Disk-Free module , but takes up less screen +space. It is useful if you want to keep a &kdiskfree; window available at +all times. + + + + +Using &kdiskfree; + + +Starting &kdiskfree; + +Type kdf at a command +prompt or select Disk Free from the +System group in the K +menu. The standard &Qt; and &kde; command options are available, and +can be listed by entering kdf + at the command prompt. + + + + +The Main window + +The main &kdiskfree; window displays the available file devices. + +Normally, the following pieces of information are included: + +&kdiskfree; Screen + + + + + + &kdiskfree; Screen + + + + + +an icon depicting the type of storage +device name +filesystem type +total size +mount point +free disk space +the percentage of space used as a number and as a +graph. + + +In the picture above, four devices are shown: one reiserfs-formatted +hard drive partition mounted at the filesystem root (/), two &CD-ROM;'s, and a floppy drive. + +Left clicking on the header of a +particular column sorts the devices according to that variable. A +second left click sorts in the opposite +order. + +Clicking on a row pops up a menu. If that device is not +currently mounted, the Mount Device option +is available. If the device is mounted, it can be unmounted by +choosing Unmount Device. Selecting +Open in File Manager opens a new window with a +graphical view of the files on that device. + + + + +The &kdiskfree; menu bar + + +The <guimenu>File</guimenu> Menu + + + + + +File +Update + +Immediately updates the display to reflect the current +status + + + + + + +&Ctrl;Q + +File +Quit + +Closes &kdiskfree; + + + + + + +The <guimenu>Settings</guimenu> menu and dialog + + + + +Settings +Configure Shortcuts... + + +The standard &kde; dialog for setting shortcuts. + + + + + + +Settings +Configure KDiskFree... + + +Opens a configuration dialog. + +Configure &kdiskfree; Screen + + + + + + Configure &kdiskfree; Screen + + + + +This dialog has two tabbed windows, General Settings +and Mount Commands + + +General Settings Click on the word +visible or hidden to turn +display of an data field on or off. Change the update +frequency by moving the slider. The value in the box on the left is +the interval (in seconds) between updates of the &kdiskfree; display to +reflect the current status. The File Manager setting +controls the command executed when the Open +Filemanager pop-up menu item is selected. +There are also two check boxes. One controls if a file manager +window will be automatically opened when a device is mounted. The +other causes an alert window to pop up if a disk gets critically +full. + + + +Mount Commands +Allows the user to specify the mount and unmount commands for a +given device, as well as the icon used to represent it. More information on +these commands can be found on the man page for mount (type +man at the +command prompt). + + + + + + + + +The <guimenu>Help</guimenu> menu + +&help.menu.documentation; + + + + + + + +Credits and License + +&kdiskfree; + +Program Copyright © 1998-2000 &Michael.Kropfberger; &Michael.Kropfberger.mail; + +Documentation Copyright © 2000 &Jonathan.Singer; &Jonathan.Singer.mail; + +&underFDL; +&underGPL; + + + +&documentation.index; + + + diff --git a/doc/kdf/kdf.png b/doc/kdf/kdf.png new file mode 100644 index 0000000000000000000000000000000000000000..737ec7cd2b028863d0855e0ba8e0142630aeb00d GIT binary patch literal 22869 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

vMd?fHzg#7?}}$@;JCs=J$u_O32? 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

    5V{qNp_V`}Pr~-(Owu(oyhrep>r?g;- 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 + + + + +]> + + + +The &kedit; Handbook + + +ThadMcGinnis + +
    ctmcginnis@compuserve.com
    +
    +
    + + +Lauri +Watts +
    lauri@kde.org
    +Reviewer +
    +
    + +2003-09-16 +1.3 + +&FDLNotice; + +This Handbook describes &kedit;, a simple +text editor for &kde; + + +KDE +KEdit +text editor + + + +2000 +Thad McGinnis + + +
    + + +Introduction + +&kedit; is a text editor for the &kde; Desktop. It is a +small editor which can be used with &konqueror; for text and +configuration file browsing. &kedit; also serves well for creating small +plain text documents. It is not meant to be a programmers editor, in +particular it is not meant to replace any of the more powerful editors +such as &kate;, XEmacs or +Emacs. &kedit;'s functionality will +intentionally remain rather limited to ensure a reasonably fast +start. + + + + +Some Fundamentals + +&kedit; is very simple to use. Anyone that has used a text editor +should have no problems. + + +Drag and Drop + +&kedit; uses the &kde; Drag and Drop protocol. Files may be +dragged and dropped onto &kedit; from the Desktop, &konqueror;, or some +remote &FTP; site opened in one of &konqueror;'s windows. + + + + +Command Line Options + +Though &kedit; may most often be started from the &kde; program +menu, or a desktop icon, it can also be opened at the command line +prompt of a terminal window. There are a few useful options that are +available when doing this. + + +Specify a File + +By specifying the path and name of a particular file the user can +have &kedit; open (or create) that file immediately upon startup.This +option might look something like the following: + + +%kedit /home/myhome/docs/myfile.txt + + + + + +Specify a file on the Internet + +The above-mentioned method could even be used to open files on the +internet (if the user has an active connection at the time.) An example +of this might look like the following: + + +%kedit ftp://ftp.kde.org/pub/kde/Welcome.msg + + + + + +Other Command Line Options + +The following command line help options are available + + + +kedit + +This lists the most basic options available at the command +line. + + + + +kedit + +This lists the options available for changing the way &kedit; +interacts with &Qt;. + + + + +kedit + +This lists the options available for changing the way &kedit; +interacts with &kde;. + + + + +kedit + +This lists all of the command line options. + + + + +kedit + +Lists &kedit;'s authors in the terminal window + + + + +kedit + +Lists version information for &Qt;, &kde;, and &kedit;. Also +available through kedit + + + + + + + + + +Key Bindings + +Many of the key bindings (shortcuts) are configurable by way of +the Settings menu. By default &kedit; +honors the following key bindings. + + + + + +Key Binding +Action + + + + + +Left Arrow +Move the cursor one character leftwards. + + + +Right Arrow +Move the cursor one character rightwards. + + + +Up Arrow +Move the cursor one line upwards + + + +Down Arrow +Move the cursor one line downwards. + + + +Page Up +Move the cursor one page upwards. + + + +Page Down +Move the cursor one page downwards. + + + +Backspace +Delete the character to the left of the cursor. + + + +Home +Move the cursor to the beginning of the line. + + + +End +Move the cursor to the end of the line. + + + +Delete +Delete the character to the right of the cursor. + + + +&Shift;Left +Arrow +Mark text one character leftwards. + + + +&Shift;Right +Arrow +Mark text one character rightwards. + + + +&Ctrl;A +Select all the text in the document. + + + +&Ctrl;B +Move the cursor one character leftwards. + + + + +&Ctrl;C +Copy the marked text to the clipboard. + + + +&Ctrl; +D +Delete the character to the right of the +cursor. + + + +&Ctrl;E +Move the cursor to the end of the line. + + + +&Ctrl;F +Search for text in the document. + + + +&Ctrl;G +Go to line. + + + + +&Ctrl;H +Delete the character to the left of the +cursor. + + + +&Ctrl;K +Create a new document + + + +&Ctrl; +N +Move the cursor one line downwards. + + + +&Ctrl; +P +Print. + + + +&Ctrl;V +Paste the clipboard text into the document at the text +cursor position. + + + + +&Ctrl;X +Cut the marked text, copying it to the +clipboard. + + + +&Ctrl; +Y +Yank (paste) the content of the kill-buffer (clipboard) +into the document, at the current cursor position. + + + + + + + + + + +The Menu Entries + + +The <guimenu>File</guimenu> Menu + + + + &Ctrl;N +FileNew + +This starts a new Document in a new instance of the +editor. + + + + + &Ctrl;O +FileOpen... + + +This command opens a file. It does this by means +of a dialog box which allows the user to navigate the file +system. + +The dialog operates like a small file manager. Clicking on +folders displayed in the central window directs the dialog to enter +that folder - displaying its contents. There is an entry/drop down +box which can be used to directly type in the location and name of the +file or by clicking the arrow at the side choose from a drop down list of +recently used locations. + + Below this is a filter which similarly may have data entered +directly or chosen from a drop down list of recent filter types. The +filter facility lets only files that meet its specifications be +displayed in the central window. If the filter contained text such as +*.txt then only files with the txt +extension would be visible in the selection window. + +The toolbar has left and right arrow buttons that let the user +move back and forth through previously selected folders as well as +an up arrow button for moving up the folder tree. The button with the +little house takes the user to his or her home folder, and the one +with the two arrows curved in on each other updates the view of the +current folder. The flag button lets the user set a new bookmark at +the current folder or go to one that was previously set. The icon of +the folder with the sparkle on it, allows you to create a new +folder. Finally there is drop down box on the toolbar with a list of +some commonly frequented folders. + + + + +FileOpen +Recent + + + +This is a shortcut to open recently saved +documents. Clicking on this item opens a list to the side of +the menu with a list of several of the most recently saved +files. Clicking on a specific file will open it in &kedit; - if the file +still resides at the same location. + + + + +&Ctrl;S +FileSave + +This saves the current document. If there has +already been a save of the document then this will overwrite the +previously saved file without asking for the user's consent. + + +The editor can be configured to make a backup. + + +If it is the first save of a new document the save as dialog +(described below) will be invoked. + + + + + +FileSave +As... + +This allows a document to be saved with a new file +name. This is done by means of the file dialog box described +above in the Open section of this help +file. + + + + + +&Ctrl;P +FilePrint... + +This opens a simple print dialog allowing the user to +specify what, where, and how to print. The user can choose +between the standard lpr or a custom command as well +as whether to print the whole document or a selected section. + + + + + +FileMail... + +This is used to email the current document. It +calls a mail dialog whereby the user can enter the address and subject +for the message. + +You may set your preferred mail client in &kcontrol; + + + + + + &Ctrl;W +FileClose + +This will close the editor window, if you have +more than one instance of &kedit; running, those instances will not be +closed. + + + + + +&Ctrl;Q + +File +Quit + +This closes the editor. + + + + + + + +The <guimenu>Edit</guimenu> Menu + + + + &Ctrl;Z +EditUndo + +This is used to eliminate or reverse the most recent user +action or operation. + + + + + &Ctrl;&Shift;Z +EditRedo + +This will reverse the most recent change (if any) +made using Undo. + + + + + &Ctrl;X +EditCut + +This command deletes the current selection and places it +on the clipboard. The clipboard is a feature of &kde; that +works invisibly to provide a way to transfer data between +applications. + + + + + &Ctrl;C +EditCopy + +This copies the currently selected text to the clipboard +so that it may be pasted elsewhere. The clipboard is a feature +of &kde; that works invisibly to provide a way to transfer data between +applications. + + + + + &Ctrl;V +EditPaste + +This will insert the contents of the clipboard at the +cursor position. The clipboard is feature of &kde; that works +invisibly to provide a way to transfer data between applications. + + + + + +&Ctrl;A +EditSelect +All + +This will select the entire document. This could +be very useful for copying the entire file to another +application. + + + + + &Ctrl;F +EditFind... + +This opens the find dialog which is used to +specify the text to Find in the document. There is +small text box for entering the search pattern. Two other options are +included to make the search more efficient. Selecting Case +sensitive will limit finds to entries that match the case +(upper or lower) of each of the characters in the search +pattern. Find backwards directs the search to +proceed in an upwardly direction. + + + + + F3 +EditFind +Next + +This repeats the last find operation, if any, without +calling the find dialog box. + + + + + &Ctrl;R +EditReplace... + +This command opens the replace dialog box. The +replace dialog is similar to the above-mentioned find dialog but with +the addition of a Replace with: text box. Using +this dialog the user can specify both the text to be found and text with +which to replace it. This dialog also contains two additional buttons. +The Replace button allows the user to make one +replacement at a time which is useful when not all instances of the +searched for text should be replaced. The Replace +All button should be used with caution as it will immediately +replace every instance of the specified text. + + + + + + +EditInsert +File... + +This opens the FileOpen dialog box whereby +the user can insert a complete file in the open +document. The file will be entered at the position of the +blinking text cursor. + + + + + + +EditInsert +Date + +This will enter the current date at the position of the +blinking text cursor. + + + + + + +EditClean +Spaces + +Choosing this item will remove from any selected +text any extra spaces and all carriage returns (the code for +the end of a paragraph brought about by pressing the +Enter key.) In other words, any occurrences of +two or more spaces will be reduced to one space; and all paragraphs and +blank lines will be reduced to one single +paragraph. + + + + + + +The <guimenu>Go</guimenu> Menu + + + + + +&Ctrl;G +GoGo to +Line... + +This opens the goto line dialog box which is used to have +the cursor jump to a particular line (specified by number) in the +document. The line number may be entered directly into the text +box or graphically by clicking on the up or down arrow spin controls at +the side of the text box. The little up arrow will increase the line +number and the down arrow decrease it. + + + + + + +The <guimenu>Tools</guimenu> Menu + + + + +ToolsSpelling... + +This initiates the spell checking program - a program +designed to help the user catch and correct any spelling +errors. Clicking on this entry will start the checker and bring +up the speller dialog box through which the user can control the +process. There are three text boxes lined up vertically just to the +left of center with their corresponding labels further to the left. +Starting at the top they are: + + + +Misspelled word: + +Here, the spell checker indicates the word currently under +consideration. This happens when the checker encounters a word not in +its dictionary - a file containing a list of correctly spelled words +against which it compares each word in the editor. + + + + +Replacement: + + If the checker has any similar words in its dictionary the first +one will be listed here. The user can accept the suggestion, type in +his or her own correction, or choose a different suggestion from the +next box. + + + + +Suggestions: + +The checker may list here a number of possible replacements for +the word under consideration. Clicking on any one of the suggestions +will cause that word to be entered in the +Replacement: box, above. + + + + +On dialog box are 8 buttons that allow the user to control the +spell check process. They are: + + + +Replace + +This button has the checker replace the word under consideration +in the document with the word in the Replacement: +box. + + + + +Replace All + +This button causes the checker to replace not only the current +Misspelled Word: but to automatically make the same +substitution for any other occurrences of this Misspelled +Word: in the document. + + + + +Ignore + +Activating this button will have the checker move on without +making any changes. + + + + +Ignore All + +This button tells the checker to do nothing with the current +Misspelled Word: and to pass over any other +instances of the same word. + + +This only applies to the current spell check run. If the checker +is run again later it will stop on this same word. + + + + + +Add + +Pressing this button adds the word in the Misspelled +Word: box to the checker's dictionary. This means that in the +future the checker will always consider this word to be correctly +spelled. + + + + +Help + +This invokes the &kde; help system starting at the &kedit; help +pages (this document). + + + + +Stop + +This button stops the spell check process. + + + + +Cancel + +This button cancels the spell check process. + + + + +Located horizontally along the bottom of the spell check dialog is +a progress bar. As the checking process proceeds the bar will fill from +left to right providing a graphical representation of how far along in +the document the process has reached. + + +A numerical display of the spell check process is simultaneously +displayed in the status bar of the editor. The status bar is the horizontal strip at +the bottom of the editor just outside of the text entry area. + + + + + + + + +The <guimenu>Settings</guimenu> Menu + + + + +SettingsShow +Toolbar + +When checked, this displays a movable toolbar containing +buttons used to initiate frequently used commands. The toolbar is most +commonly located at the top of the editor just under the menu. When +unchecked the toolbar is hidden. Clicking on the striated grip +will hide or unhide the bar. Clicking and dragging on this grip allows +the user to move the bar. + + + + + +SettingsShow +Statusbar + +When checked, this displays a small bar at the bottom of +the editor containing information about the status of the current +document. When unchecked the status bar is hidden. + + + + + +SettingsSave +Settings + +This saves the current editor settings to be used for +future documents. + + + + + +SettingsConfigure +Shortcuts... + +This command opens a dialog box whereby the key bindings may be changed. A display +window at the top of the dialog box shows the list of commands +available. Below the display are three radio buttons. The user may +choose a modifier key from None, +Default, and Custom. + + +Note that a set of radio buttons only allows the selection of one +of the offered items - in the way that buttons on a car radio only offer +the selection of one preset station. Also, the Default Key selection is +only available for those commands that actually have a +default shortcut.) + + + +Selecting the Custom key option activates the three check boxes and key +button at the bottom of the dialog. The user may then select a +combination of keys for the command in question by means of the check +boxes and key button. For example, with the About &kde; command selected +in the display window, the user could select &Ctrl; and &Alt;, click on +the key button, and then press the K key on the +keyboard. This would mean that anytime he or she held down the &Ctrl; +and &Alt; buttons and pressed K (while using &kedit;) +the About &kde; display box would be called. + + + + + +SettingsConfigure +Toolbars... + + +This will open the dialog whereby the toolbar +configuration may be changed. The user can choose which +shortcut buttons should appear on the toolbar, as well as whether and +where any text should appear with the buttons. Other choices include +button (icon) size and toolbar location (top, left, right, floating, or +flat.) Flat causes the toolbar to be retracted. A click on the striated +grip icon will extend it for use and another click retract it again. A +display window on the left lists the commands available to be placed on +the toolbar. A display on the right lists those commands already on the +toolbar. A set of four arrow buttons between the two displays +manipulates the selections. The right pointing arrow places any command +selected in the left pane onto the right pane, &ie;, it is added to the +toolbar. The left arrow does just the opposite, removing any action +selected in the right window from the toolbar. The up and down pointing +arrows change the position of an action selected in the right window +which changes the position of its button in the toolbar. + + + + + +SettingsConfigure KEdit... + +This menu item opens a dialog whereby several different settings may be adjusted. + + + + + + + +The <guimenuitem>Help</guimenuitem> Menu + +&help.menu.documentation; + + + + + +The Preferences Dialog + +Selecting +SettingsConfigure +KEdit from the menu brings up the preferences +dialog box. This dialog can be used to alter a number of different +settings. The settings available for change vary according to which +category the user chooses from a vertical list on the left side of the +dialog. By means of a row of five buttons along the bottom of the box +the user can control the process. She or he may invoke the +Help system, set the options to their +Default values, accept the current settings and +close the dialog by means of the OK button, +Apply the current choices to the document without +closing the dialog, or Cancel the process. The +categories Font, Color, +Spelling, and Miscellaneous +are detailed below. + + +Font + +The preferences dialog opens with this, the first category, +chosen. Here the user can change four settings and see the effects of +any changes in the text sample displayed in the rectangle at the bottom +or the box. The settings are: + + + + +Font: + +This scroll box allows the user to select by name from among the +various fonts available. The appearance of any selected font may be +seen in the sample text displayed in the rectangle at the bottom of the +dialog. + + + + +Font style: + +This, the center, selection box is used to choose between the four +basic styles of Regular, Italic, Bold, and Bold Italic. The appearance +of the selected style may be seen in the sample text displayed in the +rectangle at the bottom of the dialog. + + + + +Size: + +This, the rightmost scroll/selection box allows the user to change +font size. The larger the number chosen the larger the font size will +be. The sample text displayed in the rectangle at the bottom of the +dialog will reflect the choice of size. + + + + + + + + +Color + +This section provides access to two different color settings, +described below. Each of these settings may be changed by clicking on +its corresponding button. These are special wide buttons that are the +color of the current setting. Clicking on one of the buttons calls a +special color dialog box used to change the setting. + +The color dialog box provides a convenient and graphical way to +select a color. In the upper left of the box is a rectangular display +of a spectrum of colors. To the immediate right of this, is a vertical +bar displaying a range of intensity from the most dark at the bottom to +the most light at the top. The user may select and adjust a color by +clicking in these two boxes. Clicking in the rectangular display selects +a particular mix of red, green, and blue colors and in the vertical bar +selects a level of intensity (value). The various color attributes are +displayed in numerical form in small text boxes located directly below +the spectral rectangle and the user can see them change as the color is +adjusted. These attributes include the mix of the basic color +components (red, green, and blue) as well as hue and saturation levels. +Alternatively the user can enter figures directly in these boxes. There +is also a square at the bottom center of the dialog box which displays +the color which is under consideration at any time. To the right of +this display is another text box labeled HTML: This +shows the user the color code that would be used to specify the +particular displayed color in HTML code which is +widely used for web pages. + +In addition to the above, the color dialog allows the capture of +any color currently displayed on the desktop or in another program. +Clicking on the button with the dropper icon (located on the right side +of the dialog box) changes the shape of the mouse cursor to a set of +cross hairs. Clicking again will pick up the color attributes of +whatever color is displayed under the cross hairs. + +Furthermore the user has the option of adding any color to a +personal palette of Use custom colors by clicking on +the wide button labeled Add to Custom Colors +(which is located above the display square.) This adds the current +color to the custom color palette. This palette and any other available +palettes can be displayed using the drop down selection box located +directly above the palette display at the top right of the dialog box. +Besides the custom colors, the user can access a number of pre-prepared +palettes. + + + +Use custom colors + +By default &kedit; will use your system color scheme. If this +is enabled, you may choose a Foreground and background color below. + + + + +Foreground color: + +Here the user can specify a color for the text used in +&kedit;. + + + + +Background color: + +Here the user can specify a color for the general background of +&kedit;. + + + + + + + + +Spelling + +A spell checker is a program designed to help the user catch and +correct any spelling errors. This section of the preferences dialog +allows certain key settings to be adjusted in this regard. + + + +Create root/affix combinations not in +dictionary + +Selecting this option allows the spell checker to register as +correct combinations of root words with suffixes or +prefixes even if the particular combination is not listed in its +dictionary database of words. + + + + +Consider run-together words as spelling +errors + +Selecting this will cause the spell checker to register as +misspelled two or more correctly spelled words that are +run-together, &ie;, that do not have spaces separating +them. + + + + +Dictionary: + +Depending on the user's installation, one or more different +language spelling dictionaries may be available. This drop down box +allows the user to choose which language the spell checker should +use. + + + + +Encoding: + +There are different coding systems used to associate particular +codes with particular characters and symbols. If the user knows which +code he or she is using this drop down box allows this code to be +specified so that the spell checker can do its job correctly. + + + + +Client: + +Since &kedit; does not contain its own spell checker, an external +one must be chosen. This is where the user may specify which spell check +program to use. + + + + + + + +Miscellaneous + +This category deals with three different properties detailed +below. + + + +Word wrap: + +Word wrap is a feature that causes the editor to automatically +start a new line of text and move (wrap) the cursor to the beginning of +that new line. The drop down box at the top of the dialog provides the +following three word wrap choices: + + + +Disable Wrapping + +Choosing this will keep the editor from doing any wrapping. The +user will have to start new lines manually (with the +Enter key.) + + + + +Soft wrapping + +This choice has the editor automatically adjust the line lengths +to fit its current width. In other words, the wider the user makes the +editor the longer the lines will be; and the narrower the editor, the +shorter the lines will be. These line breaks are not saved in the file. + + + + +At specified column + +Choosing this activates a text box immediately below, labeled +Wrap column:. Here the user may specify the +maximum number of characters in a line of text. + + + +Each character including spaces fills one column. + + + + + + + + + +Make backup when saving a +file + +This check box tells the editor to rename the last saved version of +the current document before carrying out a save +command. The editor does this by adding a tilde (~) at +the end of the name of the original file. In this way the user has a +chance to recover a document if she or he had mistakenly saved something +over it. + + + + + + + + + +Credits and Licenses + +&kedit; Copyright 2000 by Bernd Johannes Wuebben +wuebben@math.cornell.edu + +Documentation Copyright 2000 by Thad McGinnis +ctmcginnis@compuserve.com. + +This version of the &kedit; Handbook is based on the original by: +Bernd Johannes Wuebben wuebben@math.cornell.edu + + + +&underFDL; +&underGPL; + + + + +Installation + +&install.intro.documentation; +&install.compile.documentation; + + + +
    + + diff --git a/doc/kfloppy/Makefile.am b/doc/kfloppy/Makefile.am new file mode 100644 index 0000000..085981d --- /dev/null +++ b/doc/kfloppy/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG = en +KDE_DOCS = AUTO + diff --git a/doc/kfloppy/index.docbook b/doc/kfloppy/index.docbook new file mode 100644 index 0000000..9915f80 --- /dev/null +++ b/doc/kfloppy/index.docbook @@ -0,0 +1,614 @@ + + + + + + BSD"> + Minix"> +]> + + + + + + + + +The &kfloppy; Formatter Handbook + + + +Thad +McGinnis +
    ctmcginnis@compuserve.com +
    + + +Nicolas +Goutte +
    goutte@kde.org +
    + + +Bernd +Johannes +Wuebben +
    wuebben@math.cornell.edu
    +Developer +
    + + +Chris +Howells +
    howells@kde.org
    +Developer (User Interface re-design) +
    + + +Adriaan +de Groot +
    groot@kde.org
    +Developer (Add BSD support) +
    + + +Lauri +Watts +Reviewer +
    lauri@kde.org
    +
    + + +
    + +2005-06-01 +3.5 + + +2000 +Thad McGinnis + + + +2005 +Nicolas Goutte + + +&FDLNotice; + +&kfloppy; Formatter is a utility that provides a +straightforward graphical means to format 3.5" and 5.25" floppy +disks. + + +KDE +kfloppy +floppy +format + + +
    + + +Introduction + +&kfloppy; Formatter is a utility that provides a straightforward +graphical means to format 3.5" and 5.25" floppy disks. + +&kfloppy; depends on external programs and therefore +currently works only with &Linux; and &BSD;. Depending if you are +using &kfloppy; on &Linux; or on &BSD;, &kfloppy; has slightly different +features. + +Make sure that your floppy disk is not +mounted. &kfloppy; cannot format a mounted floppy disk. + + + + +Using &kfloppy; + +Starting &kfloppy; opens a single window by which the user may +choose appropriate settings and control the formatting process. These +options and controls are detailed below. + +Make sure that your floppy disk is not +mounted. &kfloppy; cannot format a mounted floppy disk. + + +Control Settings + +The settings are chosen by means of three drop down boxes located +at the top left center of &kfloppy;. + + +Floppy Drive + +Clicking on the top drop down box, which is labeled +Floppy drive:, offers the user the following +two choices: + + +Primary +Secondary + + +Clicking on the second drop down box from the top, which is labeled +Size:, offers the user the following +four choices: + + +3.5" 1.44MB +3.5" 720KB +5.25" 1.2MB +5.25" 360KB + + +The &Linux; version of &kfloppy; has also a choice of size named: + + +Auto-Detect + + + + +The 800KB disk format used by &Mac; floppy drives cannot be +supported on PC floppy drives since they are not capable of formatting +disks in that fashion. + + + + +<guilabel>File Systems</guilabel> + +The third drop down box, labeled File System, offers the user the +following choices, if they are applicable: + + + +Dos + +This selection will have &kfloppy; place the MS-DOS/&Windows; type +of file system on the diskette. The user will most likely want to +choose this system if she or he will be using the diskette with those +operating systems as they do not recognize other system types. +(This is supported for &Linux; and &BSD;.) + + + + +ext2 + +This selection will have &kfloppy; place the type of file system +on the diskette which is most commonly used with &Linux;, however +seldomly on floppy disks. +(This is supported for &Linux; and &BSD;.) + + + + +UFS + +This selection will have &kfloppy; place the type of file system +on the diskette which is most commonly used with FreeBSD. The user will +likely want to choose this system if he or she will only be using the +floppy disk with FreeBSD. +(This is supported for &BSD; only.) + + + + +Minix + +This selection will have &kfloppy; place the type of file system +on the diskette which often used on floppy disks used with &Linux;, +(This is supported for &Linux; only.) + + + + + + + + +Formatting Options +Within the outline of a box in the left center of &kfloppy; the user +may find a set of five formatting options. The top two are a pair of radio +buttons. This term (radio buttons) indicates a set of options among +which only one can be selected - in the same way that only one preset +channel selection may be set on a car radio.The +bottom two options are for labeling the diskette. All are explained +below: + + +Formatting Method +&kfloppy; can format a disk in the following two ways: + + + +Quick Format + +This simply puts the new file system on the disk. +All data on the disk will be lost, even if the data itself will not erased. + + + +Zero out and quick format + +This format first puts zeros on the disk and then creates the new file system. +All data on the disk will be erased. + + + +Full Format + +A full format reallocates the tracks and sectors, puts the selected +file system on the disk, and then verifies the format, blocking out any bad +sectors it finds. +All data on the disk will be erased. + + + + + + + +Verify Integrity + +This tells &kfloppy; to check that the formatting was correctly +written to the floppy. This allows bad sectors to be identified. + + +If bad sectors a found during the verify phase of a Full Format, +the formatting is aborted and the file system is not written! + + + + + +Volume Label + +The bottom two features allow the user to add (or change) a +label to the diskette. If the Volume label: check +box is selected then the user can enter a name (label) for the +diskette that is to be formatted in the text box located immediately +below. When the diskette is subsequently formatted the label will be +written to the diskette. + +Due to a limitation of the DOS file system, a label can only be +at most 11 characters long. For simplification, &kfloppy; assumes that +this limit is true for all file systems. + +The file system &Minix; cannot have any volume label. In this +case, &kfloppy; will ignore the volume label. + + + + + + +The Buttons +There are three buttons located vertically along the right side of +&kfloppy;. + + + +Format + +This button +initiates the formatting process. Once the user is sure that all the +settings are correct he or she may begin the process by clicking on +this button. +There will be a change in the two long rectangular boxes +that span the bottom of &kfloppy;. + +The upper box is a status indicator that gives information about the +process underway, especially the error encountered during the processing. + +The lower box is a progress bar. This displays both graphically +and numerically the progress of first the formatting and then the +verification. Before starting it appears to be empty - showing only +the figure 0% in the center. As each process +takes place the progress is tracked graphically as the box fills from +left to right. At the same time the number in the center will +increase reflecting the precise percentage of the process that has +been completed. + +As &kfloppy; uses external programs to format the floppy disk, +it has to rely on these programs to give the right information for +being able to display the progress bar. Unfortunately, this is not the +case. Especially, the programs writing the file systems do not return +enough data, so that the progress bar will remain at 0%. + + +Make sure that your floppy disk is not mounted. +&kfloppy; cannot format a mounted floppy disk. + + +&kfloppy; does not unmount the +floppy by itself, as this could mean that the user may overwrite a floppy +disk with important data on it. + + + + +Help + +This invokes the &kde; help system starting at the &kfloppy; help pages +(this document). + + + + +Report Bug + +Report a problem to the &kde; team. + + + + +About KFloppy + +This displays version and author information of &kfloppy;. + + + + +About KDE + +This displays version and author information of KDE. + + + + + +Quit + +Clicking on this button will close &kfloppy;. + + + + + + + + + +Command line options + +Though &kfloppy; may most often be started from the &kde; program menu, +or a desktop icon, it can also be opened at the command line prompt of a +terminal window. There are a few options that are available when doing +this. They are: + + + +kfloppy +This lists the most basic options available at the command +line. + + + + +kfloppy +This lists the options available for changing the way +&kfloppy; interacts with &Qt;. + + + + +kfloppy + +This lists the options available for changing the way &kfloppy; +interacts with KDE. + + + + +kfloppy + +This lists all of the command line options. + + + + +kfloppy + +Lists &kfloppy;'s author in the terminal window + + + + +kfloppy + +Lists version information for &Qt;, &kde;, and &kfloppy;. Also available +through kfloppy + + + + + + + +Credits and Licenses + + + +&kfloppy; Formatter Program Copyright 1997 - 2000 Bernd Johannes Wuebben +wuebben@math.cornell.edu + +&kfloppy; Formatter Program Copyright 2002 Adriaan de Groot +groot@kde.org + +&kfloppy; Formatter Program Copyright 2004, 2005 Nicolas Goutte +goutte@kde.org + +Documentation Copyright 2000 by Thad McGinnis +ctmcginnis@compuserve.com. + +Documentation Copyright 2005 by Nicolas Goutte +goutte@kde.org. + +This version of the &kfloppy; Handbook is based on the original by +David Rugge davidrugge@mindspring.com + +&underFDL; +&underGPL; + + + + +Needed External Programs + +As already written earlier in this handbook, &kfloppy; works +with the help of external programs to do the different formatting tasks. + +If one of the programs is missing, &kfloppy; tries to work nevertheless. +However the corresponding option will not be available. + + + +fdformat +This program is needed for low-level formatting, +on &Linux; and on &BSD;. If it is missing, +Full format will be disabled. + + + +dd +This program is needed for zeroing-out, +on &Linux; and on &BSD;. If it is missing, +Zero out and quick format will be disabled. + + + +mkdosfs +This program is needed for DOS formatting, +on &Linux;. + + + +newfs_msdos +This program is needed for DOS formatting, +on &BSD;. + + + +newfs +This program is needed for UFS formatting, +on &BSD;. + + + +mke2fs +This program is needed for ext2 formatting, +on &Linux; and on &BSD;. + + + +mkfs.minix +This program is needed for &Minix; formatting, +on &Linux;. + + + + + + +User-Given Devices + + +Introduction + +"User Given Devices" is the work title of a still experimental feature of +&kfloppy;. It allows the user to give a device name and to use it nearly +as if it was a floppy drive. + +This feature is mainly intended as a work-around for users having +USB floppy drives of any kind +(including ZIP disk drives) or any other non-legacy +floppy drives. + +Unfortunately at the time of writing this documentation, the feature +is not very user friendly, as it does not offer any help to the user on how +a device is called and &kfloppy; does not even remember the device name from +call to call. (This is partially a security, as the device of the +floppy drive might change between reboots.) + +As this feature was developed under &Linux;, the &BSD; version +of &kfloppy; offers less choices than &kfloppy; under &Linux;. + + + + +Using It + + +Using "User Given Devices" is quite simple, you just need to enter +a device name, for example /dev/sdz4 +in the Floppy drive: combobox instead of +selecting Primary or Secondary. + + +You need to enter the /dev/ +part of the device for two reasons: + + +It is how &kfloppy; recognizes the "User Given Devices" mode. + + +It is a security, to avoid that the user writes anything in the combobox +that is by change a device name. + + + + +Unfortunately, using any device instead of a floppy device has a few +consequences. The major one is that Full Format cannot be +selected anymore. Doing so will result in a error message box when trying to +start the format. However you can use Zero out and quick format +instead. It will not format the device, just zeroing it out, but in practice it is +nearly the same; especially all data on the device will be erased. + +Be careful when entering the device name. &kfloppy; will pass +the device name as is to the external programs. Especially it does not check +(and the external programs do not check either) if the device is a +floppy drive device. If you give your any of your main +disk partitions as device, it will be accepted. (If the partition is mounted +or if you cannot write on this device, you +will probably get an error message nevertheless, avoiding the worst.) + +Even if you can specify a floppy device like +/dev/fd0u2880, &kfloppy; will refuse to make a +Full Format on it. + +On &Linux;, you can select any file system that you want. On &BSD;, +only UFS is currently supported (and not tested at time of writing this +documentation). + +When you are ready to format, click on the Format +button as usual. You will get a message box asking you to verify the device name. + + +This is the last chance to check the device name before formating. +After it, it is too late. + + + + + +
    + + diff --git a/doc/kgpg/Makefile.am b/doc/kgpg/Makefile.am new file mode 100644 index 0000000..5271453 --- /dev/null +++ b/doc/kgpg/Makefile.am @@ -0,0 +1,4 @@ + +KDE_LANG=en +KDE_DOCS=kgpg + diff --git a/doc/kgpg/editor.png b/doc/kgpg/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..f435ac8eadff28a1d39202116bd8d2751c64c6ae GIT binary patch literal 15541 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
    &J*59yr~hLp{dZud3Nnb#hxR#fz4bub zd%)RvaUnl9vW0#Akhsq@4njP?^s^`}X|0NXJn}r}IXTWa=HvU=j;SSC)~TZH9<6Fn zo>$Afb_aiT-MNjK!PAq2=HOY3E92R>zh2C1A4kW1uDq7DBUS|gw0@!M>K^U-)7K#f zs;;Q2&c3c3>-^}?+N$1LF zP!VRZ@pQYn#NO5LZ|l9QBB59UGm^mCu})Jr%()lTht=r;w{Ifz-S|S-)32VNEXskn z`a~Xux4tK^N8)P3Zg8)ye(O)XzmitW1;U6T2dHNWi&VDymayh*Gb zXXGO3+dpq0yq(WTrO!QY{U_q}^H|v-YHE3WNE~Bo)2#W9Mwu9vjm*%=0?!GN-ZU>$Q>vOk} z0@fNex(3xjYn89+5V?V)eao(?8j#C;VvzpV*7f`B<9W!lMJ04mP)0ffR;_+=J%b50FHaDG!XTcz#FioqKVGw^fQ1C~4u8P!N7~t&2&)A| z-(Xo(aL5T64r}GuD96g-&4&-BzHqY-&%92)iHC^4?4xQ`(~3-)#as6D35EBZDv7jz z9P{umzd|Qj#zowM26^Edy*R$hPN5xdgEAyDCHfy`{f{ELhSBP9KIm6GC^XITHLjo6 zK9q%)N2GxuW!*2LHx#UXkkzQ}?&|+|ZH}{xEy-*Du+Q;-YgMGu*42d^K~`6ee4ub* zXZ85lyxor_bn^Z`DH9fz67L^X|Lo{PXj^L}*4tG-C09UBQ&ZD^1T;6n4U^~E0ljnY z*3e1V+k-KdEt}Qn>X#5+XiM)`5jh{IyhDDgs;<6aO12I7+-e2$Mz!agq+hNbrvz +Kgpg"> + + + + +]> + + + + +The &kgpg; Handbook + + + +Jean-Baptiste +Mardelle + +
    bj@altern.org
    +
    +
    + + + +
    + + +2002 +Jean-Baptiste Mardelle + + +&FDLNotice; + +2002-03-01 +0.02.00 + + + +&kgpg; is a simple graphical interface for GnuPG (http://gnupg.org) + + + + +KDE +Kgpg +encryption +gpg +pgp +security + + +
    + + +Introduction + + +&kgpg; is a simple interface for GnuPG, a powerful encryption utility. GnuPG (also known as gpg) is included in most distributions and should be installed on your system. You can get the latest version on http://gnupg.org. + +With &kgpg; you will be able to encrypt and decrypt your files and emails, allowing much more secure communications. A mini howto on encryption with gpg is available on gnupg's web site. + + +With &kgpg;, you don't need to remember gpg's command lines and options. Almost everything can be done with a few mouse clicks. + + + + +Getting Started + +Here is a list of &kgpg;'s main components: + + + + +System Tray Icon + + + +&kgpg; system tray applet + + + + + + + +When you start &kgpg;, a system tray icon will appear. A &LMB; +click will open the Key Manager window, while a &RMB; click will open a menu allowing quick access to some important features. +You can also drop files or text on the applet icon to encrypt or decrypt it. + + + + + + +Key Manager Window + + + +Key manager window + + + + + + +That's the central place to manage your keys. To open the Key Manager window, &LMB; on &kgpg;'s applet. +You can import, export, sign and edit your keys. Most actions can be performed with a &LMB; click on a key. + + + + + +Editor Window + + + +Editor window + + + + + + +It's a simple text editor, where you can type or paste text to encrypt/decrypt it. To open the editor, &RMB; on &kgpg;'s applet. + + + + + + +Konqueror Integration + + +&kgpg; is integrated in &konqueror;. It means that when you right click on a file, you can choose + ActionsEncrypt +File to encrypt a file. You can decrypt a file with a &LMB; click. + + + + + + + + + +Using &kgpg; + + +There are two ways to encrypt your data: + +Symmetrical encryption: your data is just encrypted with a password. Anybody who has a computer with gpg can decrypt your message if you give him/her the password. To perform a symmetrical encryption, choose "symmetrical encryption" in the options box when asked to choose an encryption key. +Key encryption: you must first create your key pair (secret key and public key) and give a passphrase. Keep your secret key in a safe plece, and exchange your public key with your friends. Then, if you want to send an encrypted message to Alex, you must encrypt the message with Alex's public key. To decrypt the message, the recipient will need Alex's secret key and passphrase. + + +Key encryption is a bit more complicated (you must exchange keys with your friends) but safer. Remember that if you encrypt a key with someone else's key, you will not be able to decrypt it. You can only decrypt messages that have been encrypted with your public key. + + +Generating a key + +If you don't have a key, &kgpg; will automatically pop up +the key generation dialog at the first startup. You can also access it +in the Key Manager from +KeysGenerate Key +Pair. + + +Key generation dialog + + + + + + +Simply enter your name, Email address and click +Ok. This will generate a standard gpg key. If +you want more options, you can click on the Expert mode button, which +will bring up a &konsole; window with all of gpg's options. + + + + +Encrypting Your Data + + + +Encrypting a File From &konqueror; + +Click on the file you want to +encrypt with the &RMB;. Choose ActionsEncrypt +File in the pop up +menu. You will then be prompted with the Public key selection +dialog. Choose the key of the recipient and click Encrypt. The +encrypted file will be saved with a .asc or .gpg extension depending on whether you +chose ASCII encryption or not. + + + + +Encrypting a File or Text With &kgpg;'s Applet + +Simply drop your file on the &kgpg; system tray applet. If it is +an unencrypted file, &kgpg; will pop up the key selection dialog (see +below). Select the encryption key, and the encrypted file will be +saved. If you drop text, the encrypted text will be pasted to the +clipboard. You can also encrypt clipboard by selecting the +Encrypt clipboard item in applet +menu. + + +Here's a screen shot of the key selection window + + + + + + +For more information on the encryption options ASCII +armor, Allow encryption with untrusted keys and +Symmetrical encryption, please refer to gpg's +documentation or man pages. + + + + +Encrypting Text From &kgpg;'s editor + +This is as simple as clicking on the +Encrypt button. You will then be prompted with +the Public key selection dialog. Choose your key and click +Encrypt again. The encrypted message will +appear in the editor window. + + + + + +Decrypting Your Data + + + +Decrypting a File From &konqueror; +Left click on the file you want to +decrypt. Enter your passphrase and it will be decrypted. You can also +drag an encrypted text file and drop it into &kgpg;'s editor window. It +will then ask the passphrase and open the decrypted text in &kgpg;'s +editor. You can even drop remote files ! You can also use the +FileDecrypt +File and choose a file to decrypt. + + + + +Decrypting Text or a File With the &kgpg; applet + +You can drop an encrypted file or selected text on the &kgpg; +system tray applet. You will then be prompted for passphrase, and the +decrypted file/text will be saved or opened in the &kgpg; editor +depending from how you configured the applet. You can also decrypt +clipboard with the decrypt clipboard menu +entry of the &kgpg; applet + + + + +Decrypting a text from the editor + +Copy or Drag and Drop the text you want to decrypt, and click on +the Decrypt button. You will be prompted for the +passphrase. + + + + + + +Key Management + +All basic key management options can be performed through +&kgpg;. To open the key management window &LMB; on &kgpg;'s applet. +Most options are available with a right click on a key. +To import/export public keys, you can use drag +and drop or the Copy/Paste keyboard shortcuts. + + +Here's a screen shot of key management + + + + + + + + + +Configuring &kgpg; + +Configuration is accessible through the &kgpg; applet menu (&RMB; +click on the applet). You can set default parameters for encryption, +decryption, user interface and applet. Most encryption options are +directly related to gpg and are documented in it's man page. + + +Here's a screen shot of the option dialog + + + + + + + + + + + + + +Credits and License + + +&kgpg; + + +Program copyright © 2002-2003 Jean-Baptiste Mardelle +bj@altern.org. + + + +&underFDL; +&underGPL; + + + +&documentation.index; + +
    + + + + diff --git a/doc/kgpg/keygen.png b/doc/kgpg/keygen.png new file mode 100644 index 0000000000000000000000000000000000000000..6bad563e0d29489154239ea706d86c4e2443cc7a GIT binary patch literal 9522 zcmb7qXH-*Nw{B>nfJo>Fp-K_yy$FbeqVy6%QG#?rGxQ=|q$7w(7o_(f9g!je0)o7h zfOP34bO**^0kqrQ_0-k^s4ZJfpGhq=-svlPZ#oudKaYR;hNvyZ?ZOxPEZQqVb z7cWZ#HQ0MHtCaf~k+PI|I2hHdR=yj3c{ev)diEiGCX2g?+-jbDirYZ@BR>}Meo%M0 zPlHmx4l5`HEzzf0|3WjF;SMBL)qrNEKr}^b)i0u~sHj^ZDK*JBRTp#q*FD{Y)?;fc z_p?2^-JdaiLxY1rkNZha*R=tU5XT=hZYl96J(V8ix)I*2fEC*A4FU@7UM^J~nx3LI zkrUc2c6CQS=XXHt>{XFv7aglZZUdUI7qsn?B2abkLIid zjqwkPSym5k^cDA}(%JAwN30IItRE?q6CY$T$-t}Jm%!F(pTp>EVF8FQu8)_|4WVWp z2a}GI=+>EWdkN$5`M7fD$nNx1j3>g`a|ufd9&w&*Ju7S3M=>WwGUbSHgg4o-KK)~mcV*#r7Wprj(|1y~UU9s9p65M>x#eHrx7pe1 zSk5-9AY7AdpZ(D+k|WJCP9gIq3HCPA-kXj~uRSht12g3iCu~0ow(^UTx%PUlCJeZo zA74mfx!hUmy@kf@89K|6*dy=7m)+C1AM$tFHhTjn|B7p&ZI$A%h;jZ}$Jgg^xYxYA zPDA;b^F>iQX8C)$j8_B@@uT@wWR|3v=@;ynx?!rLvzxP|tf%d43uaH+s%!O4;+1E(EEGqM|GR4!!1o|*v(ql z_V4hTgH36}y6!>j#|bt|56e_%PsiwP&+e*jF7_OW`bMSA^N;VAhjDW`drss;lyEB| zwsgXW6&`xuZM`+#Hly-+;iedJ7q@VkDX#EW!=M?i^`BplmWO)RyV^nu z^2P-CkM`~_EF7X+ah;v0*r`c2yD`J&mVK-QFw@Uk3+)H5kC}|M{?a^@}@I+IbyYEr9ZP!)0JKtOz!baSWc6i zW8Jy}X4c|u%c1tWLk!q+5GH%1>RDF%^C#W5BXuqa-^>5lDmr2rmcsQ*dQA4+=pFTZ zy<&qj8RN9n)Dn3G@k+*RIVVb>m*X!dZ2T%cu+g-X&!!Vh&TZkREj#0!k=-yg6IiwI zWwce!_I%Q7+TmyJfLDXk^rwJA$qlav;Vw{`fa#Vnd2xH0M7=ck)=uy4T64497LT$4 z=g0Z^3#U>Kif2>&vPWggU`(OruHXyndGgOyffM{)(hr7DYnMptxBbG#ko;bl;k|xr znZ^xjBvR3S{9!Y_mcLvVD9B$>XXBfN;(Aa*!w1W zt3W>pgD%S_q34$S1%R-i}x0<*0)X+$=9=aCZN-(Yz7q&@hg&thrcm!vmLj5GrYm)A7){& z7N4vLi3-?FD9>=tKL703*0YN*8xbZgBZ6<2`rmRQQTloL8uKz>X_&V9y2$k18Qc@C zrQ`fnxZUdB9(|}G@9Up;LGk%eo;!z5yMLkrw&`)NmW71;!rT4eM{a2742YuDdBa4p zxlt9oc~0&XAu9pwSqXbO@E-ibdD|<(sCj(N(~=8Q)H$t}PYE2CNcxDt*ma_0Ha0vW zid;idhCu||4>#kLoWe^df3-Z9{zd;8?g3w3G+0X=8WGJO63s6z9vbP<+tjv!2a0@; z&}6aA&{sojy=4FC>FX6Jjl=OeB@+ZhDGUf2`eiok>7DL2`AK3$aZO?+Cy*im2>|l9 z)C&x$ZN>t^(H_%zRN3#0|jMCJ3%Cmlqbb`U>>K(F_Hd znBM0v{^@S|?t!?*JCM3coI5$KBXp3Fnm$)3LMjmj)q5&L@0*P z^Hz&con!{pnC}*%r{>bPk$e|c(+_rz3+YfYFK75yb+n&IPCr1C-%J%yIw*pD>SIx9 zS=i}6g652h9vfYpOz-<1m?61ZoNAAUJzQ6Jv2=6+RR!V=e=R#@HJr>{>bRI3-VPKF zUyUz#EBs4Z_E*YK!bm`OV}FXZtQcxDI2L*5SpLY<5=EjWWo98NDzE+L!rp25(pi$v zqF<}N!9o*`*!oR8%cOa~?yuw1?CH6wIsZ;9n$>*CnJ>moAf^d@gTYHmQ1n-%@TjK@ z&RogBQ7p!^Jk%x}+FLfh<}Q_?PZ*l`B(FoGg94ZoxkDg_onR$EuHH212u4mTqky&^p&fzYXk>w}d z6es9ULA_-B3V}|VrRj#3teK(vp^QRm0T&Y!hy64V6(?Ja5n?}g><5a9*AwoW7N_g~ z_DEoAIxf${(ltWX6P=zrDoLCpGJ{)L@XI6v8=Nyt%5x3T*_eLaQjfpjAn_LY<4xyi zDlfU0V>RcA1WwY7tkGz1V{v!$rB( zMY#(@PCvnk+NUA(969Uz`l6!wsj0=OiPvqa9_FN2p}gOKet{gJHO*ckj-jDzh8Z=f zVX3!~p$?yhkP{t_zxXXARz#eD*yEmGf`QGQy<3*U8TF>+1Y7d_8U{A~S}O~e)k?Ml zJ@a~zE{G#`pw6@Mpa$TpE!aS$gY6Ml!=<5FE2^(I-?Sg~KtvOak%e|Fm{cckVQ7vP zyEixT{lFv7n)O=Ul=GTTzy^)((Y|*m5A5SOk)!$rON|lkIOv{Iae0zpIQiFPyW$?A zo~_Bue<{X#@HEj$C59>IBJO=QONq5?W?jm6)6+DuFpRJ#A11XH2qOY?s#(zeUTM zZX|UYL{VYve;*$q1-?r8Ed8Z#nvyzdQtU49n2H^TZmO0-Q)Km$+@LvCOP)|? zxA5+{=;W=zXUgaN9$lbxPl?dsJE@~y{niJ7OvTpW_|YFmA#Pp~#B z>XWVB;qPsw#2K)3+ms2IF8T{+04hLSu#rv%COq& zrrONay?kC%O-I*1UiK@aioj1(N((Og=tv$*T12{0{&(3JXpM8<0^Jyzb;9rz)tg@5 z{k(-$0P1QTicJjMi~lY5+1_jHf_YPN{77&eCw6W{Jy7nbxD(*M)&5`~rbd;F;gNLiky^>krh9Ve*sEUlUmq37!1rZJ!G zkJQdV_iZG%@=p}Db-{<}8%fHI_taMBWOt*F#y*{kjv)^nlf05IJ(NypfyD|Oh0{z? zy7zV>3gb-CftTy^>eUz}=~Hupb61y|hWx zGN4aiwthN#lylT`Q`r$IeNU8KfS7C66yb#OUAU2CeB|0WErz*_N!wbch<-k`9Z^{D zz(GN#9;el1@~~N`%LN6wvdfm+p_yOZk8D$$FI>!8b|;255YcgiXPDa4QOjSv8y#Xv z#aPP7V}C)dEGC1F0j75hx~aEJA!qB1^l%hUuiJ)%Me-G)a6Yt35N%)nP_XTuh{?Rl06BV;`#B1;n$+eK!~#2LMP^2ZZLJcswFIrGON? zGhToVpp_(up$&;|e&c`W`lfaU*JSfpI(fIv5DW7QG538lZfcvD<2#t@>E)&5s-jYE z_;aZNkcXETy-~eanHqDL4j{p96IdDOucE*_rAO@t-lEo7)Rk>kmwgAl3{`r=3`+O~Z4MLOe+tQx)Nri8< zl>0OiOG~)WeRH9$1;{mCAM&ObvHxUk*z7Y;$^1H-!ksn#A{mWYcDC9mJu0KMhG9_+ z=^M-&P-KfgO7e0mvxzPL)sJulM=EeBHzJ>Bp*C@Zqo#-Y#(CkR!JG9U_NUCmGv1YR z{bgh5g!O!iF-CC0Sb>vb^TXaV(VUMItui_yBtVDx&ZAjE5;elfCyP)Hxb~EIICpud z$_Ukw29=n4mFUx#7($Na^+{;%bG_;;B%H&npSx%-(I|B2r4K)Eq7j5z4u9Ky1lq_& zdmb_9fZz2#Cd-sk5y+r7gr6i*!mw+j1onYwM4!T~ze9-DZWWt>m*#+iF5eo&@fOs& z2KaBaThpFiLYZNV%oZn{lmN^fFDoY2gMT# z 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