summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--LAST_ENTERPRISE_SYNC1
-rw-r--r--Makefile.am.in2
-rw-r--r--NewsLog.txt2147
-rw-r--r--akregator/src/akregator.desktop8
-rw-r--r--akregator/src/akregator_plugin.desktop4
-rw-r--r--akregator/src/akregator_view.cpp50
-rw-r--r--akregator/src/eventsrc13
-rw-r--r--akregator/src/mk4storage/akregator_mk4storage_plugin.desktop5
-rw-r--r--certmanager/certmanager.cpp9
-rw-r--r--certmanager/conf/kleopatra_config_appear.desktop6
-rw-r--r--certmanager/conf/kleopatra_config_dirserv.desktop11
-rw-r--r--certmanager/conf/kleopatra_config_dnorder.desktop3
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmecryptoconfig.cpp16
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmedecryptjob.cpp5
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmedecryptverifyjob.cpp8
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmedeletejob.cpp1
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmedownloadjob.cpp4
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmeencryptjob.cpp5
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmeexportjob.cpp4
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmeimportjob.cpp8
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmejob.cpp16
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmejob.h7
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmekeygenerationjob.cpp5
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmekeylistjob.cpp16
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmekeylistjob.h1
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmesignencryptjob.cpp4
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmesignjob.cpp5
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmeverifydetachedjob.cpp4
-rw-r--r--certmanager/lib/backends/qgpgme/qgpgmeverifyopaquejob.cpp5
-rw-r--r--certmanager/lib/kleo/job.cpp14
-rw-r--r--certmanager/lib/kleo/job.h6
-rw-r--r--certmanager/lib/libkleopatrarc.desktop9
-rw-r--r--certmanager/lib/tests/test_verify.cpp1
-rw-r--r--certmanager/lib/ui/cryptoconfigdialog.cpp6
-rw-r--r--certmanager/lib/ui/cryptoconfigmodule.cpp30
-rw-r--r--certmanager/lib/ui/cryptoconfigmodule.h2
-rw-r--r--certmanager/lib/ui/keyselectiondialog.cpp57
-rw-r--r--certmanager/lib/ui/keyselectiondialog.h15
-rw-r--r--certmanager/lib/ui/messagebox.cpp69
-rw-r--r--certmanager/lib/ui/messagebox.h3
-rw-r--r--cvs.sh.diff13
-rw-r--r--doc/kleopatra/index.docbook6
-rw-r--r--doc/kmail/configure.docbook205
-rw-r--r--doc/kmail/index.docbook2
-rw-r--r--doc/kmail/using-chiasmus.docbook158
-rw-r--r--doc/kmail/using-kmail.docbook23
-rw-r--r--doc/kontact/index.docbook85
-rw-r--r--doc/korganizer/index.docbook167
-rw-r--r--kabc/kabcdistlistupdater/kabcdistlistupdater.desktop10
-rw-r--r--kaddressbook/addresseeeditorextension.cpp12
-rw-r--r--kaddressbook/addresseeeditorextension.h4
-rw-r--r--kaddressbook/addresseeutil.cpp16
-rw-r--r--kaddressbook/addresseeutil.h11
-rw-r--r--kaddressbook/common/kaddressbook.kcfg2
-rw-r--r--kaddressbook/csv-templates/kaddressbook.desktop1
-rw-r--r--kaddressbook/csv-templates/yahoo.desktop4
-rw-r--r--kaddressbook/customfieldswidget.cpp28
-rw-r--r--kaddressbook/dcopaddressbook.desktop4
-rw-r--r--kaddressbook/distributionlisteditor.cpp49
-rw-r--r--kaddressbook/editors/cryptosettings.desktop1
-rw-r--r--kaddressbook/editors/imaddresseditor.desktop5
-rw-r--r--kaddressbook/editors/imeditorwidget.cpp2
-rw-r--r--kaddressbook/editors/kaddressbookimprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/aimprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/gaduprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/groupwiseprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/icqprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/ircprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/jabberprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/meanwhileprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/msnprotocol.desktop2
-rw-r--r--kaddressbook/editors/protocols/skypeprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/smsprotocol.desktop1
-rw-r--r--kaddressbook/editors/protocols/yahooprotocol.desktop1
-rw-r--r--kaddressbook/features/distributionlist.desktop8
-rw-r--r--kaddressbook/features/distributionlistng.desktop10
-rw-r--r--kaddressbook/features/distributionlistngwidget.cpp10
-rw-r--r--kaddressbook/features/resourceselection.cpp3
-rw-r--r--kaddressbook/features/resourceselection.desktop2
-rw-r--r--kaddressbook/freebusywidget.cpp5
-rw-r--r--kaddressbook/imagewidget.cpp2
-rw-r--r--kaddressbook/interfaces/kaddressbook_contacteditorwidget.desktop1
-rw-r--r--kaddressbook/interfaces/kaddressbook_extension.desktop1
-rw-r--r--kaddressbook/interfaces/kaddressbook_xxport.desktop4
-rw-r--r--kaddressbook/kabcore.cpp173
-rw-r--r--kaddressbook/kabcore.h13
-rw-r--r--kaddressbook/kabtools.cpp7
-rw-r--r--kaddressbook/kaddressbook.desktop1
-rw-r--r--kaddressbook/kaddressbook_view.desktop1
-rw-r--r--kaddressbook/kcmconfigs/kabconfig.desktop12
-rw-r--r--kaddressbook/kcmconfigs/kabcustomfields.desktop3
-rw-r--r--kaddressbook/kcmconfigs/kabldapconfig.desktop9
-rw-r--r--kaddressbook/ldapsearchdialog.cpp18
-rw-r--r--kaddressbook/searchmanager.cpp1
-rw-r--r--kaddressbook/thumbnailcreator/ldifvcardcreator.cpp10
-rw-r--r--kaddressbook/thumbnailcreator/ldifvcardcreator.h1
-rw-r--r--kaddressbook/thumbnailcreator/ldifvcardthumbnail.desktop1
-rw-r--r--kaddressbook/undocmds.cpp182
-rw-r--r--kaddressbook/undocmds.h43
-rw-r--r--kaddressbook/viewmanager.cpp15
-rw-r--r--kaddressbook/views/cardview.desktop1
-rw-r--r--kaddressbook/views/iconview.desktop4
-rw-r--r--kaddressbook/views/tableview.desktop4
-rw-r--r--kaddressbook/xxport/bookmark_xxport.desktop2
-rw-r--r--kaddressbook/xxport/csv_xxport.cpp5
-rw-r--r--kaddressbook/xxport/csv_xxport.desktop2
-rw-r--r--kaddressbook/xxport/csvimportdialog.cpp4
-rw-r--r--kaddressbook/xxport/eudora_xxport.desktop2
-rw-r--r--kaddressbook/xxport/gnokii_xxport.desktop2
-rw-r--r--kaddressbook/xxport/kde2_xxport.cpp5
-rw-r--r--kaddressbook/xxport/kde2_xxport.desktop5
-rw-r--r--kaddressbook/xxport/ldif_xxport.cpp6
-rw-r--r--kaddressbook/xxport/ldif_xxport.desktop2
-rw-r--r--kaddressbook/xxport/opera_xxport.desktop2
-rw-r--r--kaddressbook/xxport/pab_xxport.desktop2
-rw-r--r--kaddressbook/xxport/vcard_xxport.cpp79
-rw-r--r--kaddressbook/xxport/vcard_xxport.desktop2
-rw-r--r--kaddressbook/xxport/vcard_xxport.h10
-rw-r--r--kaddressbook/xxportmanager.cpp2
-rw-r--r--kalarm/Changelog3
-rw-r--r--kalarm/alarmevent.cpp8
-rw-r--r--kalarm/functions.cpp14
-rw-r--r--kalarm/functions.h1
-rw-r--r--kalarm/kalarm.desktop1
-rw-r--r--kalarm/kalarm.tray.desktop3
-rw-r--r--kalarm/kalarmapp.cpp2
-rw-r--r--kalarm/kalarmd/kalarmd.autostart.desktop2
-rw-r--r--kalarm/kalarmd/kalarmd.desktop1
-rw-r--r--kandy/src/kandy.desktop5
-rw-r--r--karm/support/karm.desktop1
-rw-r--r--karm/task.cpp8
-rw-r--r--kfile-plugins/ics/kfile_ics.desktop1
-rw-r--r--kfile-plugins/palm-databases/kfile_palm.desktop1
-rw-r--r--kfile-plugins/rfc822/kfile_rfc822.desktop1
-rw-r--r--kfile-plugins/vcf/kfile_vcf.cpp7
-rw-r--r--kfile-plugins/vcf/kfile_vcf.desktop1
-rw-r--r--kioslaves/imap4/imap4.cc21
-rw-r--r--kioslaves/sieve/sieve.cpp58
-rw-r--r--kioslaves/sieve/sieve.h1
-rw-r--r--kioslaves/sieve/sieve.protocol3
-rw-r--r--kitchensync/src/kitchensync.desktop1
-rw-r--r--kmail/KMail.desktop4
-rw-r--r--kmail/Makefile.am23
-rw-r--r--kmail/accountdialog.cpp2
-rw-r--r--kmail/accountwizard.cpp4
-rw-r--r--kmail/acljobs.cpp2
-rw-r--r--kmail/acljobs.h8
-rw-r--r--kmail/annotationjobs.cpp2
-rw-r--r--kmail/antispamwizard.cpp12
-rw-r--r--kmail/antispamwizard.h4
-rw-r--r--kmail/app_octetstream.cpp2
-rw-r--r--kmail/application_octetstream.desktop2
-rw-r--r--kmail/archivefolderdialog.cpp209
-rw-r--r--kmail/archivefolderdialog.h62
-rw-r--r--kmail/attachmentcollector.h18
-rw-r--r--kmail/attachmentstrategy.cpp87
-rw-r--r--kmail/attachmentstrategy.h3
-rw-r--r--kmail/backupjob.cpp500
-rw-r--r--kmail/backupjob.h109
-rw-r--r--kmail/bodypartformatter.cpp3
-rw-r--r--kmail/cachedimapjob.cpp141
-rw-r--r--kmail/cachedimapjob.h9
-rw-r--r--kmail/callback.cpp82
-rw-r--r--kmail/callback.h4
-rw-r--r--kmail/composer.h13
-rw-r--r--kmail/configuredialog.cpp181
-rw-r--r--kmail/configuredialog.h1
-rw-r--r--kmail/configuredialog_p.h12
-rw-r--r--kmail/customtemplates.cpp120
-rw-r--r--kmail/customtemplates.h20
-rw-r--r--kmail/customtemplates_base.ui478
-rw-r--r--kmail/customtemplates_kfg.kcfg6
-rw-r--r--kmail/dcopimap.desktop1
-rw-r--r--kmail/dcopmail.desktop1
-rw-r--r--kmail/dictionarycombobox.cpp1
-rw-r--r--kmail/distributionlistdialog.cpp47
-rw-r--r--kmail/editorwatcher.cpp13
-rw-r--r--kmail/editorwatcher.h11
-rw-r--r--kmail/encodingdetector.cpp82
-rw-r--r--kmail/eventsrc8
-rw-r--r--kmail/expirypropertiesdialog.cpp51
-rw-r--r--kmail/favoritefolderview.cpp31
-rw-r--r--kmail/filterimporterexporter.cpp166
-rw-r--r--kmail/filterimporterexporter.h33
-rw-r--r--kmail/folderdiaacltab.cpp41
-rw-r--r--kmail/folderdiaacltab.h2
-rw-r--r--kmail/foldersetselector.cpp88
-rw-r--r--kmail/foldersetselector.h45
-rw-r--r--kmail/folderstorage.cpp49
-rw-r--r--kmail/folderstorage.h18
-rw-r--r--kmail/foldertreebase.cpp12
-rw-r--r--kmail/folderutil.cpp113
-rw-r--r--kmail/folderutil.h65
-rw-r--r--kmail/globalsettings_base.kcfgc2
-rw-r--r--kmail/headeritem.cpp38
-rw-r--r--kmail/headeritem.h3
-rw-r--r--kmail/headerlistquicksearch.cpp15
-rw-r--r--kmail/headerstyle.cpp98
-rw-r--r--kmail/identitydialog.cpp46
-rw-r--r--kmail/identitydialog.h2
-rw-r--r--kmail/imapaccountbase.cpp42
-rw-r--r--kmail/imapaccountbase.h20
-rw-r--r--kmail/imapjob.cpp2
-rw-r--r--kmail/importarchivedialog.cpp107
-rw-r--r--kmail/importarchivedialog.h55
-rw-r--r--kmail/importjob.cpp396
-rw-r--r--kmail/importjob.h126
-rw-r--r--kmail/interfaces/bodypartformatter.h6
-rw-r--r--kmail/interfaces/urlhandler.h35
-rw-r--r--kmail/isubject.cpp11
-rw-r--r--kmail/keyresolver.cpp343
-rw-r--r--kmail/khtmlparthtmlwriter.cpp2
-rw-r--r--kmail/kleo_util.h7
-rw-r--r--kmail/kmacctcachedimap.cpp33
-rw-r--r--kmail/kmacctcachedimap.h7
-rw-r--r--kmail/kmacctimap.cpp2
-rw-r--r--kmail/kmacctimap.h2
-rw-r--r--kmail/kmacctlocal.cpp1
-rw-r--r--kmail/kmaddrbook.cpp1
-rw-r--r--kmail/kmail.kcfg66
-rw-r--r--kmail/kmailIface.h16
-rw-r--r--kmail/kmail_config_accounts.desktop6
-rw-r--r--kmail/kmail_config_appearance.desktop6
-rw-r--r--kmail/kmail_config_composer.desktop3
-rw-r--r--kmail/kmail_config_identity.desktop9
-rw-r--r--kmail/kmail_config_misc.desktop9
-rw-r--r--kmail/kmail_config_security.desktop9
-rw-r--r--kmail/kmail_part.rc3
-rw-r--r--kmail/kmailicalIface.h6
-rw-r--r--kmail/kmailicalifaceimpl.cpp167
-rw-r--r--kmail/kmailicalifaceimpl.h8
-rw-r--r--kmail/kmcommands.cpp204
-rw-r--r--kmail/kmcommands.h22
-rw-r--r--kmail/kmcomposewin.cpp360
-rw-r--r--kmail/kmcomposewin.h54
-rw-r--r--kmail/kmedit.cpp264
-rw-r--r--kmail/kmedit.h79
-rw-r--r--kmail/kmfawidgets.cpp7
-rw-r--r--kmail/kmfawidgets.h4
-rw-r--r--kmail/kmfilteraction.cpp214
-rw-r--r--kmail/kmfilterdlg.cpp25
-rw-r--r--kmail/kmfilterdlg.h2
-rw-r--r--kmail/kmfiltermgr.cpp2
-rw-r--r--kmail/kmfolder.cpp58
-rw-r--r--kmail/kmfolder.h23
-rw-r--r--kmail/kmfoldercachedimap.cpp588
-rw-r--r--kmail/kmfoldercachedimap.h92
-rw-r--r--kmail/kmfolderdia.cpp157
-rw-r--r--kmail/kmfolderdia.h2
-rw-r--r--kmail/kmfolderdir.cpp57
-rw-r--r--kmail/kmfolderdir.h19
-rw-r--r--kmail/kmfolderimap.cpp34
-rw-r--r--kmail/kmfolderimap.h19
-rw-r--r--kmail/kmfolderindex.cpp112
-rw-r--r--kmail/kmfolderindex.h24
-rw-r--r--kmail/kmfoldermaildir.cpp13
-rw-r--r--kmail/kmfoldermbox.cpp26
-rw-r--r--kmail/kmfoldersearch.cpp1
-rw-r--r--kmail/kmfolderseldlg.cpp445
-rw-r--r--kmail/kmfolderseldlg.h53
-rw-r--r--kmail/kmfoldertree.cpp95
-rw-r--r--kmail/kmfoldertree.h15
-rw-r--r--kmail/kmgroupware.cpp4
-rw-r--r--kmail/kmheaders.cpp156
-rw-r--r--kmail/kmheaders.h20
-rw-r--r--kmail/kmkernel.cpp182
-rw-r--r--kmail/kmkernel.h22
-rw-r--r--kmail/kmlineeditspell.cpp93
-rw-r--r--kmail/kmmainwidget.cpp276
-rw-r--r--kmail/kmmainwidget.h30
-rw-r--r--kmail/kmmainwin.cpp2
-rw-r--r--kmail/kmmainwin.rc3
-rw-r--r--kmail/kmmessage.cpp439
-rw-r--r--kmail/kmmessage.h143
-rw-r--r--kmail/kmmimeparttree.cpp2
-rw-r--r--kmail/kmmsgbase.cpp51
-rw-r--r--kmail/kmmsgbase.h33
-rw-r--r--kmail/kmmsgdict.cpp15
-rw-r--r--kmail/kmmsginfo.cpp96
-rw-r--r--kmail/kmmsginfo.h4
-rw-r--r--kmail/kmmsgpart.cpp5
-rw-r--r--kmail/kmmsgpartdlg.cpp5
-rw-r--r--kmail/kmpopheaders.cpp3
-rw-r--r--kmail/kmreadermainwin.cpp78
-rw-r--r--kmail/kmreadermainwin.h21
-rw-r--r--kmail/kmreaderwin.cpp735
-rw-r--r--kmail/kmreaderwin.h86
-rw-r--r--kmail/kmsearchpattern.cpp21
-rw-r--r--kmail/kmsearchpattern.h8
-rw-r--r--kmail/kmsearchpatternedit.cpp22
-rw-r--r--kmail/kmsearchpatternedit.h3
-rw-r--r--kmail/kmsender.cpp5
-rw-r--r--kmail/kmsystemtray.cpp9
-rw-r--r--kmail/kmsystemtray.h5
-rw-r--r--kmail/kmversion.h2
-rw-r--r--kmail/managesievescriptsdialog.cpp46
-rw-r--r--kmail/managesievescriptsdialog.h3
-rw-r--r--kmail/managesievescriptsdialog_p.h3
-rw-r--r--kmail/messageactions.cpp18
-rw-r--r--kmail/messageactions.h17
-rw-r--r--kmail/messagecomposer.cpp36
-rw-r--r--kmail/messageproperty.cpp35
-rw-r--r--kmail/messageproperty.h4
-rw-r--r--kmail/newfolderdialog.cpp102
-rw-r--r--kmail/newfolderdialog.h2
-rw-r--r--kmail/objecttreeparser.cpp706
-rw-r--r--kmail/objecttreeparser.h74
-rw-r--r--kmail/objecttreeparser_p.cpp350
-rw-r--r--kmail/objecttreeparser_p.h203
-rw-r--r--kmail/partNode.cpp236
-rw-r--r--kmail/partNode.h69
-rw-r--r--kmail/partmetadata.h4
-rw-r--r--kmail/partnodebodypart.cpp4
-rw-r--r--kmail/pics/Makefile.am2
-rw-r--r--kmail/pics/kmmsginvitation.pngbin0 -> 978 bytes
-rw-r--r--kmail/profiles/profile-default-rc.desktop8
-rw-r--r--kmail/profiles/profile-high-contrast-rc.desktop2
-rw-r--r--kmail/profiles/profile-html-rc.desktop3
-rw-r--r--kmail/profiles/profile-purist-rc.desktop4
-rw-r--r--kmail/profiles/profile-secure-rc.desktop5
-rw-r--r--kmail/recipientseditor.cpp5
-rw-r--r--kmail/recipientspicker.cpp6
-rw-r--r--kmail/redirectdialog.cpp9
-rw-r--r--kmail/redirectdialog.h2
-rw-r--r--kmail/searchwindow.cpp87
-rw-r--r--kmail/searchwindow.h10
-rw-r--r--kmail/sievedebugdialog.cpp65
-rw-r--r--kmail/sievejob.cpp6
-rw-r--r--kmail/sievejob.h2
-rw-r--r--kmail/simplefoldertree.h249
-rw-r--r--kmail/simplestringlisteditor.cpp16
-rw-r--r--kmail/simplestringlisteditor.h1
-rw-r--r--kmail/snippetdlg.cpp23
-rw-r--r--kmail/snippetdlg.h11
-rw-r--r--kmail/snippetdlgbase.ui3
-rw-r--r--kmail/snippetitem.cpp10
-rw-r--r--kmail/snippetwidget.cpp4
-rw-r--r--kmail/stl_util.h17
-rw-r--r--kmail/stringutil.cpp49
-rw-r--r--kmail/stringutil.h43
-rw-r--r--kmail/subscriptiondialog.cpp2
-rw-r--r--kmail/templateparser.cpp187
-rw-r--r--kmail/templateparser.h99
-rw-r--r--kmail/templatesconfiguration.cpp21
-rw-r--r--kmail/templatesinsertcommand.cpp4
-rw-r--r--kmail/templatesinsertcommand.h3
-rw-r--r--kmail/treebase.cpp235
-rw-r--r--kmail/treebase.h83
-rw-r--r--kmail/urlhandlermanager.cpp207
-rw-r--r--kmail/urlhandlermanager.h3
-rw-r--r--kmail/vacation.cpp15
-rw-r--r--kmail/vacationdialog.cpp36
-rw-r--r--kmail/vacationdialog.h7
-rw-r--r--kmail/vcardviewer.cpp10
-rw-r--r--kmail/vcardviewer.h41
-rw-r--r--kmailcvt/Makefile.am5
-rw-r--r--kmailcvt/filter_evolution.cxx1
-rw-r--r--kmailcvt/filter_evolution_v2.cxx2
-rw-r--r--kmailcvt/filter_kmail_archive.cxx35
-rw-r--r--kmailcvt/filter_kmail_archive.hxx32
-rw-r--r--kmailcvt/filter_kmail_maildir.cxx2
-rw-r--r--kmailcvt/filter_lnotes.cxx1
-rw-r--r--kmailcvt/filter_mailapp.cxx1
-rw-r--r--kmailcvt/filter_mbox.cxx1
-rw-r--r--kmailcvt/filter_oe.cxx1
-rw-r--r--kmailcvt/filter_opera.cxx2
-rw-r--r--kmailcvt/filter_outlook.cxx1
-rw-r--r--kmailcvt/filter_plain.cxx1
-rw-r--r--kmailcvt/filter_pmail.cxx2
-rw-r--r--kmailcvt/filter_sylpheed.cxx2
-rw-r--r--kmailcvt/filter_thebat.cxx2
-rw-r--r--kmailcvt/filter_thunderbird.cxx2
-rw-r--r--kmailcvt/filters.cxx27
-rw-r--r--kmailcvt/filters.hxx10
-rw-r--r--kmailcvt/kmailcvt.cpp60
-rw-r--r--kmailcvt/kmailcvt.h3
-rw-r--r--kmailcvt/kselfilterpage.cpp4
-rw-r--r--kmailcvt/main.cpp6
-rw-r--r--kmobile/devices/digicam/libkmobile_digicam.desktop5
-rw-r--r--kmobile/devices/gammu/libkmobile_gammu.desktop7
-rw-r--r--kmobile/devices/gnokii/libkmobile_gnokii.desktop7
-rw-r--r--kmobile/devices/skeleton/libkmobile_skeleton.desktop2
-rw-r--r--kmobile/kioslave/mimetypes/mobile_addressbook.desktop1
-rw-r--r--kmobile/kioslave/mimetypes/mobile_calendar.desktop1
-rw-r--r--kmobile/kioslave/mimetypes/mobile_device.desktop1
-rw-r--r--kmobile/kioslave/mimetypes/mobile_notes.desktop1
-rw-r--r--kmobile/kmobile.desktop2
-rw-r--r--kmobile/libkmobile.desktop1
-rw-r--r--knode/KNode.desktop1
-rw-r--r--knode/articlewidget.cpp45
-rw-r--r--knode/kncomposer.cpp2
-rw-r--r--knode/knglobals.cpp27
-rw-r--r--knode/knglobals.h3
-rw-r--r--knode/knode_config_accounts.desktop5
-rw-r--r--knode/knode_config_appearance.desktop5
-rw-r--r--knode/knode_config_cleanup.desktop2
-rw-r--r--knode/knode_config_identity.desktop5
-rw-r--r--knode/knode_config_post_news.desktop1
-rw-r--r--knode/knode_config_privacy.desktop2
-rw-r--r--knode/knode_config_read_news.desktop4
-rw-r--r--knotes/knote.cpp146
-rw-r--r--knotes/knote.h18
-rw-r--r--knotes/knotealarmdlg.cpp3
-rw-r--r--knotes/knoteedit.cpp82
-rw-r--r--knotes/knoteedit.h16
-rw-r--r--knotes/knoteprinter.cpp9
-rw-r--r--knotes/knotes.desktop1
-rw-r--r--knotes/knotes_manager.desktop4
-rw-r--r--knotes/knotesalarm.cpp5
-rw-r--r--knotes/knotesapp.cpp59
-rw-r--r--knotes/knotesapp.h3
-rw-r--r--knotes/knoteslegacy.cpp7
-rw-r--r--knotes/local.desktop1
-rw-r--r--knotes/resourcelocal.cpp12
-rw-r--r--knotes/resourcemanager.cpp48
-rw-r--r--knotes/resourcemanager.h2
-rw-r--r--konsolekalendar/main.cpp8
-rw-r--r--kontact/interfaces/kontactplugin.desktop4
-rw-r--r--kontact/interfaces/plugin.h4
-rw-r--r--kontact/interfaces/uniqueapphandler.cpp2
-rw-r--r--kontact/plugins/akregator/akregator_plugin.h2
-rw-r--r--kontact/plugins/akregator/akregatorplugin.desktop19
-rw-r--r--kontact/plugins/akregator/akregatorplugin3.2.desktop10
-rw-r--r--kontact/plugins/kaddressbook/kaddressbook_plugin.cpp3
-rw-r--r--kontact/plugins/kaddressbook/kaddressbookplugin.desktop14
-rw-r--r--kontact/plugins/karm/karmplugin.desktop14
-rw-r--r--kontact/plugins/kitchensync/kitchensync.desktop13
-rw-r--r--kontact/plugins/kmail/Makefile.am2
-rw-r--r--kontact/plugins/kmail/kcmkmailsummary.desktop21
-rw-r--r--kontact/plugins/kmail/kmailplugin.desktop17
-rw-r--r--kontact/plugins/knode/knodeplugin.desktop10
-rw-r--r--kontact/plugins/knotes/knotes_part.cpp4
-rw-r--r--kontact/plugins/knotes/knotes_part.h1
-rw-r--r--kontact/plugins/knotes/knotesplugin.desktop10
-rw-r--r--kontact/plugins/korganizer/journalplugin.desktop10
-rw-r--r--kontact/plugins/korganizer/journalplugin.h2
-rw-r--r--kontact/plugins/korganizer/kcmkorgsummary.desktop14
-rw-r--r--kontact/plugins/korganizer/korg_uniqueapp.cpp35
-rw-r--r--kontact/plugins/korganizer/korganizerplugin.cpp47
-rw-r--r--kontact/plugins/korganizer/korganizerplugin.desktop11
-rw-r--r--kontact/plugins/korganizer/summarywidget.cpp57
-rw-r--r--kontact/plugins/korganizer/todoplugin.cpp36
-rw-r--r--kontact/plugins/korganizer/todoplugin.desktop14
-rw-r--r--kontact/plugins/korganizer/todosummarywidget.cpp9
-rw-r--r--kontact/plugins/kpilot/kpilotplugin.desktop9
-rw-r--r--kontact/plugins/newsticker/kcmkontactknt.desktop5
-rw-r--r--kontact/plugins/newsticker/newstickerplugin.desktop12
-rw-r--r--kontact/plugins/specialdates/kcmsdsummary.desktop9
-rw-r--r--kontact/plugins/specialdates/sdsummarywidget.cpp14
-rw-r--r--kontact/plugins/specialdates/sdsummarywidget.h2
-rw-r--r--kontact/plugins/specialdates/specialdates_plugin.cpp2
-rw-r--r--kontact/plugins/specialdates/specialdatesplugin.desktop13
-rw-r--r--kontact/plugins/summary/kcmkontactsummary.cpp4
-rw-r--r--kontact/plugins/summary/kcmkontactsummary.desktop11
-rw-r--r--kontact/plugins/summary/summaryplugin.desktop16
-rw-r--r--kontact/plugins/summary/summaryview_plugin.cpp13
-rw-r--r--kontact/plugins/test/kptestplugin.desktop5
-rw-r--r--kontact/plugins/weather/weatherplugin.desktop10
-rw-r--r--kontact/src/Kontact.desktop4
-rw-r--r--kontact/src/about/kontact.css7
-rw-r--r--kontact/src/iconsidepane.cpp15
-rw-r--r--kontact/src/iconsidepane.h5
-rw-r--r--kontact/src/kontact.setdlg75
-rw-r--r--kontact/src/kontactui.rc5
-rw-r--r--kontact/src/main.cpp31
-rw-r--r--kontact/src/mainwindow.cpp193
-rw-r--r--kontact/src/mainwindow.h16
-rw-r--r--kontact/src/sidepanebase.cpp10
-rw-r--r--kontact/src/sidepanebase.h16
-rw-r--r--korganizer/Makefile.am9
-rw-r--r--korganizer/Todo-info.text18
-rw-r--r--korganizer/aboutdata.cpp5
-rw-r--r--korganizer/actionmanager.cpp323
-rw-r--r--korganizer/actionmanager.h27
-rw-r--r--korganizer/archivedialog.cpp6
-rw-r--r--korganizer/calendarview.cpp1231
-rw-r--r--korganizer/calendarview.h185
-rw-r--r--korganizer/datenavigator.cpp124
-rw-r--r--korganizer/datenavigator.h47
-rw-r--r--korganizer/datenavigatorcontainer.cpp108
-rw-r--r--korganizer/datenavigatorcontainer.h49
-rw-r--r--korganizer/dcopcalendar.desktop1
-rw-r--r--korganizer/eventarchiver.cpp68
-rw-r--r--korganizer/eventarchiver.h16
-rw-r--r--korganizer/exportwebdialog.cpp23
-rw-r--r--korganizer/exportwebdialog.h8
-rw-r--r--korganizer/freebusymanager.cpp167
-rw-r--r--korganizer/freebusymanager.h3
-rw-r--r--korganizer/importdialog.cpp10
-rw-r--r--korganizer/importdialog.h2
-rw-r--r--korganizer/incidencechanger.cpp225
-rw-r--r--korganizer/incidencechanger.h70
-rw-r--r--korganizer/interfaces/calendar/calendardecoration.desktop1
-rw-r--r--korganizer/interfaces/calendar/calendarplugin.desktop4
-rw-r--r--korganizer/interfaces/korganizer/baseview.h95
-rw-r--r--korganizer/interfaces/korganizer/corehelper.h3
-rw-r--r--korganizer/interfaces/korganizer/incidencechangerbase.h39
-rw-r--r--korganizer/interfaces/korganizer/korganizerpart.desktop1
-rw-r--r--korganizer/interfaces/korganizer/korgprintplugin.desktop1
-rw-r--r--korganizer/interfaces/korganizer/mainwindow.h4
-rw-r--r--korganizer/journalentry.cpp19
-rw-r--r--korganizer/journalentry.h7
-rw-r--r--korganizer/kcalendariface.h3
-rw-r--r--korganizer/kdatenavigator.cpp46
-rw-r--r--korganizer/kdatenavigator.h24
-rw-r--r--korganizer/koagenda.cpp431
-rw-r--r--korganizer/koagenda.h52
-rw-r--r--korganizer/koagendaitem.cpp84
-rw-r--r--korganizer/koagendaitem.h20
-rw-r--r--korganizer/koagendaview.cpp765
-rw-r--r--korganizer/koagendaview.h50
-rw-r--r--korganizer/koattendeeeditor.cpp220
-rw-r--r--korganizer/koattendeeeditor.h16
-rw-r--r--korganizer/kocorehelper.cpp8
-rw-r--r--korganizer/kocorehelper.h1
-rw-r--r--korganizer/kocounterdialog.cpp4
-rw-r--r--korganizer/kocounterdialog.h5
-rw-r--r--korganizer/kodaymatrix.cpp41
-rw-r--r--korganizer/kodaymatrix.h9
-rw-r--r--korganizer/kodialogmanager.cpp18
-rw-r--r--korganizer/koeditoralarms.cpp138
-rw-r--r--korganizer/koeditoralarms.h6
-rw-r--r--korganizer/koeditoralarms_base.ui12
-rw-r--r--korganizer/koeditorattachments.cpp831
-rw-r--r--korganizer/koeditorattachments.h98
-rw-r--r--korganizer/koeditordetails.cpp87
-rw-r--r--korganizer/koeditordetails.h7
-rw-r--r--korganizer/koeditorfreebusy.cpp106
-rw-r--r--korganizer/koeditorfreebusy.h4
-rw-r--r--korganizer/koeditorgeneral.cpp360
-rw-r--r--korganizer/koeditorgeneral.h34
-rw-r--r--korganizer/koeditorgeneralevent.cpp76
-rw-r--r--korganizer/koeditorgeneralevent.h5
-rw-r--r--korganizer/koeditorgeneraljournal.cpp23
-rw-r--r--korganizer/koeditorgeneraljournal.h10
-rw-r--r--korganizer/koeditorgeneraltodo.cpp240
-rw-r--r--korganizer/koeditorgeneraltodo.h16
-rw-r--r--korganizer/koeditorrecurrence.cpp225
-rw-r--r--korganizer/koeditorrecurrence.h9
-rw-r--r--korganizer/koeventeditor.cpp95
-rw-r--r--korganizer/koeventeditor.h6
-rw-r--r--korganizer/koeventpopupmenu.cpp14
-rw-r--r--korganizer/koeventpopupmenu.h17
-rw-r--r--korganizer/koeventview.cpp67
-rw-r--r--korganizer/koeventview.h3
-rw-r--r--korganizer/koeventviewer.cpp106
-rw-r--r--korganizer/koeventviewer.h50
-rw-r--r--korganizer/koeventviewerdialog.cpp18
-rw-r--r--korganizer/koeventviewerdialog.h15
-rw-r--r--korganizer/koglobals.h41
-rw-r--r--korganizer/kogroupware.cpp137
-rw-r--r--korganizer/kogroupware.h21
-rw-r--r--korganizer/kogroupwareprefspage.ui20
-rw-r--r--korganizer/kohelper.cpp20
-rw-r--r--korganizer/kohelper.h6
-rw-r--r--korganizer/koincidenceeditor.cpp45
-rw-r--r--korganizer/koincidenceeditor.h38
-rw-r--r--korganizer/koincidencetooltip.cpp19
-rw-r--r--korganizer/koincidencetooltip.h14
-rw-r--r--korganizer/kojournaleditor.cpp27
-rw-r--r--korganizer/kojournaleditor.h6
-rw-r--r--korganizer/kojournalview.cpp57
-rw-r--r--korganizer/kojournalview.h6
-rw-r--r--korganizer/kolistview.cpp374
-rw-r--r--korganizer/kolistview.h30
-rw-r--r--korganizer/komailclient.cpp111
-rw-r--r--korganizer/komailclient.h7
-rw-r--r--korganizer/komonthview.cpp255
-rw-r--r--korganizer/komonthview.h30
-rw-r--r--korganizer/koprefs.cpp35
-rw-r--r--korganizer/koprefs.h1
-rw-r--r--korganizer/koprefsdialog.cpp120
-rw-r--r--korganizer/korgac/alarmdialog.cpp534
-rw-r--r--korganizer/korgac/alarmdialog.h49
-rw-r--r--korganizer/korgac/koalarmclient.cpp22
-rw-r--r--korganizer/korgac/koalarmclient.h3
-rw-r--r--korganizer/korgac/korgac.desktop2
-rw-r--r--korganizer/korgac/testalarmdlg.cpp61
-rw-r--r--korganizer/korganizer.cpp6
-rw-r--r--korganizer/korganizer.desktop8
-rw-r--r--korganizer/korganizer.h2
-rw-r--r--korganizer/korganizer.kcfg81
-rw-r--r--korganizer/korganizer_configcolors.desktop11
-rw-r--r--korganizer/korganizer_configdesignerfields.desktop5
-rw-r--r--korganizer/korganizer_configfonts.desktop11
-rw-r--r--korganizer/korganizer_configfreebusy.desktop8
-rw-r--r--korganizer/korganizer_configgroupautomation.desktop5
-rw-r--r--korganizer/korganizer_configgroupscheduling.desktop5
-rw-r--r--korganizer/korganizer_configmain.desktop11
-rw-r--r--korganizer/korganizer_configplugins.desktop8
-rw-r--r--korganizer/korganizer_configtime.desktop11
-rw-r--r--korganizer/korganizer_configviews.desktop13
-rw-r--r--korganizer/korganizer_part.cpp17
-rw-r--r--korganizer/korganizer_part.h6
-rw-r--r--korganizer/korganizeriface.h10
-rw-r--r--korganizer/korganizerifaceimpl.cpp13
-rw-r--r--korganizer/korganizerifaceimpl.h5
-rw-r--r--korganizer/kotimelineview.cpp25
-rw-r--r--korganizer/kotimelineview.h4
-rw-r--r--korganizer/kotodoeditor.cpp113
-rw-r--r--korganizer/kotodoeditor.h9
-rw-r--r--korganizer/kotodoview.cpp148
-rw-r--r--korganizer/kotodoview.h12
-rw-r--r--korganizer/kotodoviewitem.cpp95
-rw-r--r--korganizer/koviewmanager.cpp204
-rw-r--r--korganizer/koviewmanager.h35
-rw-r--r--korganizer/kowhatsnextview.cpp11
-rw-r--r--korganizer/kowhatsnextview.h8
-rw-r--r--korganizer/multiagendaview.cpp271
-rw-r--r--korganizer/multiagendaview.h15
-rw-r--r--korganizer/navigatorbar.cpp114
-rw-r--r--korganizer/navigatorbar.h15
-rw-r--r--korganizer/plugins/datenums/datenums.desktop2
-rw-r--r--korganizer/plugins/exchange/exchange.desktop2
-rw-r--r--korganizer/plugins/hebrew/hebrew.cpp8
-rw-r--r--korganizer/plugins/hebrew/hebrew.desktop2
-rw-r--r--korganizer/plugins/printing/journal/journalprint.cpp8
-rw-r--r--korganizer/plugins/printing/journal/journalprint.desktop2
-rw-r--r--korganizer/plugins/printing/list/listprint.desktop2
-rw-r--r--korganizer/plugins/printing/whatsnext/whatsnextprint.desktop4
-rw-r--r--korganizer/plugins/printing/year/yearprint.cpp9
-rw-r--r--korganizer/plugins/printing/year/yearprint.desktop2
-rw-r--r--korganizer/plugins/timespanview/timespanview.desktop2
-rw-r--r--korganizer/previewdialog.cpp163
-rw-r--r--korganizer/previewdialog.h69
-rw-r--r--korganizer/printing/calprintdefaultplugins.cpp372
-rw-r--r--korganizer/printing/calprintdefaultplugins.h136
-rw-r--r--korganizer/printing/calprintpluginbase.cpp276
-rw-r--r--korganizer/printing/calprintpluginbase.h70
-rw-r--r--korganizer/publishdialog.cpp3
-rw-r--r--korganizer/resourceview.cpp391
-rw-r--r--korganizer/resourceview.h61
-rw-r--r--korganizer/searchdialog.cpp16
-rw-r--r--korganizer/searchdialog.h6
-rw-r--r--korganizer/timelabels.cpp12
-rw-r--r--korganizer/timelineitem.cpp12
-rw-r--r--korganizer/timelineitem.h5
-rw-r--r--korganizer/tips2
-rw-r--r--korganizer/urihandler.cpp70
-rw-r--r--korganizer/urihandler.h9
-rw-r--r--korganizer/version.h2
-rw-r--r--korn/KOrn.desktop4
-rw-r--r--kpilot/conduits/abbrowserconduit/abbrowser_conduit.desktop5
-rw-r--r--kpilot/conduits/docconduit/doc_conduit.desktop1
-rw-r--r--kpilot/conduits/docconduit/kpalmdoc.desktop1
-rw-r--r--kpilot/conduits/knotes/knotes-conduit.desktop2
-rw-r--r--kpilot/conduits/malconduit/mal_conduit.desktop2
-rw-r--r--kpilot/conduits/memofileconduit/memofile-conduit.desktop2
-rw-r--r--kpilot/conduits/notepadconduit/notepad-conduit.desktop3
-rw-r--r--kpilot/conduits/null/null-conduit.desktop1
-rw-r--r--kpilot/conduits/popmail/popmail-conduit.desktop5
-rw-r--r--kpilot/conduits/recordconduit/record-conduit.desktop2
-rw-r--r--kpilot/conduits/sysinfoconduit/sysinfo_conduit.desktop5
-rw-r--r--kpilot/conduits/timeconduit/time_conduit.desktop2
-rw-r--r--kpilot/conduits/vcalconduit/todo-conduit.desktop2
-rw-r--r--kpilot/conduits/vcalconduit/vcal-conduit.desktop2
-rw-r--r--kpilot/kpilot/kpilot.desktop1
-rw-r--r--kpilot/kpilot/kpilot_config.desktop3
-rw-r--r--kpilot/kpilot/kpilotconduit.desktop1
-rw-r--r--kpilot/kpilot/kpilotdaemon.desktop1
-rw-r--r--kresources/Makefile.am2
-rw-r--r--kresources/birthdays/kabc.desktop1
-rw-r--r--kresources/birthdays/resourcekabc.cpp60
-rw-r--r--kresources/birthdays/resourcekabc.h10
-rw-r--r--kresources/blogging/blogging.desktop1
-rw-r--r--kresources/blogging/kcal_resourceblogging.cpp6
-rw-r--r--kresources/caldav/config.cpp38
-rw-r--r--kresources/caldav/config.h3
-rw-r--r--kresources/caldav/job.cpp31
-rw-r--r--kresources/caldav/job.h64
-rw-r--r--kresources/caldav/preferences.cpp29
-rw-r--r--kresources/caldav/preferences.h5
-rw-r--r--kresources/caldav/prefsskel.kcfg10
-rw-r--r--kresources/caldav/reader.cpp39
-rw-r--r--kresources/caldav/reader.h10
-rw-r--r--kresources/caldav/resource.cpp142
-rw-r--r--kresources/caldav/resource.h23
-rw-r--r--kresources/caldav/writer.cpp37
-rw-r--r--kresources/caldav/writer.h46
-rw-r--r--kresources/egroupware/kabc_resourcexmlrpc.cpp5
-rw-r--r--kresources/egroupware/kabc_xmlrpc.desktop1
-rw-r--r--kresources/egroupware/kcal_resourcexmlrpc.cpp5
-rw-r--r--kresources/egroupware/kcal_xmlrpc.desktop1
-rw-r--r--kresources/egroupware/knotes_resourcexmlrpc.cpp5
-rw-r--r--kresources/egroupware/knotes_xmlrpc.desktop1
-rw-r--r--kresources/exchange/exchange.desktop1
-rw-r--r--kresources/exchange/exchange_deprecated.desktop1
-rw-r--r--kresources/exchange/resourceexchange.cpp36
-rw-r--r--kresources/exchange/resourceexchange.h10
-rw-r--r--kresources/groupware/kabc_groupware.desktop1
-rw-r--r--kresources/groupware/kabc_resourcegroupware.cpp2
-rw-r--r--kresources/groupware/kcal_groupware.desktop1
-rw-r--r--kresources/groupware/kcal_resourcegroupware.cpp6
-rw-r--r--kresources/kolab/kabc/contact.cpp72
-rw-r--r--kresources/kolab/kabc/contact.h7
-rw-r--r--kresources/kolab/kabc/kolab.desktop1
-rw-r--r--kresources/kolab/kabc/resourcekolab.cpp64
-rw-r--r--kresources/kolab/kabc/resourcekolab.h3
-rw-r--r--kresources/kolab/kcal/event.cpp7
-rw-r--r--kresources/kolab/kcal/incidence.cpp248
-rw-r--r--kresources/kolab/kcal/incidence.h9
-rw-r--r--kresources/kolab/kcal/kolab.desktop1
-rw-r--r--kresources/kolab/kcal/resourcekolab.cpp437
-rw-r--r--kresources/kolab/kcal/resourcekolab.h64
-rw-r--r--kresources/kolab/kcal/task.cpp171
-rw-r--r--kresources/kolab/kcal/task.h16
-rw-r--r--kresources/kolab/knotes/kolabresource.desktop1
-rw-r--r--kresources/kolab/knotes/note.cpp41
-rw-r--r--kresources/kolab/knotes/resourcekolab.cpp92
-rw-r--r--kresources/kolab/knotes/resourcekolab.h3
-rw-r--r--kresources/kolab/shared/kmailconnection.cpp40
-rw-r--r--kresources/kolab/shared/kolabbase.cpp19
-rw-r--r--kresources/kolab/shared/resourcekolabbase.cpp38
-rw-r--r--kresources/kolab/shared/resourcekolabbase.h12
-rw-r--r--kresources/lib/addressbookadaptor.cpp16
-rw-r--r--kresources/lib/folderselectdialog.cpp7
-rw-r--r--kresources/lib/folderselectdialog.h1
-rw-r--r--kresources/lib/kcal_resourcegroupwarebase.cpp40
-rw-r--r--kresources/newexchange/exchangeconvertercontact.cpp122
-rw-r--r--kresources/newexchange/kabc_newexchange.desktop1
-rw-r--r--kresources/newexchange/kabc_newexchange_final.desktop1
-rw-r--r--kresources/newexchange/kabc_resourceexchange.cpp8
-rw-r--r--kresources/newexchange/kcal_newexchange.desktop1
-rw-r--r--kresources/newexchange/kcal_newexchange_final.desktop1
-rw-r--r--kresources/newexchange/kcal_resourceexchange.cpp7
-rw-r--r--kresources/remote/remote.desktop1
-rw-r--r--kresources/remote/resourceremote.cpp2
-rw-r--r--kresources/scalix/kcal/resourcescalix.cpp18
-rw-r--r--kresources/scalix/kcal/resourcescalix.h3
-rw-r--r--kresources/slox/kabc_ox.desktop1
-rw-r--r--kresources/slox/kabc_slox.desktop1
-rw-r--r--kresources/slox/kabcresourceslox.cpp11
-rw-r--r--kresources/slox/kcal_ox.desktop1
-rw-r--r--kresources/slox/kcal_slox.desktop1
-rw-r--r--kresources/slox/kcalresourceslox.cpp2
-rw-r--r--ktnef/gui/ktnef.desktop2
-rw-r--r--ktnef/gui/ms-tnef.desktop4
-rw-r--r--libemailfunctions/email.cpp21
-rw-r--r--libkcal/Makefile.am12
-rw-r--r--libkcal/alarm.cpp60
-rw-r--r--libkcal/alarm.h48
-rw-r--r--libkcal/assignmentvisitor.cpp123
-rw-r--r--libkcal/assignmentvisitor.h122
-rw-r--r--libkcal/attachment.cpp111
-rw-r--r--libkcal/attachment.h57
-rw-r--r--libkcal/attachmenthandler.cpp258
-rw-r--r--libkcal/attachmenthandler.h178
-rw-r--r--libkcal/attendee.cpp3
-rw-r--r--libkcal/attendee.h4
-rw-r--r--libkcal/calendar.cpp185
-rw-r--r--libkcal/calendar.h87
-rw-r--r--libkcal/calendarlocal.cpp145
-rw-r--r--libkcal/calendarresources.cpp234
-rw-r--r--libkcal/calendarresources.h143
-rw-r--r--libkcal/calformat.cpp2
-rw-r--r--libkcal/calformat.h2
-rw-r--r--libkcal/calhelper.cpp167
-rw-r--r--libkcal/calhelper.h135
-rw-r--r--libkcal/calselectdialog.cpp101
-rw-r--r--libkcal/calselectdialog.h69
-rw-r--r--libkcal/comparisonvisitor.cpp107
-rw-r--r--libkcal/comparisonvisitor.h122
-rw-r--r--libkcal/dndfactory.cpp197
-rw-r--r--libkcal/dndfactory.h12
-rw-r--r--libkcal/duration.cpp140
-rw-r--r--libkcal/duration.h235
-rw-r--r--libkcal/event.cpp4
-rw-r--r--libkcal/event.h9
-rw-r--r--libkcal/exceptions.cpp77
-rw-r--r--libkcal/exceptions.h32
-rw-r--r--libkcal/freebusy.cpp9
-rw-r--r--libkcal/freebusy.h11
-rw-r--r--libkcal/htmlexport.cpp34
-rw-r--r--libkcal/icalformatimpl.cpp255
-rw-r--r--libkcal/incidence.h30
-rw-r--r--libkcal/incidencebase.cpp8
-rw-r--r--libkcal/incidencebase.h30
-rw-r--r--libkcal/incidenceformatter.cpp3526
-rw-r--r--libkcal/incidenceformatter.h65
-rw-r--r--libkcal/kcal_manager.desktop4
-rw-r--r--libkcal/libical/configure.in.in20
-rw-r--r--libkcal/libical/src/libical/icalattach.c151
-rw-r--r--libkcal/local.desktop1
-rw-r--r--libkcal/localdir.desktop1
-rw-r--r--libkcal/period.cpp8
-rw-r--r--libkcal/period.h18
-rw-r--r--libkcal/recurrence.cpp177
-rw-r--r--libkcal/recurrence.h15
-rw-r--r--libkcal/recurrencerule.cpp326
-rw-r--r--libkcal/recurrencerule.h121
-rw-r--r--libkcal/resourcecached.cpp21
-rw-r--r--libkcal/resourcecached.h16
-rw-r--r--libkcal/resourcecalendar.cpp46
-rw-r--r--libkcal/resourcecalendar.h60
-rw-r--r--libkcal/resourcelocaldir.cpp51
-rw-r--r--libkcal/resourcelocaldir.h1
-rw-r--r--libkcal/resourcelocaldirconfig.cpp11
-rw-r--r--libkcal/scheduler.cpp356
-rw-r--r--libkcal/scheduler.h27
-rw-r--r--libkcal/tests/Makefile.am7
-rw-r--r--libkcal/tests/data/RecurrenceRule/ConnectDaily/ConnectDaily11.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/KAlarm_3.4/KAlarm_TestCase06.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase02.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase24.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/LibICal/LibICal_TestCase42.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/RFC2445/RFC2445_RRULETestCase12.ics.recurson.ref2
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase02.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/UntilInUTC/Until_TestCase04.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/lastworkday.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/monthly.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/rdate.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/test1.ics.recurson.ref1
-rw-r--r--libkcal/tests/data/RecurrenceRule/unsorted/weekly.ics.recurson.ref208
-rwxr-xr-xlibkcal/tests/runtestcase.pl8
-rw-r--r--libkcal/tests/testcalselectdialog.cpp45
-rw-r--r--libkcal/todo.cpp33
-rw-r--r--libkcal/todo.h20
-rw-r--r--libkdenetwork/gpgmepp/context.cpp88
-rw-r--r--libkdenetwork/gpgmepp/context.h11
-rw-r--r--libkdenetwork/gpgmepp/data.cpp10
-rw-r--r--libkdenetwork/gpgmepp/decryptionresult.cpp12
-rw-r--r--libkdenetwork/gpgmepp/decryptionresult.h7
-rw-r--r--libkdenetwork/gpgmepp/encryptionresult.cpp26
-rw-r--r--libkdenetwork/gpgmepp/encryptionresult.h6
-rw-r--r--libkdenetwork/gpgmepp/signingresult.cpp42
-rw-r--r--libkdenetwork/gpgmepp/signingresult.h9
-rw-r--r--libkdenetwork/gpgmepp/util.h4
-rw-r--r--libkdenetwork/gpgmepp/verificationresult.cpp56
-rw-r--r--libkdenetwork/gpgmepp/verificationresult.h8
-rw-r--r--libkdepim/addresseelineedit.cpp354
-rw-r--r--libkdepim/addresseelineedit.h13
-rw-r--r--libkdepim/addressesdialog.cpp123
-rw-r--r--libkdepim/calendardiffalgo.h3
-rw-r--r--libkdepim/completionordereditor.cpp23
-rw-r--r--libkdepim/csshelper.cpp14
-rw-r--r--libkdepim/csshelper.h2
-rw-r--r--libkdepim/distributionlist.cpp8
-rw-r--r--libkdepim/htmldiffalgodisplay.h3
-rw-r--r--libkdepim/kabcresourcecached.cpp22
-rw-r--r--libkdepim/kaddrbook.cpp61
-rw-r--r--libkdepim/kaddrbook.h15
-rw-r--r--libkdepim/kcmdesignerfields.cpp1
-rw-r--r--libkdepim/kdepimprotocols.h32
-rw-r--r--libkdepim/kfoldertree.h11
-rw-r--r--libkdepim/kincidencechooser.cpp58
-rw-r--r--libkdepim/kincidencechooser.h53
-rw-r--r--libkdepim/komposer/core/komposerconfig.desktop2
-rw-r--r--libkdepim/komposer/core/komposereditor.desktop1
-rw-r--r--libkdepim/komposer/core/komposerplugin.desktop1
-rw-r--r--libkdepim/komposer/plugins/default/defaulteditor.desktop2
-rw-r--r--libkdepim/kprefsdialog.cpp2
-rw-r--r--libkdepim/ktimeedit.cpp2
-rw-r--r--libkdepim/kvcarddrag.cpp39
-rw-r--r--libkdepim/kvcarddrag.h14
-rw-r--r--libkdepim/ldapclient.cpp32
-rw-r--r--libkdepim/ldapclient.h2
-rw-r--r--libkdepim/ldapsearchdialog.cpp22
-rw-r--r--libkdepim/ldapsearchdialog.h2
-rw-r--r--libkdepim/progressdialog.cpp18
-rw-r--r--libkdepim/progressdialog.h2
-rw-r--r--libkdepim/progressmanager.cpp17
-rw-r--r--libkdepim/progressmanager.h27
-rw-r--r--libkdepim/statusbarprogresswidget.cpp13
-rw-r--r--libkdepim/statusbarprogresswidget.h1
-rw-r--r--libkdepim/tests/Makefile.am11
-rw-r--r--libkdepim/tests/testkincidencechooser.cpp45
-rw-r--r--libkdepim/tests/testutf7encoder2.cpp6
-rw-r--r--libkholidays/kholidays.cpp8
-rw-r--r--libkpgp/kpgp.cpp2
-rw-r--r--libkpgp/kpgpbase.cpp26
-rw-r--r--libkpimexchange/core/exchangedownload.cpp2
-rw-r--r--libkpimexchange/core/exchangeupload.cpp2
-rw-r--r--libkpimexchange/core/utils.cpp2
-rw-r--r--libkpimidentities/identity.cpp26
-rw-r--r--libkpimidentities/identity.h16
-rw-r--r--libkpimidentities/identitymanager.cpp22
-rw-r--r--libksieve/tests/lexertest.cpp1
-rw-r--r--libksieve/tests/parsertest.cpp1
-rw-r--r--mimelib/COPYRIGHT13
-rw-r--r--mimelib/datetime.cpp5
-rw-r--r--mimelib/dw_cte.cpp14
-rw-r--r--mimelib/dw_date.cpp54
-rw-r--r--mimelib/dw_mime.cpp9
-rw-r--r--mimelib/dwstring.cpp2
-rw-r--r--mimelib/mimelib/address.h3
-rw-r--r--mimelib/mimelib/enum.h1
-rw-r--r--mimelib/mimelib/headers.h1
-rw-r--r--mimelib/mimelib/mailbox.h1
-rw-r--r--mimelib/mimelib/mboxlist.h1
-rw-r--r--mimelib/mimelib/msgcmp.h4
-rw-r--r--mimelib/mimelib/protocol.h1
-rw-r--r--mimelib/test_boyermor.cpp1
-rw-r--r--networkstatus/networkstatus.desktop2
-rw-r--r--patchlog.txt0
-rw-r--r--plugins/kmail/bodypartformatter/attendeeselector.cpp12
-rw-r--r--plugins/kmail/bodypartformatter/text_calendar.cpp379
-rw-r--r--plugins/kmail/bodypartformatter/text_calendar.desktop2
-rw-r--r--plugins/kmail/bodypartformatter/text_vcard.cpp157
-rw-r--r--plugins/kmail/bodypartformatter/text_vcard.desktop2
-rw-r--r--plugins/kmail/bodypartformatter/text_xdiff.cpp2
-rw-r--r--plugins/kmail/bodypartformatter/text_xdiff.desktop2
-rw-r--r--release_howto90
-rw-r--r--translate83
-rw-r--r--wizards/Makefile.am44
-rw-r--r--wizards/egroupwaremain.cpp4
-rw-r--r--wizards/exchangemain.cpp4
-rw-r--r--wizards/groupwarewizard.desktop1
-rw-r--r--wizards/kmailchanges.cpp16
-rw-r--r--wizards/kolabmain.cpp4
-rw-r--r--wizards/overviewpage.cpp19
-rw-r--r--wizards/overviewpage.h1
911 files changed, 35043 insertions, 10782 deletions
diff --git a/LAST_ENTERPRISE_SYNC b/LAST_ENTERPRISE_SYNC
new file mode 100644
index 00000000..2e52917a
--- /dev/null
+++ b/LAST_ENTERPRISE_SYNC
@@ -0,0 +1 @@
+Revision 1170137
diff --git a/Makefile.am.in b/Makefile.am.in
index 39ffd008..9cea71b0 100644
--- a/Makefile.am.in
+++ b/Makefile.am.in
@@ -23,7 +23,7 @@ COMPILE_BEFORE_certmanager = libkdenetwork libkpgp
COMPILE_BEFORE_korganizer = libkdepim libkpimidentities libkpimexchange kgantt
COMPILE_BEFORE_kaddressbook = libkdepim certmanager akregator
COMPILE_BEFORE_kandy = libkdepim
-COMPILE_BEFORE_kmail= libkdepim libkpimidentities certmanager libkpgp libkmime indexlib
+COMPILE_BEFORE_kmail= libkdepim libkpimidentities certmanager libkpgp libkmime
COMPILE_BEFORE_knode= libkdepim libkpgp libkmime
COMPILE_BEFORE_karm = libkdepim kresources
COMPILE_BEFORE_plugins = kmail libkdepim libkcal
diff --git a/NewsLog.txt b/NewsLog.txt
new file mode 100644
index 00000000..10034235
--- /dev/null
+++ b/NewsLog.txt
@@ -0,0 +1,2147 @@
+Friday, August 27th 2010
+
+Problems addressed
+------------------
+
+* Improve the error message when regenerating a corrupt index:
+ Show one error message for all folders on startup, instead of multiple error messages
+* Possibly fix a crash when selecting or deselecting resources when the side-by-side view is active
+
+
+Friday, August 20th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4332: event update mail which really is an invitation (rt#6125)
+* kolab/issue4484: Send S/MIME encrypted mail to address without certificate, search for external certificate button (rt#5659)
+* kolab/issue4485: Try to create a contact without writable folder; edit dialog is closed
+* kolab/issue4479: Change used kontact plugins crash (Kontact::MainWindow::addPlugin at mainwindow.cpp:719) (rt#6193)
+* kolab/issue4333: Renaming of a shared calendar folder failed (rt#6121)
+* Add more debug output to help finding the cause of kolab/issue4498
+* Regenerate the mail index earlier when finding inconsistencies in it
+
+
+Friday, August 13th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4484(Improvement): Send S/MIME encrypted mail to address without certificate, search for external certificate button (rt#5659)
+* kolab/issue4404: Reminder: the event entries of the events which triggered an alarm should be selected
+
+
+Friday, August 5th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4203(mainly): A reminder can contain non-existing events (rt#6051)
+* kolab/issue4335: D'n'D a mail attachment with the icon is not working (rt#6126)
+* kolab/issue3932: Kontact should show a warning, if a user tries to accept an invitation of a past event (rt#5833)
+* kolab/issue4005(improved): Attachments should open in read-only folders (rt#5915)
+* Speed up changing Kolab incidences in KOrganizer by only sending one change instead of two
+ to the server (see kolab/issue2109)
+
+kk4:
+* kolab/issue4469: (Kontact loses shared calendar folders (type changed)(rt#6174)
+
+kk6:
+* Add more debug output to help finding the cause of kolab/issue4498
+
+
+Friday, July 30th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4261(Mainly): Wish: Print whole day events at top of a day print (rt#6084)
+* kolab/issue3974: Clicking on an ics/vcs-attachment doesn't import or display the events of the attachment (rt#5812)
+* kolab/issue4429: Key selection dialog is too small. 'Abbrechen' button is cut
+
+
+Friday, July 23th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4335 (partly): D'n'D a mail attachment with the icon is not working (rt#6126)
+* kolab/issue3908 (partly): Mail view and print layout problem if description of attachment is to long (#5872)
+* kolab/issue4455: calendar activate/deactivate handling broken
+* kolab/issue4282: Adding a new event from an invitation update mail shows unnecssary message
+ dialog 'store/throw away' (rt#6094)
+* Fixed a few crashes in KOrganizer and a crash in KMail
+* Improvements in renaming calendar folders
+
+
+Friday, July 16th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4447: Deleting contact from distribution list with DELETE key and Remove button
+
+
+Friday, July 9th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4445: Importing a events into an existing resource and no resource activated, 1000x error messages
+* kolab/issue4437: Wrong update mail (other attendees are removed) after double accepting of an event
+* kolab/issue4406: Change write to read rights of a shared calendar folder, can lead to a focus problem (rt#6167)
+* kolab/issue4343 (improved): Wish: global audio file for all reminder (rt#6133)
+* kolab/issue4406: Change write to read rights of a shared calendar folder, can lead to a focus problem (rt#6167)
+
+Friday, July 1st 2010
+
+Problems addressed
+------------------
+
+* Fix crash when composing a message, when compiled with GCC >= 4.4
+* When adding many incidences, don't ask which calendar to put it in, for each incidence
+
+kk2:
+* kolab/issue4442: Some broken mails double themself in a sync.(rt#6183)
+
+
+Friday, June 25th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4417: Resizing a one day event changes the event wrongly (rt#6064)
+* kolab/issue4401(mainly): The contacts free-busy-url is not saved in the contact mail but in kde/share/apps/korganizer/freebusyurls
+* kolab/issue2652: Kontact generate invalid charset declaration for attached text files
+* kolab/issue4085: Wish: Mail attachments only in the header of a mail (rt#5987)
+
+
+Friday, June 18th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4031: sending mail to OpenPGP-only and S/MIME-only recipient sends only OpenPGP (rt#5938)
+* kolab/issue4369: KMail: Pressing Cancel in untrusted certificates warning dialog doesn't cancel, but continue
+* kolab/issue4411: todos alarm: configured alarm changed after opening the todo twice
+* kolab/issue3726(mainly): A changed Navigator toolbars is displayed without changes after restart (rt#5805)
+* kolab/issue4032: Todos summary shows no todos in offline (rt#5944)
+* kolab/issue4418: details view of a large multipart/mixed mail shows empty Message-ID (rt#5842)
+* kolab/issue4245: Wish: searchbar should also search for mail addresses (rt#6071)
+* kolab/issue4240: Wish: Maillist icons for invitations and update mails (rt#6065)
+* kolab/issue4419: Accept an invitation with set "Exchange compatible", update mail contains an untranslated
+ "Accepted" in the subject. (rt#5903)
+kk3:
+* kolab/issue4407: event with attachment: png/zip attachment size changes
+
+kk4:
+* kolab/issue4410: event attachment cannot be opend after restart (rt#6172)
+
+Friday, June 11th 2010
+
+Problems addressed
+------------------
+
+* Add a context menu for business card attachments in mails
+* Remove groupwise and groupdav resources
+* kolab/issue3411: kmail drag and drop (DnD) of email addresses with umlauts from reader to composer exposes encoded-word encoding
+* kolab/issue4352: Wish: Reminder: horizontal slider between event list and event details (rt#6142)
+* kolab/issue4414: print todos: in the result the priority and summary header overlap
+* kolab/issue4413: Todos: Print, but print events is selected
+* kolab/issue4408: event with attachment: textfield selection creates invitation without attachment
+
+
+Friday, June 4th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4400: Composer: create distribution list adds the dist list just into the default resource
+* kolab/issue4094: Scrollbar position changes, if a new mail is synced into the folder (rt#5997)
+* kolab/issue3911: mail enterprise header: cannot mail to the second to address
+* kolab/issue4350: Sometimes the date headers in the agenda view are grainy and doubled (rt#6140)
+* kolab/issue3411(partly): kmail drag and drop (DnD) of email addresses with umlauts from reader to composer exposes
+ encoded-word encoding
+
+
+Friday, May 28th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4365: Wish: Edit Todo: Complete button. (rt#6156)
+* kolab/issue4372: Rename context menu entry "Copy Link Address" to "Copy Email Address(es)
+* kolab/issue4281: Composer: create distlist, for every entry a resource chooser appears (rt#6098)
+* KDE bug 238945: Crash while displaying an invitation mail
+
+
+Friday, May 21th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4256: Event attendees tab, Select Addressee.. Enter Filter, empty topics are shown. (rt#6081)
+* kolab/issue4340: event edit dialog: Selected attachment should be deleted with shortcut "Remove"/German "Entf"(rt#6124)
+* kolab/issue4381: Imap cache corruption giving crash (SIGFPE) on each sync for email without length
+* kolab/issue3963: Alarm of an recurring task doesn't pop up (rt#5891)
+* kolab/issue4379: Event dialog: Added attendees of a dist list are removed, handling wrong (rt#6159)
+* kolab/issue4307: D'n'D a contact to calendar/todo sidebar icon added an empty attachment
+* kolab/issue4359 (mainly): Invitation, canceled at the resource dialog, but organizer gets accept mail (rt#6147)
+* kolab/issue4316: Pressing Cancel in Recurrence dialog does not discard changes
+* kolab/issue4093: In "enterprise" mail header CC and BCC addresses are displayed under the TO field (rt#5996)
+* kolab/issue4366: Use own fonts for printing
+* kolab/issue4322: Add signature to current line and linebreak (entered at wrong place (rt#6113)
+* kolab/issue4264: Advanced alarm dialog of an event/a todo: Change German "Entfernen ..." into "Entfernen" (rt#6087)
+* kolab/issue4286: Agenda view shows mix of long and short date format (rt#6105)
+* Improve error message if renaming a shared folder failed (see kolab/issue4333)
+
+
+Friday, May 7th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4315: Add attachment for event/task: Store inline should be set by default
+* kolab/issue4314: Can't open attachment of an invitation mail (rt#6109)
+* kolab/issue4317: Open invitation window closes, if an attachment is opened (rt#6111)
+* kolab/issue3882: Composer: Pressing TAB in the address completion popup list doesn't change to the next addressbook
+* kolab/issue4338: Toggle alarm "on" should create a 15 mins for start alarm. (rt#6131)
+* kolab/issue4119: Enter a distribution list as attendee into an event, should expand the members of the dist list into
+ the attendee field (rt#6027)
+* kolab/issue4349: Wish: remove standard event icon in the agenda view (rt#6139)
+* kolab/issue4363: An event with one attendee doesn't display the organizer in preview pane
+* kolab/issue4339: Small translation improvement: German "Kalender/Termin(iCS.." should be "Termin/Kalender (ICS.." (rt#6122)
+* kolab/issue4331: email addresses with comma or special characters should be displayed with quotes in the mail headers (rt#6128)
+* kolab/issue3999: Kontact sometimes changes from mail part to the calendar part
+* kolab/issue4093(partly): In "enterprise" mail header CC and BCC addresses are displayed under the TO field (rt#5996)
+* kolab/issue4351: Reminder: Focus after pressing remind me later, should be on the next event (rt#6141)
+* kolab/issue4350: Sometimes the date headers in the agenda view are grainy and doubled (rt#6140)
+* Add support for alias email addresses in the identity configuration
+
+
+Friday, April 9th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4267: information about the alarm are missing in the event views (rt#6090)
+* kolab/issue2470: Calendar: "Next Month" button doesn't change the displayed month (rt#5961)
+* kolab/issue3882(partly): Composer: Pressing TAB in the address completion popup list doesn't change to the next
+ addressbook
+* kolab/issue4280: Due time "00:00" is set for no time associated todos if todo resource disabled+enabled (rt#6096)
+* kolab/issue4301: calendar display for single events isn't correct
+* kolab/issue2762(partly): Sometimes whole day events overlap in the view (rt#5936)
+* kolab/issue4219(partly): Tasks: Copy, Select nothing, Paste of a subtask copies it as subtask
+
+
+Friday, April 1st 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4270: alarm of an event with two lines shows strange half line title.(rt#6093)
+* kolab/issue4271: In korganizer's resource view, creating a subresource containing a / originates a crash
+* kolab/issue4268: Calendar: Black triangle shows that events are somewhere up, but the user scrolled already to 0:00 (rt#6091)
+* kolab/issue4267(partly): information about the alarm are missing in the event views (rt#6090)
+* kolab/issue4266: birthday resource should be named "Geburtstage" if German language is used (rt#6089)
+* kolab/issue3099: Replying to stored mail crashes Kontact
+* kolab/issue4284: Journal: Link Add Journal entry in the week view is not working (rt#6103)
+* kolab/issue4285: The default size of the reminder should be larger (rt#6104)
+* kolab/issue3469: KNotes: Deleted notes reappear
+* kolab/issue4272: Sometimes it is not possible to delete a folder
+* kolab/issue4248: Configure Filter dialog: Some filter conditions are not translated to German (rt#6074)
+
+
+Friday, March 26th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4229: Kontact hangs when switching to calendar with incorrect interval tag in event (rt#6063)
+* kolab/issue4230: Todo: alarm 0 mins vs 1 min in advanced alarm dialog
+* kolab/issue4220: Calander tabular view , side-by-side tab Move an event asks for resource
+* kolab/issue4064: Task with associated due time "00:00" isn't displayed in all calendar views (rt#5974)
+* kolab/issue4224: event viewer dialog to small (rt#6060)
+* kolab/issue4149: Search Directory Services and comma-formated names (rt#5954)
+* kolab/issue3599: KNotes: Crash in KNotesResourceManager::deleteNote at resourcemanager.cpp:109
+* kolab/issue4247: Composer: After removing an attachment is the focus not on the next attachment (rt#6073)
+* kolab/issue4246: Not possible to add umlauts to the move message dialog (rt#6072)
+* kolab/issue3902: Delete a folder while syncing leads to crash
+* kolab/issue4250: Edit "Out of office" replies: Resend notification only after: days is missing (rt#6076)
+* kolab/issue4249: Crash while printing a mail without preview pane (rt#6075)
+* kolab/issue4142: Composer: view all fields layout and small problems (rt#6032)
+* kolab/issue4012: Calender view update problem, if the same appointment is moved on the server in other folders (rt#5930)
+
+
+Friday, March 19th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4207: alarm time textfield in advanced alarm dialog should be 5-digits (rt#6055)
+* kolab/issue4200: Reminder date sorting doesn't recognize different month (rt#6047)
+* kolab/issue4215: Events ending at 00h appear in the wrong day in day-view
+* kolab/issue4054(needs to patch kdelibs, see issue): Umlauts and sending contacts problem (rt#5956)
+* kolab/issue4060: Wish: Auto-spellchecking: action to add new suggestion in context menu (rt#5969)
+* kolab/issue4224: event viewer dialog to small (rt#6060)
+* kolab/issue4218: Tasks: Copy to of a recurring event forgets the recurrence
+* kolab/issue4225: small month view: selected weekend days and holidays should be colored red in blue (rt#6061)
+* kolab/issue4194(partly): Task without starttime should have default alarm type "before the end" (rt#6045)
+
+
+Friday, March 12th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4195: Copy+Paste of a todo with recurrence should not change the enddate (rt#6046)
+* kolab/issue4192: Wish: Rename German "Start" into "Beginn" in a event advanced alarm dialog (rt#6043)
+* kolab/issue3706: copy+ paste of an appointment in the monthview creates the appointment at a wrong time (rt#6042)
+* kolab/issue4194: Task without starttime should have default alarm type "before the end" (rt#6045)
+* kolab/issue4109: Task with recurrence: Starttime not saved (rt#6019)
+* kolab/issue3963: Alarm of an recurring task doesn't pop up (rt#5891)
+* kolab/issue4066: Quota warning color coming later than server warning dialog (rt#5955)
+* kolab/issue4098: Cannot import "archived" mails into local folders
+* kolab/issue3596: Display a special text instead of a Toltec binary invitation email (rt#5766)
+* kolab/issue4203: A reminder can contain non-existing events.(rt#6051)
+* kolab/issue4201: Spellchecking in composer:RMB->suggestion deletes wrong word (rt#6050)
+* kolab/issue4187: Crash while switching between signed and unsigned mail (rt#5980)
+
+
+Friday, March 5th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4102: Wish: type of attendee of an event should be displayed in the small event pane (rt#6004)
+* kolab/issue4105: Three warning dialogs appears, if I try to create a todo and have deactivated the Task resources
+* kolab/issue4107: In workweek mode clicking on the month pane week number selects whole week (rt#6013)
+* kolab/issue1765: In parallel calender view there is no need to ask in which resource folder a new event should get. (rt#5816)
+* kolab/issue4110: Task with recurrence: due of a selected task in calendar doesn't match the right date (rt#6020)
+* kolab/issue4118(partly): Wish: next/previous week buttons in the small month pane (rt#6024)
+* kolab/issue3874: Calendar Timeline View: Resize and deactive and activate of a calendar resource changes the duration of
+ the event to 15 mins
+* kolab/issue4066(partly): Quota warning color coming later than server warning dialog (rt#5955)
+* kolab/issue2277: Usability problem with "enterprise headers" airmail icon
+* kolab/issue4177: A hidden reminder dialog should reappear, if a new alarm is triggered
+* kolab/issue4181: Wish: an additional column "folder" in the todos list in the todo component
+* kolab/issue4142(partly): Add some tooltips to KMail's composer
+* kolab/issue4096: User with write access to a calendar folder should be able to change the events
+ (even if he isnot the organizer) (rt#5999)
+* kolab/issue4148: New event, attendee dialog: entry with comma format should stay in comma format in the attendee pane (rt#6035)
+* kolab/issue4128: side-by-side view: scrollbar slider too small
+
+
+Friday, February 26th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4055: Workweek after restart is today and next 4 days (rt#5958)
+* kolab/issue4053: reminder of an event with recurrence shows wrong date (rt#5953)
+* kolab/issue4112: Event/Task conflict dialog is too difficult (rt#6009)
+* kolab/issue4060: Wish: Auto-spellchecking: action to add new suggestion in context menu (rt#5969)
+* When recovering a written message after a crash, don't delete the autosave file immediatley, to avoid data
+ loss in case KMail crashes again before the next autosave is triggered
+
+
+Friday, February 19th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4105: (partly) Three warning dialogs appears, if I try to create an event and have deactivated
+ the Task resources.
+* kolab/issue1765: (partly) In parallel calender view there is no need to ask in which resource folder a new event
+ should get (rt#5816)
+* kolab/issue4117: Reminder: Preselected "remind me later" time should always be 5 mins (rt#6017)
+* kolab/issue3597: Event reminder of a deleted event appears (rt#6010)
+* kolab/issue4108: Reminder option "remind me later" should work even if the user closed the session (rt#6016)
+* kolab/issue4125: (mainly) Event with recurrence: Changing attendee of one event, changes it for every event (rt#6029)
+* kolab/issue2079: Search for mails: Cannot create a new search if an old search is selected
+* kolab/issue4056: calendar month view: It is not visible in the big calendar, which day is selected in the
+ small month calendar (rt#5960)
+* kolab/issue4053: (partly) reminder of an event with recurrence shows wrong date (rt#5953)
+* kolab/issue4145: Calendar: month view/agenda view inconsistence with events with recurrence
+* kolab/issue4147: Event/Task conflict dialog "Take Both" should be default (rt#6009)
+
+
+Friday, February 12th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4059: After deactivating of a calendar the small monthview is not updated (rt#5966)
+* kolab/issue2656: Wrong scale is shown, if the calendar component is selected (rt#5916)
+* kolab/issue3835: Edit in the Reminder dialog doesn't work after restart of KDE
+* kolab/issue4090: Wish:Mail: Double click on mail in search dialog should open the mail in a window (rt#5992)
+* kolab/issue4066(partly): Change the default value for the close to quota threshold to 80%
+* kolab/issue4039: Size of an embedded event attachment is too small
+* kolab/issue4057: Attach file: if filedialog default directory doesn't exit, it should use the home directory
+ of the user as default (rt#5962)
+* kolab/issue4097: Wish for an option: reply should always quote the whole mail (rt#5995)
+* kolab/issue4089: Composer: double click on a word should select the word and not additional spaces,
+ brackets etc (rt#5991)
+* kolab/issue2524: KMail: message window shows backslash for quoted-pairs
+* Don't crash when using menu item Action->Show after deselecting an incidence
+
+
+Friday, February 5th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue1765: In parallel calender view there is no need to ask in which resource folder a new
+ event should get. (rt#5816)
+* kolab/issue4072: too small window: kleopatra: German export secret key (rt#5848)
+* kolab/issue4054: Umlauts and sending contacts problem (rt#5956)
+* kolab/issue4076: Mail: search for whole message cannot handle umlauts (rt#5979)
+* kolab/issue3817: Wish: New choices for the option KMail->Misc->Folder->When entering a folder (rt#5857)
+* kolab/issue4081: Use of many kmail subwindows can lead to crash (KMFolder::open) (rt#5854)
+* kolab/issue4052: copy+paste of an appointment in side-by-side view creates the appointment at a
+ wrong time. (rt#5951)
+* kolab/issue4084: Overwriting of an address in the To/CC/BCC field of a composer doesnt work with "Paste"
+ of a copied address (rt#5988)
+* In the archiving dialog, disable the Ok button if the wrong folder or no file is selected
+* Add a warning when trying to use the current folder as expiry target
+* Don't allow deleting 'no content' IMAP folders
+* Don't write out the unused revision field to the XML of events
+* Remove unmaintained Scalix and featureplan support
+
+
+Friday, January 29th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4044: Wish: Mail window should close after pressing on reply/forward (rt#5945)
+* kolab/issue4043: extended alarm: Own reminder dialog text is ignored
+* kolab/issue4053: reminder of an event with recurrence shows wrong date (rt#5953)
+* kolab/issue3989: Calendar: Attendee names with comma are handled wrongly (rt#5899)
+* kolab/issue4058: German translation of "No Suggestions" of the auto spellchecking is missing (rt#5964)
+
+
+Friday, January 22th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue4004: calendar prints should contain a print date (rt#5927)
+* kolab/issue4033: calendar print: week-schedule big time numbers didn't fit the border
+* kolab/issue3901: Result of printing a day seems to be broken
+* kolab/issue4036: calendar print: tasks are wrongly printed
+* kolab/issue4038: After deletion of an event the small monthview is not updated
+* kolab/issue3805: Sometimes at the Mail save dialog no filename is created from the subject (rt#5851)
+* kolab/issue3989: Calendar: Attendee names with comma are handled wrongly (rt#5899)
+* kolab/issue1783: Invitation gets lost, if no Kalender resource is activated
+* kolab/issue4042: minutes field in the extended alarm dialog has a problem
+
+
+Friday, January 15th 2010
+
+Problems addressed
+------------------
+
+* kolab/issue3790: Crash in KMReaderWin::parseMsg at kmreaderwin.cpp:1609
+* kolab/issue4013: Make KMail-Archive format input the default (rt#5817)
+* kolab/issue3903: Kontact hangs when switching to calendar side-by-side view (rt#5870)
+* kolab/issue3986: event/todo recurrence option should be consistent (rt#5900)
+* kolab/issue4027: Kontact crahes if store event attachment inline (rt#5941)
+* kolab/issue3813: reccuring events show wrong dates (rt#5855)
+* kolab/issue4015: Archiving file selector does not keep the suggested file name when changing the directory (rt#5817)
+* kolab/issue4026: mail will be printed with wrong header, if it is printed from a mail window (rt#5935)
+* kolab/issue4014(partial): Better Archiving zip -> tar.bz2 default (rt#5817)
+* kolab/issue4029: Save a attachment of a mail from the composer: no filename (rt#5940)
+* kolab/issue4030: The filename of an UTF-16 text attachment is displayed wrongly (rt#5942)
+* Fix regression in KMail: Subfolders were never created in the mbox format, even when requested
+* In KMail, disable some actions that are not applicable to read-only folders
+* Allow to select read-only folders when archiving
+* Don't crash when attempting to archive a folder without selecting a file name
+
+
+Friday, January 1st 2010
+
+Problems addressed
+------------------
+
+* kolab/issue3988: Calendar: update mail of a changed attendee asked to reply (rt#5899)
+* kolab/issue3929: Contacts: The user can add a distribution list to itself
+* kolab/issue3747: Archiving function has a memory leak
+* kolab/issue4000: A user rejects a delegation, the delegator cannot react on this
+* kolab/issue3948: Show a 'record' button if the organizer is *not* expecting an rsvp (rt#5879)
+* kolab/issue3740: Selection jumps after deleting an attachment from an email
+* kolab/issue3959: In side-by-side view without Marcus Bains line is the seperator displaced (rt#5912)
+* Fix email address spoofing by not allowing BIDI control characters in the display name
+
+
+Friday, December 18th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3964(partial): An attendee of an event is not informed about his role or status in the event (rt#5893)
+* kolab/issue3994: The calendar/event view configuration dialog is too wide
+* kolab/issue3934: Reply of mail with signature removes the signature (rt#5887)
+* kolab/issue3973: Improvement of the German calendar import menu texts (rt#5812)
+* kolab/issue3961: Mail attachment of a task should be persistent (rt#5915)
+* kolab/issue4003: Crash after copying a mail to a quota full OnlineIMAP inbox
+* Fix priorities of todos stored on the Kolab server not being remembered properly after a restart
+
+
+Friday, December 11th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3985: Typos in German dialog "Ungültige E-Mail-Adresse" (rt#5898)
+* kolab/issue3972: Event print order will be wrong, if recurring and single events are mixed. (rt#5914)
+* kolab/issue3964(partial): An attendee of an event is not informed about his role or status in the event (rt#5893)
+* kolab/issue3961: Mail attachment of a task should be persistent (rt#5915)
+* Fix translation problem in the archiving function
+
+
+Friday, December 4th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3805: Sometimes at the Mail save dialog no filename is created from the subject (rt#5851)
+* kolab/issue3928: Insert signature at cursor position: Two additional empty lines added (rt#5880)
+* kolab/issue3971: Users dislike the "Cannot edit attachment" error message (rt#5908)
+* kolab/issue3948: Show a 'record' button if the organizer is *not* expecting an rsvp (rt#5879)
+* kolab/issue3984: New filter "*.*" for the save mail as dialog (rt#5896)
+* kolab/issue3813: reccuring events show wrong dates (rt#5855)
+
+
+Friday, November 27th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3747: Better archiving function for a branch (subtree) of folders (rt#5817)
+* kolab/issue3098: OnlineIMAP, sometimes Mail body no longer shown -> Crash
+* kolab/issue3969(partial): two offline warning windows - that might overlap and lock (rt#5917)
+* kolab/issue3978: Forwarding some emails with an embedded email as text loses some of the text (rt#5919)
+* kolab/issue3955: Kontact automaticly sends a mail to all attendees of an event without confirm
+* kolab/issue3958(partial): Copy action on the address of an open mail doesn't work (rt#5911)
+* kolab/issue3957: Improvement of German text in conditionally accepted events (rt#5905)
+
+
+Friday, November 13th 2009
+
+Problems addressed
+------------------
+
+* Work on the archiving function (kolab/issue3747).
+
+
+Friday, November 6th 2009
+
+Problems addressed
+------------------
+
+* Work on the archiving function (kolab/issue3747). Disabled from the GUI at the moment,
+ until it is completed.
+
+
+Friday, October 30th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3923(partial): Save as of an attachment of an invitation crashes kontact
+* kolab/issue3930: time on the Marcus Bains line doesn't change
+* kolab/issue3908(partial): Mail view and print layout problem if description of attachment is to long (rt#5872)
+* kolab/issue3926: Start khelpcenter instead of webbrowser help: from the introduction/welcome screen (rt#5881)
+* kolab/issue3481: Keep current email in front after saving an attachment (rt#5746)
+* kolab/issue3098: OnlineIMAP, sometimes Mail body no longer shown -> Crash
+
+
+Monday, October 26th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3065: Crash in KOAgendaItem::paintEvent
+* kolab/issue3902: Delete a folder while syncing leads to crash
+* kolab/issue3903: Kontact hangs when switching to calendar view (rt#5870)
+* kolab/issue3908 (partial): Mail view and print layout problem if description of attachment is to long (rt#5872)
+* kolab/issue3807: Reminder: None of the buttons should be the default (rt#5845)
+* kolab/issue3809: Reminder: sorting in look&feel of kontact (rt#5846)
+* kolab/issue3813: reccuring events show wrong dates (rt#5855)
+* kolab/issue3922: Decline an updated event throws error message
+* kolab/issue3864: An invitation of a long event shows a wrong duration.
+* kolab/issue3926 (partial): Start khelpcenter instead of webbrowser help: from the introduction/welcome screen (rt#5881)
+* kolab/issue3880: Calendar: In an update mail the end time of an event is wrongly translated with the "Beginn"
+* Don't check for forgotten attachments in invitation mails
+* Better context-aware messages when asking to send mail for adding/changing/removing invitations
+
+
+Friday, October 9th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3899: Selecting of an event and try to print the day of the event leads to crash
+* kolab/issue1499: using the result of an ldap query from the address selection dialog for setting folder
+ rights might fail (rt#5298)
+* kolab/issue3900: confirm dialog will be empty, if a contact without email address is added from the lookup
+* kolab/issue3667: attachment icon is missing in use with OL/toltec (rt#5786)
+
+Friday, October 2th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3783: SMIME encrypted and signed mail: Audit log dialog contains ???? at the bottom
+* kolab/issue3823: mimetreeviewer doesn't show structure of forward-as-attachment message #n where #n > 1
+* kolab/issue3889: Kontact crahes if opening/changing calendar view (rt#5868)
+* kolab/issue3867: Save S/MIME encrypted mails unencrypted after reading them
+* Also use new icons in the special dates summary, for birthday, anniversary and holiday
+
+
+Friday, September 25th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3806: The sorting of mails in the mailview changes after opening a configuration dialog (rt#5852)
+* kolab/issue3182: Replies to invitations always sent with default outgoing transport
+* kolab/issue3876: regression: New Message To: doesn't fill in To: field in composer
+
+
+Friday, September 18th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue2974: Anniversary event has broken title
+* kolab/issue3865: Crash while syncing, automatic event archival enabled, in EventArchiver::archiveIncidences
+* kolab/issue3853: Crash after renaming a folder
+* kolab/issue2069: Kontact rewrites custom folder types
+* kolab/issue3830: Mail: Setting option properties->share unread state with all users on an inbox doesn't have an effect
+* Add new KOrganizer icons for anniversary, birthday, holiday and special occassion
+
+
+Friday, September 11th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3853: Crash after renaming a folder
+* kolab/issue3836: Saved auditlog contains some strange xml text
+* kolab/issue3833: Mails will vanish, if a folder is renamed
+* kolab/issue3837: Reproducible crash when (not) decrypting s/mime message
+* kolab/issue3577: [regression] S/MIME opaque signed and encrypted email without smime-type parameter suboptimal display
+* kolab/issue3855: [regression] S/MIME opaque signed and encrypted email suboptimal display
+* kolab/issue3831: Forward inline: the header of the forwarded msg doesn't contain the CC
+ field and the time after the date (rt#5862)
+* Fix copying of an URL from KMail, which was a recent regression
+
+
+Monday, September 7th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3816: event view: some topics miss the colon after the topic name (rt#5855)
+* kolab/issue3788: Calendar: A default for the reminder option should be configurable (rt#5841)
+* kolab/issue3827: Address completion ldap, missing results from some sources (rt#5853)
+* kolab/issue3799: Freebusy authentication dialog appears in the background
+* kolab/issue3803: Reply-to field in composer has unused "..." button
+* Fix crash when completing LDAP addresses
+* Don't print "CC:" and "BCC:" in the enterprise header.
+
+
+Friday, August 28th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3359: LDAP Search result not coming in later, if user typed too fast in email completion (rt#5853)
+* kolab/issue3815: event view: dates are displayed without weekday (rt#5855)
+* kolab/issue3808: Reminder: small problems (rt#5845)
+* kolab/issue3816: event view: some topics miss the colon after the topic name (rt#5855)
+* kolab/issue3804: Configuration of Address completion order: Missing last-used addresses (rt#5856)
+* kolab/issue3821: [regression] kmail reader: cannot drag attachment icon anymore
+* kolab/issue3792: Local Folder for Groupware: Type setting partly lost by restart.
+* kolab/issue3822: Configuration of Address completion order: last-used-addresses by default shown one but last, though sorted last (rt#5856)
+* kolab/issue3671: Calendar: To Today button doesn't display a workweek right (rt#5769)
+* kolab/issue3254: printed mail cut at the left side
+* kolab/issue3812: Recent addresses of addresses with comma are displayed with backslash and quote
+* Fix regressions that images were not shown in the reader in KMail
+* Fix regression that shift-clicking an attachment in KMail wouldn't open it anymore
+
+
+Friday, August 21th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3811: Rejecting an invitation, with the event existing and writable by someone else,
+ Kontact will delete the event without question (rt#5803)
+* kolab/issue3722: Dragging emails to an existing appointment or tasks does not work (rt#5806)
+* kolab/issue3788: Calendar: A default for the reminder option should be configurable (rt#5841)
+* kolab/issue3608: Lastname of an attendee is missing (rt#5802)
+* kolab/issue3814: Completion order configuration for emails broken (rt#5856)
+* kolab/issue3819: Calendar Birthday resource: Anniversary day handling has small problems
+* kolab/issue3717: The attachment of an invitation isn't displayed
+
+
+Friday, August 14th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue1536: Default to the sender as organizer when it is not set
+* kolab/issue3717: Add support for attachments in invitations
+* kolab/issue3802: When updating incidences, preserve the UIDs so that the update is correctly registered
+* kolab/issue3808: Rename 'Dismiss' into 'Dismiss Reminder' in the reminder dialog
+* kolab/issue3375: Make the attachment overview less confusing by making a difference between embedded and
+ normal attachments
+* kolab/issue3776: Show the 'Record into my calendar' button on updated invitations when sharing
+ a calendar with others who have access rights
+
+
+Friday, August 7th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3685: Make it possible again to enter the update mail of a moved event into the calendar
+* kolab/issue3789: Show again the buttons for the 'Delegate', 'Forward' and 'Look into Calendar' actions
+* kolab/issue3234: Put optional participants of events into the CC field of the invitation mails, not into
+ the To field, to make Outlook happy
+* kolab/issue3779: Always allow an attendee to remove invitation events from his calendar
+* kolab/issue3788: Make the default time and time unit for new reminders configurable
+* kolab/issue3742: Allow to specify the groupware type of local folders again
+* kolab/issue3375: When using 'Scroll To' on attachments, mark the scrolled-to attachment with a yellow border
+* kolab/issue3776: Don't ask for the storage location on invitation updates
+* kolab/issue3740: When displaying encapsulated messages in a seperate window, make deleting attachments work
+ correctly
+* kolab/issue3722: When dragging email messages as attachments, try to use the mail subject
+ as the attachment name in the KOrganizer attachment editor.
+* Fix a problem that attachments in encapsulated messages could not be deleted
+* Don't erroneously display the text part of encapsulated messages as attachment in the quick attachment list
+* Add nicer icon for the organizer, replacing the old 'tux' icon
+
+
+Friday, July 31th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3722: Make dragging mails to existing appointments work
+* kolab/issue3759: Don't enable the Apply button in the to-do editor when opened from KMail
+* kolab/issue3719: Don't remove linebreaks from the comments on invitations
+* kolab/issue3780: Allow declining an invitation without getting an error message
+* kolab/issue3777: Fix crash when creating a new folder in KMail
+* kolab/issue3724: Possible fix a problem that when multiple persons have write access to a folder,
+ things were confused for other users
+* kolab/issue3725: When forwarding an encrypted mail, don't ask for the passphrase twice
+* kolab/issue3781: Allow to delete an accepted appointment without notifing the organizer
+
+
+Friday, July 24th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3718: Don't show the warning about too many recipients when sending invitations
+* kolab/issue3769: Don't crash when reading a free/busy list that was sent as mail
+* kolab/issue3771: In the attendee edit dialog, allow to edit the organizer field if it is empty
+* kolab/issue3744: Also recognize invitation attachments marked as text/x-vcalendar
+* kolab/issue3734: Allow to change the free/busy and active alarm setting of the default groupware
+ folders as well
+* kolab/issue3683: Fix the webpage export in KOrganizer not showing the right events
+* kolab/issue3735: Fix append-only IMAP folders leading to sync and conflict loops
+* kolab/issue3725: When forwarding encrypted mails, correctly include the attachments in the mail
+* kolab/issue3724: Fix various issues with invitations if you have access to a calendar of another
+ person that is also invited
+* kolab/issue3742: Don't show the combo box that changes the folder type for online IMAP folders, since
+ that is not supported there
+
+
+Friday, July 17th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3687: When printing from KOrganizer, make sure to include the Location
+* kolab/issue3756: Fix problems with reminders not showing up with freshly configured folders
+
+
+Sunday, July 12th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3722 (partly): Don't indicate that mails can be dropped to the attachment editor, that is not possible
+* kolab/issue3746: Fix summary not showing in an update mail and remove empty rectangle
+* kolab/issue3721: Fix incorrect translation for ical import tool
+
+
+Friday, June 26th 2009
+
+Problems addressed
+------------------
+
+* Fix problems with Free/Busy passwords that have a '!' in them.
+ This fix is in kdelibs, not in the enterprise branch.
+* Fix incompatibility with GPGME 1.2
+
+
+Friday, June 19th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3375: Fix attachment overview in the header being confusing for short mails
+* kolab/issue3578: Minimize the amount of key lookups in KMail, especially when not encrypting at all
+* kolab/issue3682: Fix a crash when displaying certain S/MIME messages
+
+
+Friday, June 12th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3685: Fix invitation handling regression, now the update mails of moved events can be
+ entered into the calendar again
+* kolab/issue3678: Speed up displaying of inline PGP encrypted messages
+* kolab/issue3694: Fix crash when displaying an invitation mail
+* kolab/issue3692: Fix crash when quickly closing the window displaying a signed message
+* Add info about the invitation options in KMail's handbook
+
+
+Friday, June 5th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3673: Switch to calendar component when choosing "Look into the calendar" in invitations
+* kolab/issue3636: Prevent creating incorrect maildir folders when using an IMAP account
+* kolab/issue3648: Syncing mails was slow and used a lot of memory
+* Don't block the UI when displaying signed or encrypted mail
+* Add select all and unselect all buttons to the filter importer/export in KMail
+
+
+Friday, May 22th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3615 (partly): Confusing warnings when evaluating key trust in KMail
+
+
+Friday, May 15th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3608: Lastname of an attendee is missing
+* kolab/issue3598: Holidays are not colored correctly
+* kolab/issue2972: Bogus error message when refreshing the IMAP cache
+* kolab/issue3617: Kleopatra's setting dialog cannot deal with gpgconf TYPE=0
+* Some spelling and whitespace fixes in the english version of the KOrganizer manual
+
+
+Friday, May 8th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3605: System tray icon displayed even when there is no unread mail
+* kolab/issue3606: Some common folder properties are missing
+* kolab/issue2459: Don't crash when refreshing the IMAP cache
+* kolab/issue3598: Public holiday description of events are missing
+* kolab/issue2276: Export contacts or calendar overwrites files without a warning
+* kolab/issue2150: Reply action missing in the message popup menu
+
+
+Thursday, April 30th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3228: Forwarding filter action does not directly send the email
+* kolab/issue3251: Fix the phone numbers of a contact in the XML, so that syncing with Toltec etc works
+* kolab/issue2931: Fix an incorrect translation
+* kolab/issue2963: Crash while deleting mails, in KMMoveCommand::execute
+* kolab/issue3268: Changes to the reply prefix would need a restart of KMail to work
+* kolab/issue2152: System tray doesn't react on the change of a folder configuration
+* Some fixes for the color settings in KOrganizer
+* Fix a small memory leak
+
+
+Friday, April 24th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue2472: (partly) Default event color is not used
+* kolab/issue3576: Crash in KOrganizer when switching to the month view
+* kolab/issue2501: Set the default month view color strategy to "calendar inside, category outside"
+* kolab/issue2508: Don't send an invitation when it the event can't be written
+* kolab/issue1819: The help link in the template configuration didn't work
+* Fix crashes in KAddressbook when undo/redo is used on a deleted resource
+* Implement a new (currently hidden) configuration option for making the frames of month or agenda items prettier
+* Fix various memory leaks
+* Correctly disable various buttons if clicking them would lead to no action or crashes
+
+
+Friday, April 17th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue1894: Default width of folder name column was too small on first start
+* kolab/issue2130: Displayed header type in the mail display is wrong
+* kolab/issue1838: Remove the What's this icon from Kontact
+* kolab/issue3303: Departement and title were not saved and restored
+* Reenable dragging of folders in KMail after an error
+* Fix various memory leaks
+* Correctly disable various buttons if clicking them would lead to no action or crashes
+* In KAddressbook, cancel saving when we didn't select a resource
+
+
+Friday, April 10th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3492: Default outgoing transport changes randomly when removing any outgoing account
+* kolab/issue1996: Composer text-completion: Cursor always jumps to the end of the entered text
+* kolab/issue3244: Crash at KMFolder::addMsg after a second import of testmails
+* In KMail, don't allow executing something when clicking on a URL in the reader
+* When formatting incidences, don't add "[Accept]" to it if it can't be accepted
+* In the attendee editor, disable "Response request" when the attendee is oneself
+* When address completion is disabled, don't search on the LDAP server when typing
+* When exporting addresses to vcard, ask before overwriting files
+* Fix small memory leaks in KMail
+
+
+Monday, April 6th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3051: Pressing Shift+R at a shown mail opens a composer with a reference to the mail
+* kolab/issue2238: D'n'D a contact on the contact sidebar icon should not be possible.
+* kolab/issue1940: Activating "unseen mails behind folder" sets the option "unread mails in own column"
+* kolab/issue3512: Kontact does not detect shared seen folder capabilty anymore
+* kolab/issue2687: After applying a new identity, the columns of the mail view reset
+* Other small improvements in the sieve script editor
+* Fix crash in the composer if the transport is empty
+* Fix enable/disable action when we are in template folder
+
+
+Friday, March 27th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3482: Kontact creates invitations with reminders for one week (1W) that Outlook 2003 does not understand
+* kolab/issue3263: Support custom templates when forwarding with filters, and also support fixed recipients for templates
+* kolab/issue3471: Copy menu entry doubled in context menu
+* kolab/issue3312: Crashes if a contact is changed with the contact editor
+* In KMail, fix crash when changing the configuration
+* When deleting templates in KMail, make sure they are removed from the configuration file
+* Remove one unnecessary sync in KNotes
+
+Merges
+------
+
+* Merge the forwarding fixes from enterprise4, to prevent corrupt mails after using filters for forwarding
+
+
+Friday, March 20th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3467: Frequent crash after editing notes
+* Eliminate some unnecessary groupware syncs in KNotes
+* Don't crash when using "Save As" in KNotes
+* Fix problems with notes being randomly recreated or randomly placed
+* Don't allow resizes when a note is locked
+* Disable "Find Text" and "Show/Hide All Notes" actions when there are no notes
+
+
+Friday, March 13th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue2685: Signature not recognised with combined OpenPGP encrypted/signed email
+* kolab/issue2444: Kontact sends base64 encoded password when sieve server does not advertise STARTTLS
+* kolab/issue1950: gpgme config dialog broken when /etc/gnupg/gpgconf.conf not empty
+* kolab/issue2628: For encrypted emails where no encryption was tried, it says "decryption impossible"
+* kolab/issue3477: Kontact creates bad invitations if attendee name with umlauts is entered with double quotes
+* In KNotes, disable actions when the note is locked
+* In KMail, consider marginally trusted keys as trusted, too
+
+
+Friday, March 6th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3367: Changing organizer's status doesn't work
+* kolab/issue3119: Black notes are displayed after system start
+* Don't allow selection of S/MIME certificates when we only want OpenPGP ones (and vice versa)
+* Avoid some unnecessary resyncs in KNotes
+* Don't enable undo/redo for locked notes
+* Don't allow to rename locked notes
+* Fix memory leak in the Kolab resource
+* Don't save the spellcheck coloring to the notes
+
+Merges
+------
+
+* Speed up folder syncing for disconnected IMAP by only uploading flags that really changed
+
+
+Friday, February 27th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3436: Fix crash in extractAuditLog in KMail.
+* kolab/issue3377: Issue warning when emailing to more than X recipients
+* Fix enabling/disabling of the Add/Remove Quote Characters actions.
+
+
+Friday, February 20th 2009
+
+Problems addressed
+------------------
+
+* Fix memory leak in KMail when reading signed or encrypted messages
+
+
+Friday, February 13th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3385 Reminder of an event doesn't work
+* kolab/issue2523 Export Calendar as Web Page: Date range empty by default, no warning
+* kolab/issue3065: Crash in KOAgendaItem::paintEvent
+
+Merges
+------
+
+* Add a cancel button to the reoccurence editor
+* Fix memory leak in KNotes
+* Disable various buttons if they have no effect, in KOrganizer, Knotes, KAddressbook and KMail
+
+
+Friday, February 6th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3374 Window behaviour of Kontact is undesirable sometimes if a message box comes up.
+* kolab/issue3376 Make gui for option ForwardingInlineByDefault
+* kolab/issue3386 Kontact requires that free/busy urls match email addresses
+
+
+Friday, January 30th 2009
+
+Problems addressed
+-------------------
+
+* kolab/issue3275 translation of "calendar" to "Kalendar" is wrong, should be "Kalender"
+
+Tuesday, January 20th 2009
+
+Problems addressed
+------------------
+
+* kolab/issue3304 Pasting a contact opens an edit dialog.
+* kolab/issue3345 Calendar: The default status of an organizer should be accepted.
+* kolab/issue2677 Misleading german translation "Die Terminordner gehören zur Identität"
+* kolab/issue2908 Wrong default name when renaming IMAP ressources
+* kolab/issue3219 user templates do not work, if the email has an attachment
+
+
+Sunday, December 21st 2008
+
+Problems addressed
+------------------
+
+* kolab/issue3306 "No attendees" behind the title of a new event or task not translated into German.
+* kolab/issue3297 If kontact is started via knotes, knotes sometimes crashed while renaming a note
+* kolab/issue2962 Composer text snippets: Add/Edit group, snippet text "GROUP" is not translated into German.
+* kolab/issue3324 can delete attachments in read-only folders
+* kolab/issue3316 Doubled folder lists in move-to filteraction selection dialog
+* kolab/issue3314 Contact folder selection state not saved between KDE sessions
+* kolab/issue3084 An organizor of an event cannot change his status
+* kolab/issue1783 Invitation get lost, if no Kalender resource is activated
+
+Friday, December 12th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue3276 cannot encrypt to marginally trusted OpenPGP key, with email address not in key and key in contact entry ( part fix )
+* kolab/issue3305 Double click on a distribution list in the distribution list editor should open an edit dialog
+* kolab/issue2048 Distribution list: couldn't delete a contact from a dist list with pressing on "delete"
+
+Wednesday, December 3rd 2008
+
+Problems addressed
+------------------
+
+* kolab/issue3228 forwarding filter action does not directly send the email
+* kolab/issue1950 Kontact: gpgme config dialog broken when /etc/gnupg/gpgconf.conf not empty
+* kolab/issue3195 Sending a mail encrypted and signed with an expired Openpgp key shows confusing dialog
+* kolab/issue3265 OpenPGP key expiry warning not emitted for signing keys) Editing
+* kolab/issue2472 ("Default event color" is not used
+* kolab/issue3143 (s/mime invalid keys are accepted by KMail and shown green in kleo (certmanager/lib/ui/keyselectiondialog.cpp)
+* kolab/issue3249 (Strange crash while replying to an SMIME mail.
+* kolab/issue3281 (Kontact does not quote CNs in iCalendar mails, which Outlook 2003 (OL 2K3) then fails to recognise
+
+Friday, November 21st 2008
+
+Problems addressed
+------------------
+
+* kolab/issue2627 Status line for audit log shown, even when it is not implemented.
+* kolab/issue2617 Kleopatra: After importing a p7c or p12 file the user is informed, that he has imported 0 certifictes.
+* kolab/issue2620 Kleopatra throws an error message, if no .gnupg exists and no agent is running.
+
+
+Tuesday, November 19th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue3196 large number of appointments can lead to corrupt index and loss of events.
+
+Sunday, November 9th 2008
+
+Problems addressed
+------------------
+
+* kolab/issue2627 Status line for audit log shown, even when it is not implemented.
+*Support the /vendor/cmu/cyrus-imapd/sharedseen annotation available in Cyrus IMAP server 2.3.9 or higher which allows to share the seen flags between all users that have access to a folder.
+* Detect if the server supports shared seen flags. Also preserve the IMAP server capabilities in kmailrc so that detection also works without a prior sync.
+
+
+
+Monday, October 27th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2230 Summary: Can select summaries of parts in the summary configuration dialog, which are deactivated in the components dialog.
+* kolab/issue2947 Kontact crashes by opening an added attachment file.
+
+
+Friday, October 17th 2008
+
+Problems addressed
+-------------------
+* kolab/issue2702 (calendar: After deleting an attendee no remaining attendee is selected.
+* kolab/issue3127 (Cannot open a mail d'n'ded to the desktop and then cannot restart kontact
+* kolab/issue2875 (Better guide the user to find S/MIME certificate manager when trying to encrypt email
+
+
+
+Friday, October 3rd 2008
+
+Problems addressed
+-------------------
+* kolab/issue2936 Document non-gui OutOfOffice settings for enterprise35.
+* kolab/issue1570 Make standard identity the default in the "Select Address" dialog
+* kolab/issue2501 Calendar: events in the month view are displayed in wrong colors
+* kolab/issue2472 "Default event color" is not used
+* kolab/issue2314 documentation of snippets missing, especially for the variable substitution
+* kolab/issue2962 Composer text snippets: Add/Edit group, snippet text "GROUP" is not translated into German.
+* kolab/issue2389 contact: After creating a new contact, while I have to select a contact resource the cursor is a clock.
+* kolab/issue2989 normal reminder changes to advanced reminder unexpectedly
+* kolab/issue1589 "Keep replies in this folder" not honored when replying with identity not matching original recipients
+* kolab/issue2614 The context menu of the favorite folder view and the folder view should be more similar
+
+
+Friday, September 26th 2008
+
+Problems addressed
+-------------------
+
+*kolab/issue2989 normal reminder changes to advanced reminder unexpectedly
+
+Friday, September 19th 2008
+
+Problems addressed
+-------------------
+* kolab/issue2830 Default identity used for invitation even if other identity is set as organizer.
+* kolab/issue2577 An invitation to a recurring event should give information about the recurrance.
+* kolab/issue1828 Printing event doesn't print list of attachment.
+
+
+Friday, September 12th 2008
+
+Problems addressed
+-------------------
+* kolab/issue2792 kontact sometimes doesn't display a shared folder
+
+Monday, September 8th 2008
+
+Problems addressed
+------------------
+* kolab/issue3024 Crash in KCal::Incidence::revision.
+
+Friday, August 29th 2008
+
+Problems addressed
+------------------
+
+* kolab/issue2680 Counter proposal: A user should be notified about an accepted counter proposal.
+* kolab/issue2625 Sync with the new sync button for emails stays offline without message.
+* kolab/issue2514 Moving a event and pressing "Cancel" in the send mail dialog, doesn't cancel the operation.
+* kolab/issue2489 Synchronize Calendar button always syncs all servers.
+* kolab/issue2111 Help->Feature Request looks for a non-existing page.
+* kolab/issue2655 Fast pressing "Down Arrow" Key in the address lookup of the composer selects an address in the "to" field.
+
+
+Saturday, August 23rd 2008
+
+Problems addressed
+------------------
+kolab/issue2927 Opened mails/composer are not reopened after a restart.
+kolab/issue2675 Calendar side-by-side view: scale doesn't fit with the hours view.
+
+
+
+Friday, August 22nd 2008
+
+Problems addressed
+------------------
+* kolab/issue2954 Possible to delete a mail if just max append rights.
+* kolab/issue2036 Press "cancel" at the calender folder selection deletes an updated event.
+
+
+
+Friday, August 13th 2008
+
+Problems addressed
+------------------
+
+* kolab/issue2933 Creating folder with a old folder name can trigger a crash.
+* kolab/issue2850 Crash while copying a mail to a read-only folder.
+* kolab/issue2904 Calender component reloads all events, e.g. after switching to todos and back.
+
+Friday, August 1st 2008
+
+Problems addressed
+------------------
+
+* kolab/issue2951 The name of the event which was created by d'n'd of a todo is "BEGIN:VCALENDAR".
+* kolab/issue2904 calender component reloads all events, e.g. after switching to todos and back.
+
+
+Friday, July 25th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2866 In the todo summary a todo is shown which was deleted.
+* kolab/issue2867 Todos: Often deleted todos reappear.
+
+Monday, July 22nd 2008
+
+Problems addressed
+-------------------
+
+kolab/issue2801 Kontact doubles mails if a filter is used and every mail is filtered.
+kolab/issue2868 The name of the todo which was created by d'n'd of an event is "BEGIN:VCALENDAR"
+
+Friday, July 11th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2522 Pressing ESC while moving a contact, deletes the contact.
+* kolab/issue2607 sync loop after deactivation of autosync.
+* kolab/issue2666 Deactivated calendar resources are reactivated after restart.
+
+Merges
+------
+* Enterprise branch is in sync with kdepim 3.5 branch
+* Bugfixes from enterprise ported to 3.5 branch
+
+Friday, July 4th 2008
+
+Problems addressed
+--------------------
+* kolab/issue2512 Kmail: "Subscription" should be renamed in "Serverside subscription"
+* kolab/issue2741 Button to do an ldap lookup is missing from the address selection dialog.
+* kolab/issue2511 Pressing "New" in the new event attendee view should not continue to create new attendees, if the first example attendee is not changed.
+
+Merges
+------
+
+* Enterprise branch is in sync with kdepim 3.5 branch
+
+Friday, June 27th 2008
+
+Problems addressed
+--------------------
+* kolab/issue2785 favorite folder: Two creation ways show different names.
+* kolab/issue2790 Strange date/time field in the new todo dialog.
+* kolab/issue2568 Button to open certificate manager is missing from encryption key dialog.
+* kolab/issue1998 An invitation via a server distribution list, cannot be accepted by attendees as they cannot choose one of their own identity.
+* kolab/issue2741 Button to do an ldap lookup is missing from the address selection dialog.
+* kolab/issue2618 Kleopatra: the dump of smime certificates doesn't contain the email addresses.
+* kolab/issue2773 Usability of "Order of Arrival" string?
+* kolab/issue2740 kleopatra shows an error message, if started and the search is on "In External Certificates"
+
+
+Friday, June 16th 2008
+
+Problems addressed
+--------------------
+
+* kolab/issue2506 Typo in the display of a smime signed mail.
+* kolab/issue2512 Kmail: "Subscription" should be renamed in "Serverside subscription"
+* kolab/issue2511 Pressing "New" in the new event attendee view should not continue to create new attendees, if the first example attendee is not changed.
+* kolab/issue2659 Copying and moving contacts with only one resource configured.
+* kolab/issue2741 Button to do an ldap lookup is missing from the address selection dialog
+* kolab/issue2619 Kleopatra: Trying to create a smime key pair with a "+" in the CN, fails without a warning.
+* kolab/issue2568 Button to open certificate manager is missing from encryption key dialog
+
+Merges
+--------
+
+* Enterprise branch is in sync with kdepim 3.5 branch
+
+Friday, May 30th 2008
+
+Problems addressed
+---------------------
+* kolab/issue2717 - Composer option "Insert signatures above quoted text" doesn't work. Implemented for replytoall for consistency.
+
+
+Merges
+-------
+* Enterprise in sync with kdepim 3.5 branch.
+
+
+
+Tuesday, May 20th 2008
+
+Problems addressed
+--------------------
+* kolab/issue2667 - Kontact sometimes tries to re-create existing folders and fails. (807761)
+* kolab/issue2717 - Composer option "Insert signatures above quoted text" doesn't work. (810237)
+
+Merges
+-------
+
+* Enterprise in sync with kdepim 3.5 branch.
+
+
+Friday, May 9th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2560 Unsuccessful Sieve connection causes strange Progress Dialog.(804616)
+* kolab/issue2675 Calendar side-by-side view: scale doesn't fit with the hours view.(804642)
+* kolab/issue2669 (Profile does not save background color of emails.(804994)
+* kolab/issue2148 (counterproposal event should be inserted into the calender
+* Kolab issues 2148, 2678, 2681, 2683, 2680 - Counter proposal issues. (805191,805702)
+* kolab/issue2247 (Command line switch to choose Kontact profile (W1-32) (805348)
+
+Merges
+--------
+
+* Enterprise in sync with kdepim 3.5 branch.
+
+
+Saturday, May 3rd 2008
+
+Merges
+-------
+
+* Enterprise in sync with kdepim 3.5 branch.
+
+Monday, April 28th 2008
+
+Problems addressed
+-----------------------
+
+* kolab/issue2585 contacts of a LDAP resource folder should be seen in the mail address text completion of a composer
+* kolab/issue2443 kontact aborts sieve when imapd sends capabilities after starttls
+* kolab/issue2608 Calendar: counter proposal is not sent to the organizer
+* KDE bug 126025: Replying to address with umlaut and comma creates two addressees
+
+
+Friday, April 18th 2008
+
+Problems addressed
+-----------------------
+
+* kolab/issue2630 calendar: Wrong scrolling in the side-by-side view.
+* kolab/issue2629 calendar: At the headers of a week in the side-by-side view are not above the right columns
+
+Merges
+-------
+* Merges in from 3.5 branch.
+
+
+
+Friday, April 11th 2008
+
+Problems addressed
+-----------------------
+
+* kolab/issue2272 - Event Attendee Editor: After "Zoom To Fit" and zoom it is possible to scroll the fb part without the attendee part. (794734)
+* kolab/issue1869 (side-by-side calender view size depends on folder path length.(795745)
+* kolab/issue1883 (wasting space with many time scales in side-by-side-view.(795745)
+* kolab/issue1947 (calendar side-by-side view: superfluous scrollbars in the dayappointments.(795745)
+* kolab/issue1948 (calendar side-by-side view: wasting space by several scrollbars? Fix one grid option.(795745)
+* kolab/issue2561 (Side-By-Side view: the view of some folders are of different size.(795745)
+
+
+Friday, April 4th 2008
+
+Problems addressed
+--------------------
+
+* kolab/issue2577 An invitation to a recurring event should give information about the recurrance. (792202)
+* kolab/issue2581 The reject counter proposal mail is send to a wrong account.(792230)
+* kolab/issue2580 A user cancels a counterpropsal and the invitation mail is gone. (792231)
+* kolab/issue2582 After pressing "decline" in the counter proposal dialog and sending the counter proposal the event can be found in the calendar. (792950)
+* kolab/issue2578 After deletion of an event the organizer gets a mail, that some attendee accepted the event. (792957)
+
+
+
+Saturday, March 29st 2008
+
+Problems addressed
+------------------
+* kolab/issue2231 - Edit event: After adding and removing an mail address, an update mail is send to the address.
+* kolab/issue2217 - "open" button/funcationality in full search window missing (Z37)
+* kolab/issue2566 - Translation Error: German key
+* kolab/issue2565 - appointment dialog text quirks
+* kolab/issue2148 - counterproposal event should be inserted into the calender
+* kolab/issue2147 - There should exist two kind of counter proposals
+* kolab/issue2149 - A counterproposal should be displayed in a way, that the organizer understands.
+
+
+Friday, March 21st 2008
+
+Problems addressed
+------------------
+* kolab/issue1826 - Default (New Mail) template needs 3 spaces between the top and the signature.
+* kolab/issue2290 - Should warn and offer to change if there are two *.default groupware folders in one account.
+* kolab/issue2272 - Event Attendee Editor: After "Zoom To Fit" and zoom it is possible to scroll the fb part without the attendee part.
+
+
+Friday, March 14th 2008
+
+Problems addressed
+-------------------
+* kolab/issue1770 Delete attachment of a signed mail doesn't work. (783303)
+* kolab/issue2533 Reproducible crash in KMail::MessageProperty::filtering when refreshing IMAP cache. (784547)
+* kolab/issue2239 Addressbook extension doesn't recognise the deletion of a contact folder.(785317)
+* KDE Bug 146679 Can't set negative absolute hours - fixed. (785054)
+* kolab/issue2168 Email attachment overlay view, header style "enterprise" : Should be made foldable.
+* kolab/issue2529 Email attachment overlay view, header style "enterprise": fold button should vanish, if the mail has no attachments.
+
+
+
+Friday, March 7th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2297 New event: Organisor is not attendee. (781595)
+* kolab/issue1988 Deleting a event should remove the deleter from the attendee list.(782029)
+* kolab/issue2443 kontact aborts sieve when imapd sends capabilities after starttls. (782672)
+
+Merges
+------
+
+* Merge35 Filter source folder whitelist (from proko2 ). (783244)
+
+Friday, February 29th 2008
+
+Problems addressed
+-------------------
+
+* Prevent crash after changing the layout and replying then. (778728)
+* kolab/issue2442 kolab/issue2442 (kioslave crashs after closing kontact, if the vacation reminder is activated. (779694)
+* "Enterprise headers" makes impossible to select text in first paragraph of body. [ kde-bug#151150 ] (779994)
+* kolab/issue1700 kleopatra crashes after ldap search. (780211)
+* kolab/issue2168 Email attachment overlay view, header style "enterprise" : Should be made foldable (780250)
+* kolab/issue2413 Kmail: Cannot select "Mark Thread" in the popup menu if I select two or more threads. (780251)
+* kolab/issue2312 Rejecting an invitation does not always work (780286)
+
+Merges
+---------
+* Merges in from 3.5 branch
+
+Friday, February 22nd 2008
+
+Problems addressed
+------------------
+* Prevent the message in the reader window from jumping back to the start of the message when the font or the font size is changed in the separate reader window.
+
+Merges
+------
+
+* Merges in from 3.5 branch.
+
+Friday, February 15th 2008
+
+Problems addressed
+-------------------
+* kolab/issue2160 contact view: move distribution list and addressbook view menu item to "views" (775026)
+* kolab/issue2477 Contacts: The Dist lists view is at the right side of the contacts list view. (775016)
+* Fixed cached imap local subscription so that it works for top-level folders.(774162)
+* Fixed the problem that filtering with online IMAP stopped after the first message had been processed.(773733)
+
+Merges
+------
+
+* Merges in from 3.5 branch.
+
+Friday, February 8th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue1981 Context menu entry "Paste" in kalender view
+* kolab/issue2260 New resource calendar folder default colors
+* Fix message status change randomly not working for non-toplevel mails
+* Really apply the identity when we edit a received message
+* kolab/issue2394 IMAP sync keeps calendar items which are deleted on the server
+* kolab/issue2450 Kmail: D'n'D and "Move To" from a read only folder is possible
+* kolab/issue2092 A latin-9 attachment is treated like a utf-8 file
+* Fix reply actions being disabled when a collapsed thread is selected
+* kolab/issue2390 contact: Two resources on the same server could looks like the same source in the contact view
+
+
+Friday, February 1st 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2036 Press "cancel" at the calender folder selection deletes an updated event. (768070)
+* kolab/issue2214 Creating a calender in local folder where the user have no rights shouldn't be possible.(768402)
+* kolab/issue2433 Debug log of kio_sieve shows password in base64. (768539)
+* kolab/issue2387 Crash when creating a subfolder of the calendar folder.(768738)
+* kolab/issue1841 Changing composer wrap margin does not affect currently open composer.(769033)
+* kolab/issue1843 Resized composer window snaps back if settings are changed.(769035)
+* kolab/issue2166 Rename "Create Task ..." to something that resembled "resubmission" or "reminder".(769042)
+* kolab/issue2159 Configure option: distribution list view and addressbook view under or left of the main list of contacts.(769058)
+* kolab/issue2167 New tasks should have reminder and until time set by default.(769058)
+
+Monday, January 28th 2008
+
+Warning
+--------
+The account password is shown in the debug output (See kolab/issue2344).
+Solution is to use "kdebugdialog" and switch "kio_sieve" off.
+
+Problems addressed
+-------------------
+
+* kolab/issue2387 Crash when creating a subfolder of the calendar folder. (767033)
+
+* kolab/issue2269 After locally unsubscribed a shared folder, the grey "user" and the grey "ltest1" folder didn't vanish. (765237)
+
+* kolab/issue2216 Crash in KMFolderSearch::addSerNum (764894)
+
+* kolab/issue2403 Forwarded or Delegated event not displayed correctly.(764828)
+
+* kolab/issue2405 Printing a encrypted mail should be possible (764404)
+
+Merges
+-------
+
+Merging complete with respect to 3.5 branch.
+
+Friday, January 18th 2008
+
+Problems addressed
+-------------------
+
+* kolab/issue2275 upgrade removed groupware resources.( 745813 )
+
+* kolab/issue2306 Crash below KMReaderWin::parseMsg after fast navigation through mails (746845)
+
+* kolab/issue2313 Crashed when subscribing new folders (e.g. in KMFolderMgr::removeFolderAux()) ( 746873 )
+
+* kolab/issue2173 "Copy contact to" and "Move contact to" have the same icons. ( 746925 )
+
+* kolab/issue2146 Kontact evaluates HTML tags in Contacts ( 747182 )
+
+* kolab/issue2182 Kontact shows misleading error messages for a mail encrypted with unsupported cyphers. ( 747318 )
+
+* kolab/issue2262 Crash below SnippetWidget::slotAdd()) (747340)
+
+* kolab/issue2286 Crash below KMail::CachedImapJob::slotPutMessageInfoData after working with tasks. ( 747584 )
+
+* kolab/issue2299 Sending a mail with softbreaks inserts newlines into this mail. (748016)
+
+* kolab/issue2220 "Action Item" and "Important" flag of mails behave different, if a folder is shared with read rights. (748416)
+
+* kolab/issue2344 Kontact crash on Deleting messages which are attachments shown in message viewer. (748425)
+
+* kolab/issue2191 filters lose conditions. (748479)
+
+* kolab/issue2004 Kontact, contact component: minsize of some components too wide (748501)
+
+* kolab/issue2061 three buttons lead to too large minimum width (in contact, calender and journal view). (748501)
+
+* kolab/issue2161 contacts view: distribution list view: Should have the usual buttons (748529)
+
+* kolab/issue2348 Crash on "checking" ToDo in calendar view (750031)
+
+* kolab/issue2304 Adding new attendees should be easier by clicking. (750093)
+
+* kolab/issue2301 Contacts: Undo asks to select a folder, after cutting some contacts. (750101)
+
+* kolab/issue2178 After inserting a text component to a mail the cursor should be at the end of this text component not at the beginning. (750499)
+
+* kolab/issue2169 Email header style "enterprise" does not jump to all email attachments (750562)
+
+* kolab/issue2008 Export of kontact profiles doesn't work. (750648)
+
+* kolab/issue1870 Display of whole day events in side-by-side view shows rubbish. (750879)
+
+* kolab/issue1952 favorite folder view: clicking on groupware folder should jump to corresponding view. (750904)
+
+* kolab/issue2379 Favorite todo folder: If the folder is already selected, clicking on it doesn't change the view. ( 758955 )
+
+* kolab/issue 2399 "Out of Office" reply reminder is activated althrough "Out of Office "reply is not activated. ( 762310 )
+
+* kolab/issue 2401 D'n'D attachment of a mail to the desktop: copy lots of different files to the desktop.( 762653 )
+
+* kolab/issue2195 German translation in kontact's Calendar box (long, Deppenapostroph). ( 762985 )
+
+
+
+Merges
+-------
+* More merges from all of kdepim.
+
+Monday, December 4th 2007
+
+Problems addressed
+--------------------
+
+* kolab/issue2260 Use better category and resource colors, make the list of default colors configurable, change the default working time color. (744677)
+
+New functionality
+-------------------
+
+* prokde35-z Item 60: Merge of the attachments and recurrence tabs into the main one, according to the usability suggestions and additional comments from the usability team. D'n'd and c'n'p support for attachments. (revision 742613)
+
+* prokde35-z Item 65: Merge of the attendee and free-busy tabs into the main one, according to the usability suggestions and additional comments from the usability team (revision 744005)
+
+* prokde35-z Item 61: Implementation of the xfb concept (revision 744092)
+
+* prokde35-z Item 203: implementation of the concept for better error messages for crypto operations (audit log) (revision 743026)
+
+* prokde35-z Item 32: Separate the recipients editor with a splitter, so the number of visible recipients can be freely configured (revision 744676)
+
+
+Friday, November 23rd 2007
+
+Problems addressed
+--------------------
+* kolab/issue2224 (Crash: KMFolder::countUnread, after hide groupware folders and sync) (739114)
+* kolab/issue1864 (Edit Categories not working when creating a new event) (739670)
+
+New functionality
+-------------------
+* prokde35-z Item 36: Clearer descriptions for search/filter criteria (738629)
+* prokde35-z Item 25: "Edit" for received mails. (739063)
+* prokde35-z Item 37: Make the splitters a bit more sensible, by preventing total collapsing, where it makes sense. (739069)
+* prokde35-z Item 26: per-account identities (739135)
+* prokde35-z Item 18: more and better configurable message actions on the main reader window (739157)
+* prokde35-z Item 53: Improved coloring of agenda view items (739603)
+* prokde35-z Item 50: Default colors for calendar resources (739689)
+* prokde35-z Item 79 (part 2): Statusbar indicator for active vacation scripts (740023)
+* prokde35-z Item 60 Allow files to be dropped onto the attachment view and ask whether they should be attached by link or by value. Implement dragging out of the view.
+
+Friday, November 16th 2007
+
+Problems addressed
+--------------------
+* kolab/issue2200 (After editing the attendee list the old attendes gets update mails without the possibility to enter them into their calender.) (737072)
+
+New functionality
+-------------------
+* prokde35-z Item 75: Aggregated reminders (737035)
+* prokde35-z Item 3: Hide no-content folders only containing groupware folders (737469)
+
+Merges
+---------
+* Merges from 3.5 branch for KMail, KAlarm, aKregator, KArm
+
+
+Friday, November 9th 2007
+
+Problems addressed
+--------------------
+* kolab/issue2123 Make sure the re-generated index is actually written out, to avoid crashes on switching out of the folder, and related unpleasantness. (732422)
+* kolab/issue2142 ( part 1 ) Make sure the file selector is shown on top of the filter dialog. (732794)
+* crash when there is no smime backend, and the protocol can't be determined.(733049 )
+* kolab/issue2151 Fix creation of new folders when restarting KMail before the next sync. ( 733149 )
+* kolab/issue2142 ( part 2 ) Provide a proper parent for the "ask to overwrite" dialog.(733495)
+* kolab/issue 2176 Move transaction code into the filtermanager, from the caller and make sure filter counts are written to and read from the right section. ( 733511 )
+* kolab/issue2175 Show an error message if the to-be-imported filters file can't be read. (733519 )
+* kolab/issue2181 Fix crash when opening a message without a parent, cleanup initialization order.(734247)
+
+New functionality
+-------------------
+* Prokde35-z Item 69 Allow comments to be given when reacting to invitations (733159)
+* Prokde35-z Item 68 (part 1) Make it configurable whether invitation emails are move to the trash once the reply to them has been sent and add gui for that to the groupware section of the main configuration dialog. (733883)
+* Prokde35-z Item 73: Show changes made by the organizer when showing invitation updates. (734580)
+
+Merges
+---------
+* Merges from 3.5 branch for KMail and KAlarm.
+
+
+
+Friday, November 2nd 2007
+
+Problems addressed
+------------------
+* kolab/issue2151 Creating a subfolder doesn't work correctly
+
+New functionality
+------------------
+* Prokde35-z Item 49: "Store Contact In" -> "Copy Contact To" and "Move Contact To" (729611)
+* Prokde35-z Item 201: Allow dragging of attachments from composer windows (729661)
+* Prokde35-z Item 203 (part 1): Port KMail from cryptplug to kleo (731701)
+* Add the ability to associate keyboard shortcuts with snippets. (731716)
+* Add a GUI option for syncing groupware changes immediately (731653)
+
+Friday, October 26th 2007
+
+Problems addressed
+------------------
+* ensure that tooltips also work on the main folder tree
+ and show quota info properly (729284)
+* kolab/issue2108 (Kontact sends broken invitation email.) Explicitely disable
+ word wrapping, instead of toggeling, where appropriate.
+
+New functionality
+------------------
+* Prokde35-z Item 16: Filter import/export (728541)
+* Prokde35-z Item 37: Open search results in standalone reader,
+ when preview pane is hidden (729306)
+
+
+Friday, October 12th 2007
+
+Problems addressed
+------------------
+* kolab/issue1941 (slow LDAP server lookup clears the To: field)
+ Don't overwrite the user selection if LDAP search results come in delayed.
+* kolab/issue2035 (Manage Sieve Script: Couldn't activate a script.) Allow
+ activation of sieve scripts when none are currently active
+* kolab/issue2042 (Not possible to create a new contact) Fix creation of
+ new contacts in kolab resources
+* kolab/issue2045 (Sending unencrypted, unsigned mail to myself throws warning)
+ Fix problems with ecnryption to untrusted keys
+* kolab/issue2046 (Crash: Try to copy an attachment to the konqueror)
+ Fix crash on drag
+* kolab/issue2067 (Kontact doubles mails when filter is used.) Make sure
+ to persist the list of deleted uids
+
+
+New functionality
+------------------
+
+* Prokde35-Z Item 55d: Immediately sync groupware changes (revision 723653)
+* Prokde35-z Item 27: Softbreaking in the kmail editor when no hardbreak limit is set (724153)
+* Prokde35-z Item 19: Raise hardbreak limit from 78 to 255 (724155)
+* Change the default for what to select on entering a folder to "last selected" from "jump to new".
+
+Merges
+------
+
+* kolab/issue1904 don't crash on shutdown if the kernel is already deleted
+* kolab/issue1942 Allow not fully trusted keys to be used for encryption, but ask the user to confirm their use.
+
+
+Wednesday, September 26st 2007
+
+Bugfixes
+--------
+
+* kolab/issue1983 Fix encoding issue in SMIME encryption message.
+* kolab/issue1924 Retain state of the crypto state indicators across drafts.
+* KDE bug 132938 Avoid asking the user to go online spuriously/
+* kolab/issue1743 Fix upload of out-of-office scripts (716765)
+* kolab/issue2023 Missing accelarators in text snippet context menu (716933)
+* kolab/issue2009 Fix new/unread flag handling during DIMAP sync (717162)
+* kolab/issue2029 Allow to hide signature details again (717191)
+
+Features
+--------
+
+* prokde35-z item 70: Check calendar link in invitations (714358)
+* prokde35-z item 30: Text snippet support in the kmail composer window (715206)
+* prokde35-z item 47: Support for read only contacts folders (715588)
+* prokde35-z item 67: Support for invitation counter proposals (716376)
+* prokde35-z item 21: D'n'D out of the folder view, removal of the "save encoded" menu entry (716393)
+* prokde35-z item 7: Close application despite presence of a system tray icon, configurably (716415)
+* prokde35-z item 40: Details on demand for pgp/smime signature status (716476)
+* prokde35-z item 79: Warn about active out-of-office scripts on startup (716765)
+* prokde35-z item 17: Better error reporting for quota errors (716771)
+* prokde35-z item 24: New attachment view in mail viewer (717292)
+
+
+Friday, September 21st 2007
+
+Bugfixes
+--------
+
+* kolab/issue1983 Fix encoding issue in SMIME encryption message.
+
+* kolab/issue1924 Retain state of the crypto state indicators across drafts.
+
+* KDE bug 132938 Avoid asking the user to go online spuriously/
+
+Features
+--------
+
+* prokde35-z item 70: Check calendar link in invitations (714358)
+
+* prokde35-z item 30: Text snippet support in the kmail composer window (715206)
+
+
+Friday, September 14th 2007
+
+Features
+--------
+
+* Make the maximum attachment size configurable by a non-gui (kioskable) option
+ and change the wording of the warning dialog to refer folks to their admin,
+ rather than blaming KMail for the limitation.
+
+Bugfixes
+--------
+
+* prokde35 W1-32 fixes for global profiling handling
+
+* kolab/issue896 Change the summary view title to "To-Do" from "To-do List" for consistency with the side bar.
+
+* Bump the kontact plugin version to reflect the profile loading changes and
+ update the version in those plugins we ship. Fixed crashes from basket on
+ startup in kubuntu, for example.
+
+* Make favourite folder area work with multiple main windows
+
+* kolab/issue1955 Fix crash when closing KMail.
+
+* kolab/issue1963, 1964 Make the create task action available in separate reader windows and the toolbar.
+
+* kolab/issue1984 fill distribution list listview delayed to avoid crash
+
+* kolab/issue1983 Make on-demand decrytion also work with SMIME.
+
+Merges
+------
+
+* Merge kalarm from 3.5 r708803-709812
+
+
+Friday, September 7th 2007
+
+Features
+--------
+* prokde35-z item 58: Rename "time associated" to "add-day event" and invert logic (706869)
+* Limit attachment size to a sensible value (upstreaming old SUSE patches, this one originally by Waldo Bastian). (706920)
+* prokde35-z feature 46: Rework distribution list integration in KAddressBook, add support for multiple active extensions (708034)
+* prokde35-z item 41: Decrypt messages only if requested (some prettification still pending) (708741)
+* prokde35-z item 9: third part: allow to disable local flags in read-only folders (708749)
+* prokde35-z item 2: Better and shorter resource folder names, showing the folder's owner (709038)
+* prokde35-z item 11: Message flags can be toggled by clicking into the corresponding header view columns (709066)
+* prokde35-z item 48: Allow adding LDAP entries to distribution lists from the LDAP search dialog. Add the ability to import LDAP contacts into the addressbook. (709092)
+* prokde35-z itme 42: Show colored indicators of signature and encryption state above the editor area (709142)
+
+Bugfixes
+--------
+* kolab/issue1376: fix \Seen flag handling on initial folder download (708706)
+* kolab/issue1924: encryption type is not stored if mail is saved to draft (709084)
+
+Merges
+------
+* Merge of kpilot fixed in 3.5 trunk (707923)
+* Merge of changes that help with folder open/close reference counting debugging (mostly from the SuSE team) (707659)
+
+
+Friday, August 31st 2007
+
+Features
+--------
+* Scalix support for Kontact.
+
+Bugfixes
+---------
+* kolab/issue1868: Crash after reply on a mail using search function (705173, merge issue 38)
+* BUG: 93436 - Always encrypt to self function was always on.
+* kolab/issue1923 Crash after pressing copy and paste in the composer. (706484)
+* kolab/issue1713 @ (at) sign in realname confuses kontact when creating appointments (704180)
+* kolab/issue/1894 Default width of the folder name column at first contact start is too small
+* kolab/issue1918 favorite folder view migration default size could be better (706063)
+
+Merges
+------
+* Merged kpilot, karm and kalarm changes from 3.5 branch into enterprise.
+
+Friday, 24th August 2007
+
+
+Features
+----------
+ - prokde35-z item 44: keep state of signing and encryption actions across drafts (fully implemented, ported to 3.5, trunk and proko2) (702320)
+ - prokde35-z item 35: consistent behavior of pasting URLs via keyboard shortcut, d'n'd and menu (fully implemented, ported to trunk) (702342)
+ - prokde35-z item 1: favourite folders view in KMail (fully implemented, port to trunk pending, merge 36) (702804)
+ - prokde35-z item 9: first part of this item, concerning sync of SEEN flags in read only folders (issue1376) (703473)
+ prokde35-z item 9: second part, ability to store custom flags on the server (704199) merges
+- prokde35 w1-20 (665722)
+- prokde35 w1-11: Let the navigator toolbar be always the last one, if it's in the top dockwindow ( 666073)
+ - prokde35 W1-19 / kolab/issue1749 Since mail folders are not groupware folders, do a full sync, when
+ the mail part is already active. (668988)
+ - prokde35 It's now possible to resize the magenta rectangle that represents the event in the freebusy
+ view, to change its start time, end time and duration (not only move it around, which preserved
+ duration).
+ - prokde35 w1-6 Implement a size column in the shared folder tree class and in kmail. Add the ability
+ to use a configurable color for the folder name and size when it is close to a configurable quota
+ threshold (provided the folder has quota info in the first place). Implement size retrieval for mbox
+ and maildir storage.
+ - prokde35 w1-23 Add a font family and size selector to the standalone readerwindow, which
+overrides the usual font for display and printing for that particular mail.
+ - prokde35 w1-30 Add an option to show two agenda views (669438)
+ - prokde35 W1-30 Start of a gantt-based view for korganizer (669557)
+ - prokde35 W22: prepare printing of notes from Kontact, move existing KNotes printing code to a library
+ shared by KNotes and the Notes plugin ( 670739)
+ - prokde35 W1-32: add profile support for kontact, with global/user-specific profiles, and profile
+ import/export (671800)
+ - prokde35 w1-15 Show the delegator and delegate in the even preview.
+ ( related to kolab/issue1773 kolab/issue1774 kolab/issue1776) (670673).
+ - prokde35 w1-10 Show plugins which failed to load their part as disabled,
+and make them not selectable.(670822)
+ - prokde35 W1-19 (sync buttons): Add submenu with "All" and the single accounts, similar as in
+the check mail action
+ - Drag and drop notes - (662503)
+ - Implemented the ability to drag the current meeting time in the freebusy view, in order to visually
+ move the meeting to a spot where the attendees are free.(668059)
+ - Merge (mostly) hidden config options and their uses from proko2
+
+Bugfixes
+=========
+ - kolab/issue896 naming inconsistencies in Kontact, enterprise only so far (703752)
+ - kolab/issue1318 potential fix for crashes during filtering (703867)
+ - kolab/issue1743 retain the vacation file name through account editing (703997)
+ - kolab/issue1894 better initial name column width in the kmail folder tree (704165)
+ - kolab/issue1713 @ (at) sign in realname confuses kontact when creating appointments (704180)
+ - kolab/issue1882 Crash after reply to a revoked mail(700851)
+ - kolab/issue1815 convert KMHeaders::applyFiltersOnMsg to using serial numbers instead of message pointers [in the case not using action scheduler]. Speculative fix to Intevation issue #1815 (Filtering 1450 mails crashes kontact). ( 703867 )
+ - More comprehensible documentation of KMFolder and friends ( 703507 )
+ - kolab/issue1640 - Minimum sync-interval for kontact ( 703384 )
+ - bugs.kde.org - 77223, 85630, 111419 ( 700059 )
+ - bugs.kde.org - 144303 - When sending an encrypted message, with an empty body, and the
+ encryption key selection or encryption prefs selection dialogs were cancelled, mNewBodyPart was
+ deleted without ever having been initialised. Also init some other vars ASAP. (700035)
+ - kolab/issue1712 Update revision when adding new attendees.(663228)
+ - kolab/issue1672 Make sure to open the folder when saving a single message as well.(664661)
+ - Fix lack of double-quotes around folder name, making GEQUOTAROOT fail on folders with a space in the
+ name.(665276)
+ - Port the ability to add and remove subfolders from korganizer's resource view from proko2. (665274)
+ - kolab/issue1721 Don't exit when the popup menu is canceled.(665679)
+ - Allow to edit attachments of already existing messages.(668156)
+ - kolab/issue1642 kontact crashed after moving some events (670485)
+ - kolab/issue1738 (Kontact escapes part of content type of text/calendar messages, makes Outlook fail
+ to directly recognise invitations)
+ - kolab/issue864 prokde35 freebusy display takes internal or does not honor "nobody" annotation(
+ 669428)
+ - kolab/issue1759 (Dragging emails onto tasks does not enable reminders by default.)
+ - kolab/issue1766 prokde35 Kontact crashes after moving event in a free/busy list (TQListViewItem)
+ - kolab/issue1784 prokde35 Kontact sometimes crashes by creating a new event.
+ - kolab/issue1780 i18n of "Agenda View Calender Display" missing
+ - kolab/issue1773 (Delegate an event back to the organizator shows strange effects.)
+ - kolab/issue1769 (editing attachment of a new mail stops with couldn't write error)
+ - prokde35 issue1768 - Percentage symbol missing
+ - kolab/issue1529, start date is set correctly when recurrence date is set
+ - kolab/issue1792 (email duplication occurs when using client-side filters and disconnected imap)
+ - kolab/issue1786 (moving folder shows error message)
+ - kolab/issue1794 (kontact mail composer is missing a combobox to choose the encryption type)
+ - kolab/issue1760 (Cannot make reminders for emails if left icon bar is disabled.)
+ - kolab/issue1569 (Kontact sometimes doesn't allow dragging of encrypted messages)
+ - kolab/issue1763 (Kontact still believes imap quota is set after quota is removed)
+ - kolab/issue1803 crash after unsharing a folder.
+ - kolab/issue1844 ("Copy To" on a mail doesn't work for online IMAP to same server)
+ - kolab/issue1839 (Kontact crashes after opening two composer dialogs and switching between summary and notes)
+ - kolab/issue1715 (Other disconnected Imap folders good as sources for client filters.)
+ - kolab/issue1303 (Inform user when a folder gets unshared and move new items (prevent data loss))
+ - kolab/issue1846 (Kontact crashes by moving many folders)
+ - Make sure the crypto state is not restored from headers if there are no headers. (703234)
+ - b.k.o 118060 - Ensure that there is a KMMainWidget before showing the config dialog, as parts of the config
+ (identitydialog) depend on its existence. (668075)
+ - b.k.o 121863 - Prevent crash if folder can't be found.(668092)
+ - Fixes from 3.5 merges - b.k.o 131176, 102001, 143511, 143866, 144166, 48461, 93199, 128435,50462,
+ 133395,144347,91252,143237,131029,144779,79685,85539,125920,146585,143869,140549,147602,143230,140881
+
+
+Current release is "Enterprise - Snapshot-06"
+
+Features:
+=========
+
+
+korganizer
+-----------
+ - proko35 W-15 forwarding and delegation of iCal invitations
+ - proko35 W1-29 "attaching mails directly to events as either the full message or just the message body"
+
+Aegypten
+-------------
+ - aegypten/issue 370 - Add scrollbar so that the dialog doesn't become too big when gpgconf gives us many options to configure.
+ - aegypten/issue 735 - Support for the NO_CHANGE flag from gpgconf 2.0.3 (readonly widgets)
+
+Bugfixes
+========
+ - kolab/issue 1698 -Ignore denied invitations from not invited attendees.
+ - kolab/issue1706 (addressbook: real adress type is broken) - introducing bugs in the GUI due to outlook compatibility,
+
+
+Miscellaneous
+==============
+ - prokde W1-16: when exporting a secret key to a .p12 file, allow the user to select the encoding (charset) of the passphrase in the p12 file.
+ - proko35 W1-8 Fix for usability issues with changes to the currently selected item when LDAP results come in delayed.
+ - kolab/35- W1-10 Add the possibility to have disabled plugins shown grayed out in the sidebar.
+Configurable by non-gui option.
+
+
+"Enterprise - Snapshot-05"
+Features:
+=========
+
+kmail
+----------
+- proko35 W1-7 (cyclic section changes on tab and backtab keys in the addressee selection completion popup)
+- Better unit test and automated packaging infrastructure.
+
+Bugfixes
+=========
+- Honor default forwarding settings for the toolbar button, the search window RMB and the keyboard shortcuts (issue 1530)
+- Fix documentation related to issue 1530
+- Also change the font of cut messages in case the inactive color is to similar to the normal color.(issue 1180)
+
+
+
+"Enterprise - Snapshot-04"
+
+Features:
+=========
+
+kmail
+----------
+- proko35 W1-14 (automatic moving of not yet synced mails from folders with insufficient access rights to a lost+found folder)
+- Unit tests fixed.
+- Kolab/issue1530 - make preferred form of forwarding configurable
+
+Bugfixes
+=========
+- Fixes related to opening of *mbox files.
+- Aegypten/issue734 - Moving email in dimap breaks signature, because lines removed
+
+Korganizer
+-----------
+- proko35 W1-9 icon alignment was improved.
+
+Additional Fixes
+================
+- Rebranched libkcal and kitchensync.
+
+
+"Enterprise - Snapshot-03"
+Features:
+=========
+
+kmail
+----------
+- Kolab/Merge14/issue1095 -Add local subscription
+- Kolab/issue1206 - kolabziward quirks
+- Kolab/issue1207 - groupware folders only as local subscription still shows mails in inbox
+- proko35 W1-5: selectable scope when reindexing a dimap cache
+
+
+Bugfixes:
+=========
+- Kolab/issue1583 - Fixing OL compatibility with attachments that have umlauts in the filename.
+- Kolab/issue 1658 - Adding a warning for empty To : field
+- proko35 W1-1 - kontact discards signature settings when signature is deactivated
+
+
+
+"Enterprise - Snapshot-02"
+
+Features:
+=========
+
+kmail
+----------
+- Kolab/issue1385 - add/insert signature
+- kolab/issue1216 - porting semicolon as separator to enterprise.
+- kolab/issue1367 : Made ".mbox" as a default extension/filter while saving messages.
+
+Bugfixes:
+=========
+
+
+kmail
+----------
+- kolab/issue 1632 - kontact sometimes crashs by moving mails from the message find dialog to a folder
+- kolab/issue1384 - Don't allow base64 or qp encoding for message attachements, such
+as when forwarding.
+
+
+"Enterprise - Snapshot-01"
+
+Features:
+=========
+
+kmail
+----------
+
+- proko35 Task - W1-24, Kolab/issue 1180 - Copy/move folders ( related kolab/issues 1294 and 1317 )
+
+- proko35 Task - W1-2 , Ktnef
+
+- proko35 Task - W1-28, Search result DnD
+
+- Kolab/issue 1222 - Reduce the memory consumption. Improve speed.
+
+- IMAP Quota feature - Forward ports of r503566, r504908, r504943, r544380, r550654, r573761, r573797, r573829, and r503568 from proko2
+
+
+
+Bugfixes:
+=========
+
+general
+----------
+
+- Kolab/issue 1362 - PO Box in kolab format.
+
+
+kmail
+----------
+
+- Apply fix for KMAcctCachedImap::processNewMail's crash (r631934)
diff --git a/akregator/src/akregator.desktop b/akregator/src/akregator.desktop
index 394cf186..eb8952d3 100644
--- a/akregator/src/akregator.desktop
+++ b/akregator/src/akregator.desktop
@@ -28,7 +28,6 @@ GenericName[hu]=RSS hírolvasó
GenericName[is]=RSS fréttaforrit
GenericName[it]=Lettore Fonti RSS
GenericName[ja]=RSS ニュースリーダー
-GenericName[ka]=RSS კვების წამკითხველი
GenericName[kk]=RSS жаңалықтарын оқу
GenericName[km]=កម្មវិធី​អាន​មតិព័ត៌មាន RSS
GenericName[ko]=RSS 피드 리더
@@ -53,8 +52,7 @@ GenericName[sv]=Läsare av RSS-kanaler
GenericName[ta]=RSS பீஃட் வாசிப்பான்
GenericName[tr]=RSS Haber Kaynağı Okuyucu
GenericName[uk]=Програма для читання подач RSS
-GenericName[uz]=RSS yangiliklarni oʻquvchi
-GenericName[uz@cyrillic]=RSS янгиликларни ўқувчи
+GenericName[uz]=RSS янгиликларни ўқувчи
GenericName[zh_CN]=RSS 种子阅读器
GenericName[zh_TW]=RSS Feed 閱讀器
Comment=An RSS Aggregator for KDE
@@ -79,7 +77,6 @@ Comment[hu]=KDE-s hírolvasó RSS hírcsatornákhoz
Comment[is]=RSS fréttaforrit fyrir KDE
Comment[it]=Un concentratore KDE per RSS
Comment[ja]=KDE 用 RSS アグリゲータ
-Comment[ka]= RSS აგრეგატი KDE-სთვის
Comment[kk]=KDE-нің RSS жаңалық агрегаторы
Comment[km]=កម្មវិធី​អាន RSS សម្រាប់ KDE
Comment[ko]=KDE용 RSS 리더
@@ -102,8 +99,7 @@ Comment[sv]=En RSS-samlare för KDE
Comment[ta]=கேடியிக்கான ஒரு RSS சேர்ப்பான்
Comment[tr]=Bir KDE RSS Okuyucusu
Comment[uk]=Агрегатор RSS для KDE
-Comment[uz]=KDE uchun RSS yangiliklarni oʻquvchi
-Comment[uz@cyrillic]=KDE учун RSS янгиликларни ўқувчи
+Comment[uz]=KDE учун RSS янгиликларни ўқувчи
Comment[zh_CN]=KDE RSS 新闻收集器
Comment[zh_TW]=KDE 的 RSS 收集器
Terminal=false
diff --git a/akregator/src/akregator_plugin.desktop b/akregator/src/akregator_plugin.desktop
index 986515c0..9f8608bc 100644
--- a/akregator/src/akregator_plugin.desktop
+++ b/akregator/src/akregator_plugin.desktop
@@ -25,7 +25,6 @@ Comment[hu]=Akregator bővítőmodul
Comment[is]=Íforrit fyrir Akregator
Comment[it]=Plugin per Akregator
Comment[ja]=Akregator 用プラグイン
-Comment[ka]=Akregator-ის მოდული
Comment[kk]=Akregator-дың плагин модулі
Comment[km]=កម្មវិធី​ជំនួយ Akregator
Comment[ko]=Akregator 플러그인
@@ -49,8 +48,7 @@ Comment[sr@Latn]=Priključak za Akregator
Comment[sv]=Insticksprogram för Akregator
Comment[tr]=Akregator Eklentisi
Comment[uk]=Втулок для Akregator
-Comment[uz]=Akregator uchun plagin
-Comment[uz@cyrillic]=Akregator учун плагин
+Comment[uz]=Akregator учун плагин
Comment[zh_CN]=Akregator 插件
Comment[zh_TW]=Akregator 外掛程式
diff --git a/akregator/src/akregator_view.cpp b/akregator/src/akregator_view.cpp
index d238307d..8776ec12 100644
--- a/akregator/src/akregator_view.cpp
+++ b/akregator/src/akregator_view.cpp
@@ -225,7 +225,7 @@ View::View( Part *part, TQWidget *parent, ActionManagerImpl* actionManager, cons
setFocusPolicy(TQWidget::StrongFocus);
TQVBoxLayout *lt = new TQVBoxLayout( this );
-
+
m_horizontalSplitter = new TQSplitter(TQSplitter::Horizontal, this);
m_horizontalSplitter->setOpaqueResize(true);
@@ -260,7 +260,7 @@ View::View( Part *part, TQWidget *parent, ActionManagerImpl* actionManager, cons
connect(m_tagNodeListView, TQT_SIGNAL(signalContextMenu(KListView*, TreeNode*, const TQPoint&)), this, TQT_SLOT(slotFeedTreeContextMenu(KListView*, TreeNode*, const TQPoint&)));
-
+
ProgressManager::self()->setFeedList(m_feedList);
m_tabs = new TabWidget(m_horizontalSplitter);
@@ -321,8 +321,12 @@ View::View( Part *part, TQWidget *parent, ActionManagerImpl* actionManager, cons
connectFrame(m_mainFrame);
m_tabs->addFrame(m_mainFrame);
- m_horizontalSplitter->setSizes( Settings::splitter1Sizes() );
- m_articleSplitter->setSizes( Settings::splitter2Sizes() );
+ const TQValueList<int> sp1sizes = Settings::splitter1Sizes();
+ if ( sp1sizes.count() >= m_horizontalSplitter->sizes().count() )
+ m_horizontalSplitter->setSizes( sp1sizes );
+ const TQValueList<int> sp2sizes = Settings::splitter2Sizes();
+ if ( sp2sizes.count() >= m_articleSplitter->sizes().count() )
+ m_articleSplitter->setSizes( sp2sizes );
KConfig *conf = Settings::self()->config();
conf->setGroup("General");
@@ -374,7 +378,7 @@ void View::slotSettingsChanged()
{
// if tagging is hidden, show only feed list
m_listTabWidget->setViewMode(Settings::showTaggingGUI() ? ListTabWidget::verticalTabs : ListTabWidget::single);
-
+
}
void View::slotOnShutdown()
@@ -406,8 +410,12 @@ void View::slotOnShutdown()
void View::saveSettings()
{
- Settings::setSplitter1Sizes( m_horizontalSplitter->sizes() );
- Settings::setSplitter2Sizes( m_articleSplitter->sizes() );
+ const TQValueList<int> spl1 = m_horizontalSplitter->sizes();
+ if ( spl1.contains( 0 ) == 0 )
+ Settings::setSplitter1Sizes( spl1 );
+ const TQValueList<int> spl2 = m_articleSplitter->sizes();
+ if ( spl2.contains( 0 ) == 0 )
+ Settings::setSplitter2Sizes( spl2 );
Settings::setViewMode( m_viewMode );
Settings::writeConfig();
}
@@ -415,7 +423,7 @@ void View::saveSettings()
void View::slotOpenNewTab(const KURL& url, bool background)
{
PageViewer* page = new PageViewer(this, "page");
-
+
connect( m_part, TQT_SIGNAL(signalSettingsChanged()), page, TQT_SLOT(slotPaletteOrFontChanged()));
connect( page, TQT_SIGNAL(setTabIcon(const TQPixmap&)),
@@ -822,7 +830,7 @@ void View::slotOpenURL(const KURL& url, Viewer* currentViewer, BrowserRun::Openi
else
{
KParts::URLArgs args = currentViewer ? currentViewer->browserExtension()->urlArgs() : KParts::URLArgs();
-
+
BrowserRun* r = new BrowserRun(this, currentViewer, url, args, mode);
connect(r, TQT_SIGNAL(signalOpenInViewer(const KURL&, Akregator::Viewer*, Akregator::BrowserRun::OpeningMode)),
this, TQT_SLOT(slotOpenURLReply(const KURL&, Akregator::Viewer*, Akregator::BrowserRun::OpeningMode)));
@@ -832,7 +840,7 @@ void View::slotOpenURL(const KURL& url, Viewer* currentViewer, BrowserRun::Openi
//TODO: KDE4 remove this ugly ugly hack
void View::slotUrlClickedInViewer(const KURL& url, Viewer* viewer, bool newTab, bool background)
{
-
+
if (!newTab)
{
slotOpenURL(url, viewer, BrowserRun::CURRENT_TAB);
@@ -983,7 +991,7 @@ void View::slotNextUnreadArticle()
{
if (m_viewMode == CombinedView)
m_listTabWidget->activeView()->slotNextUnreadFeed();
-
+
TreeNode* sel = m_listTabWidget->activeView()->selectedNode();
if (sel && sel->unread() > 0)
m_articleList->slotNextUnreadArticle();
@@ -995,7 +1003,7 @@ void View::slotPrevUnreadArticle()
{
if (m_viewMode == CombinedView)
m_listTabWidget->activeView()->slotPrevUnreadFeed();
-
+
TreeNode* sel = m_listTabWidget->activeView()->selectedNode();
if (sel && sel->unread() > 0)
m_articleList->slotPreviousUnreadArticle();
@@ -1211,8 +1219,8 @@ void View::slotOpenCurrentArticle()
link = article.link();
else if (article.guidIsPermaLink())
link = KURL(article.guid());
-
- if (link.isValid())
+
+ if (link.isValid())
{
slotOpenURL(link, 0L, BrowserRun::NEW_TAB_FOREGROUND);
}
@@ -1236,8 +1244,8 @@ void View::slotOpenCurrentArticleBackgroundTab()
link = article.link();
else if (article.guidIsPermaLink())
link = KURL(article.guid());
-
- if (link.isValid())
+
+ if (link.isValid())
{
slotOpenURL(link, 0L, BrowserRun::NEW_TAB_BACKGROUND);
}
@@ -1307,7 +1315,7 @@ void View::slotArticleDelete()
msg = i18n("<qt>Are you sure you want to delete article <b>%1</b>?</qt>").arg(TQStyleSheet::escape(articles.first().title()));
break;
default:
- msg = i18n("<qt>Are you sure you want to delete the selected article?</qt>",
+ msg = i18n("<qt>Are you sure you want to delete the selected article?</qt>",
"<qt>Are you sure you want to delete the %n selected articles?</qt>",
articles.count());
}
@@ -1386,7 +1394,7 @@ void View::slotTextToSpeechRequest()
else
{
TQString selectedText = static_cast<PageViewer *>(m_currentFrame->part())->selectedText();
-
+
if (!selectedText.isEmpty())
SpeechClient::self()->slotSpeak(selectedText, "en");
}
@@ -1439,7 +1447,7 @@ void View::slotMouseOverInfo(const KFileItem *kifi)
void View::readProperties(KConfig* config)
{
-
+
if (!Settings::resetQuickFilterOnNodeChange())
{
m_searchBar->slotSetText(config->readEntry("searchLine"));
@@ -1447,7 +1455,7 @@ void View::readProperties(KConfig* config)
if (statusfilter != -1)
m_searchBar->slotSetStatus(statusfilter);
}
-
+
int selectedID = config->readNumEntry("selectedNodeID", -1);
if (selectedID != -1)
{
@@ -1471,7 +1479,7 @@ void View::saveProperties(KConfig* config)
// save filter settings
config->writeEntry("searchLine", m_searchBar->text());
config->writeEntry("searchCombo", m_searchBar->status());
-
+
TreeNode* sel = m_listTabWidget->activeView()->selectedNode();
if (sel)
diff --git a/akregator/src/eventsrc b/akregator/src/eventsrc
index 3be7516a..6615ce17 100644
--- a/akregator/src/eventsrc
+++ b/akregator/src/eventsrc
@@ -29,7 +29,6 @@ Name[hu]=Hírforrás felvéve
Name[is]=Straum bætt við
Name[it]=Aggiunta fonte
Name[ja]=フィード追加
-Name[ka]=დამატებულია კვება
Name[kk]=Қор қосылды
Name[km]=បាន​បន្ថែម​មតិព័ត៌មាន
Name[ko]=피드 추가됨
@@ -53,8 +52,7 @@ Name[sv]=Kanal tillagd
Name[ta]=பீஃட் சேர்க்கப்பட்டது
Name[tr]=Haber kaynağı eklendi
Name[uk]=Подачу додано
-Name[uz]=Yangiliklar tasmasi qoʻshildi
-Name[uz@cyrillic]=Янгиликлар тасмаси қўшилди
+Name[uz]=Янгиликлар тасмаси қўшилди
Name[zh_CN]=添加了新闻源
Name[zh_TW]=已加入 Feed
Comment=A new feed was remotely added to Akregator
@@ -78,7 +76,6 @@ Comment[hu]=Egy hírforrást távolról felvettek az Akregatorba
Comment[is]=Nýjum straum var bætt við Akregator
Comment[it]=Una nuova fonte è stata aggiunta ad Akregator da remoto
Comment[ja]=新規フィードがリモートで Akregator に追加されました
-Comment[ka]=Akregator-ის სიას დისტანციურად ახალი კვება დაემატა
Comment[kk]=Akregator-ға қашықтан жаңа қор қосылды
Comment[km]=បាន​បន្ថែម​មតិព័ត៌មាន​ថ្មី​មួយ​ពី​ចម្ងាយ​ទៅ Akregator
Comment[ko]=Akregator에 피드가 원격으로 추가됨
@@ -102,8 +99,7 @@ Comment[sv]=En ny kanal har lagts till i aKregator utifrån
Comment[ta]=Akregatorக்கு ஒரு புதிய உள்ளீடு சேர்க்கப்பட்டது
Comment[tr]=Akregator'a yeni bir haber kaynağı eklendi
Comment[uk]=Нову подачу було віддалено додано до Akregator
-Comment[uz]=Akregator dasturiga yangi yangiliklar tasmasi qoʻshildi
-Comment[uz@cyrillic]=Akregator дастурига янги янгиликлар тасмаси қўшилди
+Comment[uz]=Akregator дастурига янги янгиликлар тасмаси қўшилди
Comment[zh_CN]=新闻源远程添加进了 Akregator
Comment[zh_TW]=已從遠端加入新的 feed 到 Akregator
default_presentation=4
@@ -135,7 +131,6 @@ Name[hu]=Hírekk
Name[is]=Nýjar greinar
Name[it]=Nuovi articoli
Name[ja]=新規記事
-Name[ka]=ახალი სტატიები
Name[kk]=Жаңа мақалалар
Name[km]=អត្ថបទ​ថ្មី
Name[ko]=새 글
@@ -160,8 +155,7 @@ Name[sv]=Nya artiklar
Name[ta]= புதிய செய்திகள்
Name[tr]=Yeni Haberler
Name[uk]=Нові статті
-Name[uz]=Yangi maqolalar
-Name[uz@cyrillic]=Янги мақолалар
+Name[uz]=Янги мақолалар
Name[zh_CN]=新闻文章
Name[zh_TW]=新文章
Comment=New articles were fetched
@@ -188,7 +182,6 @@ Comment[hu]=Új hírek lettek letöltve
Comment[is]=Nýjar greinar voru sóttar
Comment[it]=I nuovi articoli sono stati recuperati
Comment[ja]=新規記事を取得しました
-Comment[ka]=მიღებულია ახალი სტატიები
Comment[kk]=Жаңа мақалалар қабылданды
Comment[km]=បាន​ប្រមូល​អត្ថបទ​ថ្មី
Comment[ko]=새 글을 가져옴
diff --git a/akregator/src/mk4storage/akregator_mk4storage_plugin.desktop b/akregator/src/mk4storage/akregator_mk4storage_plugin.desktop
index c7d899a7..1e63cfc0 100644
--- a/akregator/src/mk4storage/akregator_mk4storage_plugin.desktop
+++ b/akregator/src/mk4storage/akregator_mk4storage_plugin.desktop
@@ -21,7 +21,6 @@ Name[hu]=Metakit tároló
Name[is]=Metakit geymslu bakendi
Name[it]=Backend archiviazione metakit
Name[ja]=メタキットストレージバックエンド
-Name[ka]=Metakit მეხსიერების ბუფერი
Name[kk]=Metakit архивтеу бағдарламасы
Name[km]=កម្មវិធី​ខាង​ក្រោយ​សម្រាប់​រក្សាទុក (Metakit)
Name[ko]=Metakit 저장소 백엔드
@@ -69,7 +68,6 @@ Comment[hu]=Akregator bővítőmodul
Comment[is]=Íforrit fyrir Akregator
Comment[it]=Plugin per Akregator
Comment[ja]=Akregator 用プラグイン
-Comment[ka]=Akregator-ის მოდული
Comment[kk]=Akregator-дың плагин модулі
Comment[km]=កម្មវិធី​ជំនួយ Akregator
Comment[ko]=Akregator 플러그인
@@ -93,8 +91,7 @@ Comment[sr@Latn]=Priključak za Akregator
Comment[sv]=Insticksprogram för Akregator
Comment[tr]=Akregator Eklentisi
Comment[uk]=Втулок для Akregator
-Comment[uz]=Akregator uchun plagin
-Comment[uz@cyrillic]=Akregator учун плагин
+Comment[uz]=Akregator учун плагин
Comment[zh_CN]=Akregator 插件
Comment[zh_TW]=Akregator 外掛程式
ServiceTypes=Akregator/Plugin
diff --git a/certmanager/certmanager.cpp b/certmanager/certmanager.cpp
index f12411bf..c078315b 100644
--- a/certmanager/certmanager.cpp
+++ b/certmanager/certmanager.cpp
@@ -889,7 +889,8 @@ void CertManager::slotDirmngrExited() {
This slot will import CRLs from a file.
*/
void CertManager::importCRLFromFile() {
- TQString filter = TQString("*.crl *.arl *-crl.der *-arl.der|") + i18n("Certificate Revocation List (*.crl *.arl *-crl.der *-arl.der)");
+ // loadcrl can only work with DER encoded files (verified with dirmngr 1.0.3)
+ TQString filter = TQString("*.crl *.arl *-crl.der *-arl.der|") + i18n("Certificate Revocation List, DER encoded (*.crl *.arl *-crl.der *-arl.der)");
KURL url = KFileDialog::getOpenURL( TQString::null,
filter,
this,
@@ -1277,9 +1278,11 @@ void CertManager::slotCertificateExportResult( const GpgME::Error & err, const T
void CertManager::slotExportSecretKey() {
Kleo::KeySelectionDialog dlg( i18n("Secret Key Export"),
- i18n("Select the secret key to export "
+ "<qt>" +
+ i18n("Select the secret key to export "
"(<b>Warning: The PKCS#12 format is insecure; "
- "exporting secret keys is discouraged</b>):"),
+ "exporting secret keys is discouraged</b>):") +
+ "</qt>",
std::vector<GpgME::Key>(),
Kleo::KeySelectionDialog::SecretKeys|Kleo::KeySelectionDialog::SMIMEKeys,
false /* no multiple selection */,
diff --git a/certmanager/conf/kleopatra_config_appear.desktop b/certmanager/conf/kleopatra_config_appear.desktop
index 8cbeaecf..fa6fa6ba 100644
--- a/certmanager/conf/kleopatra_config_appear.desktop
+++ b/certmanager/conf/kleopatra_config_appear.desktop
@@ -40,7 +40,6 @@ Name[hu]=Megjelenés
Name[is]=Útlit
Name[it]=Aspetto
Name[ja]=外観
-Name[ka]=იერსახე
Name[kk]=Сыртқы көрінісі
Name[km]=រូបរាង
Name[ko]=모양
@@ -67,8 +66,7 @@ Name[ta]=தோற்றம்
Name[tg]=Намуди зоҳирӣ
Name[tr]=Görünüm
Name[uk]=Вигляд
-Name[uz]=Koʻrinishi
-Name[uz@cyrillic]=Кўриниши
+Name[uz]=Кўриниши
Name[zh_CN]=外观
Comment=Colors & Fonts Configuration
Comment[af]=Kleur en skrif tipe opstelling
@@ -97,7 +95,6 @@ Comment[hu]=A színek és betűtípusok beállítása
Comment[is]=Stilling lita & leturgerða
Comment[it]=Configurazione tipi di carattere e colori
Comment[ja]=色とフォントの設定
-Comment[ka]=ფერთა და შრიფტთა კონფიგურაცია
Comment[kk]=Түс & Қаріп параметрлері
Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​ពណ៌ & ពុម្ពអក្សរ
Comment[ko]=색과 글꼴 설정
@@ -153,7 +150,6 @@ Keywords[hu]=szín,betűtípus,beállítások
Keywords[is]=litir,letur, stillingar
Keywords[it]=colori, font, caratteri, configurazione
Keywords[ja]=色,フォント,設定
-Keywords[ka]=ფერები,შრიფტები, კონფიგურაცია
Keywords[km]=ពណ៌,ពុម្ពអក្សរ,ការ​កំណត់​រចនាសម្ព័ន្ធ
Keywords[ko]=색,글꼴,설정
Keywords[lt]=color,font, configuration, spalvų, šriftų konfigūravimas
diff --git a/certmanager/conf/kleopatra_config_dirserv.desktop b/certmanager/conf/kleopatra_config_dirserv.desktop
index 7a50a7c4..9153b003 100644
--- a/certmanager/conf/kleopatra_config_dirserv.desktop
+++ b/certmanager/conf/kleopatra_config_dirserv.desktop
@@ -27,7 +27,7 @@ Name[et]=Kataloogiteenused
Name[eu]=Direktorio zerbitzuak
Name[fa]=خدمات فهرست راهنما
Name[fi]=Hakemistopalvelut
-Name[fr]=Services d'annuaire
+Name[fr]=Services de répertoires
Name[fy]=Maptsjinsten
Name[ga]=Seirbhísí Eolaire
Name[gl]=Servicios de Directorio
@@ -36,7 +36,6 @@ Name[hu]=Címtárszolgáltatások
Name[is]=Nafnaþjónustur
Name[it]=Servizi Directory
Name[ja]=ディレクトリサービス
-Name[ka]=საცნობარო მომსახურება
Name[kk]=Каталог қызметтері
Name[km]=សេវា​ថត
Name[ko]=디렉터리 서비스
@@ -80,7 +79,7 @@ Comment[et]=LDAP kataloogiteenuste seadistused
Comment[eu]=LDAP direktorio zerbitzuen konfigurazioa
Comment[fa]=پیکربندی خدمات فهرست راهنمای LDAP
Comment[fi]=Hakemistopalveluiden asetukset
-Comment[fr]=Configuration des services d'annuaire LDAP
+Comment[fr]=Configuration des répertoires LDAP
Comment[fy]=Konfiguraasje foar LDAP-tsjinsten
Comment[gl]=Configuración dos servicios de directorio LDAP
Comment[he]=תצורה של שירותי ספרייה עבור LDAP
@@ -88,7 +87,6 @@ Comment[hu]=Az LDAP címtárszolgáltatások beállításai
Comment[is]=Stillingar LDAP uppflettingaþjónustunnar
Comment[it]=Configurazione servizi LDAP
Comment[ja]=LDAP ディレクトリサービスの設定
-Comment[ka]=LDAP საცნობარო მომსახურების კონფიგურაცია
Comment[kk]=LDAP каталог қызметтер параметрлері
Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​របស់​សេវា​ថត LDAP
Comment[ko]=LDAP 디렉터리 서비스 설정
@@ -133,7 +131,7 @@ Keywords[et]=ldap,kataloog,teenused
Keywords[eu]=Idap, direktorio, zerbitzuak
Keywords[fa]=ldap، فهرست راهنما، خدمات
Keywords[fi]=ldap,hakemisto,palvelut
-Keywords[fr]=ldap,annuaire,annuaires,service,services
+Keywords[fr]=ldap,dossier,dossiers,service,services
Keywords[fy]=ldap,directory,services,triemtafel,tsjinsten
Keywords[ga]=ldap,eolaire,seirbhísí
Keywords[gl]=ldap,directorio,servicios
@@ -142,7 +140,6 @@ Keywords[hu]=ldap,címtár,szolgáltatások
Keywords[is]=ldap,directory,services,nafnaþjónusta
Keywords[it]=ldap, servizi, directory
Keywords[ja]=ldap,ディレクトリ,サービス
-Keywords[ka]=ldap,ცნობარი,მომსახურება
Keywords[km]=ldap,ថត,សេវា
Keywords[ko]=ldap,디렉터리,서비스
Keywords[lt]=ldap,directory,services,aplankai,tarnybos
@@ -152,7 +149,7 @@ Keywords[nb]=ldap,mappe,tjenester
Keywords[nds]=LDAP,Verteken,Deensten
Keywords[ne]=ldap,डाइरेक्टरी,कार्य
Keywords[nn]=ldap,katalog,tenester
-Keywords[pl]=katalog,usługi katalogowe,usługi,LDAP
+Keywords[pl]=ldap,katalog,usługi katalogowe,usługi,LDAP
Keywords[pt]=ldap,directório,serviços
Keywords[pt_BR]=ldap,diretório,serviços
Keywords[ru]=LDAP,службы каталогов
diff --git a/certmanager/conf/kleopatra_config_dnorder.desktop b/certmanager/conf/kleopatra_config_dnorder.desktop
index dc46c331..a14ffb3c 100644
--- a/certmanager/conf/kleopatra_config_dnorder.desktop
+++ b/certmanager/conf/kleopatra_config_dnorder.desktop
@@ -34,7 +34,6 @@ Name[hu]=DN-attribútumsorrend
Name[is]=DN eiginleikaröðun
Name[it]=Attributi DN, ordine
Name[ja]=DN 属性順位
-Name[ka]=DN ატრიბუტთა რიგი
Name[kk]=DN-атрибуттер реті
Name[km]=លំដាប់​គុណលក្ខណៈ DN
Name[ko]=DN 분배 순서
@@ -85,7 +84,6 @@ Comment[hu]=A DN-attribútumok megjelenítési sorrendjének beállítása
Comment[is]=Stilla röð DN eiginleikanna
Comment[it]=Configura l'ordine in cui sono mostrati gli attributi DN
Comment[ja]=DN 属性を表示する順位を設定
-Comment[ka]=DN ატრიბუტთა ჩვენების რიგის კონფიგურაცია
Comment[kk]=DN атрибуттерді көрсету ретін баптау
Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​លំដាប់ ដែល​ត្រូវ​បង្ហាញ​គុណលក្ខណៈ DN
Comment[lt]=Konfigūruoti DN savybių rodymo tvarką
@@ -137,7 +135,6 @@ Keywords[hu]=DN,sorrend,RDN,attribútum
Keywords[is]=DN,röð,order,RDN,attribute
Keywords[it]=DN,ordine,RDN,attributi
Keywords[ja]=DN,順位,RDN,属性
-Keywords[ka]=DN,რიგი,RDN,ატრიბუტი
Keywords[km]=DN,លំដាប់,RDN,គុណលក្ខណៈ
Keywords[lt]=DN,order,RDN,attribute,savybė,tvarka
Keywords[mk]=DN,order,RDN,attribute,редослед,атрибут
diff --git a/certmanager/lib/backends/qgpgme/qgpgmecryptoconfig.cpp b/certmanager/lib/backends/qgpgme/qgpgmecryptoconfig.cpp
index c6780050..ae45d683 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmecryptoconfig.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmecryptoconfig.cpp
@@ -447,6 +447,13 @@ TQVariant QGpgMECryptoConfigEntry::stringToValue( const TQString& str, bool unes
bool isString = isStringType();
if ( isList() ) {
+ if ( argType() == ArgType_None ) {
+ bool ok = true;
+ const TQVariant v = str.isEmpty() ? 0U : str.toUInt( &ok ) ;
+ if ( !ok )
+ kdWarning(5150) << "list-of-none should have an unsigned int as value:" << str << endl;
+ return v;
+ }
TQValueList<TQVariant> lst;
TQStringList items = TQStringList::split( ',', str );
for( TQStringList::const_iterator valit = items.begin(); valit != items.end(); ++valit ) {
@@ -657,7 +664,10 @@ void QGpgMECryptoConfigEntry::resetToDefault()
if ( mFlags & GPGCONF_FLAG_DEFAULT )
mValue = mDefaultValue;
else if ( mArgType == ArgType_None )
- mValue = false;
+ if ( isList() )
+ mValue = 0U;
+ else
+ mValue = false;
}
void QGpgMECryptoConfigEntry::setBoolValue( bool b )
@@ -715,7 +725,9 @@ void QGpgMECryptoConfigEntry::setNumberOfTimesSet( unsigned int i )
{
Q_ASSERT( mArgType == ArgType_None );
Q_ASSERT( isList() );
- setUIntValue( i );
+ mValue = i;
+ mSet = i > 0;
+ mDirty = true;
}
void QGpgMECryptoConfigEntry::setStringValueList( const TQStringList& lst )
diff --git a/certmanager/lib/backends/qgpgme/qgpgmedecryptjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmedecryptjob.cpp
index 692efa32..15d3246f 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmedecryptjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmedecryptjob.cpp
@@ -85,7 +85,10 @@ GpgME::DecryptionResult Kleo::QGpgMEDecryptJob::exec( const TQByteArray & cipher
}
void Kleo::QGpgMEDecryptJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mCtx->decryptionResult(), mOutDataDataProvider->data() );
+ const GpgME::DecryptionResult res = mCtx->decrypt( *mInData, *mOutData );
+ const TQByteArray plainText = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( res, plainText );
}
#include "qgpgmedecryptjob.moc"
diff --git a/certmanager/lib/backends/qgpgme/qgpgmedecryptverifyjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmedecryptverifyjob.cpp
index 68f67d0f..a14e7e18 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmedecryptverifyjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmedecryptverifyjob.cpp
@@ -87,9 +87,11 @@ Kleo::QGpgMEDecryptVerifyJob::exec( const TQByteArray & cipherText, TQByteArray
}
void Kleo::QGpgMEDecryptVerifyJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mCtx->decryptionResult(),
- mCtx->verificationResult(),
- mOutDataDataProvider->data() );
+ const GpgME::DecryptionResult dr = mCtx->decryptionResult();
+ const GpgME::VerificationResult vr = mCtx->verificationResult();
+ const TQByteArray plainText = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( dr, vr, plainText );
}
#include "qgpgmedecryptverifyjob.moc"
diff --git a/certmanager/lib/backends/qgpgme/qgpgmedeletejob.cpp b/certmanager/lib/backends/qgpgme/qgpgmedeletejob.cpp
index c06907ee..3665ee66 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmedeletejob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmedeletejob.cpp
@@ -64,6 +64,7 @@ GpgME::Error Kleo::QGpgMEDeleteJob::start( const GpgME::Key & key, bool allowSec
}
void Kleo::QGpgMEDeleteJob::doOperationDoneEvent( const GpgME::Error & error ) {
+ getAuditLog();
emit result( error );
}
diff --git a/certmanager/lib/backends/qgpgme/qgpgmedownloadjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmedownloadjob.cpp
index 364e8f9f..979a8549 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmedownloadjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmedownloadjob.cpp
@@ -72,7 +72,9 @@ GpgME::Error Kleo::QGpgMEDownloadJob::start( const TQStringList & pats ) {
}
void Kleo::QGpgMEDownloadJob::doOperationDoneEvent( const GpgME::Error & error ) {
- emit result( error, mOutDataDataProvider->data() );
+ const TQByteArray data = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( error, data );
}
#include "qgpgmedownloadjob.moc"
diff --git a/certmanager/lib/backends/qgpgme/qgpgmeencryptjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmeencryptjob.cpp
index ddd51717..a6a380b0 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmeencryptjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmeencryptjob.cpp
@@ -97,7 +97,10 @@ GpgME::EncryptionResult Kleo::QGpgMEEncryptJob::exec( const std::vector<GpgME::K
}
void Kleo::QGpgMEEncryptJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mResult = mCtx->encryptionResult(), mOutDataDataProvider->data() );
+ mResult = mCtx->encryptionResult();
+ const TQByteArray ciphertext = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( mResult, ciphertext );
}
void Kleo::QGpgMEEncryptJob::showErrorDialog( TQWidget * parent, const TQString & caption ) const {
diff --git a/certmanager/lib/backends/qgpgme/qgpgmeexportjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmeexportjob.cpp
index c31074af..16e5fb77 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmeexportjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmeexportjob.cpp
@@ -72,7 +72,9 @@ GpgME::Error Kleo::QGpgMEExportJob::start( const TQStringList & pats ) {
}
void Kleo::QGpgMEExportJob::doOperationDoneEvent( const GpgME::Error & error ) {
- emit result( error, mOutDataDataProvider->data() );
+ const TQByteArray data = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( error, data );
}
#include "qgpgmeexportjob.moc"
diff --git a/certmanager/lib/backends/qgpgme/qgpgmeimportjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmeimportjob.cpp
index 7c698e7e..80792161 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmeimportjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmeimportjob.cpp
@@ -75,11 +75,15 @@ GpgME::Error Kleo::QGpgMEImportJob::start( const TQByteArray & keyData ) {
GpgME::ImportResult Kleo::QGpgMEImportJob::exec( const TQByteArray & keyData ) {
setup( keyData );
- return mCtx->importKeys( *mInData );
+ const GpgME::ImportResult res = mCtx->importKeys( *mInData );
+ getAuditLog();
+ return res;
}
void Kleo::QGpgMEImportJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mCtx->importResult() );
+ const GpgME::ImportResult res = mCtx->importResult();
+ getAuditLog();
+ emit result( res );
}
diff --git a/certmanager/lib/backends/qgpgme/qgpgmejob.cpp b/certmanager/lib/backends/qgpgme/qgpgmejob.cpp
index 72f9f77f..6d7ae5b4 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmejob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmejob.cpp
@@ -236,21 +236,19 @@ void Kleo::QGpgMEJob::createOutData() {
static const unsigned int GetAuditLogFlags = GpgME::Context::AuditLogWithHelp|GpgME::Context::HtmlAuditLog;
-static TQString audit_log_as_html( GpgME::Context * ctx ) {
- if ( !ctx )
- return TQString();
+static TQString audit_log_as_html( GpgME::Context * ctx, GpgME::Error & err ) {
+ assert( ctx );
QGpgME::QByteArrayDataProvider dp;
GpgME::Data data( &dp );
assert( !data.isNull() );
- if ( const GpgME::Error err = ctx->getAuditLog( data, GetAuditLogFlags ) )
+ if ( ( err = ctx->getAuditLog( data, GetAuditLogFlags ) ) )
return TQString();
- else
- return TQString::fromUtf8( dp.data().data() );
+ const TQByteArray ba = dp.data();
+ return TQString::fromUtf8( ba.data(), ba.size() );
}
void Kleo::QGpgMEJob::doSlotOperationDoneEvent( GpgME::Context * context, const GpgME::Error & e ) {
if ( context == mCtx ) {
- getAuditLog();
doEmitDoneSignal();
doOperationDoneEvent( e );
mThis->deleteLater();
@@ -258,7 +256,9 @@ void Kleo::QGpgMEJob::doSlotOperationDoneEvent( GpgME::Context * context, const
}
void Kleo::QGpgMEJob::getAuditLog() {
- mAuditLogAsHtml = audit_log_as_html( mCtx );
+ if ( !mCtx )
+ return;
+ mAuditLogAsHtml = audit_log_as_html( mCtx, mAuditLogError );
}
void Kleo::QGpgMEJob::doSlotCancel() {
diff --git a/certmanager/lib/backends/qgpgme/qgpgmejob.h b/certmanager/lib/backends/qgpgme/qgpgmejob.h
index 984bed44..0681c165 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmejob.h
+++ b/certmanager/lib/backends/qgpgme/qgpgmejob.h
@@ -37,6 +37,7 @@
#include <gpgmepp/interfaces/passphraseprovider.h>
#include <gpgmepp/key.h>
+#include <gpgmepp/context.h>
#include <tqcstring.h>
#include <tqstring.h>
@@ -45,8 +46,6 @@
#include <kdepimmacros.h>
namespace GpgME {
- class Error;
- class Context;
class Data;
}
@@ -120,6 +119,7 @@ namespace Kleo {
virtual void doEmitDoneSignal() = 0;
void doSlotCancel();
TQString auditLogAsHtml() const { return mAuditLogAsHtml; }
+ GpgME::Error auditLogError() const { return mAuditLogError; }
private:
/*! \reimp from GpgME::ProgressProvider */
@@ -146,6 +146,7 @@ namespace Kleo {
unsigned int mNumPatterns;
unsigned int mChunkSize;
unsigned int mPatternStartIndex, mPatternEndIndex;
+ GpgME::Error mAuditLogError;
TQString mAuditLogAsHtml;
};
@@ -154,7 +155,7 @@ namespace Kleo {
#define make_slot_cancel private: void slotCancel() { QGpgMEJob::doSlotCancel(); }
#define make_progress_emitter private: void doEmitProgressSignal( const TQString & what, int cur, int tot ) { emit progress( what, cur, tot ); }
#define make_done_emitter private: void doEmitDoneSignal() { emit done(); }
-#define make_auditLogAsHtml private: TQString auditLogAsHtml() const { return QGpgMEJob::auditLogAsHtml(); }
+#define make_auditLogAsHtml private: TQString auditLogAsHtml() const { return QGpgMEJob::auditLogAsHtml(); } GpgME::Error auditLogError() const { return QGpgMEJob::auditLogError(); }
#define QGPGME_JOB make_slot_cancel make_progress_emitter make_done_emitter make_auditLogAsHtml
#endif // __KLEO_QGPGMEJOB_H__
diff --git a/certmanager/lib/backends/qgpgme/qgpgmekeygenerationjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmekeygenerationjob.cpp
index b226d649..16e13134 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmekeygenerationjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmekeygenerationjob.cpp
@@ -80,7 +80,10 @@ GpgME::Error Kleo::QGpgMEKeyGenerationJob::start( const TQString & parameters )
}
void Kleo::QGpgMEKeyGenerationJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mCtx->keyGenerationResult(), mPubKeyDataProvider ? mPubKeyDataProvider->data() : TQByteArray() );
+ const GpgME::KeyGenerationResult res = mCtx->keyGenerationResult();
+ const TQByteArray data = mPubKeyDataProvider ? mPubKeyDataProvider->data() : TQByteArray() ;
+ getAuditLog();
+ emit result( res, data );
}
#include "qgpgmekeygenerationjob.moc"
diff --git a/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.cpp
index 9e663e92..b07135f0 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.cpp
@@ -48,6 +48,7 @@
#include <kdebug.h>
#include <tqstringlist.h>
+#include <tqtimer.h>
#include <algorithm>
@@ -97,6 +98,10 @@ GpgME::Error Kleo::QGpgMEKeyListJob::start( const TQStringList & pats, bool secr
kdDebug(5150) << "QGpgMEKeyListJob::start(): retrying keylisting with chunksize " << chunkSize() << endl;
continue;
}
+ } else if ( err.code() == GPG_ERR_EOF ) {
+ kdDebug(5150) << "QGpgMEKeyListJob::start(): early end of keylisting, trying to fake an empty result" << endl;
+ TQTimer::singleShot( 10, this, TQT_SLOT(slotFakeOperationDoneEvent()) );
+ return GpgME::Error();
}
deleteLater();
mResult = GpgME::KeyListResult( 0, err );
@@ -158,6 +163,17 @@ void Kleo::QGpgMEKeyListJob::slotNextKeyEvent( GpgME::Context * context, const G
emit nextKey( key );
}
+void Kleo::QGpgMEKeyListJob::slotFakeOperationDoneEvent() {
+ const GpgME::KeyListResult res = mCtx->keyListResult();
+ if ( !res.error().code() == GPG_ERR_EOF )
+ kdDebug(5150) << "QGpgMEKeyListJob::slotFakeOperationDoneEvent: expected EOF, got "
+ << res.error().asString() << endl;
+ mResult = GpgME::KeyListResult();
+ emit done();
+ emit result( mResult );
+ deleteLater();
+}
+
void Kleo::QGpgMEKeyListJob::slotOperationDoneEvent( GpgME::Context * context, const GpgME::Error & ) {
if ( context != mCtx )
return;
diff --git a/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.h b/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.h
index 0bc84c08..38864107 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.h
+++ b/certmanager/lib/backends/qgpgme/qgpgmekeylistjob.h
@@ -65,6 +65,7 @@ namespace Kleo {
private slots:
void slotNextKeyEvent( GpgME::Context * context, const GpgME::Key & key );
void slotOperationDoneEvent( GpgME::Context * context, const GpgME::Error & e );
+ void slotFakeOperationDoneEvent();
private:
void doOperationDoneEvent( const GpgME::Error &) {} // unused, we implement slotOperationDoneEvent ourselves.
diff --git a/certmanager/lib/backends/qgpgme/qgpgmesignencryptjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmesignencryptjob.cpp
index bc05eb86..9a469001 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmesignencryptjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmesignencryptjob.cpp
@@ -109,7 +109,9 @@ Kleo::QGpgMESignEncryptJob::exec( const std::vector<GpgME::Key> & signers,
void Kleo::QGpgMESignEncryptJob::doOperationDoneEvent( const GpgME::Error & ) {
mResult.first = mCtx->signingResult();
mResult.second = mCtx->encryptionResult();
- emit result( mResult.first, mResult.second, mOutDataDataProvider->data() );
+ const TQByteArray cipherText = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( mResult.first, mResult.second, cipherText );
}
void Kleo::QGpgMESignEncryptJob::showErrorDialog( TQWidget * parent, const TQString & caption ) const {
diff --git a/certmanager/lib/backends/qgpgme/qgpgmesignjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmesignjob.cpp
index 0042d6a3..01ae8a91 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmesignjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmesignjob.cpp
@@ -102,7 +102,10 @@ GpgME::SigningResult Kleo::QGpgMESignJob::exec( const std::vector<GpgME::Key> &
}
void Kleo::QGpgMESignJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mResult = mCtx->signingResult(), mOutDataDataProvider->data() );
+ mResult = mCtx->signingResult();
+ const TQByteArray signature = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( mResult, signature );
}
void Kleo::QGpgMESignJob::showErrorDialog( TQWidget * parent, const TQString & caption ) const {
diff --git a/certmanager/lib/backends/qgpgme/qgpgmeverifydetachedjob.cpp b/certmanager/lib/backends/qgpgme/qgpgmeverifydetachedjob.cpp
index b1022f61..41fa4849 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmeverifydetachedjob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmeverifydetachedjob.cpp
@@ -89,7 +89,9 @@ GpgME::VerificationResult Kleo::QGpgMEVerifyDetachedJob::exec( const TQByteArray
}
void Kleo::QGpgMEVerifyDetachedJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mCtx->verificationResult() );
+ const GpgME::VerificationResult res = mCtx->verificationResult();
+ getAuditLog();
+ emit result( res );
}
diff --git a/certmanager/lib/backends/qgpgme/qgpgmeverifyopaquejob.cpp b/certmanager/lib/backends/qgpgme/qgpgmeverifyopaquejob.cpp
index 92e1917b..e4340aa3 100644
--- a/certmanager/lib/backends/qgpgme/qgpgmeverifyopaquejob.cpp
+++ b/certmanager/lib/backends/qgpgme/qgpgmeverifyopaquejob.cpp
@@ -84,7 +84,10 @@ GpgME::VerificationResult Kleo::QGpgMEVerifyOpaqueJob::exec( const TQByteArray &
}
void Kleo::QGpgMEVerifyOpaqueJob::doOperationDoneEvent( const GpgME::Error & ) {
- emit result( mCtx->verificationResult(), mOutDataDataProvider->data() );
+ const GpgME::VerificationResult res = mCtx->verificationResult();
+ const TQByteArray plainText = mOutDataDataProvider->data();
+ getAuditLog();
+ emit result( res, plainText );
}
diff --git a/certmanager/lib/kleo/job.cpp b/certmanager/lib/kleo/job.cpp
index c5371b64..dedbebfc 100644
--- a/certmanager/lib/kleo/job.cpp
+++ b/certmanager/lib/kleo/job.cpp
@@ -52,9 +52,13 @@
#include "refreshkeysjob.h"
#include "specialjob.h"
+#include <gpgmepp/context.h>
+
#include <tqapplication.h>
#include <kdebug.h>
+#include <gpg-error.h>
+
Kleo::Job::Job( TQObject * parent, const char * name )
: TQObject( parent, name )
{
@@ -75,6 +79,16 @@ TQString Kleo::Job::auditLogAsHtml() const {
return TQString();
}
+GpgME::Error Kleo::Job::auditLogError() const {
+ kdDebug() << "Kleo::Job::auditLogError() should be reimplemented in Kleo::Job subclasses!" << endl;
+ return GpgME::Error( gpg_error( GPG_ERR_NOT_IMPLEMENTED ) );
+}
+
+bool Kleo::Job::isAuditLogSupported() const {
+ const GpgME::Error err = auditLogError();
+ return err.code() != GPG_ERR_NOT_IMPLEMENTED ;
+}
+
#define make_job_subclass(x) \
Kleo::x::x( TQObject * parent, const char * name ) : Job( parent, name ) {} \
Kleo::x::~x() {}
diff --git a/certmanager/lib/kleo/job.h b/certmanager/lib/kleo/job.h
index 1c091bab..78ff58ce 100644
--- a/certmanager/lib/kleo/job.h
+++ b/certmanager/lib/kleo/job.h
@@ -38,6 +38,10 @@
class TQWidget;
+namespace GpgME {
+ class Error;
+}
+
namespace Kleo {
/**
@@ -67,6 +71,8 @@ namespace Kleo {
virtual void showErrorDialog( TQWidget * parent=0, const TQString & caption=TQString::null ) const;
virtual TQString auditLogAsHtml() const;
+ virtual GpgME::Error auditLogError() const;
+ bool isAuditLogSupported() const;
public slots:
virtual void slotCancel() = 0;
diff --git a/certmanager/lib/libkleopatrarc.desktop b/certmanager/lib/libkleopatrarc.desktop
index 3af8feaf..07af3adc 100644
--- a/certmanager/lib/libkleopatrarc.desktop
+++ b/certmanager/lib/libkleopatrarc.desktop
@@ -22,7 +22,6 @@ Name[hu]=Nem ellenőrzött kulcs
Name[is]=Ekki staðfestur lykill
Name[it]=Chiave non convalidata
Name[ja]=認証されていない鍵
-Name[ka]=დაუმოწმებელი გასაღები
Name[kk]=Тексерілмеген кілт
Name[km]=កូនសោ​គ្មាន​សុពលភាព
Name[ko]=검증되지 않은 키
@@ -77,7 +76,6 @@ Name[hu]=Lejárt kulcs
Name[is]=Útrunninn lykill
Name[it]=Chiave scaduta
Name[ja]=期限切れの鍵
-Name[ka]=ვადაგასული გასაღები
Name[kk]=Ескірген кілт
Name[km]=កូនសោ​បាន​ផុតកំណត់
Name[ko]=만료된 키
@@ -130,7 +128,6 @@ Name[hu]=Visszavont kulcs
Name[is]=Afturkallaður lykill
Name[it]=Chiave revocata
Name[ja]=破棄された鍵
-Name[ka]=ანულირებული გასაღები
Name[kk]=Күші жойылған кілт
Name[km]=កូនសោ​ត្រូវ​បាន​ដកហូត
Name[ko]=거부된 키
@@ -183,7 +180,6 @@ Name[hu]=Megbízható gyökértanúsítvány
Name[is]=Treyst rótarskilríki
Name[it]=Certificato radice affidabile
Name[ja]=信頼されたルート証明書
-Name[ka]= რუტის სანდო სერთიფიკატი
Name[kk]=Сенім артылған түбір куәлігі
Name[km]=វិញ្ញាបនបត្រ Root ដែល​អាច​ជឿទុកចិត្ត
Name[lt]=Patikimas root sertifikatas
@@ -236,7 +232,6 @@ Name[hu]=Nem megbízható gyökértanúsítvány
Name[is]=Ekki traust rótarskilríki
Name[it]=Certificato radice non affidabile
Name[ja]=信頼されてないルート証明書
-Name[ka]=რუტის არასანდო სერტიფიკატი
Name[kk]=Сенім артылмаған түбір куәлігі
Name[km]=វិញ្ញាបនបត្រ Root ដែល​មិន​អាច​ជឿទុកចិត្ត
Name[lt]=Nepatikimas root sertifikatas
@@ -290,7 +285,6 @@ Name[hu]=Egyéb kulcsok
Name[is]=Aðrir lyklar
Name[it]=Altre chiavi
Name[ja]=他の鍵
-Name[ka]=სხვა გასაღებები
Name[kk]=Басқа кілттер
Name[km]=កូនសោ​ផ្សេង​ទៀត
Name[ko]=기타 키
@@ -316,8 +310,7 @@ Name[sv]=Andra nycklar
Name[ta]=மற்ற விசைகள்
Name[tr]=Diğer Anahtarlar
Name[uk]=Інші ключі
-Name[uz]=Boshqa kalitlar
-Name[uz@cyrillic]=Бошқа калитлар
+Name[uz]=Бошқа калитлар
Name[zh_CN]=其它密钥
Name[zh_TW]=其他金鑰
diff --git a/certmanager/lib/tests/test_verify.cpp b/certmanager/lib/tests/test_verify.cpp
index 54a88b4c..cb5db396 100644
--- a/certmanager/lib/tests/test_verify.cpp
+++ b/certmanager/lib/tests/test_verify.cpp
@@ -29,6 +29,7 @@
*/
#include <config.h>
+#include <cstdlib>
#include <kleo/cryptobackendfactory.h>
#include <kleo/verifydetachedjob.h>
diff --git a/certmanager/lib/ui/cryptoconfigdialog.cpp b/certmanager/lib/ui/cryptoconfigdialog.cpp
index 47242994..0d383083 100644
--- a/certmanager/lib/ui/cryptoconfigdialog.cpp
+++ b/certmanager/lib/ui/cryptoconfigdialog.cpp
@@ -46,6 +46,12 @@ Kleo::CryptoConfigDialog::CryptoConfigDialog( Kleo::CryptoConfig* config, TQWidg
setMainWidget( mMainWidget );
connect( mMainWidget, TQT_SIGNAL( changed() ), TQT_SLOT( slotChanged() ) );
enableButton( Apply, false );
+ if ( mMainWidget->hasError() ) {
+ showButton( Default, false );
+ showButton( User1, false );
+ showButton( Apply, false );
+ showButton( Ok, false );
+ }
// Automatically assign accelerators
KAcceleratorManager::manage( this );
diff --git a/certmanager/lib/ui/cryptoconfigmodule.cpp b/certmanager/lib/ui/cryptoconfigmodule.cpp
index 33e7129c..5b14d7c4 100644
--- a/certmanager/lib/ui/cryptoconfigmodule.cpp
+++ b/certmanager/lib/ui/cryptoconfigmodule.cpp
@@ -62,8 +62,20 @@ static inline TQPixmap loadIcon( TQString s ) {
->loadIcon( s.replace( TQRegExp( "[^a-zA-Z0-9_]" ), "_" ), KIcon::NoGroup, KIcon::SizeMedium );
}
+static unsigned int num_components_with_options( const Kleo::CryptoConfig * config ) {
+ if ( !config )
+ return 0;
+ const TQStringList components = config->componentList();
+ unsigned int result = 0;
+ for ( TQStringList::const_iterator it = components.begin() ; it != components.end() ; ++it )
+ if ( const Kleo::CryptoConfigComponent * const comp = config->component( *it ) )
+ if ( !comp->groupList().empty() )
+ ++result;
+ return result;
+}
+
static const KJanusWidget::Face determineJanusFace( const Kleo::CryptoConfig * config ) {
- return config && config->componentList().size() < 2
+ return num_components_with_options( config ) < 2
? KJanusWidget::Plain
: KJanusWidget::IconList ;
}
@@ -115,6 +127,22 @@ Kleo::CryptoConfigModule::CryptoConfigModule( Kleo::CryptoConfig* config, TQWidg
+ scrollView->style().pixelMetric(TQStyle::PM_ScrollBarExtent),
QMIN( compGUI->sizeHint().height(), dialogHeight ) );
}
+ if ( mComponentGUIs.empty() ) {
+ Q_ASSERT( face() == Plain );
+ const TQString msg = i18n("The gpgconf tool used to provide the information "
+ "for this dialog does not seem to be installed "
+ "properly. It did not return any components. "
+ "Try running \"%1\" on the command line for more "
+ "information.")
+ .arg( components.empty() ? "gpgconf --list-components" : "gpgconf --list-options gpg" );
+ TQLabel * label = new TQLabel( msg, vbox );
+ label->setAlignment( TQt::WordBreak );
+ label->setMinimumHeight( fontMetrics().lineSpacing() * 5 );
+ }
+}
+
+bool Kleo::CryptoConfigModule::hasError() const {
+ return mComponentGUIs.empty();
}
void Kleo::CryptoConfigModule::save()
diff --git a/certmanager/lib/ui/cryptoconfigmodule.h b/certmanager/lib/ui/cryptoconfigmodule.h
index 70c4a269..167c3ac8 100644
--- a/certmanager/lib/ui/cryptoconfigmodule.h
+++ b/certmanager/lib/ui/cryptoconfigmodule.h
@@ -50,6 +50,8 @@ namespace Kleo {
public:
CryptoConfigModule( Kleo::CryptoConfig* config, TQWidget * parent=0, const char * name=0 );
+ bool hasError() const;
+
void save();
void reset(); // i.e. reload current settings, discarding user input
void defaults();
diff --git a/certmanager/lib/ui/keyselectiondialog.cpp b/certmanager/lib/ui/keyselectiondialog.cpp
index fcb25751..fc590d49 100644
--- a/certmanager/lib/ui/keyselectiondialog.cpp
+++ b/certmanager/lib/ui/keyselectiondialog.cpp
@@ -61,6 +61,8 @@
#include <kconfig.h>
#include <kmessagebox.h>
#include <kprocess.h>
+#include <kactivelabel.h>
+#include <kurl.h>
// Qt
#include <tqcheckbox.h>
@@ -85,7 +87,12 @@ static bool checkKeyUsage( const GpgME::Key & key, unsigned int keyUsage ) {
if ( keyUsage & Kleo::KeySelectionDialog::ValidKeys ) {
if ( key.isInvalid() )
- kdDebug() << "key is invalid - ignoring" << endl;
+ if ( key.keyListMode() & GpgME::Context::Validate ) {
+ kdDebug() << "key is invalid" << endl;
+ return false;
+ } else {
+ kdDebug() << "key is invalid - ignoring" << endl;
+ }
if ( key.isExpired() ) {
kdDebug() << "key is expired" << endl;
return false;
@@ -309,6 +316,28 @@ Kleo::KeySelectionDialog::KeySelectionDialog( const TQString & title,
Kleo::KeySelectionDialog::KeySelectionDialog( const TQString & title,
const TQString & text,
+ const TQString & initialQuery,
+ const std::vector<GpgME::Key> & selectedKeys,
+ unsigned int keyUsage,
+ bool extendedSelection,
+ bool rememberChoice,
+ TQWidget * parent, const char * name,
+ bool modal )
+ : KDialogBase( parent, name, modal, title, Default|Ok|Cancel|Help, Ok ),
+ mOpenPGPBackend( 0 ),
+ mSMIMEBackend( 0 ),
+ mRememberCB( 0 ),
+ mSelectedKeys( selectedKeys ),
+ mKeyUsage( keyUsage ),
+ mSearchText( initialQuery ),
+ mInitialQuery( initialQuery ),
+ mCurrentContextMenuItem( 0 )
+{
+ init( rememberChoice, extendedSelection, text, initialQuery );
+}
+
+Kleo::KeySelectionDialog::KeySelectionDialog( const TQString & title,
+ const TQString & text,
const TQString & initialQuery,
unsigned int keyUsage,
bool extendedSelection,
@@ -321,6 +350,7 @@ Kleo::KeySelectionDialog::KeySelectionDialog( const TQString & title,
mRememberCB( 0 ),
mKeyUsage( keyUsage ),
mSearchText( initialQuery ),
+ mInitialQuery( initialQuery ),
mCurrentContextMenuItem( 0 )
{
init( rememberChoice, extendedSelection, text, initialQuery );
@@ -340,11 +370,26 @@ void Kleo::KeySelectionDialog::init( bool rememberChoice, bool extendedSelection
mTopLayout = new TQVBoxLayout( page, 0, spacingHint() );
if ( !text.isEmpty() ) {
- TQLabel* textLabel = new TQLabel( text, page );
- textLabel->setAlignment( textLabel->alignment() | Qt::WordBreak );
- mTopLayout->addWidget( textLabel );
+ if ( text.startsWith( "<qt>" ) ) {
+ KActiveLabel *textLabel = new KActiveLabel( text, page );
+ disconnect( textLabel, TQT_SIGNAL(linkClicked(const TQString&)), textLabel, TQT_SLOT(openLink(const TQString&)) );
+ connect( textLabel, TQT_SIGNAL(linkClicked(const TQString&)), TQT_SLOT(slotStartCertificateManager(const TQString&)) );
+ textLabel->setAlignment( textLabel->alignment() | TQt::WordBreak );
+ mTopLayout->addWidget( textLabel );
+ } else {
+ KActiveLabel *textLabel = new KActiveLabel( text, page );
+ textLabel->setAlignment( textLabel->alignment() | TQt::WordBreak );
+ mTopLayout->addWidget( textLabel );
+ }
}
+ TQPushButton * const searchExternalPB
+ = new TQPushButton( i18n("Search for &External Certificates"), page );
+ mTopLayout->addWidget( searchExternalPB, 0, TQt::AlignLeft );
+ connect( searchExternalPB, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotStartSearchForExternalCertificates()) );
+ if ( initialQuery.isEmpty() )
+ searchExternalPB->hide();
+
TQHBoxLayout * hlay = new TQHBoxLayout( mTopLayout ); // inherits spacing
TQLineEdit * le = new TQLineEdit( page );
le->setText( initialQuery );
@@ -500,10 +545,12 @@ void Kleo::KeySelectionDialog::slotHelp()
emit helpClicked();
}
-void Kleo::KeySelectionDialog::slotStartCertificateManager()
+void Kleo::KeySelectionDialog::slotStartCertificateManager( const TQString &query )
{
KProcess certManagerProc;
certManagerProc << "kleopatra";
+ if ( !query.isEmpty() )
+ certManagerProc << "--external" << "--query" << KURL::decode_string( query );
if( !certManagerProc.start( KProcess::DontCare ) )
KMessageBox::error( this, i18n( "Could not start certificate manager; "
diff --git a/certmanager/lib/ui/keyselectiondialog.h b/certmanager/lib/ui/keyselectiondialog.h
index fd8f6739..ab8dc756 100644
--- a/certmanager/lib/ui/keyselectiondialog.h
+++ b/certmanager/lib/ui/keyselectiondialog.h
@@ -93,6 +93,15 @@ namespace Kleo {
bool modal=true );
KeySelectionDialog( const TQString & title,
const TQString & text,
+ const TQString & initialPattern,
+ const std::vector<GpgME::Key> & selectedKeys,
+ unsigned int keyUsage=AllKeys,
+ bool extendedSelection=false,
+ bool rememberChoice=false,
+ TQWidget * parent=0, const char * name=0,
+ bool modal=true );
+ KeySelectionDialog( const TQString & title,
+ const TQString & text,
const TQString & initialPattern,
unsigned int keyUsage=AllKeys,
bool extendedSelection=false,
@@ -129,7 +138,10 @@ namespace Kleo {
private slots:
void slotRereadKeys();
- void slotStartCertificateManager();
+ void slotStartCertificateManager( const TQString &query = TQString() );
+ void slotStartSearchForExternalCertificates() {
+ slotStartCertificateManager( mInitialQuery );
+ }
void slotKeyListResult( const GpgME::KeyListResult & );
void slotSelectionChanged();
void slotCheckSelection() { slotCheckSelection( 0 ); }
@@ -170,6 +182,7 @@ namespace Kleo {
TQTimer * mStartSearchTimer;
// cross-eventloop temporaries:
TQString mSearchText;
+ const TQString mInitialQuery;
Kleo::KeyListViewItem * mCurrentContextMenuItem;
int mTruncated, mListJobCount, mSavedOffsetY;
};
diff --git a/certmanager/lib/ui/messagebox.cpp b/certmanager/lib/ui/messagebox.cpp
index ddce8f04..e05a21b9 100644
--- a/certmanager/lib/ui/messagebox.cpp
+++ b/certmanager/lib/ui/messagebox.cpp
@@ -46,10 +46,15 @@
#include <klocale.h>
#include <ksavefile.h>
#include <kguiitem.h>
+#include <kdebug.h>
#include <tqtextedit.h>
#include <tqtextstream.h>
#include <tqvbox.h>
+#include <tqapplication.h>
+#include <tqstylesheet.h>
+
+#include <gpg-error.h>
using namespace Kleo;
using namespace GpgME;
@@ -74,6 +79,7 @@ public:
explicit AuditLogViewer( const TQString & log, TQWidget * parent=0, const char * name=0, WFlags f=0 )
: KDialogBase( parent, name, false, i18n("View GnuPG Audit Log"),
Close|User1|User2, Close, false, KGuiItem_save(), KGuiItem_copy() ),
+ m_log( /* sic */ ),
m_textEdit( new TQTextEdit( this, "m_textEdit" ) )
{
setWFlags( f );
@@ -85,7 +91,18 @@ public:
~AuditLogViewer() {}
void setAuditLog( const TQString & log ) {
- m_textEdit->setText( log );
+ if ( log == m_log )
+ return;
+ m_log = log;
+ m_textEdit->setText( "<qt>" + log + "</qt>" );
+ const TQRect rect = m_textEdit->paragraphRect( 0 );
+ kdDebug() << "setAuditLog: rect = " << rect << endl;
+ if ( !rect.isValid() )
+ return;
+ TQSize maxSize = qApp->desktop()->screenGeometry( this ).size() * 2 / 3 ;
+ if ( !maxSize.isValid() )
+ maxSize = TQSize( 640, 480 );
+ m_textEdit->setMinimumSize( rect.size().boundedTo( maxSize ) );
}
private:
@@ -98,7 +115,12 @@ private:
KSaveFile file( fileName );
if ( TQTextStream * const s = file.textStream() ) {
- *s << m_textEdit->text() << endl;
+ *s << "<html><head>";
+ if ( !caption().isEmpty() )
+ *s << "\n<title>" << /*TQt*/TQStyleSheet::escape( caption() ) << "</title>\n";
+ *s << "</head><body>\n"
+ << m_log
+ << "\n</body></html>" << endl;
file.close();
}
@@ -114,6 +136,7 @@ private:
}
private:
+ TQString m_log;
TQTextEdit * m_textEdit;
};
@@ -125,13 +148,23 @@ void MessageBox::auditLog( TQWidget * parent, const Job * job, const TQString &
if ( !job )
return;
- if ( !GpgME::hasFeature( AuditLogFeature ) ) {
+ if ( !GpgME::hasFeature( AuditLogFeature ) || !job->isAuditLogSupported() ) {
KMessageBox::information( parent, i18n("Your system does not have support for GnuPG Audit Logs"),
i18n("System Error") );
return;
}
+ const GpgME::Error err = job->auditLogError();
+
+ if ( err.code() != GPG_ERR_NO_DATA ) {
+ KMessageBox::information( parent, i18n("An error occurred while trying to retrieve the GnuPG Audit Log:\n%1")
+ .arg( TQString::fromLocal8Bit( err.asString() ) ),
+ i18n("GnuPG Audit Log Error") );
+ return;
+ }
+
const TQString log = job->auditLogAsHtml();
+
if ( log.isEmpty() ) {
KMessageBox::information( parent, i18n("No GnuPG Audit Log available for this operation."),
i18n("No GnuPG Audit Log") );
@@ -143,7 +176,7 @@ void MessageBox::auditLog( TQWidget * parent, const Job * job, const TQString &
// static
void MessageBox::auditLog( TQWidget * parent, const TQString & log, const TQString & caption ) {
- AuditLogViewer * const alv = new AuditLogViewer( "<qt>" + log + "</qt>", parent, "alv", Qt::WDestructiveClose );
+ AuditLogViewer * const alv = new AuditLogViewer( log, parent, "alv", Qt::WDestructiveClose );
alv->setCaption( caption );
alv->show();
}
@@ -247,8 +280,34 @@ void MessageBox::error( TQWidget * parent, const SigningResult & sresult, const
}
// static
+bool MessageBox::showAuditLogButton( const Kleo::Job * job ) {
+ if ( !job ) {
+ kdDebug() << "not showing audit log button (no job instance)" << endl;
+ return false;
+ }
+ if ( !GpgME::hasFeature( GpgME::AuditLogFeature ) ) {
+ kdDebug() << "not showing audit log button (gpgme too old)" << endl;
+ return false;
+ }
+ if ( !job->isAuditLogSupported() ) {
+ kdDebug() << "not showing audit log button (not supported)" << endl;
+ return false;
+ }
+ if ( job->auditLogError().code() == GPG_ERR_NO_DATA ) {
+ kdDebug() << "not showing audit log button (GPG_ERR_NO_DATA)" << endl;
+ return false;
+ }
+ if ( !job->auditLogError() && job->auditLogAsHtml().isEmpty() ) {
+ kdDebug() << "not showing audit log button (success, but result empty)" << endl;
+ return false;
+ }
+ return true;
+}
+
+
+// static
void MessageBox::make( TQWidget * parent, TQMessageBox::Icon icon, const TQString & text, const Job * job, const TQString & caption, int options ) {
- KDialogBase * dialog = GpgME::hasFeature( GpgME::AuditLogFeature )
+ KDialogBase * dialog = showAuditLogButton( job )
? new KDialogBase( caption, KDialogBase::Yes | KDialogBase::No,
KDialogBase::Yes, KDialogBase::Yes,
parent, "error", true, true,
diff --git a/certmanager/lib/ui/messagebox.h b/certmanager/lib/ui/messagebox.h
index 5ed2edaf..ee72e43c 100644
--- a/certmanager/lib/ui/messagebox.h
+++ b/certmanager/lib/ui/messagebox.h
@@ -40,6 +40,7 @@ namespace GpgME {
class EncryptionResult;
class DecryptionResult;
class VerificationResult;
+ class Error;
}
namespace Kleo {
@@ -73,6 +74,8 @@ namespace Kleo {
static void auditLog( TQWidget * parent, const TQString & log, const TQString & caption );
static void auditLog( TQWidget * parent, const TQString & log );
+ static bool showAuditLogButton( const Kleo::Job * job );
+
private:
static void make( TQWidget * parent, TQMessageBox::Icon icon, const TQString & text, const Kleo::Job * job, const TQString & caption, int options );
};
diff --git a/cvs.sh.diff b/cvs.sh.diff
new file mode 100644
index 00000000..313956b0
--- /dev/null
+++ b/cvs.sh.diff
@@ -0,0 +1,13 @@
+Index: admin/cvs.sh
+===================================================================
+--- admin/cvs.sh (revision 637526)
++++ admin/cvs.sh (working copy)
+@@ -592,7 +592,7 @@ for i in `ls -1 po.backup/*.pot 2>/dev/n
+ test -f po/$i || echo "disappeared: $i"
+ done
+ for i in `ls -1 po/*.pot 2>/dev/null | sed -e "s#po/##"`; do
+- sed -e 's,^"Content-Type: text/plain; charset=CHARSET\\n"$,"Content-Type: text/plain; charset=UTF-8\\n",' po/$i > po/$i.new && mv po/$i.new po/$i
++ sed -e 's,^"Content-Type: text/plain; charset=CHARSET\\n"$,"Content-Type: text/plain; charset=UTF-8\\n",; s,"Content-Transfer-Encoding: ENCODING\\n","Content-Transfer-Encoding: 8bit\\n", ; s,"Language-Team: LANGUAGE <LL@li.org>\\n","Language-Team: LANGUAGE <kde-i18n-doc@kde.org>\\n",' po/$i > po/$i.new && mv po/$i.new po/$i
+ #msgmerge -q -o po/$i po/$i po/$i
+ egrep -v '^#[^,]' po/$i | egrep '^.*[^ ]+.*$' | grep -v "\"POT-Creation" > temp.pot
+ if test -f po.backup/$i && ! cmp -s temp.pot po.backup/$i; then
diff --git a/doc/kleopatra/index.docbook b/doc/kleopatra/index.docbook
index ba467215..09f9531b 100644
--- a/doc/kleopatra/index.docbook
+++ b/doc/kleopatra/index.docbook
@@ -146,8 +146,8 @@ menu, as well as from the command line. The &kleopatra; executable is
named <userinput><command>kleopatra</command></userinput>.</para>
<note><para>This program is named after Cleopatra, a famous female
-Egyptian pharaoh that lived at the time of Julius Caesar, whom she is
-said to have had an intimate relationship with.</para>
+Egyptian pharaoh that lived at the time of Julius Caesar, with whom
+she had a child, Caesarion, unacknowledged as his heir.</para>
<para>The name was chosen since this program originates from the
<ulink url="http://www.gnupg.org/aegypten2/">&Auml;gypten
@@ -494,7 +494,7 @@ command line interface).</para>
<varlistentry id="view-stop-operation">
-<term><menuchoice><shortcut><keycombo action="simul"><keycap>Esc</keycap></keycombo></shortcut>
+<term><menuchoice><shortcut><keycombo action="simul">&Esc;</keycombo></shortcut>
<guimenu>View</guimenu><guimenuitem>Stop Operation</guimenuitem></menuchoice></term>
<listitem>
diff --git a/doc/kmail/configure.docbook b/doc/kmail/configure.docbook
index a66665ad..7643b356 100644
--- a/doc/kmail/configure.docbook
+++ b/doc/kmail/configure.docbook
@@ -648,7 +648,7 @@ so you can choose a monospaced font for the date field for better readability.</
quoted more than three times will appear in color. Note that the
<guilabel>Quoted text</guilabel> colors only work in the message reader, not in
the composer. If you want folders which are close to their quota
-(space alotment, usually used on IMAP servers) to be displayed in a different color,
+(space allotment, usually used on IMAP servers) to be displayed in a different color,
you can specify a percentage value as a threshold for this. The color to be used
can be configured along with the other custom colors.<!-- TODO --></para>
@@ -657,6 +657,11 @@ can be configured along with the other custom colors.<!-- TODO --></para>
<sect2 id="configure-appearance-layout">
<title>Layout</title>
+<para>If the <guilabel>Close message window after replying or forwarding</guilabel> option is
+activated, KMail will close the message window after replying to or forwarding the message that
+is displayed in the window. This only applies to the separate message window, not to the embedded
+message preview pane.</para>
+
<para><guilabel>Show HTML status bar</guilabel> activates a bar at the left side of the reader
pane that tells you if a message is &html; or not. This is important because
&html; messages might imitate the look of a signed and encrypted message, so
@@ -777,6 +782,32 @@ folder will be selected in &kmail;'s main window.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="configure-composer-general-quote-selection-only">
+ <term>
+ <guilabel>Only quote selected text when repyling</guilabel>
+ </term>
+ <listitem>
+ <para>
+ If checked, &kmail; will quote only the selected text in the message window,
+ instead of the complete message, when replying.
+ With this, it is possible to quickly generate replies that quote only the relevant
+ paragraph to which you are actually replying, and omits the other paragraphs that are
+ not relevant to the context.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry id="configure-composer-general-strip-signatures">
+ <term>
+ <guilabel>Remove the signature when replying</guilabel>
+ </term>
+ <listitem>
+ <para>
+ If checked, &kmail; will remove the signature from the quoted text
+ when replying to a message. This is useful since it reduces the amount
+ of quoted text, which makes it easier to read the reply.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry id="configure-composer-general-auto-request-mdns">
<term>
<guilabel>Automatically request message disposition notifications</guilabel>
@@ -806,6 +837,19 @@ folder will be selected in &kmail;'s main window.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="configure-composer-general-too-many-recipients">
+ <term>
+ <guilabel>Warn if the number of recipients is larger than</guilabel>
+ </term>
+ <listitem>
+ <para>
+ If the number of recipients is larger than this value, KMail will
+ warn and ask for a confirmation before sending the mail.
+ The default is to warn if there are more than <literal>5</literal> recipients.
+ This warning can be turned off.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry id="configure-composer-general-autosave-interval">
<term>
<guilabel>Autosave interval</guilabel>
@@ -819,6 +863,18 @@ folder will be selected in &kmail;'s main window.
</para>
</listitem>
</varlistentry>
+ <varlistentry id="configure-composer-general-forwading-type">
+ <term>
+ <guilabel>Default Forwarding Type</guilabel>
+ </term>
+ <listitem>
+ <para>
+ Lets you decide whether you want to forward messages inline or as an attachment by default.
+ This changes which type of forwarding mechanism is used when you click the toolbar icon or
+ when you activate the shortcut for forwarding.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry id="configure-composer-general-external-editor">
<term>
<guilabel>External Editor</guilabel>
@@ -1102,7 +1158,7 @@ of key words can be modified.</para>
<para>
Attaches the complete message to the disposition
notification. Usually, this is overkill. It does
- not add any valueable information that cannot be
+ not add any valuable information that cannot be
deduced from the message headers alone, but people
sometimes insist on this, since it is much easier
for humans to correlate the content of the message
@@ -1276,7 +1332,7 @@ of key words can be modified.</para>
</term>
<listitem>
<para>
- If checked, everytime you encrypt a message, a dialog
+ If checked, every time you encrypt a message, a dialog
will appear that presents you with the encryption keys
that will be used for each recipient. You can then
review the choice of keys, change them, and approve or
@@ -1335,7 +1391,7 @@ of key words can be modified.</para>
</title>
<para>
- On this tab you can switch security-relavant warnings on and
+ On this tab you can switch security-relevant warnings on and
off.
</para>
@@ -1386,7 +1442,7 @@ of key words can be modified.</para>
<listitem>
<para>
If checked, &kmail; will emit a warning if an &smime;
- certifciate or &openpgp; key will be used for a recipient
+ certificate or &openpgp; key will be used for a recipient
whose email address is not listed in the email addresses
stored in the certificate.
</para>
@@ -1698,7 +1754,7 @@ of key words can be modified.</para>
backends. Below each backend entry, you can see what protocols
(&openpgp; and/or &smime;) the backend supports. If a protocol
is not listed, the backend does not support it. If it is
- listed, but greyed out, the backend supports the protocol, but
+ listed, but grayed out, the backend supports the protocol, but
some required programs were not found, or other errors
occurred during initialization. If you press
<guibutton>Rescan</guibutton>, a dialog box will appear that
@@ -1793,12 +1849,39 @@ Correspondingly, if you ask &kmail; to go to the previous unread message.
</varlistentry>
<varlistentry>
-<term><guilabel>Jump to first unread message when entering a folder</guilabel></term>
+
+<term><guilabel>When entering a folder</guilabel></term>
+<listitem>
+<para>This option controls what happens if you open a folder.
+<itemizedlist>
+<listitem>
+<para>If <guilabel>Jump to First New Message</guilabel> is selected then &kmail; will select the
+first message it finds that is marked as new.
+</para>
+</listitem>
+<listitem>
+<para>If <guilabel>Jump to First Unread or New Message</guilabel> is selected then &kmail; will
+select the first message it finds that is marked either as new or as unread.
+</para>
+</listitem>
+<listitem>
+<para>If <guilabel>Jump to Last Selected Message</guilabel> is selected then &kmail; will select
+the message that was selected when the folder was open the last time.
+</para>
+</listitem>
+<listitem>
+<para>If <guilabel>Jump to Newest Message</guilabel> is selected then &kmail; will select the newest
+message by date.
+</para>
+</listitem>
<listitem>
-<para>If this option is enabled &kmail; will go to the first unread message
-when you enter a folder; if it is not enabled, &kmail; will go to first
-new message or, if there is no new message, to the message
-that was selected when you last left the folder.</para>
+<para>If <guilabel>Jump to Oldest Message</guilabel> is selected then &kmail; will select the oldest
+message by date.
+</para>
+</listitem>
+</itemizedlist>
+
+</para>
</listitem>
</varlistentry>
@@ -1908,6 +1991,21 @@ option is selected.</para>
<para>Invitations use to be send as attachments to a mail. By enabling this option, you let the invitation mails to be sent in the text of the mail, which is necessary to send invitations and replies to Microsoft Outlook(tm).</para>
</listitem>
</varlistentry>
+<varlistentry>
+<term><guilabel>Exchange compatible invitations naming</guilabel></term>
+<listitem>
+<para>Microsoft Outlook, when used in combination with a Microsoft Exchange
+server, has a problem understanding standards-compliant groupware e-mail.
+Enable this option to send groupware invitations in a way that Microsoft
+Exchange understands. The invitation will be sent as an attachment with name <filename>ical.ics</filename>.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><guilabel>Outlook compatible invitation reply comments</guilabel></term>
+<listitem>
+<para>When the user provides comments when responding to invitations, send the comment in way that Microsoft Outlook(tm) understands. If this option is not enabled, the response comments will not be seen in Outlook.</para>
+</listitem>
+</varlistentry>
</variablelist>
</sect2>
@@ -1934,7 +2032,7 @@ SendMDNsWithEmptySender=true
to the [MDN] section of the kmail configuration file. If there is no such section, simply add "[MDN]" on
a line by itself just above the option.
-Note that the default setting of "false" strictly speaking violates internet standards, but is
+Note that the default setting of "false" strictly speaking violates Internet standards, but is
set that way for practical reasons, to avoid servers rejecting MDNs that KMail generates because they
think they are SPAM.
</para>
@@ -1956,20 +2054,6 @@ The option is enabled by default. To disable the feature, add a line reading (un
</varlistentry>
<varlistentry>
-<term><guilabel>ForwardingInlineByDefault</guilabel></term>
-<listitem>
-<para>
-This option allows you to make inline forwarding the default forwarding method instead
-of forwarding as attachement.
-
-To enable the feature, add a line reading (under [Composer] section):
-</para>
-<programlisting>ForwardingInlineByDefault=true
-</programlisting>
-</listitem>
-</varlistentry>
-
-<varlistentry>
<term><guilabel>MaximumAttachmentSize</guilabel></term>
<listitem>
<para>
@@ -2011,6 +2095,73 @@ To disable the feature, add a line reading (under [OutOfOffice] section):
</listitem>
</varlistentry>
+<varlistentry>
+<term><guilabel>Allow out-of-office settings to be adjusted by the user.</guilabel></term>
+<listitem>
+<para>
+In case you don't want users to be able to upload their own out-of-office scripts to
+the server you can add:
+</para>
+<programlisting>AllowOutOfOfficeSettings=false
+</programlisting><para>
+to the [OutOfOffice] section of the kmail configuration file. If there is no such section, simply add "[OutOfOffice]" on
+a line by itself just above the option.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guilabel>Allow out-of-office scripts to be uploaded by the user, but no settings changed.</guilabel></term>
+<listitem>
+<para>
+If you want to allow your users to upload their own out-of-office scripts but you do not want them to be
+able to change the domain to react to and the react-to-spam setting, you can add:
+</para>
+<programlisting>AllowOutOfOfficeUploadButNoSettings=true
+</programlisting><para>
+to the [OutOfOffice] section of the kmail configuration file. If there is no such section, simply add "[OutOfOffice]" on
+a line by itself just above the option.
+</para>
+</listitem>
+</varlistentry>
+
+
+<varlistentry>
+<term><guilabel>Default domain to limit out-of-office replies to.</guilabel></term>
+<listitem>
+<para>
+When editing vacation (out-of-office) scripts, the user can specify a domain to
+limit the sending of such replies to. To pre-load this setting with a default
+value, add
+</para>
+<programlisting>OutOfOfficeDomain=myMailDomain.test
+</programlisting><para>
+to the [OutOfOffice] section of the kmail configuration file. If there is no such section, simply add "[OutOfOffice]" on
+a line by itself just above the option.
+
+Applying defaults to the out-of-office configuration dialog via the corresponding
+button will restore this domain, in case the user has changed it.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guilabel>Enable sending of out-of-office replies to messages marked as SPAM.</guilabel></term>
+<listitem>
+<para>
+By default, out-of-office replies are not sent to messages marked as SPAM. To override this
+behavior, add
+</para>
+<programlisting>OutOfOfficeReactToSpam=true
+</programlisting><para>
+to the [OutOfOffice] section of the kmail configuration file. If there is no such section, simply add "[OutOfOffice]" on
+a line by itself just above the option.
+
+Applying defaults to the out-of-office configuration dialog via the corresponding
+button will restore this setting, in case the user has changed it.
+</para>
+</listitem>
+</varlistentry>
<varlistentry>
<term><guilabel>disregardUmask</guilabel></term>
@@ -2030,7 +2181,7 @@ To enable the feature, add a line reading (under [General] section):
<listitem><para>Activate this option to automate the handling of not yet uploaded messages in disconnected IMAP
folders that can not be uploaded. This can happen if the folder was removed from the server or your access
rights have been restricted. Such messages will automatically moved to a newly created lost+found folder if
-this option is enabled, you will be ask how to proceed everytime otherwise.
+this option is enabled, you will be ask how to proceed every time otherwise.
To enable the feature, add a line reading:
</para>
diff --git a/doc/kmail/index.docbook b/doc/kmail/index.docbook
index fe38a510..06faeb06 100644
--- a/doc/kmail/index.docbook
+++ b/doc/kmail/index.docbook
@@ -9,6 +9,7 @@
<!ENTITY kmail-menus SYSTEM "menus.docbook">
<!ENTITY kmail-faq SYSTEM "faq.docbook">
<!ENTITY kmail-importing SYSTEM "importing.docbook">
+ <!ENTITY kmail-chiasmus SYSTEM "using-chiasmus.docbook">
<!ENTITY kmail-credits-and-licenses SYSTEM "credits-and-licenses.docbook">
<!ENTITY % addindex "IGNORE">
<!ENTITY % English "INCLUDE" > <!-- change language only here -->
@@ -126,6 +127,7 @@
&kmail-menus;
&kmail-faq;
&kmail-importing;
+&kmail-chiasmus;
&kmail-credits-and-licenses;
<appendix id="installation">
diff --git a/doc/kmail/using-chiasmus.docbook b/doc/kmail/using-chiasmus.docbook
new file mode 100644
index 00000000..cd075d86
--- /dev/null
+++ b/doc/kmail/using-chiasmus.docbook
@@ -0,0 +1,158 @@
+<chapter id="chiasmus">
+
+<chapterinfo>
+<authorgroup>
+<author>
+<firstname>Jan-Oliver</firstname>
+<surname>Wagner</surname>
+<affiliation><address>
+<email>jan@intevation.de</email>
+</address></affiliation>
+</author>
+<author>
+<firstname>Till</firstname>
+<surname>Adam</surname>
+<affiliation><address>
+<email>till@kdab.net</email>
+</address></affiliation>
+</author>
+
+</authorgroup>
+
+<date>2005-06-30</date>
+<releaseinfo>1.8</releaseinfo>
+</chapterinfo>
+
+<title>Using the Chiasmus encryption tool</title>
+
+<sect1 id="chiasmus-preparations">
+<title>Preparations</title>
+
+<para>
+To encrypt and decrypt with Chiasmus, you need the BSI's Chiasmus
+command line tool for GNU/Linux. It is intended solely for use in
+government agencies and availabe from the BSI on request.
+</para>
+
+<para>
+When executed without parameters, the <command>chiasmus</command>
+program should output something like:
+</para>
+
+<para>
+<screen>
+Chiasmus (R) fuer Windows K 1.8.0.0
+Bundesamt fuer Sicherheit in der Informationstechnik
+Kontakt: Chiasmus@bsi.bund.de
+(C) 2001 - 2005
+[ ...]
+</screen>
+</para>
+
+<para>
+Version 1.8.0.0 was tested succesfully. Other versions may or may not
+work correctly.
+</para>
+
+<para>
+As a last preparation step a directory which will hold the key files
+ending in <filename>.xis</filename> has to be created, if none already exists. Usually
+<filename class="directory">~/.chiasmus/</filename> is used.
+</para>
+
+</sect1>
+
+<sect1 id="chiasmus-configuration">
+ <title>Configuration</title>
+<para>
+Select <menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure KMail
+</guimenuitem></menuchoice> and choose the <guilabel>Crypto-Backends</guilabel>
+tab on the Security page. Select the entry for <guilabel>Chiasmus</guilabel> and click
+<guibutton>Configure....</guibutton> to open the configuration dialog
+for the Chiasmus backend.
+</para>
+
+<para>
+Specify the path to the Chiasmus binary and the directory where key files are
+to be stored, using the file selection dialogs which open when you click the
+folder icons next to the path entries.
+</para>
+
+<para>
+Close the backend configuration dialog by clicking <guibutton>Ok</guibutton>
+and check the <guilabel>Chiasmus Checkbox</guilabel> to activate it. Then also close the main
+configuration dialog.
+</para>
+
+</sect1>
+
+
+<sect1 id="chiasmus-encryption">
+ <title>Encryption</title>
+<para>
+To encrypt a message with Chiasmus, select <menuchoice><guimenu>
+Options</guimenu><guimenuitem>Encrypt message with chiasmus
+</guimenuitem></menuchoice>. A dialog comes up in which you can select
+the key file to use, as well as additional command line arguments to
+be passed to <command>chiasmus</command>.
+</para>
+
+<note>
+<para>
+If you want to use Chiasmus encryption regularly, you should add
+an icon for that option to your toolbar, using <menuchoice><guimenu>
+Settings</guimenu><guimenuitem>Configure toolbars</guimenuitem>
+</menuchoice>. Move the entry for <guilabel>Encrypt with Chiasmus
+</guilabel> from the left side of the dialog to the right, using the
+buttons between the two panes. You can then quickly enable or disable
+Chiasmus encryption using that toolbar button and have a visual
+indication of the current state.
+</para>
+</note>
+
+<note>
+<para>
+If automatic saving of backup copies of currently edited messages is
+enabled, you will be prompted for your Chiasmus password, if Chiamsus
+encryption is active.
+</para>
+</note>
+
+<para>
+On message sending, you will be prompted for the password. If the password
+is correct, the text of the message and all its attachments will be
+encrypted.
+</para>
+
+<note>
+<para>
+The other signing and encryption options are completely independent of
+the Chiasmus encryption. You can use those in addition to Chiasmus,
+&eg; to sign the message. Additional encryption, on the other hand,
+does not make much sense and complicates decryption for the
+recipients.
+</para>
+</note>
+
+</sect1>
+
+<sect1 id="chiasmus-decryption">
+ <title>Decryption</title>
+<para>
+&kmail; and &kontact; detect messages that have been encrypted
+using Chiasmus and will automatically ask for the key file to use for
+decryption, as well as the corresponding password. If the password is correct, the
+message will be decrypted and displayed.
+</para>
+
+<para>
+To decrypt attachments that were encrypted using Chiasmus (&ie; those which have
+a file name ending in <filename>.xia</filename>), right-click on the
+attachment you want to decrypt and select <menuchoice><guimenuitem>Decrypt using Chiasmus
+</guimenuitem></menuchoice>. After you have chosen a key file to be used for decryption and
+entered the correct password for it, a file selection dialog will allow you
+to specify where the decrypted attachment should be saved.
+</para>
+</sect1>
+
+</chapter>
diff --git a/doc/kmail/using-kmail.docbook b/doc/kmail/using-kmail.docbook
index 1d3b3e38..6bc1046f 100644
--- a/doc/kmail/using-kmail.docbook
+++ b/doc/kmail/using-kmail.docbook
@@ -375,6 +375,25 @@ checker. Note that you may first need to configure the spellchecker using
</sect2>
+<sect2 id="setup-text-snippets">
+<title>Setting Up the Text Snippets Tool</title>
+<para>
+When editing in the composer window you can store often used parts of text as snippets. To configure the capabilities of the mail snippets part select <menuchoice> <guimenu>Settings</guimenu> <guimenuitem>Snippets</guimenuitem> </menuchoice> from the menubar. A new panel will appear on the left side of the composer.
+</para>
+<para>To add a new snippet to Snippet Panel, right click on panel, click on <menuchoice><guimenu>Add Snippet</guimenu></menuchoice> in the context menu. A snippet editor dialog will appear, in which new text can be added and the snippet can be given a name. Also a <guilabel>Shortcut</guilabel> can be associated with the snippet.
+Snippets can be grouped together as well by creating groups and adding snippets to particular group. If you want to view the stored text in a tooltip window whenever you keep the mouse cursor over the title of that snippet.
+</para>
+<para>The <guilabel>Snippets</guilabel> tool allows for a variable text in predefined places any time you insert a snippet into a file. To accomplish this <guilabel>Snippets</guilabel> provides its own variables' mechanism. You can set up its behaviour in the snippet text itself by using separators ( $ ) that enclose the variable names. For example : $variablename$, $invoicenumber$, $weekno$.
+</para>
+<para>
+The variable separator can be changed to some other character by changing "snippetDelimiter" in [SnippetPart] section. The Text Snippet configuration file can be found here $KDEHOME/share/config/kmailsnippetrc .
+<programlisting>
+snippetDelimiter=$
+</programlisting>
+
+</para>
+
+</sect2>
</sect1>
<sect1 id="folders">
@@ -503,7 +522,7 @@ events by using the <guilabel>Generate free/busy and activate alarms for</guilab
choice box.</para>
<para>In case you don't want to receive reminders for folders shared by someone else,
-you can block them locally by activating the <guilabel>Block free/busy and alarms locally</guilabel>
+you can block them locally by activating the <guilabel>Block alarms locally</guilabel>
checkbox.</para>
</sect3>
@@ -1321,7 +1340,7 @@ which you do not like.</para>
</varlistentry>
<varlistentry>
<term><guilabel>Forward To</guilabel></term>
-<listitem><para>This will forward the message inline (&ie; as if you selected <menuchoice><guimenu>Message</guimenu><guimenuitem>Forward</guimenuitem><guimenuitem>Inline...</guimenuitem></menuchoice>) to another email address.</para>
+<listitem><para>This will forward the message inline (&ie; as if you selected <menuchoice><guimenu>Message</guimenu><guimenuitem>Forward</guimenuitem><guimenuitem>Inline...</guimenuitem></menuchoice>) to another email address. You can select the template to be used when forwarding with this filter with the drop down list.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/doc/kontact/index.docbook b/doc/kontact/index.docbook
index 15a7c2c0..25b0a31f 100644
--- a/doc/kontact/index.docbook
+++ b/doc/kontact/index.docbook
@@ -948,10 +948,89 @@ documentation</ulink>.
</sect1>
<sect1 id="kontact-configure-profiles">
<title>&kontact; Profiles</title>
-<para>&kontact;'s profile support makes it possible to load and save user settings in profiles.
-The settings stored in the profile include typical Look&amp;Feel related options such as app-specific color schemes, icon sets, toolbar layout and application defaults. Personal information, e.g. accounts and identities are not stored in profiles.
+<para>A profile is an arbitrary set of configuration values for any of the kontact components (mail, calendar, etc.) accompanied by a configuration file for the profile itself, which specifies its name, description etc. An example profile configuration file looks like this:
+</para>
+
+<informalexample>
+<para>
+<literallayout>
+[Kontact Profile]
+Description=Default KDE Kontact settings
+Identifier=KontactDefaults
+Name=Kontact Style
+</literallayout>
+</para>
+<para>
+The format is the standard .ini file format used for configuration throughout KDE, including in kiosk.
+</para>
+</informalexample>
+
+<para>
+&kontact;'s profile support makes it possible to load and save user settings in profiles.
+The settings stored in the profile include typical Look&amp;Feel related options such as app-specific color schemes, icon sets, toolbar layout and application defaults. Personal information, e.g. accounts and identities are not stored in profiles.
+</para>
+
+<para>
Two default profiles are provided by Kontact: &quot;&kontact; Style&quot;, which contains the default &kontact; settings, and &quot;Outlook Style&quot;, adapting &kontact; to Microsoft Outlook Look&amp;Feel.
-The user can adapt existing profiles, create new profiles from his current settings, and import and export profiles. To manage profiles, choose &quot;Configure Profiles&quot; from the &quot;Settings&quot; menu.
+The user can adapt existing profiles, create new profiles from his current settings, and import and export profiles.
+</para>
+
+<para>
+The dialog opened through Settings -> "Configure Profiles" allows profiles to be imported, exported, created, deleted and saved. They can also be loaded (applied) from there. Saving applies the currently active settings throughout Kontact to the selected profile, while import and export allow existing profiles to be written to or read from directories. To change a setting, one can edit the kontactrc file using a text editor and save it.
+</para>
+
+<para>
+Apart from the configuration file, a profile directory can contain configuration skeleton files for Kontact as a whole (kontactrc) or for any of the components (korganizerrc, kmailrc, etc.). These files can in turn contain any configuration values that the profile should set (overriding the user's current configuration) when the profile is loaded.
+
+<itemizedlist>
+ <listitem><para>
+ The korganizer configuration for the "Kontact Defaults" profile for example sets the calendar view to be merged, by default :
+<informalexample>
+<para>
+ [Views]
+ Agenda View Calendar Display=CalendarsMerged
+</para>
+</informalexample>
+</para>
+ </listitem>
+
+ <listitem><para>
+ The Outlook-like profile, on the other hand, sets it to be side by side, like in Outlook:
+<informalexample>
+<para>
+ [Views]
+ Agenda View Calendar Display=CalendarsSideBySide
+</para>
+</informalexample>
+</para>
+ </listitem>
+
+ <listitem><para>
+ If a profile wants to reset or remove a configuration key, it can specify that key like so:
+<informalexample>
+<para>
+ [General]
+ activeBackground=KONTACT_PROFILE_DELETE_KEY
+</para>
+</informalexample>
+</para>
+ </listitem>
+
+ <listitem><para>
+ This example resets the background color to whatever the KDE style suggests. The Outlook compatability profile sets this key to the Windows/Outlook color style:
+<informalexample>
+<para>
+ [General]
+ activeBackground=47,103,255
+</para>
+</informalexample>
+</para>
+ </listitem>
+ </itemizedlist>
+</para>
+
+<para>
+Currently Kontact ships with two (incomplete) profiles, one which (re-)configures things to look and feel the way Kontact natively does, while the other one attempts to approach the look&amp;feel of Outlook on Windows. To this end they change a variety of things, concretely the color palette used, the icon theme used, how the calendar view is layed out, whether the navigation toolbar is visible how the splitter sizes are initialized, in the main kontact interface.
</para>
</sect1>
</chapter>
diff --git a/doc/korganizer/index.docbook b/doc/korganizer/index.docbook
index a0398ed2..83b207e1 100644
--- a/doc/korganizer/index.docbook
+++ b/doc/korganizer/index.docbook
@@ -4,8 +4,6 @@
<!ENTITY kappname "&korganizer;">
<!ENTITY package "kdepim">
<!ENTITY plugins-chapter SYSTEM "plugins-chapter.docbook">
- <!ENTITY exchange-plugin-workshop SYSTEM "exchange-plugin.docbook">
- <!ENTITY group-scheduling-workshop SYSTEM "group-scheduling.docbook">
<!ENTITY outlook-to-vcalendar-workshop SYSTEM "outlook-to-vcalendar.docbook">
<!ENTITY % addindex "IGNORE">
<!ENTITY % English "INCLUDE">
@@ -123,7 +121,7 @@ help you keep your schedule. </para></abstract>
<keyword>alarm</keyword>
<keyword>appointment</keyword>
<keyword>event</keyword>
-<keyword>jornal</keyword>
+<keyword>journal</keyword>
<keyword>to-do</keyword>
</keywordset>
@@ -153,7 +151,7 @@ information and the freedom to choose the best solutions.
&kontact;, offering you an integrated solution for your
communication and information management needs: email, notes, contacts
management, news reader, synchronization with portable devices, and news feeds
-reader. Even if you don't use it inside &kontact;, &korganizer; is
+reader. Even if you do not use it inside &kontact;, &korganizer; is
integrated with the other &kde; <acronym>PIM</acronym> applications.
For instance, you can configure it to show birthdays from &kaddressbook; in your
agenda, use &kmail; to send and receive invitations, &etc;</para>
@@ -350,7 +348,7 @@ appear instantly, allowing you to set the new due date.</para>
<para>This five-minute course covered only the basic operation of &korganizer;.
Now you should go on and read the rest of this manual to unleash the full
-power of &korganizer;'s capabilities. But if you don't feel like it, you
+power of &korganizer;'s capabilities. But if you do not feel like it, you
should at least skip through the <link linkend="faq">&FAQ;</link>.</para>
</sect1>
@@ -405,7 +403,7 @@ want to use another resource, especially if you use a supported groupware
server. Please ask the server administrator for the information required to
configure the groupware resource, including free/busy information publishing
and retrieving. Access to free/busy information allows an event organizer to
-take the attendee's calendar in consideration when adding him to the the event's
+take the attendee's calendar in consideration when adding him to the event's
attendee list.</para>
<note><para>Besides calendar storage, groupware servers typically offer contacts,
@@ -514,7 +512,7 @@ storing your calendar information under
<listitem><para>
If you have access to a server that supports the
<ulink url="http://www.groupdav.org">GroupDav protocol</ulink>, add this
-resource in order to be able to to save (and load) events<!--, journals, free/busy information?--> and to-dos
+resource in order to be able to save (and load) events<!--, journals, free/busy information?--> and to-dos
to the server. To add the resource, you will need to know the server &URL;, your
user name and your password. The GroupDav protocol supports the storage of
contacts, so you may want to add and configure the &kaddressbook;
@@ -532,7 +530,7 @@ date list can be obtained at the
<listitem><para>
If you have access to a
<ulink url="http://www.novell.com/products/groupwise">Novell GroupWise Server</ulink>
-(version 6.5 or later), add this resource in order to be able to to save (and load)
+(version 6.5 or later), add this resource in order to be able to save (and load)
events, free/busy information <!--,journals ?-->and to-dos to the server. To add the resource, you will
need to know the server &URL;, your user name and your password. There is
support for storage of contacts, so you may want to configure &kaddressbook;
@@ -552,7 +550,7 @@ GroupWise resources, but &kmail;, &kaddressbook; too.</para>
<term><guilabel>Calendar on IMAP Server via &kmail;</guilabel></term>
<listitem><para>
If you have access to a server that shares calendar data via IMAP, add this
-resource in order to be able to to save (and load) events, to-dos, free/busy
+resource in order to be able to save (and load) events, to-dos, free/busy
information and journal entries to the IMAP server. To enable IMAP access, you
will need to configure &kmail; first, then add the &korganizer; resource.
Also, since you are using &kmail; to contact the server, &korganizer; will
@@ -617,7 +615,7 @@ corruption, you will lose only one calendar item, not the whole calendar.</para>
<listitem><para>
If you have access to a
<ulink url="http://www.microsoft.com/exchange">Exchange 2000 Server</ulink>,
-add this resource in order to be able to to save (and load)
+add this resource in order to be able to save (and load)
events FIXME:,journals, free/busy information and to-dos? to the server. To add the resource, you will
need to know the server &URL;, FIXME:port? your user name and your password. There
is support for (read only) contacts, so you may want to configure &kaddressbook;
@@ -690,7 +688,7 @@ the next start, if you set the <guilabel>Automatic Save</guilabel> to
to a regular interval). If you plan to use a calendar resource in
writable mode, make sure that your connection is stable, configure the
resource to save the file on each change (or at frequent intervals),
-and don't reload the file at regular intervals.</para>
+and do not reload the file at regular intervals.</para>
<para>A related, but opposite problem, is that two users cannot safely edit
the same remote file at the same time, because the remote file resource does not
@@ -706,13 +704,13 @@ the file, his changes will be lost.
<term><guilabel>SUSE &Linux; OpenExchange Server</guilabel></term>
<listitem><para>
If you have access to a
-<ulink url="http://www.novell.com/products/groupwise">SUSE &Linux; OpenExchange
-Server</ulink>, version 4.1, add this resource in order to be able to to save
+<ulink url="http://www.novell.com/coolsolutions/openexchange/">SUSE &Linux; OpenExchange
+Server</ulink>, version 4.1, add this resource in order to be able to save
(and load) events, free/busy information <!--,journals ?-->and to-dos to the server. To add the
resource, you will need to know the server &URL;, your user name and your
password. There is support for storage of contacts, so you may want to configure
&kaddressbook; resource.</para>
-<para>The most practical way to configure the access to a GroupWise server is
+<para>The most practical way to configure the access to an OpenExchange server is
to use the <application>sloxwizard</application> wizard. You can start it
from the command line prompt:
@@ -730,7 +728,7 @@ OpenExchange resources, but &kmail;, &kaddressbook; too.</para>
<listitem><para>
If you have access to a
<ulink url="http://www.egroupware.org">eGroupware
-Server</ulink>, version 1.0, add this resource in order to be able to to save
+Server</ulink>, version 1.0, add this resource in order to be able to save
(and load) events, free/busy information <!--,journals ?-->and to-dos to the server. To add the
resource, you will need to know the server &URL;, your user name and your
password. There is support for storage of contacts, so you may want to configure
@@ -827,8 +825,8 @@ calendar information with your colleagues and friends.</para>
<!--TODO: use case: export your friends birthdays?-->
<procedure id="procedure-export-html">
-<step><para>Disable all the resources you don't want to export, and filter out
-the items you don't want to export.</para></step>
+<step><para>Disable all the resources you do not want to export, and filter out
+the items you do not want to export.</para></step>
<step><para>Choose the <menuchoice><guimenu>File</guimenu>
<guisubmenu>Export</guisubmenu><guimenuitem>Export Web Page...</guimenuitem>
</menuchoice> menu item. You will get a window with three tabs:
@@ -1062,7 +1060,7 @@ a <guiicon>chasing-arrows</guiicon> icon is displayed if it repeats multiple
times. Hovering the mouse over an calendar item will bring up a tooltip
with the item detailed information. To make &korganizer; show a red line
marking the current-time on the current day (the Marcus Bains line),
-check the <guilabel>Show current-time (Marcus Bains Line)</guilabel> box in the
+check the <guilabel>Show current-time (Marcus Bains) line</guilabel> box in the
<link linkend="config-main-views">&korganizer; view
configuration</link>.</para>
@@ -1110,7 +1108,7 @@ will be able to quickly identify the type of event by its color.
</para>
<para>
-The aganda view can display events from all your calendars merged into one view or
+The agenda view can display events from all your calendars merged into one view or
show a view per calendar. Having both views available via tabs is also possible and
can be <link linkend="config-main-views">customized in the preferences dialog</link>.
</para>
@@ -1337,7 +1335,7 @@ the agenda view or in the month view (depending on the
<title>Filters</title>
<para>To help you view, find and export your data, you can create and
-use filters for your calendars. For instance, if you don't want to view
+use filters for your calendars. For instance, if you do not want to view
completed to-dos, you can filter them out, instead of
<link linkend="managing-purge-archive">purging them</link>. If you assign
categories, you can use them to create filters.</para>
@@ -1354,11 +1352,11 @@ and edit filters that will affect which items will be displayed by
<para>The <menuchoice><guimenu>View</guimenu>
<guisubmenu>Filter</guisubmenu></menuchoice> submenu and the filter toolbar drop
down offer access to all available filters created using
-the <link linkend="menu-settings-edit-filters"><guilabel>Edit
+the <link linkend="menu-settings-edit-filters"><guilabel>Edit Calendar
Filters</guilabel></link> dialog. To toggle the display of the filters toolbar
on and off, choose the <menuchoice><guimenu>Settings</guimenu>
<guisubmenu>Toolbars</guisubmenu><guimenuitem>Filter toolbar</guimenuitem></menuchoice>.
-If you don't want to use any filter, choose <guilabel>No filter</guilabel>.</para>
+If you do not want to use any filter, choose <guilabel>No filter</guilabel>.</para>
<para>Filters are useful when <link linkend="managing-export">exporting your
calendar</link>. If you use a filter, only the filtered (visible) items will
@@ -1381,8 +1379,8 @@ entries) according to title, description, and/or categories.
The find action will only search the specified fields.</para>
<tip><para>You can use wildcards if you do not remember the exact summary. If
-you don't know single character of the summary, put <userinput>?</userinput>
-instead of the missing character. If you don't know more characters, use
+you do not know single character of the summary, put <userinput>?</userinput>
+instead of the missing character. If you do not know more characters, use
<userinput>*</userinput>. For instance if you know that the event or to-do has
<emphasis>meeting</emphasis> in the beginning and <emphasis>product</emphasis>
after, you would write <userinput>meeting*product</userinput> in the Find dialog.
@@ -1449,7 +1447,7 @@ Enter your data as described below.</para></step>
<para>This is a thorough description of the individual event window fields and
widgets. Not all fields have to be filled in; some can be left empty. Read the
-<link linkend="entering-data-required-fields">Required fields section</link>
+<link linkend="entering-data-required-fields">Required fields</link> section
for detailed information. And if you prefer to learn by example, there's one
in the <link linkend="examples-entering-event">Entering event</link> section.
</para>
@@ -1511,7 +1509,7 @@ program; if you do not, the program will not run.</para></tip>-->
reminded, or click the <guibutton>Advanced</guibutton> button to open the
<guilabel>Edit Reminders</guilabel> dialog. Using this dialog, you can set
repeating intervals for your reminders, and create special reminders that play
-sounds, run programs, or send emails.</para>
+sounds or run programs.</para>
<!--Click the musical <guiicon>Note</guiicon> symbol to choose the
alarm sound. Click the <guiicon>Gear</guiicon> icon to browse for a
@@ -1522,7 +1520,7 @@ program that should run at the alarm time.</para>--></listitem>
<term><guilabel>Show Time As:</guilabel></term>
<listitem><para>The duration of the event may be shown as Busy or Free in your
schedule. Choose it from the <guilabel>Show Time As</guilabel>
-menu.</para></listitem>
+drop down box.</para></listitem>
</varlistentry>
<varlistentry>
@@ -1540,7 +1538,7 @@ you.</para></listitem>
<term><guilabel>Select Categories</guilabel></term>
<listitem><para>You can assign several
<link linkend="categories-view">categories</link> to a calendar item. Click the
-<guilabel>Select Categories</guilabel> button to open the
+<guilabel>Select</guilabel> button to open the
<guilabel>Select Categories</guilabel> dialog. Check the category boxes to
assign suitable categories to the event. You can also add a new category, modify
a category or delete a category by pressing the button
@@ -1556,8 +1554,8 @@ either Personal or Special Occasion - it is your choice.</para></tip>
<varlistentry>
<term><guilabel>Access:</guilabel></term>
<listitem><para>Choose <guilabel>Private</guilabel> or <guilabel>Confidential</guilabel>
-to keep the event private or confidential. Currently, this choice correctly
-sets the <quote>CLASS</quote> attribute of the events to
+to keep the event private or confidential. Currently, this choice correctly
+sets the <quote>CLASS</quote> attribute of the events to
<quote>PUBLIC</quote>, <quote>PRIVATE</quote> or <quote>CONFIDENTIAL</quote>.
However, if these settings are really used to restrict the access of the information
depends on the client and / or groupware server implementation.</para>
@@ -1572,7 +1570,7 @@ only you can access.</para></warning></listitem>
</variablelist>
-<para>When you want to confirm, call off or revert the entered data, choose
+<para>When you want to confirm, apply or call off the entered data, choose
among the <link linkend="reference-action-buttons">Action Buttons</link>,
<guibutton>OK</guibutton>, <guibutton>Apply</guibutton> and
<guibutton>Cancel</guibutton>.</para>
@@ -1649,7 +1647,7 @@ on.</para></listitem>
<para>This is similar to Monthly. You need to choose whether or not you
are indicating a calendar day of the year (&eg;, the 250th day of the
year) - <guilabel>Recur on day <replaceable>#</replaceable> of the
-year</guilabel>, in in a specific week on a specific day of the week of a month
+year</guilabel>, in a specific week on a specific day of the week of a month
(&eg;, the 2nd Tuesday of March), or the day of the month in a
particular month of the year - <guilabel>Recur on day <replaceable>#</replaceable>
of the <replaceable>month</replaceable></guilabel>. By default, &korganizer;
@@ -1775,7 +1773,7 @@ is displayed in the details list window gives you quick overview of what
should be done to make the event successful. It can be used for sorting (see
above). If you use groupware schedule and request responses from your
attendees, as you receive the responses the status of the attendee will be
-updated. If you don't request responses, you will have to update the status
+updated. If you do not request responses, you will have to update the status
manually.</para></listitem>
</varlistentry>
@@ -1819,7 +1817,7 @@ sending the invitations.</para>
represents one of the attendees, listed on the left. The marked areas on the
chart represent the time already taken by other events, unmarked areas represent
time free from other events. You can move the event to a different point in time
-by dragging it with the mouse, or resize it, by moving the edges of the highlighted
+by dragging it with the mouse, or resize it by moving the edges of the highlighted
area with the mouse.</para>
<para>The free/busy information is only available if the
@@ -1827,7 +1825,7 @@ attendee publishes his free/busy schedule, and if &korganizer; is correctly
configured to retrieve it. For more information about configuring &korganizer;
to publish and retrieve free/busy information, please check the
<xref linkend="config" />. Double-clicking on an attendee entry in the list
-will allow you to enter the location of their free/busy information.
+will allow you to enter the location of their free/busy information.
</para>
<variablelist>
@@ -1837,7 +1835,7 @@ will allow you to enter the location of their free/busy information.
<listitem><para>Sets the zoom level on the schedule chart. <guilabel>Hour</guilabel>
shows a range of several hours, <guilabel>Day</guilabel> shows a range of a few
days, <guilabel>Week</guilabel> shows a range of a few months, and
-<guilabel>Month</guilabel> shows a range of a few years, while
+<guilabel>Month</guilabel> shows a range of a few months, while
<guilabel>Automatic</guilabel> selects the range most appropriate for the
current event or to-do.</para></listitem>
</varlistentry>
@@ -1989,7 +1987,7 @@ where the to-do will take place.</para></listitem>
<term><guilabel>Date &amp; Time</guilabel></term>
<listitem><para>The <guilabel>Due</guilabel> and <guilabel>Start</guilabel>
boxes are not initially checked, as to-dos usually do not have a start and due
-date. Check one of both boxes and
+date. Check one or both boxes and
change these dates as desired. Enter the dates directly or use the
<link linkend="glossary" endterm="gloss-calendar-widget">Calendar Widget</link>.
Choose time from quarter hour intervals, or enter the desired time directly into
@@ -2013,7 +2011,7 @@ in steps of 10%.</para></listitem>
<varlistentry>
<term><guilabel>Priority</guilabel></term>
<listitem><para>Assign a priority to your to-do. This drop down menu offers
-priorities from one to five, one being the highest. Initially to-dos are set
+priorities from one to nine, one being the highest. Initially to-dos are set
to priority five (medium).</para></listitem>
</varlistentry>
@@ -2029,7 +2027,7 @@ program; if you do not, the program will not run.</para></tip>-->
reminded, or click the <guibutton>Advanced</guibutton> button to open the
<guilabel>Edit Reminders</guilabel> dialog. Using this dialog, you can set
repeating intervals for your reminders, and create special reminders that play
-sounds, run programs, or send emails.</para>
+sounds or run programs.</para>
<!--Click the musical <guiicon>Note</guiicon> symbol to choose the
alarm sound. Click the <guiicon>Gear</guiicon> icon to browse for a
@@ -2188,7 +2186,7 @@ events with other users using one of these clients.
&korganizer; is integrated with &kmail; for receiving, processing, and sending
events, event responses, updates, cancellations, &etc; For instance, when you
get an invitation in &kmail;, and decide to
-accept it, by clicking the the <guilabel>accept</guilabel> link in the mail
+accept it, by clicking the <guilabel>accept</guilabel> link in the mail
body, the event is added to your calendar, and a response to the event's
organizer is sent automatically.</para>
@@ -2288,11 +2286,11 @@ choosing the <menuchoice><guimenu>Schedule</guimenu><guimenuitem>Send Invitation
to Attendees</guimenuitem></menuchoice> menu item.
The attendees get an email containing all the relevant information
for the event or to-do. They can respond to the meeting proposal by accepting or
-rejecting it or by making a counter proposal. They can also delegate or forward the
+rejecting it or by making a counter proposal. They can also delegate or forward the
invitation.
-All this information is sent to you by email again and, if you have configured &kmail;
-appropriately the attendees responses are automatically inserted in your calendar. If
-there are additional attendees willing to participate (e.g. by accepting a forwarded
+All this information is sent to you by email again and, if you have configured &kmail;
+appropriately, the attendees responses are automatically inserted in your calendar.
+If there are additional attendees willing to participate (e.g. by accepting a forwarded
invitation) you will be asked to accept the new attendees.
</para>
@@ -2340,12 +2338,14 @@ view</link>.</para>
<guibutton>Accept</guibutton> or <guibutton>Accept Cond.</guibutton>. The
last two actions will insert the item to your calendar. In any case, &kmail; will
send your response to the organizer automatically.</para>
-<para>You can also <guibutton>Delegate</guibutton> or <guibutton>Forward</guibutton>
+
+<para>You can also <guibutton>Delegate</guibutton> or <guibutton>Forward</guibutton>
the invitation. When delegating, you can suggest another person as your proxy.
-Using <guibutton>Forward</guibutton> you can forward the invitation to one or more
+Using <guibutton>Forward</guibutton> you can forward the invitation to one or more
people not yet invited.
-When the receiver of the delegation or forward accepts the invitation,
+When the receiver of the delegation or forward accepts the invitation,
the organizer will be asked to approve the new attendee.</para>
+
<para>If for any reason you changed your mind, edit your status in the item's
<link linkend="entering-data-events-attendees">attendee tab</link>. If you
checked the <guilabel>Use Groupware Communication</guilabel> box
@@ -2565,7 +2565,7 @@ network files, &etc;), please check <xref linkend="managing-resources" />.</para
<title>Personal</title>
<para>The personal options relate to your personal identity, and other
-miscellaneous things that don't fall under any of the other general
+miscellaneous things that do not fall under any of the other general
categories.</para>
<variablelist>
@@ -2732,10 +2732,10 @@ defined in the <guilabel>Use holiday region</guilabel> drop down above.</para>
<variablelist>
<varlistentry>
-<term><guilabel>Enable tooltips displaying summary of events</guilabel></term>
+<term><guilabel>Enable tooltips for displaying summaries</guilabel></term>
<listitem><para>If your summary for an event is longer than would fit in the
current View, the remaining characters are not displayed. Check <guilabel>Enable
-tooltips displaying summary of events</guilabel> if you want the full summary
+tooltips for displaying summaries</guilabel> if you want the full summary
displayed when the hovering the mouse pointer over the appointment for a few
seconds.</para></listitem>
</varlistentry>
@@ -2769,6 +2769,13 @@ navigator</guilabel> box is checked, the days containing weekly recurring
events are shown in bold typeface in the date navigator.</para></listitem>
</varlistentry>
+<varlistentry>
+<term><guilabel>Week numbers select a work week when in work week view</guilabel></term>
+<listitem><para>If the <guilabel>Week numbers select a work week when in work
+week view</guilabel> box is checked, clicking on the week numbers along the
+side of the date navigator will navigate through work weeks rather than
+through normal 7-day weeks.</para></listitem>
+</varlistentry>
</variablelist>
@@ -2785,7 +2792,7 @@ in the agenda view.</para></listitem>
<varlistentry>
<term><guilabel>Next x days:</guilabel></term>
<listitem><para>This option allows you to change the amount of days of the
-<guimenu>Next x Days</guimenu> menu item in the <guimenu>Views</guimenu>
+<guimenu>Next x Days</guimenu> menu item in the <guimenu>View</guimenu>
menu.</para></listitem>
</varlistentry>
@@ -2817,7 +2824,7 @@ plan.</para></listitem>
<link linkend="config-main-colors">assign a different color to each
resource</link>. This check box toggles the use the resource color when
displaying the to-do or event in the agenda view on and off. Note that if you
-don't assign different colors, there is little sense in using this feature,
+do not assign different colors, there is little sense in using this feature,
as &korganizer; default configuration is to use the same color for
all resources.</para></listitem>
</varlistentry>
@@ -2856,7 +2863,7 @@ in the whole &korganizer; window instead of sharing the window with the sidebar
<link linkend="config-main-colors">assign a different color to each
category</link>. If you check this box, the event or to-do color in the month
view will reflect the category color, instead of using no color, or only the
-resource color. Note that if you don't assign different category colors,
+resource color. Note that if you do not assign different category colors,
there is little sense in using this feature, as &korganizer; default
configuration is to use the same color for all categories.</para></listitem>
</varlistentry>
@@ -2867,7 +2874,7 @@ configuration is to use the same color for all categories.</para></listitem>
<link linkend="config-main-colors">assign a different color to each
resource</link>. If you check this box, the event or to-do color in the month
view will reflect the resource color, instead of using no color, or only the
-category color. Note that if you don't assign different resource colors, there
+category color. Note that if you do not assign different resource colors, there
is little sense in using this feature, as &korganizer; default configuration
is to use the same color for all resources.</para></listitem>
</varlistentry>
@@ -2953,7 +2960,7 @@ navigator.</para></listitem>
<listitem><para>This button opens the <guilabel>Select Color</guilabel> dialog,
allowing you to select the highlight color. The highlight color will be used for
marking the currently selected area in your agenda and in the date
-navigator.navigator.</para></listitem>
+navigator.</para></listitem>
</varlistentry>
<varlistentry>
@@ -2974,7 +2981,7 @@ allowing you to select the agenda view background color.</para></listitem>
<varlistentry>
<term><guilabel>Working hours color</guilabel></term>
<listitem><para>This button opens the <guilabel>Select Color</guilabel> dialog,
-allowing you to select the agenda view.</para></listitem>
+allowing you to select the color of the working hours background in the agenda view.</para></listitem>
</varlistentry>
<varlistentry>
@@ -2992,7 +2999,7 @@ allowing you to select the to-do overdue color.</para></listitem>
<varlistentry>
<term><guilabel>Categories</guilabel></term>
<listitem><para>This group allows you to assign a color to each category. Select
-a category in the drop down, and press the button to open the
+a category in the drop down list, and press the button to open the
<guilabel>Select Color</guilabel> dialog, allowing you to select the color for
that category. <link linkend="config-main-views">Depending on the view
preferences</link>, this color will be used to mark events and to-dos which
@@ -3002,7 +3009,7 @@ belong to this category in your agenda and in the month view.</para></listitem>
<varlistentry>
<term><guilabel>Resources</guilabel></term>
<listitem><para>This group allows you to assign a color to each resource. Select
-a resource in the drop down, and press the button to open the
+a resource in the drop down list, and press the button to open the
<guilabel>Select Color</guilabel> dialog, allowing you to select the color for
that resource. <link linkend="config-main-views">Depending on the view
preferences</link>, this color will be used to mark events and to-dos which are
@@ -3026,7 +3033,7 @@ updating or deleting events or to-dos which involve others. This mail can be
an invitation to attendees of an event you created, a cancellation of an event
you created, an answer or an update on your invitation status, an event change
request, &etc; Check this option if you you want to use the groupware
-functionality (e.g Configuring &kontact; as a &kde;
+functionality (&eg; Configuring &kontact; as a &kde;
<guilabel>Kolab</guilabel> client).</para></listitem>
</varlistentry>
@@ -3119,7 +3126,7 @@ when inviting you to an event.</para>
<variablelist>
<varlistentry>
-<term><guilabel>Publish free/busy information</guilabel></term>
+<term><guilabel>Publish free/busy information automatically</guilabel></term>
<listitem><para>Enable this option if you wish your Free/Busy information to be
uploaded automatically. Note that you may skip this option and choose to mail or
upload your Free/Busy information via the <guilabel>Schedule</guilabel> menu of
@@ -3133,7 +3140,7 @@ it from other users.</para>
</varlistentry>
<varlistentry>
-<term><guilabel>Minimum time between uploads in minutes</guilabel></term>
+<term><guilabel>Minimum time between uploads (in minutes)</guilabel></term>
<listitem><para>In case you choose to publish your information automatically,
you may configure the interval of time in minutes between each upload.</para>
</listitem>
@@ -3160,7 +3167,7 @@ shall be published. Ask the server administrator for this information.</para>
<para>Kolab2 server specificity: Registered your UID (Unique IDentifier), by
default your UID would be similar to your email address on the Kolab2 server
but it may also be different. In the last case enter your UID. Ask about your
-UID to the server administrator if you don't know it.</para></listitem>
+UID to the server administrator if you do not know it.</para></listitem>
</varlistentry>
<varlistentry>
@@ -3222,7 +3229,7 @@ server.</para>
(Unique IDentifier), by default your UID would be similar to your email address
on the <guilabel>Kolab2 server</guilabel> but it may also be different. In the
last case enter your UID. Ask about your UID to the server administrator if you
-don't know it.</para></listitem>
+do not know it.</para></listitem>
</varlistentry>
<varlistentry>
@@ -3295,7 +3302,7 @@ linkend="other-features-drag-and-drop">drag-and-drop operations</link>.
<itemizedlist>
<listitem><para>The tool set is configured in the <menuchoice><guimenu>
Settings</guimenu><guimenuitem>Configure
-Toolbars....</guimenuitem></menuchoice> menu item.
+Toolbars...</guimenuitem></menuchoice> menu item.
</para></listitem>
<listitem><para>The graphic style (icon size, text position, &etc;) is
adjusted through the <guimenu>Toolbar Context Menu</guimenu>. Right click the
@@ -3324,9 +3331,9 @@ the window.</para>
<para>There are two rectangles below the toolbar title: <guilabel>Available
actions</guilabel> and <guilabel>Current actions</guilabel>. Using the left and
-right arrows (located between the rectangles) you can add icons from the
-Available actions group to the <guilabel>Current actions</guilabel> group. The
-toolbar will have every icon that is in the <guilabel>Current action</guilabel>
+right arrows (located between the rectangles) you can move icons from the
+<guilabel>Available actions</guilabel> group to the <guilabel>Current actions</guilabel> group. The
+toolbar will have every icon that is in the <guilabel>Current actions</guilabel>
box. The up and down arrows allow you reposition an icon.</para>
<tip><para>Remember that less icons may be better, because the screen is less
@@ -3439,7 +3446,7 @@ menu item and choose a different calendar). </para></listitem>
menu item to give your new calendar a filename and to save it).</para></listitem>
</itemizedlist>
-<para>For more information about this acton, please refer to
+<para>For more information about this action, please refer to
<xref linkend="managing-import-export" />.</para>
</listitem>
@@ -3518,7 +3525,7 @@ that you want to save, but also want to keep separate from your
File</guimenu> <guimenuitem>Revert</guimenuitem></menuchoice></term>
<listitem><para>When you choose <guimenuitem>Revert</guimenuitem>, &korganizer;
<action>loads the last saved version of the calendar, discarding all the
-changes made after the last save.</action>.</para>
+changes made after the last save</action>.</para>
<para>For more information about this action, please refer to
<xref linkend="managing-import-export" />.</para>
</listitem>
@@ -3578,8 +3585,8 @@ vCalendar with a few entries via email, for instance.</para>
<guimenuitem>Import From &UNIX; Ical Tool</guimenuitem>
</menuchoice></term>
<listitem><para>If you have used <application>ical</application>, a popular but
-older calendar program for &UNIX;, you may wish to <action>import your events,
-events, and to-do</action> directly to &korganizer;. This action
+older calendar program for &UNIX;, you may wish to <action>import your events
+and to-do</action> directly to &korganizer;. This action
will read the <filename>.calendar</filename> file from your home
folder and merge any entries it contains into your current calendar.
If any errors or suspicious things occur during the process, you will be
@@ -3864,7 +3871,7 @@ enough to remember in between sessions what the last active view was, and the
next time it is started, it will display that view.</para>
<para>In general, each view will provide a way of displaying your journal
-entries, to-dos and and events, constrained to a particular time period or
+entries, to-dos and events, constrained to a particular time period or
style of display. Click any item to select it for further action.
<mousebutton>Right</mousebutton> click an item to bring up a menu
with options such as <guimenuitem>edit</guimenuitem>,
@@ -4014,7 +4021,7 @@ day (<guimenuitem>Zoom In Vertically</guimenuitem> and
<listitem><para>This submenu offers access to the filters already created using
the <link linkend="menu-settings-edit-filters"><guilabel>Edit
Filters</guilabel></link> dialog. <action>Select on this submenu the filter
-that will be used in &korganizer; view.</action>. If you don't want to use a
+that will be used in &korganizer; view</action>. If you do not want to use a
filter, choose <guilabel>No filter</guilabel>.</para></listitem>
</varlistentry>
@@ -4091,8 +4098,8 @@ linkend="entering-data-to-do">the Entering To-dos</link> section.</para></listit
<guimenuitem>New Sub-to-do...</guimenuitem>
</menuchoice></term>
<listitem><para>Choose <guilabel>New Sub-to-do...</guilabel> to <action>start
-writing a new sub-to-do. The currently selected to-do will be the the
-sub-to-do parent.</action>. Initially the to-do has no due date, but you can
+writing a new sub-to-do. The currently selected to-do will be the
+sub-to-do parent</action>. Initially the to-do has no due date, but you can
specify one.</para>
<para>You can get a detailed description of the to-do window in <link
linkend="entering-data-to-do">Entering To-dos</link> section.</para></listitem>
@@ -4104,7 +4111,7 @@ linkend="entering-data-to-do">Entering To-dos</link> section.</para></listitem>
<guimenuitem>New Journal...</guimenuitem>
</menuchoice></term>
<listitem><para>Choose <guilabel>New Journal...</guilabel> to <action>start
-writing a new journal entry.</action>.</para></listitem>
+writing a new journal entry</action>.</para></listitem>
</varlistentry>
<varlistentry id="menu-actions-show-event">
@@ -4650,7 +4657,7 @@ calendar.</para>
<tip><para>However, you cannot drag from agenda view in one calendar to
agenda view in other calendar.</para></tip></listitem>
<listitem><para>Toolbars can be dragged on the screen. Move the mouse pointer
-over the tollbar's handle, and drag it to a new location on your
+over the toolbar's handle, and drag it to a new location on your
screen.</para></listitem>
</itemizedlist>
@@ -4820,7 +4827,7 @@ on your platform and the size of your calendar(s).</para>
(kdelibs). &kde; base package (kdebase) must also be installed to change
localization preferences like date and time formats. &korganizer; itself
is in the kdepim package. All packages can be found on <ulink
-url="http://www.kde.org">&kde; home page.</ulink>.</para>
+url="http://www.kde.org">&kde; home page</ulink>.</para>
<para>The &korganizer; homepage is at <ulink
url="http://korganizer.kde.org">http://korganizer.kde.org</ulink>
@@ -4856,7 +4863,7 @@ The single-arrow icons move forwards and backwards in time by increments of a
month, while the double-arrows allow moving by years at a time. Today's date
will be outlined with a small box. Dates which have events scheduled on them
will be bold. If you want to select a date, simply click it. Hold down the
-Control key and click the dates if you wish to select multiple neighbor dates at
+&Ctrl; key and click the dates if you wish to select multiple neighbor dates at
once. The dates will be displayed in the main panel.</para>
<para>Recurring events are not always displayed. You can forbid the display of
@@ -4939,7 +4946,7 @@ dialog.</para>
<itemizedlist>
<listitem><para>Events start and finish at distinct date. You can also specify
-distinct start and finish times, but you don't have to. While business
+distinct start and finish times, but you do not have to. While business
meetings, personal anniversaries and cinema visits are examples of carefully
planned events with exact time scheduling, a holiday is an event that takes
several days and thus there is no need to specify exact start and finish
diff --git a/kabc/kabcdistlistupdater/kabcdistlistupdater.desktop b/kabc/kabcdistlistupdater/kabcdistlistupdater.desktop
index 3bea0152..c67030ef 100644
--- a/kabc/kabcdistlistupdater/kabcdistlistupdater.desktop
+++ b/kabc/kabcdistlistupdater/kabcdistlistupdater.desktop
@@ -1,20 +1,10 @@
# KDE Config File
[Desktop Entry]
Name=kabcdistlistupdater
-Name[nl]=kabcdistlijstbijwerker
Exec=kabcdistlistupdater --disable-autostart
Icon=misc
Type=Application
Comment=Tool to update the old distribution lists to the new ones.
-Comment[ca]=Eina per actualitzar les llistes de distribució antigues a les noves.
-Comment[es]=Herramienta para actualizar las antiguas listas de distribución al nuevo formato.
-Comment[et]=Tööriist vanade postiloendite uuendamiseks uue vormi kohaselt.
-Comment[nds]=Warktüüch, dat ole Verdeellisten to niege opfrischt
-Comment[nl]=Hulpmiddel om de oude distributielijsten bij te werken tot de nieuwe.
-Comment[sk]=Nástroj na aktualizáciu starých ditribučných zoznamov na nové.
-Comment[sr]=Алат за ажурирање старих дистрибуционих листи новима.
-Comment[sr@Latn]=Алат за ажурирање старих дистрибуционих листи новима.
-Comment[sv]=Verktyg för att uppdatera gamla distributionslistor till nya.
Terminal=false
NoDisplay=true
X-KDE-autostart-condition=kabcdistlistupdaterrc:Startup:EnableAutostart:true
diff --git a/kaddressbook/addresseeeditorextension.cpp b/kaddressbook/addresseeeditorextension.cpp
index 3f7fc175..5c1ddcec 100644
--- a/kaddressbook/addresseeeditorextension.cpp
+++ b/kaddressbook/addresseeeditorextension.cpp
@@ -22,6 +22,7 @@
*/
#include <tqlayout.h>
+#include <tqtimer.h>
#include <klocale.h>
@@ -52,17 +53,22 @@ AddresseeEditorExtension::~AddresseeEditorExtension()
void AddresseeEditorExtension::contactsSelectionChanged()
{
const KABC::Addressee::List selectedAddressees = selectedContacts();
- KABC::Addressee::List addressees;
-
+ KABC::Addressee::List modifiedAddress;
if ( mAddresseeEditor->dirty() ) {
mAddresseeEditor->save();
addressees.append( mAddresseeEditor->addressee() );
- emit modified( addressees );
+ modifiedAddress = addressees;
+ TQTimer::singleShot(0, this, TQT_SLOT(emitModifiedAddresses()));
}
mAddresseeEditor->setAddressee( selectedAddressees[ 0 ] );
}
+void AddresseeEditorExtension::emitModifiedAddresses()
+{
+ emit modified( addressees );
+}
+
TQString AddresseeEditorExtension::title() const
{
return i18n( "Contact Editor" );
diff --git a/kaddressbook/addresseeeditorextension.h b/kaddressbook/addresseeeditorextension.h
index ff4e3d65..d3368248 100644
--- a/kaddressbook/addresseeeditorextension.h
+++ b/kaddressbook/addresseeeditorextension.h
@@ -50,10 +50,12 @@ class AddresseeEditorExtension : public KAB::ExtensionWidget
This method should be reimplemented and return a unique identifier.
*/
virtual TQString identifier() const;
-
+ private slots:
+ void emitModifiedAddresses();
private:
AddresseeEditorBase *mAddresseeEditor;
bool mDirty;
+ KABC::Addressee::List addressees;
};
#endif
diff --git a/kaddressbook/addresseeutil.cpp b/kaddressbook/addresseeutil.cpp
index d564a9cb..7e598017 100644
--- a/kaddressbook/addresseeutil.cpp
+++ b/kaddressbook/addresseeutil.cpp
@@ -29,6 +29,21 @@
#include "addresseeutil.h"
+#if defined(KABC_VCARD_ENCODING_FIX)
+TQByteArray AddresseeUtil::addresseesToClipboard( const KABC::Addressee::List &list )
+{
+ KABC::VCardConverter converter;
+
+ return converter.createVCardsRaw( list );
+}
+
+KABC::Addressee::List AddresseeUtil::clipboardToAddressees( const TQByteArray &data )
+{
+ KABC::VCardConverter converter;
+
+ return converter.parseVCardsRaw( data.data() );
+}
+#else
TQString AddresseeUtil::addresseesToClipboard( const KABC::Addressee::List &list )
{
KABC::VCardConverter converter;
@@ -42,6 +57,7 @@ KABC::Addressee::List AddresseeUtil::clipboardToAddressees( const TQString &data
return converter.parseVCards( data );
}
+#endif
TQString AddresseeUtil::addresseesToEmails( const KABC::Addressee::List &addrList )
{
diff --git a/kaddressbook/addresseeutil.h b/kaddressbook/addresseeutil.h
index 31d750e3..5bcac313 100644
--- a/kaddressbook/addresseeutil.h
+++ b/kaddressbook/addresseeutil.h
@@ -26,6 +26,7 @@
#include <tqstring.h>
#include <kabc/addressee.h>
+#include <kabc/vcardparser.h> // for KABC_VCARD_ENCODING_FIX define
/**
This class provides some utility methods for transposing an
@@ -43,15 +44,23 @@ class AddresseeUtil
/**
Same as above function, except that an entire list of KABC::Addressee
objects will be converted to vCard and put in the string.
- */
+ */
+#if defined(KABC_VCARD_ENCODING_FIX)
+ static TQByteArray addresseesToClipboard( const KABC::Addressee::List &addrList );
+#else
static TQString addresseesToClipboard( const KABC::Addressee::List &addrList );
+#endif
/**
Convert a string from the clipboard into a list of addressee objects.
If the clipboard text was not a valid vcard, an empty list
will be returned.
*/
+#if defined(KABC_VCARD_ENCODING_FIX)
+ static KABC::Addressee::List clipboardToAddressees( const TQByteArray &clipboard );
+#else
static KABC::Addressee::List clipboardToAddressees( const TQString &clipboard );
+#endif
/**
Converts the list of addressee objects into a list of email addresses.
diff --git a/kaddressbook/common/kaddressbook.kcfg b/kaddressbook/common/kaddressbook.kcfg
index 37e6ff0a..d0a48c25 100644
--- a/kaddressbook/common/kaddressbook.kcfg
+++ b/kaddressbook/common/kaddressbook.kcfg
@@ -57,7 +57,7 @@
<entry type="Bool" name="ContactListAboveExtensions">
<default>true</default>
<whatsthis>If true, the contact list will be placed above the extensions on the left (distribution list editor etc.) instead of in the middle of the main window</whatsthis>
-
+
</entry>
</group>
diff --git a/kaddressbook/csv-templates/kaddressbook.desktop b/kaddressbook/csv-templates/kaddressbook.desktop
index a5b9c406..505f3c54 100644
--- a/kaddressbook/csv-templates/kaddressbook.desktop
+++ b/kaddressbook/csv-templates/kaddressbook.desktop
@@ -19,7 +19,6 @@ Name[hi]=केडीईएड्रेसबुक (केडीई 3.1)
Name[hr]=KAdressBook (KDE 3.1)
Name[hu]=Címjegyzék (KDE 3.1)
Name[it]=Rubrica indirizzi (KDE 3.1)
-Name[ka]=წიგნაკი (KDE 3.1)
Name[mk]=КАдресар (KDE 3.1)
Name[nb]=Adressebok (KDE 3.1)
Name[nds]=KAdressbook (KDE 3.1)
diff --git a/kaddressbook/csv-templates/yahoo.desktop b/kaddressbook/csv-templates/yahoo.desktop
index b365365c..43b771c8 100644
--- a/kaddressbook/csv-templates/yahoo.desktop
+++ b/kaddressbook/csv-templates/yahoo.desktop
@@ -32,7 +32,6 @@ Name[hu]=Yahoo! címjegyzék
Name[is]=Yahoo! póstfangaskrá
Name[it]=Rubrica indirizzi Yahoo!
Name[ja]=Yahoo! アドレス帳
-Name[ka]=წიგნაკი Yahoo!
Name[kk]=Yahoo! адрестік кітапшасы
Name[km]=សៀវភៅ​អាសយដ្ឋាន​របស់​យ៉ាហ៊ូ
Name[ko]=Yahoo! 주소록
@@ -58,8 +57,7 @@ Name[ta]=யாஹூ! முகவரிப் புத்தகம்
Name[tg]=Китоби адресии Yahoo!
Name[tr]=Yahoo! Adres Defteri
Name[uk]=Адресна книга Yahoo
-Name[uz]=Yahoo! manzillar daftari
-Name[uz@cyrillic]=Yahoo! манзиллар дафтари
+Name[uz]=Yahoo! манзиллар дафтари
Name[zh_CN]=Yahoo! 地址簿
Name[zh_TW]=Yahoo! 通訊錄
diff --git a/kaddressbook/customfieldswidget.cpp b/kaddressbook/customfieldswidget.cpp
index 4fc41819..c9f4d861 100644
--- a/kaddressbook/customfieldswidget.cpp
+++ b/kaddressbook/customfieldswidget.cpp
@@ -289,6 +289,33 @@ void FieldWidget::loadContact( KABC::Addressee *addr )
}
}
+void FieldWidget::setReadOnly( bool readOnly )
+{
+ FieldRecordList::ConstIterator it;
+ for ( it = mFieldList.begin(); it != mFieldList.end(); ++it ) {
+ TQString value;
+ if ( (*it).mWidget->isA( "TQLineEdit" ) ) {
+ TQLineEdit *wdg = static_cast<TQLineEdit*>( (*it).mWidget );
+ wdg->setReadOnly(readOnly);
+ } else if ( (*it).mWidget->isA( "TQSpinBox" ) ) {
+ TQSpinBox *wdg = static_cast<TQSpinBox*>( (*it).mWidget );
+ wdg->setEnabled( !readOnly );
+ } else if ( (*it).mWidget->isA( "TQCheckBox" ) ) {
+ TQCheckBox *wdg = static_cast<TQCheckBox*>( (*it).mWidget );
+ wdg->setEnabled( !readOnly );
+ } else if ( (*it).mWidget->isA( "TQDateEdit" ) ) {
+ TQDateEdit *wdg = static_cast<TQDateEdit*>( (*it).mWidget );
+ wdg->setEnabled( !readOnly );
+ } else if ( (*it).mWidget->isA( "TQTimeEdit" ) ) {
+ TQTimeEdit *wdg = static_cast<TQTimeEdit*>( (*it).mWidget );
+ wdg->setEnabled( !readOnly );
+ } else if ( (*it).mWidget->isA( "TQDateTimeEdit" ) ) {
+ TQDateTimeEdit *wdg = static_cast<TQDateTimeEdit*>( (*it).mWidget );
+ wdg->setEnabled( !readOnly );
+ }
+ }
+}
+
void FieldWidget::storeContact( KABC::Addressee *addr )
{
FieldRecordList::ConstIterator it;
@@ -390,6 +417,7 @@ void CustomFieldsWidget::setReadOnly( bool readOnly )
{
mAddButton->setEnabled( !readOnly );
mRemoveButton->setEnabled( !readOnly && !mFieldWidget->fields().isEmpty() );
+ mFieldWidget->setReadOnly( readOnly );
}
void CustomFieldsWidget::addField()
diff --git a/kaddressbook/dcopaddressbook.desktop b/kaddressbook/dcopaddressbook.desktop
index 50ee3455..feea50c0 100644
--- a/kaddressbook/dcopaddressbook.desktop
+++ b/kaddressbook/dcopaddressbook.desktop
@@ -28,7 +28,6 @@ Comment[hu]=Címjegyzék DCOP-felülettel
Comment[is]=Vistfangaskrá með DCOP tengingu
Comment[it]=Rubrica indirizzi con un'interfaccia DCOP
Comment[ja]=DCOP インターフェースを持つアドレス帳
-Comment[ka]=წიგნაკი DCOP-ის ინტერფეისით
Comment[kk]=DCOP интерфейсті адрестік кітапшасы
Comment[km]=សៀវភៅ​អាសយដ្ឋាន​ដែល​មាន​ចំណុច​ប្រទាក់ DCOP
Comment[ko]=DCOP 인터페이스를 사용하는 주소록
@@ -54,7 +53,6 @@ Comment[ta]=முகவரிப்புத்தகத்துடன் DCOP
Comment[tg]=Китоби адрес бо интерфейси DCOP
Comment[tr]=DCOP Arayüzü Olan Adres Defteri
Comment[uk]=Адресна книга з інтерфейсом DCOP
-Comment[uz]=DCOP interfeysli manzillar daftari
-Comment[uz@cyrillic]=DCOP интерфейсли манзиллар дафтари
+Comment[uz]=DCOP интерфейсли манзиллар дафтари
Comment[zh_CN]=具有 DCOP 接口的地址簿
Comment[zh_TW]=有 DCOP 介面的通訊錄
diff --git a/kaddressbook/distributionlisteditor.cpp b/kaddressbook/distributionlisteditor.cpp
index 1b379b4a..c088978f 100644
--- a/kaddressbook/distributionlisteditor.cpp
+++ b/kaddressbook/distributionlisteditor.cpp
@@ -28,10 +28,11 @@
#include <libemailfunctions/email.h>
#include <kabc/addressbook.h>
+#include <kabc/resource.h>
#include <kapplication.h>
#include <kdialogbase.h>
-#include <kglobal.h>
+#include <kglobal.h>
#include <kiconloader.h>
#include <klineedit.h>
#include <klocale.h>
@@ -41,6 +42,7 @@
#include <tqlayout.h>
#include <tqsignalmapper.h>
#include <tqtoolbutton.h>
+#include <tqguardedptr.h>
class KPIM::DistributionListEditor::EditorWidgetPrivate
{
@@ -55,6 +57,7 @@ public:
TQWidget* memberListWidget;
TQVBoxLayout* addresseeLayout;
TQValueList<KPIM::DistributionListEditor::Line*> addressees;
+ TQGuardedPtr<KABC::Resource> resource;
KPIM::DistributionList distributionList;
KPIM::DistributionListEditor::Line* addLineForEntry( const KPIM::DistributionList::Entry& entry );
int lastLineId;
@@ -94,7 +97,7 @@ void KPIM::DistributionListEditor::Line::setEntry( const KPIM::DistributionList:
{
m_uid = entry.addressee.uid();
m_initialText = entry.addressee.fullEmail( entry.email );
- m_lineEdit->setText( m_initialText );
+ m_lineEdit->setText( m_initialText );
}
KABC::Addressee KPIM::DistributionListEditor::Line::findAddressee( const TQString& name, const TQString& email ) const
@@ -105,7 +108,7 @@ KABC::Addressee KPIM::DistributionListEditor::Line::findAddressee( const TQStrin
typedef KABC::Addressee::List List;
const List byEmail = m_addressBook->findByEmail( email );
if ( !byEmail.isEmpty() )
- {
+ {
const List::ConstIterator end = byEmail.end();
for ( List::ConstIterator it = byEmail.begin(); it != end; ++it )
{
@@ -138,7 +141,7 @@ KPIM::DistributionList::Entry KPIM::DistributionListEditor::Line::entry() const
res.addressee = addr;
}
if ( res.addressee.isEmpty() )
- res.addressee = findAddressee( name, email );
+ res.addressee = findAddressee( name, email );
res.email = res.addressee.preferredEmail() != email ? email : TQString();
return res;
}
@@ -146,18 +149,19 @@ KPIM::DistributionList::Entry KPIM::DistributionListEditor::Line::entry() const
KPIM::DistributionListEditor::LineEdit::LineEdit( TQWidget* parent ) : KPIM::AddresseeLineEdit( parent )
{
+ allowDistributionLists( false );
}
-KPIM::DistributionListEditor::EditorWidget::EditorWidget( KABC::AddressBook* book, TQWidget* parent )
+KPIM::DistributionListEditor::EditorWidget::EditorWidget( KABC::AddressBook* book, TQWidget* parent )
: KDialogBase( parent, /*name=*/0, /*modal=*/ true, /*caption=*/TQString(), KDialogBase::Ok|KDialogBase::Cancel ), d( new DistributionListEditor::EditorWidgetPrivate )
{
d->addressBook = book;
Q_ASSERT( d->addressBook );
d->lastLineId = 0;
d->mapper = new TQSignalMapper( this );
- connect( d->mapper, TQT_SIGNAL( mapped( int ) ),
- this, TQT_SLOT( lineTextChanged( int ) ) );
+ connect( d->mapper, TQT_SIGNAL( mapped( int ) ),
+ this, TQT_SLOT( lineTextChanged( int ) ) );
setCaption( i18n( "Edit Distribution List" ) );
TQWidget* main = new TQWidget( this );
TQVBoxLayout* mainLayout = new TQVBoxLayout( main );
@@ -192,12 +196,12 @@ KPIM::DistributionListEditor::EditorWidget::EditorWidget( KABC::AddressBook* boo
memberLayout->addStretch();
d->scrollView->addChild( d->memberListWidget );
d->scrollView->setResizePolicy( TQScrollView::AutoOneFit );
-
+
setMainWidget( main );
KPIM::DistributionListEditor::Line* const last = d->addLineForEntry( KPIM::DistributionList::Entry() );
const TQSize hint = sizeHint();
- resize( hint.width() * 1.5, hint.height() );
+ resize( hint.width() * 3L/2, hint.height() );
}
KPIM::DistributionListEditor::EditorWidget::~EditorWidget()
@@ -217,6 +221,7 @@ void KPIM::DistributionListEditor::EditorWidget::setDistributionList( const KPIM
{
d->distListUid = list.uid();
d->nameLineEdit->setText( list.name() );
+ d->resource = list.resource();
using KPIM::DistributionListEditor::Line;
typedef TQValueList<Line*>::ConstIterator ListIterator;
@@ -238,12 +243,12 @@ void KPIM::DistributionListEditor::EditorWidget::setDistributionList( const KPIM
}
KPIM::DistributionListEditor::Line* KPIM::DistributionListEditor::EditorWidgetPrivate::addLineForEntry( const KPIM::DistributionList::Entry& entry )
-{
+{
KPIM::DistributionListEditor::Line* line = new KPIM::DistributionListEditor::Line( addressBook, memberListWidget );
line->setEntry( entry );
addresseeLayout->addWidget( line );
addressees.append( line );
- TQObject::connect( line, TQT_SIGNAL( textChanged() ),
+ TQObject::connect( line, TQT_SIGNAL( textChanged() ),
mapper, TQT_SLOT( map() ) );
mapper->setMapping( line, ++lastLineId );
line->setShown( true );
@@ -256,23 +261,39 @@ void KPIM::DistributionListEditor::EditorWidget::slotOk()
const KPIM::DistributionList existing = KPIM::DistributionList::findByName( d->addressBook, name );
if ( !existing.isEmpty() && existing.uid() != d->distListUid )
{
- KMessageBox::error( this, i18n( "A distribution list with the name %1 already exists. Please choose another name." ).arg( name ), i18n( "Name in Use" ) );
+ KMessageBox::error( this, i18n( "A distribution list with the name %1 already exists. Please choose another name." ).arg( name ), i18n( "Name in Use" ) );
+ return;
+ }
+
+ KABC::Ticket *ticket = d->resource->requestSaveTicket();
+ if ( !ticket ) {
+ kdWarning(5720) << "Unable to get save ticket!" << endl;
return;
}
KPIM::DistributionList list;
list.setUid( d->distListUid.isNull() ? KApplication::randomString( 10 ) :d->distListUid );
list.setName( name );
+ list.setResource( d->resource );
typedef TQValueList<KPIM::DistributionListEditor::Line*>::ConstIterator ListIterator;
for ( ListIterator it = d->addressees.begin(), end = d->addressees.end(); it != end; ++it )
- {
+ {
const KPIM::DistributionList::Entry entry = (*it)->entry();
if ( entry.addressee.isEmpty() )
continue;
list.insertEntry( entry.addressee, entry.email );
}
d->distributionList = list;
- accept();
+
+ d->addressBook->insertAddressee( d->distributionList );
+ if ( !d->resource->save( ticket ) ) {
+ kdWarning(5720) << "Unable to save dist list!" << endl;
+ }
+ d->resource->releaseSaveTicket( ticket );
+
+ if ( !KPIM::DistributionList::findByName( d->addressBook, name ).isEmpty() ) {
+ accept();
+ }
}
KPIM::DistributionList KPIM::DistributionListEditor::EditorWidget::distributionList() const
diff --git a/kaddressbook/editors/cryptosettings.desktop b/kaddressbook/editors/cryptosettings.desktop
index 90ea108b..4baaa54a 100644
--- a/kaddressbook/editors/cryptosettings.desktop
+++ b/kaddressbook/editors/cryptosettings.desktop
@@ -24,7 +24,6 @@ Name[hu]=Titkosítási beállítások
Name[is]=Stillingar dulritunar
Name[it]=Preferenze crittografia
Name[ja]=暗号の設定
-Name[ka]=დაშიფრვის პარამეტრები
Name[kk]=Шифрлау параметрлері
Name[km]=ចំណង់​ចំណូល​ចិត្ត Crypto
Name[ko]=암호화 설정
diff --git a/kaddressbook/editors/imaddresseditor.desktop b/kaddressbook/editors/imaddresseditor.desktop
index 64dc7442..bb6b341c 100644
--- a/kaddressbook/editors/imaddresseditor.desktop
+++ b/kaddressbook/editors/imaddresseditor.desktop
@@ -21,7 +21,6 @@ Name[hu]=Azonnali üzenetküldés (IM)
Name[is]=Skilaboðaforrit
Name[it]=Messaggistica istantanea
Name[ja]=インスタントメッセージ
-Name[ka]=მყისიერი შეტყობინებები
Name[kk]=Лезде хабарласу
Name[km]=ផ្ញើ​សារ​បន្ទាន់
Name[ko]=인스턴트 페시징
@@ -45,8 +44,7 @@ Name[ta]=உடனடி செய்தி பரிமாற்றம்
Name[tg]=Хизматгоҳи мубодилаи иттилоот
Name[tr]=Hızlı Mesajlaşma
Name[uk]=Миттєвий зв'язок
-Name[uz]=Xabar almashish
-Name[uz@cyrillic]=Хабар алмашиш
+Name[uz]=Хабар алмашиш
Name[zh_CN]=即时通讯
Name[zh_TW]=即時通訊
Comment=Instant Messaging Address Editor
@@ -72,7 +70,6 @@ Comment[hu]=IM-címszerkesztő
Comment[is]=Vistfangaritill fyrir skilaboðaforrit
Comment[it]=Editor degli indirizzi per messaggi istantanei
Comment[ja]=インスタントメッセージのアドレスを編集
-Comment[ka]=მყისიერი შეტყობინებების წიგნაკის რედაქტორი
Comment[kk]=Лезде хабарласу адрестер өңдегіші
Comment[km]=កម្មវិធី​និពន្ធ​អាសយដ្ឋាន​ដើម្បី​ផ្ញើ​សារ​បន្ទាន់
Comment[ko]=인스턴트 메시징 주소 편집기
diff --git a/kaddressbook/editors/imeditorwidget.cpp b/kaddressbook/editors/imeditorwidget.cpp
index 0da0feb0..ad84505c 100644
--- a/kaddressbook/editors/imeditorwidget.cpp
+++ b/kaddressbook/editors/imeditorwidget.cpp
@@ -362,6 +362,8 @@ void IMEditorWidget::slotAdd()
void IMEditorWidget::slotEdit()
{
+ if( mReadOnly )
+ return;
TQListViewItemIterator it( mWidget->lvAddresses, TQListViewItemIterator::Selected );
// Just edit the first one selected.
diff --git a/kaddressbook/editors/kaddressbookimprotocol.desktop b/kaddressbook/editors/kaddressbookimprotocol.desktop
index 80a6f89a..ad4eda6c 100644
--- a/kaddressbook/editors/kaddressbookimprotocol.desktop
+++ b/kaddressbook/editors/kaddressbookimprotocol.desktop
@@ -25,7 +25,6 @@ Name[hu]=KAddressbook azonnali üzenetküldési protokoll
Name[is]=KAddressbook skilaboðaforritið
Name[it]=KAddressbook protocollo messaggistica istantanea
Name[ja]=KAddressbook インスタントメッセージプロトコル
-Name[ka]=KDE ოქმი მყისიერი შეტყობინებებისათვისწიგნაკითვის
Name[kk]=KAddressbook лезде хабарласу протоколы
Name[km]=ពិធីការ​ផ្ញើសារ​បន្ទាន់​របស់ KAddressbook
Name[ko]=KAddressbook 인스턴트 메시징 프로토콜
diff --git a/kaddressbook/editors/protocols/aimprotocol.desktop b/kaddressbook/editors/protocols/aimprotocol.desktop
index e17be1f6..a29098d8 100644
--- a/kaddressbook/editors/protocols/aimprotocol.desktop
+++ b/kaddressbook/editors/protocols/aimprotocol.desktop
@@ -29,7 +29,6 @@ Comment[hu]=AIM protokoll
Comment[is]=AIM samskiptamátinn
Comment[it]=Protocollo AIM
Comment[ja]=AIM プロトコル
-Comment[ka]=AIM ოქმი
Comment[kk]=AIM протоколы
Comment[km]=ពិធីការ AIM
Comment[ko]=AIM 프로토콜
diff --git a/kaddressbook/editors/protocols/gaduprotocol.desktop b/kaddressbook/editors/protocols/gaduprotocol.desktop
index 96ee6e9e..9ccea3c5 100644
--- a/kaddressbook/editors/protocols/gaduprotocol.desktop
+++ b/kaddressbook/editors/protocols/gaduprotocol.desktop
@@ -30,7 +30,6 @@ Comment[hu]=Gadu-Gadu protokoll
Comment[is]=Gadu-Gadu samskiptamátinn
Comment[it]=Protocollo Gadu-Gadu
Comment[ja]=Gadu-Gadu プロトコル
-Comment[ka]=Gadu-Gadu ოქმი
Comment[kk]=Gadu-Gadu протоколы
Comment[km]=ពិធីការ Gadu-Gadu
Comment[lt]=Gadu-Gadu protokolas
diff --git a/kaddressbook/editors/protocols/groupwiseprotocol.desktop b/kaddressbook/editors/protocols/groupwiseprotocol.desktop
index 0ee40fd2..0fc2cce0 100644
--- a/kaddressbook/editors/protocols/groupwiseprotocol.desktop
+++ b/kaddressbook/editors/protocols/groupwiseprotocol.desktop
@@ -18,7 +18,6 @@ Comment[fy]=Novell GroupWise-messenger
Comment[he]=מסנג'ר של Novell GroupWise
Comment[is]=Novell GroupWise Samskiptatólið
Comment[ja]=Novell GroupWise メッセンジャー
-Comment[ka]= Novell GroupWise მყისიერი შეტყობინებების მაცნე
Comment[kk]=Novell GroupWise хабарласу
Comment[km]=កម្មវិធី​ផ្ញើ​សារ​របស់​ណូវែល - GroupWise
Comment[lt]=Novell GroupWise momentinių žinučių klientas
diff --git a/kaddressbook/editors/protocols/icqprotocol.desktop b/kaddressbook/editors/protocols/icqprotocol.desktop
index e071238e..be9fff52 100644
--- a/kaddressbook/editors/protocols/icqprotocol.desktop
+++ b/kaddressbook/editors/protocols/icqprotocol.desktop
@@ -29,7 +29,6 @@ Comment[hu]=ICQ protokoll
Comment[is]=ICQ samskiptamátinn
Comment[it]=Protocollo ICQ
Comment[ja]=ICQ プロトコル
-Comment[ka]=ICQ ოქმი
Comment[kk]=ICQ протоколы
Comment[km]=ពិធីការ ICQ
Comment[lt]=ICQ protokolas
diff --git a/kaddressbook/editors/protocols/ircprotocol.desktop b/kaddressbook/editors/protocols/ircprotocol.desktop
index 78f19447..40f73a36 100644
--- a/kaddressbook/editors/protocols/ircprotocol.desktop
+++ b/kaddressbook/editors/protocols/ircprotocol.desktop
@@ -9,7 +9,6 @@ Comment[fa]=گپ بازپخش اینترنت
Comment[hu]=IRC (Internet Relay Chat)
Comment[is]=Internet spjall
Comment[ja]=インターネットリレーチャット
-Comment[ka]=IRC
Comment[kk]=Internet Relay Chat хабарласу
Comment[km]=ជជែក​កំសាន្ត​តាមអ៊ីនធឺណិត
Comment[lt]=Estafetinis Interneto pokalbis
diff --git a/kaddressbook/editors/protocols/jabberprotocol.desktop b/kaddressbook/editors/protocols/jabberprotocol.desktop
index 94b7271b..b34f8809 100644
--- a/kaddressbook/editors/protocols/jabberprotocol.desktop
+++ b/kaddressbook/editors/protocols/jabberprotocol.desktop
@@ -30,7 +30,6 @@ Comment[hu]=Jabber protokoll
Comment[is]=Jabber samskiptamátinn
Comment[it]=Protocollo Jabber
Comment[ja]=Jabber プロトコル
-Comment[ka]=Jabber ოქმი
Comment[kk]=Jabber протоколы
Comment[km]=ពិធីការ Jabber
Comment[lt]=Jabber protokolas
diff --git a/kaddressbook/editors/protocols/meanwhileprotocol.desktop b/kaddressbook/editors/protocols/meanwhileprotocol.desktop
index 7442cd04..23e9fe3d 100644
--- a/kaddressbook/editors/protocols/meanwhileprotocol.desktop
+++ b/kaddressbook/editors/protocols/meanwhileprotocol.desktop
@@ -29,7 +29,6 @@ Comment[hu]=Meanwhile protokoll
Comment[is]=Meanwhile samskiptamátinn
Comment[it]=Protocollo Meanwhile
Comment[ja]=Meanwhile プロトコル
-Comment[ka]=Meanwhile ოქმი
Comment[kk]=Meanwhile протоколы
Comment[km]=ពិធីការ Meanwhile
Comment[lt]=Meanwhile protokolas
diff --git a/kaddressbook/editors/protocols/msnprotocol.desktop b/kaddressbook/editors/protocols/msnprotocol.desktop
index 58504fd7..1256278a 100644
--- a/kaddressbook/editors/protocols/msnprotocol.desktop
+++ b/kaddressbook/editors/protocols/msnprotocol.desktop
@@ -12,7 +12,6 @@ Comment[fa]=پیام‌رسان MSN
Comment[fr]=Messagerie MSN
Comment[is]=MSN spjallforritið
Comment[ja]=MSN メッセンジャー
-Comment[ka]=MSN შიკრიკი
Comment[km]=កម្មវិធី​ផ្ញើ​សារ MSN
Comment[nds]=MSN-Kortnarichtenmaker
Comment[ne]=एमएसएन म्यासेन्जर
@@ -25,7 +24,6 @@ Name[cy]=Negesydd MSN
Name[eo]=MSN Mesaĝilo
Name[fa]=پیام‌رسان MSN
Name[ja]=MSN メッセンジャー
-Name[ka]=MSN შიკრიკი
Name[km]=កម្មវិធី​ផ្ញើសារ MSN
Name[nds]=MSN-Kortnarichtenmaker
Name[ne]=एमएसएन म्यासेन्जर
diff --git a/kaddressbook/editors/protocols/skypeprotocol.desktop b/kaddressbook/editors/protocols/skypeprotocol.desktop
index 60ac3406..a5c67fc4 100644
--- a/kaddressbook/editors/protocols/skypeprotocol.desktop
+++ b/kaddressbook/editors/protocols/skypeprotocol.desktop
@@ -24,7 +24,6 @@ Comment[hu]=Skype internetes telefon
Comment[is]=Skype Internet sími
Comment[it]=Telefonia internet Skype
Comment[ja]=Skype インターネット電話
-Comment[ka]=Skype ინტერნეტ ტელეფონი
Comment[kk]=Skype Интернет телефониясы
Comment[km]=ទូរស័ព្ទ​តាម​អ៊ីនធឺណិត​ដោយ​ប្រើ Skype
Comment[lt]=Skype Interneto telefonija
diff --git a/kaddressbook/editors/protocols/smsprotocol.desktop b/kaddressbook/editors/protocols/smsprotocol.desktop
index 30b50a1e..38710e83 100644
--- a/kaddressbook/editors/protocols/smsprotocol.desktop
+++ b/kaddressbook/editors/protocols/smsprotocol.desktop
@@ -29,7 +29,6 @@ Comment[hu]=SMS protokoll
Comment[is]=SMS samskiptamátinn
Comment[it]=Protocollo SMS
Comment[ja]=SMS プロトコル
-Comment[ka]= SMS ოქმი
Comment[kk]=SMS протоколы
Comment[km]=ពិធីការ​សេវា​សារ​ខ្លីៗ
Comment[lt]=SMS protokolas
diff --git a/kaddressbook/editors/protocols/yahooprotocol.desktop b/kaddressbook/editors/protocols/yahooprotocol.desktop
index c3055472..8064f772 100644
--- a/kaddressbook/editors/protocols/yahooprotocol.desktop
+++ b/kaddressbook/editors/protocols/yahooprotocol.desktop
@@ -30,7 +30,6 @@ Comment[hu]=Yahoo protokoll
Comment[is]=Yahoo samskiptamátinn
Comment[it]=Protocollo Yahoo
Comment[ja]=Yahoo プロトコル
-Comment[ka]=Yahoo ოქმი
Comment[kk]=Yahoo протоколы
Comment[km]=ពិធីការ​យ៉ាហ៊ូ
Comment[lt]=Yahoo protokolas
diff --git a/kaddressbook/features/distributionlist.desktop b/kaddressbook/features/distributionlist.desktop
index b05d7b5e..844a4896 100644
--- a/kaddressbook/features/distributionlist.desktop
+++ b/kaddressbook/features/distributionlist.desktop
@@ -27,7 +27,6 @@ Name[hu]=KAB címlista bővítőmodul
Name[is]=Íforrit fyrir KAB dreifilista
Name[it]=Plugin lista di distribuzione KAB
Name[ja]=KAB 配布リストプラグイン
-Name[ka]=KAB დისტრიბუციის სიის მოდული
Name[kk]=KAB тарату тізімінің плагин модулі
Name[km]=កម្មវិធី​ជំនួយ​បញ្ជី​ចែកចាយ​របស់ KAB
Name[lt]=KAB platinimo sąrašo priedas
@@ -51,8 +50,7 @@ Name[ta]=KABயின் பகிர்ந்தளித்தல் பட்
Name[tg]=Рӯйхати ба ҳар тараф мефиристодагӣ
Name[tr]=KAB Dağıtım Listesi Eklentisi
Name[uk]=Втулок списку розповсюдження KAB
-Name[uz]=Tarqatish roʻyxat plagini
-Name[uz@cyrillic]=Тарқатиш рўйхат плагини
+Name[uz]=Тарқатиш рўйхат плагини
Name[zh_CN]=KAB 分发列表插件
Comment=Plugin for managing distribution lists
Comment[af]=Inprop module vir die bestuur van verspreiding lyste
@@ -82,7 +80,6 @@ Comment[hu]=Bővítőmodul címlisták kezeléséhez
Comment[is]=Íforrit til að sjá um dreifilista
Comment[it]=Plugin per gestire liste di distribuzione
Comment[ja]=配布リスト管理用プラグイン
-Comment[ka]=სადისტრიბუციო სიათა მართვის მოდული
Comment[kk]=Тарату тізімімен айналысу плагин модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​គ្រប់គ្រង​បញ្ជី​ចែកចាយ
Comment[lt]=Priedas platinimo sąrašų tvarkymui
@@ -107,8 +104,7 @@ Comment[ta]=பகிர்தல் பட்டியல் நிர்வக
Comment[tg]=Кор бо рӯйхати ба ҳар тараф мефиристодагӣ
Comment[tr]=Dağıtım listelerini yönetmek için eklenti
Comment[uk]=Втулок для керування списками розповсюдження
-Comment[uz]=Tarqatish roʻyxatlarni boshqarish uchu plagin
-Comment[uz@cyrillic]=Тарқатиш рўйхатларни бошқариш учу плагин
+Comment[uz]=Тарқатиш рўйхатларни бошқариш учу плагин
Comment[zh_CN]=管理分发列表的插件
Comment[zh_TW]=管理分配清單外掛程式
Type=Service
diff --git a/kaddressbook/features/distributionlistng.desktop b/kaddressbook/features/distributionlistng.desktop
index 84d7070b..e805a91a 100644
--- a/kaddressbook/features/distributionlistng.desktop
+++ b/kaddressbook/features/distributionlistng.desktop
@@ -6,22 +6,16 @@ Name[ca]=Endollable de la propera generació de la llista de distribució KAB
Name[da]=Næste generations-plugin til KAB-Distribution-liste
Name[de]=Verteilerlisten-Modul für neues Adressbuch
Name[el]=Πρόσθετο επόμενης γενιάς λίστας διανομής του KAB
-Name[es]=Complemento de nueva generación KAB para listas de distribución
Name[et]=KAB postiloendi järgmise põlvkonna plugin
-Name[fr]=Module de liste de diffusion nouvelle génération pour KAB
-Name[is]=Næstu kynslóðar íforrit fyrir KAB dreifilista
Name[it]=Plugin lista di distribuzione KAB di nuova generazione
Name[ja]=KAB 配布リスト次世代プラグイン
-Name[km]=កម្មវិធី​ជំនួយ​ជំនាន់​ក្រោយ​របស់​​បញ្ជី​ចែកចាយ​ KAB
Name[nds]=Verbetert Verdeellist-Moduul för KAdressbook
Name[nl]=Plugin voor KAB Distributielijst (Nieuwe Generatie)
Name[pl]=Wtyczka KAB do obsługi list wysyłkowych
-Name[ru]=Списки рассылки (новая версия)
Name[sk]=KAB plugin distribučného zoznamu ďaľšej generácie
Name[sr]=Прикључак KAB-а наредне генерације за дистрибуционе листе
Name[sr@Latn]=Priključak KAB-a naredne generacije za distribucione liste
Name[sv]=Adressbokens nästa generation insticksprogram för distributionslistor
-Name[tr]=KAB Dağıtım Listesi Sonraki Kuşak Eklentisi
Name[zh_CN]=KAB 分发列表生成插件
Name[zh_TW]=KAB 分派清單下一代外掛程式
Comment=Plugin for managing distribution lists
@@ -52,7 +46,6 @@ Comment[hu]=Bővítőmodul címlisták kezeléséhez
Comment[is]=Íforrit til að sjá um dreifilista
Comment[it]=Plugin per gestire liste di distribuzione
Comment[ja]=配布リスト管理用プラグイン
-Comment[ka]=სადისტრიბუციო სიათა მართვის მოდული
Comment[kk]=Тарату тізімімен айналысу плагин модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​គ្រប់គ្រង​បញ្ជី​ចែកចាយ
Comment[lt]=Priedas platinimo sąrašų tvarkymui
@@ -77,8 +70,7 @@ Comment[ta]=பகிர்தல் பட்டியல் நிர்வக
Comment[tg]=Кор бо рӯйхати ба ҳар тараф мефиристодагӣ
Comment[tr]=Dağıtım listelerini yönetmek için eklenti
Comment[uk]=Втулок для керування списками розповсюдження
-Comment[uz]=Tarqatish roʻyxatlarni boshqarish uchu plagin
-Comment[uz@cyrillic]=Тарқатиш рўйхатларни бошқариш учу плагин
+Comment[uz]=Тарқатиш рўйхатларни бошқариш учу плагин
Comment[zh_CN]=管理分发列表的插件
Comment[zh_TW]=管理分配清單外掛程式
Type=Service
diff --git a/kaddressbook/features/distributionlistngwidget.cpp b/kaddressbook/features/distributionlistngwidget.cpp
index 08ef3e4c..4ca4e365 100644
--- a/kaddressbook/features/distributionlistngwidget.cpp
+++ b/kaddressbook/features/distributionlistngwidget.cpp
@@ -71,12 +71,11 @@ void KAB::DistributionListNg::ListBox::dropEvent( TQDropEvent *event )
if ( !item || index( item ) == 0 )
return;
- TQString vcards;
- if ( !KVCardDrag::decode( event, vcards ) )
+ KABC::Addressee::List list;
+ if ( !KVCardDrag::decode( event, list ) )
return;
- KABC::VCardConverter converter;
- emit dropped( item->text(), converter.parseVCards( vcards ) );
+ emit dropped( item->text(), list );
}
namespace KAB {
@@ -154,6 +153,7 @@ KAB::DistributionListNg::MainWidget::MainWidget( KAB::Core *core, TQWidget *pare
this, TQT_SLOT( contactsDropped( const TQString &, const KABC::Addressee::List & ) ) );
connect( mListBox, TQT_SIGNAL( highlighted( int ) ),
this, TQT_SLOT( itemSelected( int ) ) );
+ connect( mListBox, TQT_SIGNAL(doubleClicked(TQListBoxItem*)), TQT_SLOT(editSelectedDistributionList()) );
layout->addWidget( mListBox );
connect( core, TQT_SIGNAL( contactsUpdated() ),
@@ -172,7 +172,7 @@ void KAB::DistributionListNg::MainWidget::contextMenuRequested( TQListBoxItem *i
{
TQGuardedPtr<KPopupMenu> menu = new KPopupMenu( this );
menu->insertItem( i18n( "New Distribution List..." ), core(), TQT_SLOT( newDistributionList() ) );
- if ( item )
+ if ( item && ( item->text() !=i18n( "All Contacts" ) ) )
{
menu->insertItem( i18n( "Edit..." ), this, TQT_SLOT( editSelectedDistributionList() ) );
menu->insertItem( i18n( "Delete" ), this, TQT_SLOT( deleteSelectedDistributionList() ) );
diff --git a/kaddressbook/features/resourceselection.cpp b/kaddressbook/features/resourceselection.cpp
index d6edba25..59a3c1ee 100644
--- a/kaddressbook/features/resourceselection.cpp
+++ b/kaddressbook/features/resourceselection.cpp
@@ -251,7 +251,6 @@ void ResourceSelection::add()
return;
}
- resource->setResourceName( i18n( "%1 address book" ).arg( type ) );
resource->setAddressBook(core()->addressBook());
KRES::ConfigDialog dlg( this, TQString( "contact" ), resource );
@@ -262,6 +261,7 @@ void ResourceSelection::add()
mLastResource = resource->identifier();
updateView();
+ currentChanged(mListView->currentItem() );
} else {
delete resource;
resource = 0;
@@ -309,6 +309,7 @@ void ResourceSelection::remove()
core()->addressBook()->emitAddressBookChanged();
updateView();
+ currentChanged(mListView->currentItem() );
}
void ResourceSelection::currentChanged( TQListViewItem *item )
diff --git a/kaddressbook/features/resourceselection.desktop b/kaddressbook/features/resourceselection.desktop
index 4879e939..b1f33698 100644
--- a/kaddressbook/features/resourceselection.desktop
+++ b/kaddressbook/features/resourceselection.desktop
@@ -26,7 +26,6 @@ Name[hu]=Címjegyzékkezelő bővítőmodul
Name[is]=Umsjónaríforrit vistfangaflettis
Name[it]=Plugin per gestire rubriche indirizzi
Name[ja]=アドレス帳管理プラグイン
-Name[ka]=წიგნაკის მართვის მოდული
Name[kk]=Адрестік кітапшамен айналысу плагин модулі
Name[km]=កម្មវិធី​ជំនួយ​ការ​គ្រប់គ្រង​សៀវភៅ​អាសយដ្ឋាន
Name[lt]=Adresų knygelės tvarkymo priedas
@@ -78,7 +77,6 @@ Comment[hu]=Bővítőmodul címjegyzékek kezeléséhez
Comment[is]=Íforrit til að sjá um vistfangaskrár
Comment[it]=Plugin per gestire rubriche indirizzi
Comment[ja]=アドレス帳管理用プラグイン
-Comment[ka]=წიგნაკის მართვის მოდული
Comment[kk]=Адрестік кітапшамен айналысу плагин модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​គ្រប់គ្រង​សៀវភៅ​អាសយដ្ឋាន
Comment[lt]=Priedas adresų knygelių tvarkymui
diff --git a/kaddressbook/freebusywidget.cpp b/kaddressbook/freebusywidget.cpp
index 9bda3249..096c1d58 100644
--- a/kaddressbook/freebusywidget.cpp
+++ b/kaddressbook/freebusywidget.cpp
@@ -68,6 +68,11 @@ void FreeBusyWidget::storeContact( KABC::Addressee *addr )
KCal::FreeBusyUrlStore::self()->writeUrl( addr->preferredEmail(), mURL->url() );
KCal::FreeBusyUrlStore::self()->sync();
+ if ( mURL->url().isEmpty() ) {
+ addr->removeCustom( "KADDRESSBOOK", "FreeBusyURL" );
+ } else {
+ addr->insertCustom( "KADDRESSBOOK", "FreeBusyURL", mURL->url() );
+ }
}
void FreeBusyWidget::setReadOnly( bool readOnly )
diff --git a/kaddressbook/imagewidget.cpp b/kaddressbook/imagewidget.cpp
index ddacc2cd..7d8ac8f5 100644
--- a/kaddressbook/imagewidget.cpp
+++ b/kaddressbook/imagewidget.cpp
@@ -222,6 +222,8 @@ void ImageButton::contextMenuEvent( TQContextMenuEvent *event )
void ImageButton::load()
{
+ if ( mReadOnly )
+ return;
KURL url = KFileDialog::getOpenURL( TQString(), KImageIO::pattern(), this );
if ( url.isValid() ) {
if ( mImageLoader ) {
diff --git a/kaddressbook/interfaces/kaddressbook_contacteditorwidget.desktop b/kaddressbook/interfaces/kaddressbook_contacteditorwidget.desktop
index bb646e78..e8159d59 100644
--- a/kaddressbook/interfaces/kaddressbook_contacteditorwidget.desktop
+++ b/kaddressbook/interfaces/kaddressbook_contacteditorwidget.desktop
@@ -24,7 +24,6 @@ Comment[hu]=KAddressBook névjegyszerkesztő bővítőmodul
Comment[is]=KAddressbook tengiliðaritils íforrit
Comment[it]=Plugin editor dei contatti di KAddressbook
Comment[ja]=KAddressbook 連絡先エディタ ウィジェット プラグイン
-Comment[ka]= KDE-ს წიგნაკის კონტაქტთა რედაქტირების ელემენტის მოდული
Comment[kk]=Адрестік кітапшаның контактты өңдеу модулі
Comment[km]=កម្មវិធី​ជំនួយ​ធាតុ​ក្រាហ្វិក​កម្មវិធី​និពន្ធ​ទំនាក់ទំនង​របស់ KAddressBook
Comment[lt]=KAddressBook kontaktų redaktoriaus valdiklių priedas
diff --git a/kaddressbook/interfaces/kaddressbook_extension.desktop b/kaddressbook/interfaces/kaddressbook_extension.desktop
index 55be3b71..0bf35396 100644
--- a/kaddressbook/interfaces/kaddressbook_extension.desktop
+++ b/kaddressbook/interfaces/kaddressbook_extension.desktop
@@ -27,7 +27,6 @@ Comment[hu]=KAddressBook kiegészítő modul
Comment[is]=KAddressbook viðbótar íforrit
Comment[it]=Plugin estensione di KAddressbook
Comment[ja]=KAddressbook 拡張プラグイン
-Comment[ka]=KDE წიგნაკის გაფართოების მოდული
Comment[kk]=KAddressBook кеңейту модулі
Comment[km]=កម្មវិធី​ជំនួយ​ផ្នែក​បន្ថែម​របស់ KAddressBook
Comment[lt]=KAddressBook praplėtimo priedas
diff --git a/kaddressbook/interfaces/kaddressbook_xxport.desktop b/kaddressbook/interfaces/kaddressbook_xxport.desktop
index fb2b03d0..3d9e5503 100644
--- a/kaddressbook/interfaces/kaddressbook_xxport.desktop
+++ b/kaddressbook/interfaces/kaddressbook_xxport.desktop
@@ -28,7 +28,6 @@ Comment[hu]=KAddressBook importálási/exportálási bővítőmodul
Comment[is]=KAddressbook flytja inn/út íforrit
Comment[it]=Plugin importa/esporta di KAddressbook
Comment[ja]=KAddressbook インポート/エクスポートプラグイン
-Comment[ka]=წიგნაკის იმპორტ/ექსპორტის მოდული
Comment[kk]=KAddressBook импорт/экспорт модулі
Comment[km]=កម្មវិធី​ជំនួយ​នាំចូល/នាំចេញ​របស់ KAddressBook
Comment[lt]=KAddressBook importo/eksporto priedas
@@ -52,8 +51,7 @@ Comment[ta]=கேமுகவரிப்புத்தகம் ஏற்ற
Comment[tg]=Содирот ва воридоти китоби адрес
Comment[tr]=KAdresDefteri Al/Gönder Eklentisi
Comment[uk]=Втулок імпорту/експорту адресної книги KAddressBook
-Comment[uz]=Manzillar daftari uchun import/eksport plagini
-Comment[uz@cyrillic]=Манзиллар дафтари учун импорт/экспорт плагини
+Comment[uz]=Манзиллар дафтари учун импорт/экспорт плагини
Comment[zh_CN]=KAddressBook 导入/导出插件
Comment[zh_TW]=KAddressBook 匯入/匯出外掛程式
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index 427cb79a..7951cded 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -34,6 +34,8 @@
#include <tqwidgetstack.h>
#include <tqregexp.h>
#include <tqvbox.h>
+#include <tqtooltip.h>
+#include <tqwhatsthis.h>
#include <kabc/addresseelist.h>
#include <kabc/errorhandler.h>
@@ -277,7 +279,23 @@ KABC::Resource *KABCore::requestResource( TQWidget *parent )
KABC::Resource *resource;
while ( ( resource = resIt.current() ) != 0 ) {
++resIt;
- if ( !resource->readOnly() ) {
+ bool writable = false;
+ if ( resource->inherits( "KPIM::ResourceABC" ) ) {
+ KPIM::ResourceABC *resAbc = static_cast<KPIM::ResourceABC *>( resource );
+ const TQStringList subresources = resAbc->subresources();
+ for ( TQStringList::ConstIterator it = subresources.begin(); it != subresources.end(); ++it ) {
+ if ( resAbc->subresourceActive(*it) && resAbc->subresourceWritable(*it) ) {
+ writable = true;
+ break;
+ }
+ }
+ } else {
+ if ( !resource->readOnly() ) {
+ writable = true;
+ }
+ }
+
+ if ( writable ) {
KRES::Resource *res = resource; // downcast
kresResources.append( res );
}
@@ -401,7 +419,7 @@ void KABCore::setContactSelected( const TQString &uid )
mActionDelete->setEnabled( someSelected && writable );
// the "edit" dialog doubles as the details dialog and it knows when the addressee is read-only
// (### this does not make much sense from the user perspective!)
- mActionEditAddressee->setEnabled( singleSelected );
+ mActionEditAddressee->setEnabled( singleSelected && !mExtensionManager->isQuickEditVisible());
mActionCopyAddresseeTo->setEnabled( someSelected && moreThanOneResource );
mActionMoveAddresseeTo->setEnabled( someSelected && moreThanOneResource && writable );
mActionMail->setEnabled( someSelected );
@@ -413,9 +431,18 @@ void KABCore::setContactSelected( const TQString &uid )
if ( mReadWrite ) {
QClipboard *cb = TQApplication::clipboard();
+#if defined(KABC_VCARD_ENCODING_FIX)
+ const TQMimeSource *data = cb->data( QClipboard::Clipboard );
+ list = AddresseeUtil::clipboardToAddressees( data->encodedData( "text/x-vcard" ) );
+#else
list = AddresseeUtil::clipboardToAddressees( cb->text() );
+#endif
mActionPaste->setEnabled( !list.isEmpty() );
}
+#ifdef KDEPIM_NEW_DISTRLISTS
+ mAddDistListButton->setEnabled( writable );
+ mRemoveDistListButton->setEnabled( someSelected && writable );
+#endif
}
void KABCore::sendMail()
@@ -495,10 +522,20 @@ void KABCore::deleteContacts( const TQStringList &uids )
++it;
}
- if ( KMessageBox::warningContinueCancelList( mWidget, i18n( "Do you really want to delete this contact?",
- "Do you really want to delete these %n contacts?", uids.count() ),
- names, TQString::null, KStdGuiItem::del() ) == KMessageBox::Cancel )
+ if ( KMessageBox::warningContinueCancelList(
+ mWidget,
+ i18n( "<qt>"
+ "Do you really want to delete this contact from your addressbook?<br>"
+ "<b>Note:</b>The contact will be also removed from all distribution lists."
+ "</qt>",
+ "<qt>"
+ "Do you really want to delete these %n contacts from your addressbook?<br>"
+ "<b>Note:</b>The contacts will be also removed from all distribution lists."
+ "</qt>",
+ uids.count() ),
+ names, TQString::null, KStdGuiItem::del() ) == KMessageBox::Cancel ) {
return;
+ }
DeleteCommand *command = new DeleteCommand( mAddressBook, uids );
mCommandHistory->addCommand( command );
@@ -513,12 +550,15 @@ void KABCore::copyContacts()
{
KABC::Addressee::List addrList = mViewManager->selectedAddressees();
+#if defined(KABC_VCARD_ENCODING_FIX)
+ TQByteArray clipText = AddresseeUtil::addresseesToClipboard( addrList );
+ QClipboard *cb = TQApplication::clipboard();
+ cb->setText( TQString::fromUtf8( clipText.data() ) );
+#else
TQString clipText = AddresseeUtil::addresseesToClipboard( addrList );
-
- kdDebug(5720) << "KABCore::copyContacts: " << clipText << endl;
-
QClipboard *cb = TQApplication::clipboard();
cb->setText( clipText );
+#endif
}
void KABCore::cutContacts()
@@ -536,9 +576,12 @@ void KABCore::cutContacts()
void KABCore::pasteContacts()
{
QClipboard *cb = TQApplication::clipboard();
-
+#if defined(KABC_VCARD_ENCODING_FIX)
+ const TQMimeSource *data = cb->data( QClipboard::Clipboard );
+ KABC::Addressee::List list = AddresseeUtil::clipboardToAddressees( data->encodedData( "text/x-vcard" ) );
+#else
KABC::Addressee::List list = AddresseeUtil::clipboardToAddressees( cb->text() );
-
+#endif
pasteContacts( list );
}
@@ -667,6 +710,10 @@ void KABCore::contactModified( const KABC::Addressee &addr )
void KABCore::newDistributionList()
{
#ifdef KDEPIM_NEW_DISTRLISTS
+ KABC::Resource *resource = requestResource( mWidget );
+ if ( !resource )
+ return;
+
TQString name = i18n( "New Distribution List" );
const KPIM::DistributionList distList = KPIM::DistributionList::findByName( addressBook(), name );
if ( !distList.isEmpty() ) {
@@ -680,6 +727,7 @@ void KABCore::newDistributionList()
KPIM::DistributionList list;
list.setUid( KApplication::randomString( 10 ) );
list.setName( name );
+ list.setResource( resource );
editDistributionList( list );
#endif
}
@@ -827,27 +875,14 @@ void KABCore::storeContactIn( const TQString &uid, bool copy /*false*/ )
if ( !resource )
return;
- KABLock::self( mAddressBook )->lock( resource );
- TQStringList::Iterator it( uidList.begin() );
- const TQStringList::Iterator endIt( uidList.end() );
- while ( it != endIt ) {
- KABC::Addressee addr = mAddressBook->findByUid( *it++ );
- if ( !addr.isEmpty() ) {
- KABC::Addressee newAddr( addr );
- // We need to set a new uid, otherwise the insert below is
- // ignored. This is bad for syncing, but unavoidable, afaiks
- newAddr.setUid( KApplication::randomString( 10 ) );
- newAddr.setResource( resource );
- addressBook()->insertAddressee( newAddr );
- const bool inserted = addressBook()->find( newAddr ) != addressBook()->end();
- if ( !copy && inserted ) {
- KABLock::self( mAddressBook )->lock( addr.resource() );
- addressBook()->removeAddressee( addr );
- KABLock::self( mAddressBook )->unlock( addr.resource() );
- }
- }
+ if ( copy ) {
+ CopyToCommand *command = new CopyToCommand( mAddressBook, uidList, resource );
+ mCommandHistory->addCommand( command );
+ }
+ else {
+ MoveToCommand *command = new MoveToCommand( this, uidList, resource );
+ mCommandHistory->addCommand( command );
}
- KABLock::self( mAddressBook )->unlock( resource );
addressBookChanged();
setModified( true );
@@ -1201,19 +1236,30 @@ void KABCore::initGUI()
buttonLayout->setSpacing( KDialog::spacingHint() );
buttonLayout->addStretch( 1 );
- KPushButton *addDistListButton = new KPushButton( mDistListButtonWidget );
- addDistListButton->setText( i18n( "Add" ) );
- connect( addDistListButton, TQT_SIGNAL( clicked() ),
+ mAddDistListButton = new KPushButton( mDistListButtonWidget );
+ mAddDistListButton->setEnabled( false );
+ mAddDistListButton->setText( i18n( "Add" ) );
+ TQToolTip::add( mAddDistListButton, i18n( "Add contacts to the distribution list" ) );
+ TQWhatsThis::add( mAddDistListButton,
+ i18n( "Click this button if you want to add more contacts to "
+ "the current distribution list. You will be shown a dialog that allows "
+ "to enter a list of existing contacts to this distribution list." ) );
+ connect( mAddDistListButton, TQT_SIGNAL( clicked() ),
this, TQT_SLOT( editSelectedDistributionList() ) );
- buttonLayout->addWidget( addDistListButton );
+ buttonLayout->addWidget( mAddDistListButton );
mDistListButtonWidget->setShown( false );
viewLayout->addWidget( mDistListButtonWidget );
- KPushButton *removeDistListButton = new KPushButton( mDistListButtonWidget );
- removeDistListButton->setText( i18n( "Remove" ) );
- connect( removeDistListButton, TQT_SIGNAL( clicked() ),
+ mRemoveDistListButton = new KPushButton( mDistListButtonWidget );
+ mRemoveDistListButton->setEnabled( false );
+ mRemoveDistListButton->setText( i18n( "Remove" ) );
+ TQToolTip::add( mRemoveDistListButton, i18n( "Remove contacts from the distribution list" ) );
+ TQWhatsThis::add( mRemoveDistListButton,
+ i18n( "Click this button if you want to remove the selected contacts from "
+ "the current distribution list." ) );
+ connect( mRemoveDistListButton, TQT_SIGNAL( clicked() ),
this, TQT_SLOT( removeSelectedContactsFromDistList() ) );
- buttonLayout->addWidget( removeDistListButton );
+ buttonLayout->addWidget( mRemoveDistListButton );
#endif
mFilterSelectionWidget = new FilterSelectionWidget( searchTB , "kde toolbar widget" );
@@ -1566,8 +1612,42 @@ void KABCore::removeSelectedContactsFromDistList()
const TQStringList uids = selectedUIDs();
if ( uids.isEmpty() )
return;
- for ( TQStringList::ConstIterator it = uids.begin(); it != uids.end(); ++it ) {
- dist.removeEntry ( *it );
+
+ TQStringList names;
+ TQStringList::ConstIterator it = uids.begin();
+ const TQStringList::ConstIterator endIt( uids.end() );
+ while ( it != endIt ) {
+ KABC::Addressee addr = mAddressBook->findByUid( *it );
+ names.append( addr.realName().isEmpty() ? addr.preferredEmail() : addr.realName() );
+ ++it;
+ }
+
+ if ( KMessageBox::warningContinueCancelList(
+ mWidget,
+ i18n( "<qt>"
+ "Do you really want to remove this contact from the %1 distribution list?<br>"
+ "<b>Note:</b>The contact will be not be removed from your addressbook nor from "
+ "any other distribution list."
+ "</qt>",
+ "<qt>"
+ "Do you really want to remove these %n contacts from the %1 distribution list?<br>"
+ "<b>Note:</b>The contacts will be not be removed from your addressbook nor from "
+ "any other distribution list."
+ "</qt>",
+ uids.count() ).arg( mSelectedDistributionList ),
+ names, TQString::null, KStdGuiItem::del() ) == KMessageBox::Cancel ) {
+ return;
+ }
+
+ for ( TQStringList::ConstIterator uidIt = uids.begin(); uidIt != uids.end(); ++uidIt ) {
+ typedef KPIM::DistributionList::Entry::List EntryList;
+ const EntryList entries = dist.entries( addressBook() );
+ for ( EntryList::ConstIterator it = entries.begin(); it != entries.end(); ++it ) {
+ if ( (*it).addressee.uid() == (*uidIt) ) {
+ dist.removeEntry( (*it).addressee, (*it).email );
+ break;
+ }
+ }
}
addressBook()->insertAddressee( dist );
setModified();
@@ -1631,7 +1711,6 @@ void KABCore::editDistributionList( const KPIM::DistributionList &dist )
if ( dlg->exec() == TQDialog::Accepted && dlg ) {
const KPIM::DistributionList newDist = dlg->distributionList();
if ( newDist != dist ) {
- addressBook()->insertAddressee( newDist );
setModified();
}
}
@@ -1648,15 +1727,21 @@ void KABCore::setSelectedDistributionList( const TQString &name )
{
mSelectedDistributionList = name;
mSearchManager->setSelectedDistributionList( name );
- mViewHeaderLabel->setText( name.isNull() ? i18n( "Contacts" ) : i18n( "Distribution List: %1" ).arg( name ) );
+ mViewHeaderLabel->setText( name.isNull() ?
+ i18n( "Contacts" ) :
+ i18n( "Distribution List: %1" ).arg( name ) );
mDistListButtonWidget->setShown( !mSelectedDistributionList.isNull() );
if ( !name.isNull() ) {
mDetailsStack->raiseWidget( mDistListEntryView );
+ if ( selectedUIDs().isEmpty() ) {
+ mViewManager->setFirstSelected( true );
+ }
const TQStringList selectedUids = selectedUIDs();
showDistributionListEntry( selectedUids.isEmpty() ? TQString() : selectedUids.first() );
+ } else {
+ mDetailsStack->raiseWidget( mExtensionManager->activeDetailsWidget() ?
+ mExtensionManager->activeDetailsWidget() : mDetailsWidget );
}
- else
- mDetailsStack->raiseWidget( mExtensionManager->activeDetailsWidget() ? mExtensionManager->activeDetailsWidget() : mDetailsWidget );
}
TQStringList KABCore::distributionListNames() const
diff --git a/kaddressbook/kabcore.h b/kaddressbook/kabcore.h
index ac297510..2e6fded3 100644
--- a/kaddressbook/kabcore.h
+++ b/kaddressbook/kabcore.h
@@ -24,6 +24,8 @@
#ifndef KABCORE_H
#define KABCORE_H
+#include <config.h> // FOR KDEPIM_NEW_DISTRLISTS
+
#include <kabc/field.h>
#include <tqdict.h>
@@ -48,6 +50,7 @@ class KAboutData;
class KAction;
class KActionCollection;
class KConfig;
+class KPushButton;
class KStatusBar;
class KToggleAction;
class KXMLGUIClient;
@@ -157,7 +160,7 @@ class KDE_EXPORT KABCore : public KAB::Core
/**
sets the distribution list to display. If null, the regular
- address book is to be displayed.
+ address book is to be displayed.
*/
virtual void setSelectedDistributionList( const TQString &name );
#endif
@@ -308,7 +311,7 @@ class KDE_EXPORT KABCore : public KAB::Core
*/
virtual void newContact();
- /**
+ /**
DCOP METHOD: Opens distribution list editor to create a new distribution list
*/
virtual void newDistributionList();
@@ -347,7 +350,7 @@ class KDE_EXPORT KABCore : public KAB::Core
* If the adding to the new resource is successfull, the contact is
* removed from the old one, unless the Copy flag is given. */
void storeContactIn( const TQString &uid = TQString::null, bool copy = false );
-
+
/**
* Lets the user chose a different resource for the selected contacts and
* copies it there.
@@ -421,7 +424,7 @@ class KDE_EXPORT KABCore : public KAB::Core
void removeSelectedContactsFromDistList();
void editSelectedDistributionList();
- void sendMailToDistributionList( const TQString &id );
+ void sendMailToDistributionList( const TQString &id );
private:
void initGUI();
@@ -443,6 +446,8 @@ class KDE_EXPORT KABCore : public KAB::Core
#ifdef KDEPIM_NEW_DISTRLISTS
TQString mSelectedDistributionList;
+ KPushButton *mAddDistListButton;
+ KPushButton *mRemoveDistListButton;
TQWidget *mDistListButtonWidget;
#endif
diff --git a/kaddressbook/kabtools.cpp b/kaddressbook/kabtools.cpp
index ba3b886f..7e6b5c9c 100644
--- a/kaddressbook/kabtools.cpp
+++ b/kaddressbook/kabtools.cpp
@@ -80,12 +80,15 @@ void KABTools::mailVCards( const TQStringList &uids, KABC::AddressBook *ab )
KABC::VCardConverter converter;
KABC::Addressee::List list;
list.append( addressee );
+#if defined(KABC_VCARD_ENCODING_FIX)
+ const TQCString vcard = converter.createVCardsRaw( list, KABC::VCardConverter::v3_0 );
+ file.writeBlock( vcard, vcard.length() );
+#else
TQString vcard = converter.createVCards( list, KABC::VCardConverter::v3_0 );
-
TQTextStream t( &file );
t.setEncoding( TQTextStream::UnicodeUTF8 );
t << vcard;
-
+#endif
file.close();
KURL url( path );
diff --git a/kaddressbook/kaddressbook.desktop b/kaddressbook/kaddressbook.desktop
index 92a1ee73..a636c776 100644
--- a/kaddressbook/kaddressbook.desktop
+++ b/kaddressbook/kaddressbook.desktop
@@ -42,7 +42,6 @@ GenericName[hu]=Címjegyzékkezelő
GenericName[is]=Vistfangastjóri
GenericName[it]=Gestore degli indirizzi
GenericName[ja]=アドレスマネージャ
-GenericName[ka]=წიგნაკის მმართველი
GenericName[kk]=Адрестік кітапшасы
GenericName[km]=កម្មវិធី​គ្រប់គ្រង​អាសយដ្ឋាន
GenericName[lt]=Adresų tvarkyklė
diff --git a/kaddressbook/kaddressbook_view.desktop b/kaddressbook/kaddressbook_view.desktop
index 05e445e3..ffd4e8d5 100644
--- a/kaddressbook/kaddressbook_view.desktop
+++ b/kaddressbook/kaddressbook_view.desktop
@@ -28,7 +28,6 @@ Comment[hu]=KAddressBook nézeti bővítőmodul
Comment[is]=KAddressbook birtingar íforrit
Comment[it]=Plugin visualizzazione di KAddressbook
Comment[ja]=Addressbook ビュープラグイン
-Comment[ka]= KDE წიგნაკის ჩვენების მოდული
Comment[kk]=Адрестік кітапшасын қарау модулі
Comment[km]=កម្មវិធី​ជំនួយ​ទិដ្ឋភាព​របស់ KAddressBook
Comment[lt]=KAddressBook peržiūros priedas
diff --git a/kaddressbook/kcmconfigs/kabconfig.desktop b/kaddressbook/kcmconfigs/kabconfig.desktop
index 17a0b1b5..f5e5d450 100644
--- a/kaddressbook/kcmconfigs/kabconfig.desktop
+++ b/kaddressbook/kcmconfigs/kabconfig.desktop
@@ -36,7 +36,6 @@ Name[hu]=Általános
Name[is]=Almennt
Name[it]=Generale
Name[ja]=全般
-Name[ka]=ზოგადი
Name[kk]=Жалпы
Name[km]=ទូទៅ
Name[lt]=Bendras
@@ -62,8 +61,7 @@ Name[ta]=பொதுவான
Name[th]=ทั่วไป
Name[tr]=Genel
Name[uk]=Загальні
-Name[uz]=Umumiy
-Name[uz@cyrillic]=Умумий
+Name[uz]=Умумий
Name[zh_CN]=常规
Comment=Configure the Address Book
Comment[af]=Stel die adres boek op
@@ -94,7 +92,6 @@ Comment[hu]=A címjegyzék beállítása
Comment[is]=Stilla vistfangaskrána
Comment[it]=Configura la rubrica indirizzi
Comment[ja]=アドレス帳設定
-Comment[ka]=წიგნაკის კონფიგურაცია
Comment[kk]=Адрестік кітапшаны баптау
Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​សៀវភៅ​អាសយដ្ឋាន
Comment[lt]=Konfigūruoti adresų knygelę
@@ -120,8 +117,7 @@ Comment[ta]=கேமுகவரிப்புத்தகத்தை கட
Comment[tg]=Танзимоти китоби адрес
Comment[tr]=Adres Defterini Yapılandır
Comment[uk]=Налаштування адресної книги
-Comment[uz]=Manzillar daftarini moslash
-Comment[uz@cyrillic]=Манзиллар дафтарини мослаш
+Comment[uz]=Манзиллар дафтарини мослаш
Comment[zh_CN]=配置地址簿
Comment[zh_TW]=設定通訊錄
Keywords=kaddressbook, configure, settings
@@ -151,7 +147,6 @@ Keywords[hu]=kaddressbook, konfigurálás, beállítások
Keywords[is]=kaddressbook, stillingar, stilla
Keywords[it]=kaddressbook, configura, impostazioni
Keywords[ja]=kaddressbook 設定
-Keywords[ka]=kaddressbook,კონფიგურაცია, პარამეტრები
Keywords[km]=kaddressbook,កំណត់​រចនាសម្ព័ន្ធ,ការ​កំណត់
Keywords[lt]=kaddressbook, configure, settings, konfigūravimas, nustatymai
Keywords[mk]=kaddressbook, configure, settings, КАдресар, конфигурирање, конфигурација, поставување
@@ -175,6 +170,5 @@ Keywords[ta]=கேமுகவரிப்புத்தகம்,கட்ட
Keywords[tg]=kaddressbook,китоби адрес,танзимот
Keywords[tr]=kadresdefteri, yapılandırma, ayarlar
Keywords[uk]=kaddressbook, налаштування, параметри
-Keywords[uz]=kaddressbook, moslash, moslamalar, manzillar daftari
-Keywords[uz@cyrillic]=kaddressbook, мослаш, мосламалар, манзиллар дафтари
+Keywords[uz]=kaddressbook, мослаш, мосламалар, манзиллар дафтари
Keywords[zh_CN]=kaddressbook, configure, settings, 配置, 设置
diff --git a/kaddressbook/kcmconfigs/kabcustomfields.desktop b/kaddressbook/kcmconfigs/kabcustomfields.desktop
index f0b7cf1f..c2d97c0f 100644
--- a/kaddressbook/kcmconfigs/kabcustomfields.desktop
+++ b/kaddressbook/kcmconfigs/kabcustomfields.desktop
@@ -37,7 +37,6 @@ Name[hu]=Egyéni lapok
Name[is]=Sérsniðnar síður
Name[it]=Pagine personalizzate
Name[ja]=カスタムページ
-Name[ka]=სამომხმარებლო გვერდები
Name[kk]=Қосымша парақтар
Name[km]=ទំព័រ​ផ្ទាល់​ខ្លួន
Name[lt]=Pasirinkti puslapiai
@@ -89,7 +88,6 @@ Comment[hu]=Az egyéni lapok beállítása
Comment[is]=Stilla sérsniðnu síðurnar
Comment[it]=Configura le pagine personalizzate
Comment[ja]=カスタムページの設定
-Comment[ka]=სამომხმარებლო გვერდების კონფიგურაცია
Comment[kk]=Қосымша парақтарды баптау
Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ទំព័រ​ផ្ទាល់​ខ្លួន
Comment[lt]=Konfigūruoti darbastalių skaičių ir pavadinimus
@@ -137,7 +135,6 @@ Keywords[hu]=kaddressbook, beállítás, beállítások, egyéni mezők
Keywords[is]=kaddressbook, stillingar, stilla, sérsniðnir reitir
Keywords[it]=kaddressbook, configura, impostazioni, campi personalizzati
Keywords[ja]=kaddressbook、設定、設定,カスタムフィールド
-Keywords[ka]=kaddressbook,კონფიგურაცია,პარამეტრები,სამომხმარებლო ველები
Keywords[km]=kaddressbook,កំណត់​រចនាសម្ព័ន្ធ,ការ​កំណត់,វាល​ផ្ទាល់​ខ្លួន
Keywords[lt]=kaddressbook, configure, settings, custom fields, pasirinkti laukai,konfigūruoti, nustatymai
Keywords[mk]=kaddressbook, configure, settings, custom fields, КАдресар, конфигурација, конфигурирање, сопствени полиња
diff --git a/kaddressbook/kcmconfigs/kabldapconfig.desktop b/kaddressbook/kcmconfigs/kabldapconfig.desktop
index a13645a9..2d29acdf 100644
--- a/kaddressbook/kcmconfigs/kabldapconfig.desktop
+++ b/kaddressbook/kcmconfigs/kabldapconfig.desktop
@@ -38,7 +38,6 @@ Name[hu]=LDAP-lekérdezés
Name[is]=LDAP uppfletting
Name[it]=Ricerca LDAP
Name[ja]=LDAP 検索
-Name[ka]= ძებნა LDAP-ში
Name[kk]=LDAP іздеу
Name[km]=ស្វែងរក LDAP
Name[lt]=LDAP paieška
@@ -89,7 +88,6 @@ Comment[hu]=A címjegyzék LDAP-beállításainak megváltoztatása
Comment[is]=Breyta LDAP stillingum vistfangaskráarinnar
Comment[it]=Configurare le impostazioni LDAP della rubrica indirizzi
Comment[ja]=アドレス帳 LDAP 設定
-Comment[ka]=LDAP წიგნაკის პარამეტრების კონფიგურაცია
Comment[kk]=Адрестік кітапшаның LDAP параметрлерін баптау
Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​ការ​កំណត់ LDAP របស់​សៀវភៅ​អាសយដ្ឋាន
Comment[lt]=Konfigūruoti adresų knygelės LDAP nustatymus
@@ -113,8 +111,7 @@ Comment[ta]=கேமுகவரிபுத்தகத்தை உருவ
Comment[tg]=Танзимоти серверҳои LDAP-и китоби адрес
Comment[tr]=Adres Defteri LDAP Ayarlarını Yapılandır
Comment[uk]=Налаштування параметрів LDAP для адресної книги
-Comment[uz]=LDAP manzillar daftarini moslash
-Comment[uz@cyrillic]=LDAP манзиллар дафтарини мослаш
+Comment[uz]=LDAP манзиллар дафтарини мослаш
Comment[zh_CN]=配置地址簿 LDAP 设置
Comment[zh_TW]=設定通訊錄 LDAP 設定
Keywords=kaddressbook, configure, settings, LDAP
@@ -142,7 +139,6 @@ Keywords[hu]=kaddressbook, konfiguráció, beállítások, LDAP
Keywords[is]=kaddressbook, stillingar, stilla, LDAP
Keywords[it]=kaddressbook, configura, impostazioni, LDAP
Keywords[ja]=kaddressbook LDAP 設定
-Keywords[ka]=kaddressbook,კონფიგურაცია,პარამეტრები, LDAP
Keywords[km]=kaddressbook,កំណត់​រចនាសម្ព័ន្ធ,ការ​កំណត់,LDAP
Keywords[lt]=kaddressbook, configure, settings, LDAP, nustatymai, konfigūruoti
Keywords[mk]=kaddressbook, configure, settings, LDAP, кадресар, конфигурација, конфигурирање, поставувања
@@ -166,6 +162,5 @@ Keywords[ta]=கேமுகவரிபுத்தகம்,கட்டமை
Keywords[tg]=kaddressbook, configure, settings, LDAP, китоби адрес, танзимот
Keywords[tr]=adres defteri,yapılandırma,ayarlar,LDAP
Keywords[uk]=kaddressbook, налаштування, параметри, LDAP
-Keywords[uz]=kaddressbook, moslash, moslamalar, manzillar daftari, LDAP
-Keywords[uz@cyrillic]=kaddressbook, мослаш, мосламалар, манзиллар дафтари, LDAP
+Keywords[uz]=kaddressbook, мослаш, мосламалар, манзиллар дафтари, LDAP
Keywords[zh_CN]=kaddressbook, configure, settings, LDAP, 配置, 设置
diff --git a/kaddressbook/ldapsearchdialog.cpp b/kaddressbook/ldapsearchdialog.cpp
index fc99562d..c42ff669 100644
--- a/kaddressbook/ldapsearchdialog.cpp
+++ b/kaddressbook/ldapsearchdialog.cpp
@@ -576,7 +576,14 @@ KABC::Addressee::List LDAPSearchDialog::importContactsUnlessTheyExist( const TQV
addr.setNote( i18n( "arguments are host name, datetime", "Imported from LDAP directory %1 on %2" ).arg( d->itemToServer[cli], KGlobal::locale()->formatDateTime( now ) ) );
addr.setResource( resource );
mCore->addressBook()->insertAddressee( addr );
- importedAddrs.append( addr.fullEmail() );
+ TQString displayString;
+ if ( !addr.fullEmail().isEmpty() ) {
+ displayString = addr.fullEmail();
+ }
+ else {
+ displayString = addr.formattedName();
+ }
+ importedAddrs.append( displayString );
localAddrs.append( addr );
} else {
localAddrs.append( existing.first() );
@@ -595,14 +602,15 @@ KABC::Addressee::List LDAPSearchDialog::importContactsUnlessTheyExist( const TQV
void LDAPSearchDialog::slotUser2()
{
#ifdef KDEPIM_NEW_DISTRLISTS
- KABC::Resource *resource = mCore->requestResource( this );
- if ( !resource ) return;
-
const TQValueList<ContactListItem*> selectedItems = d->selectedItems( mResultListView );
if ( selectedItems.isEmpty() ) {
KMessageBox::information( this, i18n( "Please select the contacts you want to add to the distribution list." ), i18n( "No Contacts Selected" ) );
return;
}
+
+ KABC::Resource *resource = mCore->requestResource( this );
+ if ( !resource ) return;
+
KPIM::DistributionList dist = selectDistributionList();
if ( dist.isEmpty() )
return;
@@ -628,6 +636,8 @@ void LDAPSearchDialog::slotUser1()
KABC::Resource *resource = mCore->requestResource( this );
if ( !resource ) return;
const TQValueList<ContactListItem*> selectedItems = d->selectedItems( mResultListView );
+ if( selectedItems.isEmpty() )
+ return;
importContactsUnlessTheyExist( selectedItems, resource );
}
diff --git a/kaddressbook/searchmanager.cpp b/kaddressbook/searchmanager.cpp
index 0cd23b5a..374a1af5 100644
--- a/kaddressbook/searchmanager.cpp
+++ b/kaddressbook/searchmanager.cpp
@@ -20,6 +20,7 @@
with any edition of Qt, and distribute the resulting executable,
without including the source code for Qt in the source distribution.
*/
+#include <config.h> // FOR KDEPIM_NEW_DISTRLISTS
#include <kabc/addresseelist.h>
#include <kdeversion.h>
diff --git a/kaddressbook/thumbnailcreator/ldifvcardcreator.cpp b/kaddressbook/thumbnailcreator/ldifvcardcreator.cpp
index 0ed562e1..3de0220f 100644
--- a/kaddressbook/thumbnailcreator/ldifvcardcreator.cpp
+++ b/kaddressbook/thumbnailcreator/ldifvcardcreator.cpp
@@ -75,7 +75,13 @@ bool VCard_LDIFCreator::readContents( const TQString &path )
text.truncate(0);
// read the file
+#if defined(KABC_VCARD_ENCODING_FIX)
+ const TQByteArray data = file.readAll();
+ const TQString contents( data );
+ const TQCString contentsRaw( data.data(), data.size() );
+#else
TQString contents = file.readAll();
+#endif
file.close();
// convert the file contents to a KABC::Addressee address
@@ -83,7 +89,11 @@ bool VCard_LDIFCreator::readContents( const TQString &path )
KABC::Addressee addr;
KABC::VCardConverter converter;
+#if defined(KABC_VCARD_ENCODING_FIX)
+ addrList = converter.parseVCardsRaw( contentsRaw );
+#else
addrList = converter.parseVCards( contents );
+#endif
if ( addrList.count() == 0 )
if ( !KABC::LDIFConverter::LDIFToAddressee( contents, addrList ) )
return false;
diff --git a/kaddressbook/thumbnailcreator/ldifvcardcreator.h b/kaddressbook/thumbnailcreator/ldifvcardcreator.h
index 7b5cface..2de6c7b4 100644
--- a/kaddressbook/thumbnailcreator/ldifvcardcreator.h
+++ b/kaddressbook/thumbnailcreator/ldifvcardcreator.h
@@ -23,6 +23,7 @@
#include <tqpixmap.h>
#include <kio/thumbcreator.h>
+#include <kabc/vcardparser.h> // for KABC_VCARD_ENCODING_FIX define
class KPixmapSplitter;
diff --git a/kaddressbook/thumbnailcreator/ldifvcardthumbnail.desktop b/kaddressbook/thumbnailcreator/ldifvcardthumbnail.desktop
index 2eb63ab5..90d73eac 100644
--- a/kaddressbook/thumbnailcreator/ldifvcardthumbnail.desktop
+++ b/kaddressbook/thumbnailcreator/ldifvcardthumbnail.desktop
@@ -25,7 +25,6 @@ Name[hu]=Elektronikus névjegykártyák
Name[is]=Skrár með rafrænum nafnspjöldum
Name[it]=Biglietto da visita elettronico
Name[ja]=電子ビジネスカードファイル
-Name[ka]=ელექტრონული სავიზიტო ბარათების ფაილები
Name[kk]=Электрондық визитка файлдары
Name[km]=ឯកសារ​នាមប័ណ្ណ​អេឡិចត្រូនិច
Name[lt]=Elektroninės verslo kortelės bylos
diff --git a/kaddressbook/undocmds.cpp b/kaddressbook/undocmds.cpp
index ee989595..0f6e555d 100644
--- a/kaddressbook/undocmds.cpp
+++ b/kaddressbook/undocmds.cpp
@@ -28,6 +28,8 @@
#include <klocale.h>
#include <kapplication.h>
+#include <kabc/resource.h>
+
#include "addresseeutil.h"
#include "addresseeconfig.h"
#include "core.h"
@@ -35,6 +37,16 @@
#include "undocmds.h"
+bool Command::resourceExist( KABC::Resource *resource )
+{
+ TQPtrList<KABC::Resource> lst = addressBook()->resources();
+ for ( Resource *res = lst.first(); res; res = lst.next() ) {
+ if ( res == resource )
+ return true;
+ }
+ return false;
+}
+
DeleteCommand::DeleteCommand( KABC::AddressBook *addressBook,
const TQStringList &uidList)
: Command( addressBook ), mUIDList( uidList )
@@ -57,7 +69,8 @@ void DeleteCommand::unexecute()
lock()->lock( (*it).resource() );
for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
- addressBook()->insertAddressee( *it );
+ if ( resourceExist( ( *it ).resource() ) )
+ addressBook()->insertAddressee( *it );
lock()->unlock( (*it).resource() );
}
@@ -81,7 +94,8 @@ void DeleteCommand::execute()
KABC::Addressee::List::ConstIterator addrIt;
const KABC::Addressee::List::ConstIterator addrEndIt( mAddresseeList.end() );
for ( addrIt = mAddresseeList.begin(); addrIt != addrEndIt; ++addrIt ) {
- addressBook()->removeAddressee( *addrIt );
+ if ( resourceExist( ( *addrIt ).resource() ) )
+ addressBook()->removeAddressee( *addrIt );
lock()->unlock( (*addrIt).resource() );
}
}
@@ -107,7 +121,8 @@ void PasteCommand::unexecute()
lock()->lock( (*it).resource() );
for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
- addressBook()->removeAddressee( *it );
+ if ( resourceExist( ( *it ).resource() ) )
+ addressBook()->removeAddressee( *it );
lock()->unlock( (*it).resource() );
}
}
@@ -126,20 +141,19 @@ void PasteCommand::execute()
KABC::Addressee::List::Iterator it;
const KABC::Addressee::List::Iterator endIt( mAddresseeList.end() );
for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
- /**
- We have to set a new uid for the contact, otherwise insertAddressee()
- ignore it.
- */
- (*it).setUid( KApplication::randomString( 10 ) );
- uids.append( (*it).uid() );
- addressBook()->insertAddressee( *it );
+ if ( resourceExist( ( *it ).resource() ) ) {
+
+ /**
+ We have to set a new uid for the contact, otherwise insertAddressee()
+ ignore it.
+ */
+ (*it).setUid( KApplication::randomString( 10 ) );
+ uids.append( (*it).uid() );
+ addressBook()->insertAddressee( *it );
+ }
lock()->unlock( (*it).resource() );
}
- TQStringList::ConstIterator uidIt;
- const TQStringList::ConstIterator uidEndIt( uids.end() );
- for ( uidIt = uids.begin(); uidIt != uidEndIt; ++uidIt )
- mCore->editContact( *uidIt );
}
@@ -163,7 +177,8 @@ void NewCommand::unexecute()
lock()->lock( (*it).resource() );
for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
- addressBook()->removeAddressee( *it );
+ if ( resourceExist( ( *it ).resource() ) )
+ addressBook()->removeAddressee( *it );
lock()->unlock( (*it).resource() );
}
}
@@ -178,7 +193,8 @@ void NewCommand::execute()
lock()->lock( (*it).resource() );
for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
- addressBook()->insertAddressee( *it );
+ if ( resourceExist( ( *it ).resource() ) )
+ addressBook()->insertAddressee( *it );
lock()->unlock( (*it).resource() );
}
}
@@ -199,16 +215,22 @@ TQString EditCommand::name() const
void EditCommand::unexecute()
{
- lock()->lock( mOldAddressee.resource() );
- addressBook()->insertAddressee( mOldAddressee );
- lock()->unlock( mOldAddressee.resource() );
+ if ( resourceExist( mOldAddressee.resource() ) )
+ {
+ lock()->lock( mOldAddressee.resource() );
+ addressBook()->insertAddressee( mOldAddressee );
+ lock()->unlock( mOldAddressee.resource() );
+ }
}
void EditCommand::execute()
{
- lock()->lock( mNewAddressee.resource() );
- addressBook()->insertAddressee( mNewAddressee );
- lock()->unlock( mNewAddressee.resource() );
+ if ( resourceExist( mNewAddressee.resource() ) )
+ {
+ lock()->lock( mNewAddressee.resource() );
+ addressBook()->insertAddressee( mNewAddressee );
+ lock()->unlock( mNewAddressee.resource() );
+ }
}
@@ -232,7 +254,8 @@ void CutCommand::unexecute()
lock()->lock( (*it).resource() );
for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
- addressBook()->insertAddressee( *it );
+ if ( resourceExist( ( *it ).resource() ) )
+ addressBook()->insertAddressee( *it );
lock()->unlock( (*it).resource() );
}
@@ -258,7 +281,8 @@ void CutCommand::execute()
KABC::Addressee::List::ConstIterator addrIt;
const KABC::Addressee::List::ConstIterator addrEndIt( mAddresseeList.end() );
for ( addrIt = mAddresseeList.begin(); addrIt != addrEndIt; ++addrIt ) {
- addressBook()->removeAddressee( *addrIt );
+ if ( resourceExist( ( *addrIt ).resource() ) )
+ addressBook()->removeAddressee( *addrIt );
lock()->unlock( addr.resource() );
}
@@ -268,5 +292,115 @@ void CutCommand::execute()
QClipboard *cb = TQApplication::clipboard();
mOldText = cb->text();
kapp->processEvents();
+#if defined(KABC_VCARD_ENCODING_FIX)
+ cb->setText( TQString::fromUtf8( mClipText.data() ) );
+#else
cb->setText( mClipText );
+#endif
+}
+
+CopyToCommand::CopyToCommand( KABC::AddressBook *addressBook, const TQStringList &uidList,
+ KABC::Resource *resource )
+ : Command( addressBook ), mUIDList( uidList ), mResource( resource )
+{
+}
+
+TQString CopyToCommand::name() const
+{
+ return i18n( "Copy Contact To", "Copy %n Contacts To", mUIDList.count() );
+}
+
+void CopyToCommand::unexecute()
+{
+ KABC::Addressee::List::ConstIterator it;
+ const KABC::Addressee::List::ConstIterator endIt( mAddresseeList.end() );
+ //For copy : just remove it from the "copied to" resource.
+ // lock resources
+ for ( it = mAddresseeList.begin(); it != endIt; ++it )
+ lock()->lock( (*it).resource() );
+
+ for ( it = mAddresseeList.begin(); it != endIt; ++it ) {
+ if ( resourceExist( ( *it ).resource() ) )
+ addressBook()->removeAddressee( *it );
+ lock()->unlock( (*it).resource() );
+ }
+}
+
+void CopyToCommand::execute()
+{
+ KABLock::self( addressBook() )->lock( mResource );
+ TQStringList::Iterator it( mUIDList.begin() );
+ const TQStringList::Iterator endIt( mUIDList.end() );
+ while ( it != endIt ) {
+ KABC::Addressee addr = addressBook()->findByUid( *it++ );
+ if ( !addr.isEmpty() ) {
+ KABC::Addressee newAddr( addr );
+ // We need to set a new uid, otherwise the insert below is
+ // ignored. This is bad for syncing, but unavoidable, afaiks
+ newAddr.setUid( KApplication::randomString( 10 ) );
+ newAddr.setResource( mResource );
+ if ( resourceExist( newAddr.resource() ) )
+ addressBook()->insertAddressee( newAddr );
+ mAddresseeList.append( newAddr );
+ }
+ }
+ KABLock::self( addressBook() )->unlock( mResource );
+
+}
+
+MoveToCommand::MoveToCommand( KAB::Core *core, const TQStringList &uidList,
+ KABC::Resource *resource )
+ : Command( core->addressBook() ), mUIDList( uidList ), mResource( resource ), mCore( core )
+{
+}
+
+TQString MoveToCommand::name() const
+{
+ return i18n( "Move Contact To", "Move %n Contacts To", mUIDList.count() );
+}
+
+void MoveToCommand::unexecute()
+{
+ //For move : remove it from the "copied to" resource and insert it back to "copied from" resource.
+ KABC::Resource *resource = mCore->requestResource( mCore->widget() );
+ if ( !resource )
+ return;
+ moveContactTo( resource );
+}
+
+void MoveToCommand::execute()
+{
+ moveContactTo( mResource );
+}
+
+void MoveToCommand::moveContactTo( KABC::Resource *resource )
+{
+ KABLock::self( addressBook() )->lock( resource );
+ TQStringList::Iterator it( mUIDList.begin() );
+ const TQStringList::Iterator endIt( mUIDList.end() );
+ while ( it != endIt ) {
+ KABC::Addressee addr = addressBook()->findByUid( *it++ );
+ if ( !addr.isEmpty() ) {
+ KABC::Addressee newAddr( addr );
+ // We need to set a new uid, otherwise the insert below is
+ // ignored. This is bad for syncing, but unavoidable, afaiks
+ TQString uid = KApplication::randomString( 10 );
+ newAddr.setUid( uid );
+ newAddr.setResource( resource );
+ if ( resourceExist( newAddr.resource() ) )
+ addressBook()->insertAddressee( newAddr );
+ mAddresseeList.append( newAddr );
+ mUIDList.append( uid );
+ const bool inserted = addressBook()->find( newAddr ) != addressBook()->end();
+ if ( inserted ) {
+ if ( resourceExist( addr.resource() ) ) {
+ KABLock::self( addressBook() )->lock( addr.resource() );
+ addressBook()->removeAddressee( addr );
+ KABLock::self( addressBook() )->unlock( addr.resource() );
+ }
+ }
+ }
+ }
+ KABLock::self( addressBook() )->unlock( resource );
+
}
diff --git a/kaddressbook/undocmds.h b/kaddressbook/undocmds.h
index 192a4e80..43f6aae9 100644
--- a/kaddressbook/undocmds.h
+++ b/kaddressbook/undocmds.h
@@ -32,6 +32,8 @@
#include <kabc/addressbook.h>
#include <kabc/addressee.h>
+#include <kabc/vcardparser.h> // for KABC_VCARD_ENCODING_FIX define
+
#include <kcommand.h>
#include "kablock.h"
@@ -48,9 +50,9 @@ class Command : public KCommand
protected:
KABC::AddressBook *addressBook() const { return mAddressBook; }
KABLock *lock() const { return KABLock::self( mAddressBook ); }
-
+ bool resourceExist( KABC::Resource *resource );
private:
- KABC::AddressBook *mAddressBook;
+ KABC::AddressBook* mAddressBook;
};
class DeleteCommand : public Command
@@ -94,7 +96,11 @@ class CutCommand : public Command
private:
KABC::Addressee::List mAddresseeList;
TQStringList mUIDList;
+#if defined(KABC_VCARD_ENCODING_FIX)
+ TQByteArray mClipText;
+#else
TQString mClipText;
+#endif
TQString mOldText;
};
@@ -127,4 +133,37 @@ class EditCommand : public Command
KABC::Addressee mNewAddressee;
};
+class CopyToCommand : public Command
+{
+ public:
+ CopyToCommand( KABC::AddressBook *addressBook, const TQStringList &uidList,
+ KABC::Resource *resource );
+
+ virtual TQString name() const;
+ virtual void unexecute();
+ virtual void execute();
+
+ private:
+ KABC::Addressee::List mAddresseeList;
+ TQStringList mUIDList;
+ KABC::Resource *mResource;
+};
+
+class MoveToCommand : public Command
+{
+ public:
+ MoveToCommand( KAB::Core *core, const TQStringList &uidList,
+ KABC::Resource *resource );
+
+ virtual TQString name() const;
+ virtual void unexecute();
+ virtual void execute();
+ void moveContactTo( KABC::Resource *resource );
+
+ private:
+ KABC::Addressee::List mAddresseeList;
+ TQStringList mUIDList;
+ KABC::Resource *mResource;
+ KAB::Core *mCore;
+};
#endif
diff --git a/kaddressbook/viewmanager.cpp b/kaddressbook/viewmanager.cpp
index 4e4cd5a6..5dab74e2 100644
--- a/kaddressbook/viewmanager.cpp
+++ b/kaddressbook/viewmanager.cpp
@@ -419,7 +419,7 @@ void ViewManager::dropped( TQDropEvent *e )
if ( e->source() == this )
return;
- TQString clipText, vcards;
+ KABC::Addressee::List list;
KURL::List urls;
if ( KURLDrag::decode( e, urls) ) {
@@ -433,10 +433,7 @@ void ViewManager::dropped( TQDropEvent *e )
}
} else if ( c == 1 )
emit urlDropped( *it );
- } else if ( KVCardDrag::decode( e, vcards ) ) {
- KABC::VCardConverter converter;
-
- const KABC::Addressee::List list = converter.parseVCards( vcards );
+ } else if ( KVCardDrag::decode( e, list ) ) {
KABC::Addressee::List::ConstIterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
KABC::Addressee a = mCore->addressBook()->findByUid( (*it).uid() );
@@ -467,7 +464,11 @@ void ViewManager::startDrag()
KMultipleDrag *drag = new KMultipleDrag( this );
KABC::VCardConverter converter;
+#if defined(KABC_VCARD_ENCODING_FIX)
+ TQCString vcards = converter.createVCardsRaw( addrList );
+#else
TQString vcards = converter.createVCards( addrList );
+#endif
// Best text representation is given by textdrag, so it must be first
drag->addDragObject( new TQTextDrag( AddresseeUtil::addresseesToEmails( addrList ), this ) );
@@ -484,7 +485,11 @@ void ViewManager::startDrag()
TQFile tempFile( tempDir.name() + "/" + fileName );
if ( tempFile.open( IO_WriteOnly ) ) {
+#if defined(KABC_VCARD_ENCODING_FIX)
+ tempFile.writeBlock( vcards, vcards.length() );
+#else
tempFile.writeBlock( vcards.utf8() );
+#endif
tempFile.close();
KURLDrag *urlDrag = new KURLDrag( KURL( tempFile.name() ), this );
diff --git a/kaddressbook/views/cardview.desktop b/kaddressbook/views/cardview.desktop
index cb8d35cb..7dfe4152 100644
--- a/kaddressbook/views/cardview.desktop
+++ b/kaddressbook/views/cardview.desktop
@@ -28,7 +28,6 @@ Name[hu]=Kártyanézet
Name[is]=Spjaldsýn
Name[it]=Vista scheda
Name[ja]=カードビュー
-Name[ka]=ბარათების ჩვენება
Name[kk]=Визитка
Name[km]=ទិដ្ឋភាព​កាត
Name[lt]=Kortelės vaizdas
diff --git a/kaddressbook/views/iconview.desktop b/kaddressbook/views/iconview.desktop
index 59853a70..4e99a5c5 100644
--- a/kaddressbook/views/iconview.desktop
+++ b/kaddressbook/views/iconview.desktop
@@ -32,7 +32,6 @@ Name[id]=Tampilan Ikon
Name[is]=Táknmyndasýn
Name[it]=Vista a icone
Name[ja]=アイコンビュー
-Name[ka]=ხატულების ჩვენება
Name[kk]=Таңбаша
Name[km]=ទិដ្ឋភាព​រូបតំណាង
Name[lt]=Rodyti piktogramas
@@ -63,8 +62,7 @@ Name[tg]=Ишоротҳо
Name[th]=มุมมองแบบไอคอน
Name[tr]=Simge Görünümü
Name[uk]=Вигляд піктограмами
-Name[uz]=Nishoncha koʻrinishida
-Name[uz@cyrillic]=Нишонча кўринишида
+Name[uz]=Нишонча кўринишида
Name[ven]=Mbonalelo ya aikhono
Name[vi]=Xem icon
Name[xh]=Imboniselo ye Icon
diff --git a/kaddressbook/views/tableview.desktop b/kaddressbook/views/tableview.desktop
index b07b2a19..71856c96 100644
--- a/kaddressbook/views/tableview.desktop
+++ b/kaddressbook/views/tableview.desktop
@@ -28,7 +28,6 @@ Name[hu]=Táblázatos nézet
Name[is]=Töflusýn
Name[it]=Vista tabella
Name[ja]=テーブルビュー
-Name[ka]=ცხრილი
Name[kk]=Кесте
Name[km]=ទិដ្ឋភាព​តារាង
Name[lt]=Lentelės vaizdas
@@ -55,8 +54,7 @@ Name[ta]=அட்டவணை காட்சி
Name[tg]=Ҷадвал
Name[tr]=Tablo Görünümü
Name[uk]=Вигляд таблицею
-Name[uz]=Jadval koʻrinishida
-Name[uz@cyrillic]=Жадвал кўринишида
+Name[uz]=Жадвал кўринишида
Name[zh_CN]=表格视图
Name[zh_TW]=表格檢視
Type=Service
diff --git a/kaddressbook/xxport/bookmark_xxport.desktop b/kaddressbook/xxport/bookmark_xxport.desktop
index 54d33716..186d1378 100644
--- a/kaddressbook/xxport/bookmark_xxport.desktop
+++ b/kaddressbook/xxport/bookmark_xxport.desktop
@@ -24,7 +24,6 @@ Name[hi]=केएबी पसंदीदा XXपोर्ट प्लग
Name[hu]=KAB könyvjelzőkezelő XXPort bővítőmodul
Name[is]=Íforrit fyrir KAB XXPort bókarmerki
Name[ja]=KAB ブックマーク インポート/エクスポートプラグイン
-Name[ka]=KAB სანიშნეების ექსპორტის მოდული
Name[kk]=Бетбелгіні экспорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB Bookmark XXPort
Name[lt]=KAB žymelių XXPort priedas
@@ -72,7 +71,6 @@ Comment[hu]=Bővítőmodul webcímek exportáláshoz, könyvjelzőként
Comment[is]=Íforrit til að skrá vefföng tengiliða sem bókarmerki
Comment[it]=Plugin per esportare come segnalibro gli indirizzi web dei contatti
Comment[ja]=連絡先のウェブアドレスをブックマークとしてエクスポートするプラグイン
-Comment[ka]= კონტაქტების ვებ-მისამართების სანიშნეებად ექსპორტის მოდული
Comment[kk]=Контакттың веб адрестерін бетбелгіге экспорттау модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចេញ​អាសយដ្ឋាន​បណ្ដាញ​របស់​ទំនាក់ទំនង ជា​ចំណាំ
Comment[lt]=Priedas skirtas žiniatinklio adresų kontaktuose eksportavimui į žymeles
diff --git a/kaddressbook/xxport/csv_xxport.cpp b/kaddressbook/xxport/csv_xxport.cpp
index fa4be2c9..b1ee9404 100644
--- a/kaddressbook/xxport/csv_xxport.cpp
+++ b/kaddressbook/xxport/csv_xxport.cpp
@@ -49,6 +49,11 @@ bool CSVXXPort::exportContacts( const KABC::AddresseeList &list, const TQString&
if ( url.isEmpty() )
return true;
+ if( TQFileInfo(url.path()).exists() ) {
+ if(KMessageBox::questionYesNo( parentWidget(), i18n("Do you want to overwrite file \"%1\"").arg( url.path()) ) == KMessageBox::No)
+ return false;
+ }
+
if ( !url.isLocalFile() ) {
KTempFile tmpFile;
if ( tmpFile.status() != 0 ) {
diff --git a/kaddressbook/xxport/csv_xxport.desktop b/kaddressbook/xxport/csv_xxport.desktop
index de6a51c4..9031c222 100644
--- a/kaddressbook/xxport/csv_xxport.desktop
+++ b/kaddressbook/xxport/csv_xxport.desktop
@@ -24,7 +24,6 @@ Name[hi]=केएबी सीएसवी XXपोर्ट प्लगइन
Name[hu]=KAB XXPort bővítőmodul
Name[is]=Íforrit fyrir KAV CSV XXPort
Name[ja]=KAB CSV インポート/エクスポートプラグイン
-Name[ka]=KAB CSV ექსპორტის მოდული
Name[kk]=CSV файлды экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB CSV XXPort
Name[lt]=KAB CSV XXPort priedas
@@ -71,7 +70,6 @@ Comment[hu]=Bővítőmodul névjegyek importálásához/exportálásához, CSV f
Comment[is]=Íforrit til að flytja tengiliði inn og út í CSV sniði
Comment[it]=Plugin per importare ed esportare contatti in formato CSV
Comment[ja]=CSV フォーマットで連絡先をインポート/エクスポートするプラグイン
-Comment[ka]=კონტაქტების CSV ფორმატით იმპორტ/ექსპორტის მოდული
Comment[kk]=Контакттарды CSV пішіміне экспорт/импорт ету модулі
Comment[km]=កម្មវិធី ជំនួយ​ដើម្បី​នាំចូល និង​នាំចេញ​ទំនាក់ទំនង​ក្នុង​ទ្រង់ទ្រាយ​ជា CSV ។
Comment[lt]=Priedas, skirtas kontaktų eksportui ir importui CSV formatu
diff --git a/kaddressbook/xxport/csvimportdialog.cpp b/kaddressbook/xxport/csvimportdialog.cpp
index cfcac0fe..bbcd74d2 100644
--- a/kaddressbook/xxport/csvimportdialog.cpp
+++ b/kaddressbook/xxport/csvimportdialog.cpp
@@ -857,6 +857,10 @@ void CSVImportDialog::saveTemplate()
if ( !fileName.contains( ".desktop" ) )
fileName += ".desktop";
+ if( TQFileInfo(fileName).exists() ) {
+ if(KMessageBox::questionYesNo( this, i18n("Do you want to overwrite file \"%1\"").arg(fileName) ) == KMessageBox::No)
+ return;
+ }
TQString name = KInputDialog::getText( i18n( "Template Name" ), i18n( "Please enter a name for the template:" ) );
if ( name.isEmpty() )
diff --git a/kaddressbook/xxport/eudora_xxport.desktop b/kaddressbook/xxport/eudora_xxport.desktop
index a075f3f8..10adbfa7 100644
--- a/kaddressbook/xxport/eudora_xxport.desktop
+++ b/kaddressbook/xxport/eudora_xxport.desktop
@@ -24,7 +24,6 @@ Name[hi]=केएबी यूडोरा XXपोर्ट प्लगइन
Name[hu]=KAB Eudora XXPort bővítőmodul
Name[is]=Íforrit fyrir KAB Eudora XXPort
Name[ja]=KAB Eudora インポート/エクスポートプラグイン
-Name[ka]= KAB Eudora-სთან ექსპორტის მოდული
Name[kk]=Eudora-ға экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB Eudora XXPort
Name[lt]=KAB Eudora XXPort priedas
@@ -72,7 +71,6 @@ Comment[hu]=Bővítőmodul Eudora névjegyek importálásához/exportálásához
Comment[is]=Íforrit til að flytja inn og út Eudora tengiliði
Comment[it]=Plugin importare ed esportare contatti Eudora
Comment[ja]=Eudora の連絡先をインポート/エクスポートするプラグイン
-Comment[ka]=Eudora-ს კონტაქტების იმპორტ/ექსპორტის მოდული
Comment[kk]=Eudora контакттарды экспорт/импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល និង​នាំចេញ​ទំនាក់ទំនង​របស់ Eudora
Comment[lt]=Priedas Eudora kontaktų importui ir eksportui
diff --git a/kaddressbook/xxport/gnokii_xxport.desktop b/kaddressbook/xxport/gnokii_xxport.desktop
index c937a7d7..e6152fd7 100644
--- a/kaddressbook/xxport/gnokii_xxport.desktop
+++ b/kaddressbook/xxport/gnokii_xxport.desktop
@@ -24,7 +24,6 @@ Name[hu]=KAB mobiltelefon XXPort bővítőmodul
Name[is]=Íforrit fyrir KAB farsíma XXPort
Name[it]=Plugin KAB telefono cellulare XXPort
Name[ja]=KAB 携帯電話インポート/エクスポートプラグイン
-Name[ka]=KAB მობილურ ტელეფონთან ექსპორტის მოდული
Name[kk]=Қалта телефонға экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB Mobile Phone XXPort
Name[lt]=KAB mobilaus telefono XXPort priedas
@@ -72,7 +71,6 @@ Comment[hu]=Mobiltelefonos bővítőmodul címbejegyzések importálásához/exp
Comment[is]=Íforrit til að færa tengilið milli póstfangaskrár og farsíma
Comment[it]=Plugin per importare ed esportare voci della rubrica da un telefono cellulare
Comment[ja]=アドレス帳のエントリをインポート/エクスポートする携帯電話用プラグイン
-Comment[ka]=მობილური ტელეფონის მოდული წიგნაკის ელემენტების იმპორტ/ექსპორტისათვის
Comment[kk]=Қалта телефонға адр. кітапша жазуын экспорт/импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ទូរស័ព្ទ​ចល័ត​ដើម្បី​នាំចូល និង​នាំចេញ​ធាតុ​សៀវភៅ​អាសយដ្ឋាន
Comment[lt]=Priedas skirtas importuoti ir eksportuoti adresų knygelės įrašus į mobiliuosius telefonus
diff --git a/kaddressbook/xxport/kde2_xxport.cpp b/kaddressbook/xxport/kde2_xxport.cpp
index 8e754b39..92a31102 100644
--- a/kaddressbook/xxport/kde2_xxport.cpp
+++ b/kaddressbook/xxport/kde2_xxport.cpp
@@ -66,9 +66,10 @@ KABC::AddresseeList KDE2XXPort::importContacts( const TQString& ) const
proc << "--override";
} else if ( result == KMessageBox::No )
proc << "kab2kabc";
- else
+ else {
kdDebug(5720) << "KAddressBook::importKDE2(): Unknow return value." << endl;
-
+ return KABC::AddresseeList();
+ }
proc.start( KProcess::Block );
addressBook()->load();
diff --git a/kaddressbook/xxport/kde2_xxport.desktop b/kaddressbook/xxport/kde2_xxport.desktop
index f2c20026..d47d108f 100644
--- a/kaddressbook/xxport/kde2_xxport.desktop
+++ b/kaddressbook/xxport/kde2_xxport.desktop
@@ -25,7 +25,6 @@ Name[hi]=केएबी केडीई2 XXपोर्ट प्लगइन
Name[hu]=KAB KDE2 XXPort bővítőmodul
Name[is]=Íforrit fyrir KAB KDE2 XXPort
Name[ja]=KAB KDE2 インポート/プラグイン
-Name[ka]=KAB KDE2-ს ექსპორტის მოდული
Name[kk]=KDE2 пішімінен импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB KDE2 XXPort
Name[lt]=KAB KDE2 XXPort priedas
@@ -73,7 +72,6 @@ Comment[hu]=Bővítőmodul KDE2-es címjegyzék importálásához
Comment[is]=Íforrit til að færa inn gömlu KDE2 vistfangaskrána
Comment[it]=Plugin per importare le vecchie voci della rubrica di KDE2
Comment[ja]=古い KDE 2 アドレス帳をインポートするプラグイン
-Comment[ka]=ძველი KDE2-ს წიგნაკის იმპორტის მოდული
Comment[kk]=Ескі KDE2 адр.кітапшасынан импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល​សៀវភៅ​អាសយដ្ឋាន KDE 2 ចាស់ៗ
Comment[lt]=Priedas senosios KDE 2 adresų knygelės importui
@@ -97,8 +95,7 @@ Comment[ta]=பழைய KDE 2 கேமுகவரிபுத்தகத்
Comment[tg]=Модул барои воридоти файлҳои китобиадресии KDE2
Comment[tr]=KDE 2 adres defteri bilgilerini alma eklentisi
Comment[uk]=Втулок для імпорту адресної книги старого формату часів KDE 2
-Comment[uz]=Eski KDE 2 manzillar daftarini import qilish uchun plagin
-Comment[uz@cyrillic]=Эски KDE 2 манзиллар дафтарини импорт қилиш учун плагин
+Comment[uz]=Эски KDE 2 манзиллар дафтарини импорт қилиш учун плагин
Comment[zh_CN]=导入旧的 KDE 2 地址簿的插件
Comment[zh_TW]=匯入舊的 KDE2 通訊錄的外掛程式
Type=Service
diff --git a/kaddressbook/xxport/ldif_xxport.cpp b/kaddressbook/xxport/ldif_xxport.cpp
index d632d449..92143c7e 100644
--- a/kaddressbook/xxport/ldif_xxport.cpp
+++ b/kaddressbook/xxport/ldif_xxport.cpp
@@ -96,6 +96,12 @@ bool LDIFXXPort::exportContacts( const KABC::AddresseeList &list, const TQString
if ( url.isEmpty() )
return true;
+ if( TQFileInfo(url.path()).exists() ) {
+ if(KMessageBox::questionYesNo( parentWidget(), i18n("Do you want to overwrite file \"%1\"").arg( url.path()) ) == KMessageBox::No)
+ return false;
+ }
+
+
if ( !url.isLocalFile() ) {
KTempFile tmpFile;
if ( tmpFile.status() != 0 ) {
diff --git a/kaddressbook/xxport/ldif_xxport.desktop b/kaddressbook/xxport/ldif_xxport.desktop
index abdc1095..1274b4d8 100644
--- a/kaddressbook/xxport/ldif_xxport.desktop
+++ b/kaddressbook/xxport/ldif_xxport.desktop
@@ -25,7 +25,6 @@ Name[hi]=केएबी एलडीआईएफ XXपोर्ट प्लग
Name[hu]=KAB LDIF XXPort bővítőmodul
Name[is]=Íforrit fyrir KAB LDIF XXPort
Name[ja]=KAB LDIF インポート/エクスポートプラグイン
-Name[ka]=KAB LDIF-ის ექსპორტის მოდული
Name[kk]=LDIF пішіміне экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB LDIF XXPort
Name[lt]=KAB LDIF XXPort priedas
@@ -74,7 +73,6 @@ Comment[hu]=Bővítőmodul Netscape és Mozilla LDIF formátumú névjegyek impo
Comment[is]=Íforrit sem flytur flytja inn eða út tengiliði í Netscape og Mozilla LDIF sniði
Comment[it]=Plugin per importare ed esportare contatti in formato Netscape e Mozilla LDIF
Comment[ja]=Netscape と Mozilla の LDIF フォーマットで連絡先をインポート/エクスポートするプラグイン
-Comment[ka]= Netscape-სა და Mozilla-ს კონტაქტების იმპორტ/ექსპორტის მოდული LDIF ფორმატით
Comment[kk]=Netscape пен Mozilla LDIF пішіміне экспорт/импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល និង​នាំចេញ​ទំនាក់ទំនង​ក្នុង​ទ្រង់ទ្រាយ​ជា Netscape និង Mozilla LDIF
Comment[lt]=Priedas, skirtas kontaktų importavimui ir eksportavimui Netscape ir Mozilla LDIFF formatu
diff --git a/kaddressbook/xxport/opera_xxport.desktop b/kaddressbook/xxport/opera_xxport.desktop
index ddbcff7b..c1d3c200 100644
--- a/kaddressbook/xxport/opera_xxport.desktop
+++ b/kaddressbook/xxport/opera_xxport.desktop
@@ -24,7 +24,6 @@ Name[hi]=केएबी ऑपेरा XXपोर्ट प्लगइन
Name[hu]=KAB Opera XXPort bővítőmodul
Name[is]=Íforrit fyrir KAP Opera XXPort
Name[ja]=KAB Opera インポート/エクスポートプラグイン
-Name[ka]=KAB Opera-ს ექსპორტის მოდული
Name[kk]=Opera пішіміне экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB Opera XXPort
Name[lt]=KAB Opera XXPort priedas
@@ -72,7 +71,6 @@ Comment[hu]=Bővítőmodul Opera névjegyek importálásához
Comment[is]=Íforrit til flytja inn eða út Opera tengiliði
Comment[it]=Plugin per importare contatti da Opera
Comment[ja]=Opera の連絡先をインポートするプラグイン
-Comment[ka]=Opera-ს კონტაქტების იმპორტის მოდული
Comment[kk]=Opera контактарын экспорт/импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល​ទំនាក់ទំនង​របស់ Opera
Comment[lt]=Priedas Opera kontaktų importui
diff --git a/kaddressbook/xxport/pab_xxport.desktop b/kaddressbook/xxport/pab_xxport.desktop
index e35ad24d..c0af8e3d 100644
--- a/kaddressbook/xxport/pab_xxport.desktop
+++ b/kaddressbook/xxport/pab_xxport.desktop
@@ -23,7 +23,6 @@ Name[hi]=केएबी एमएस एक्सचेंज निजी प
Name[hu]=KAB XXPort bővítőmodul MS Exchange személyes címjegyzékekhez
Name[is]=Íforrit fyrir KAB MS Exchange Personal Addressbook XXPort
Name[ja]=KAB MS Exchange パーソナルアドレス帳インポート/エクスポートプラグイン
-Name[ka]= MS Exchange-ის პერსონალური წიგნაკის ექსპორტის მოდული
Name[kk]=MS Exchange адрестік кітапшасына экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB MS Exchange Personal Addressbook XXPort
Name[lt]=KAB MS Exchange asmeninės adresų knygelės XXPort priedas
@@ -72,7 +71,6 @@ Comment[hu]=Bővítőmodul MS Exchange személyes címjegyzékek importálásáh
Comment[is]=Íforrit til að flytja tengiliði í eða úr MS Exchange Personal Address Book
Comment[it]=Plugin per importare rubriche personali da MS Exchange
Comment[ja]=MS Exchange パーソナルアドレス帳をインポートするプラグイン
-Comment[ka]=MS Exchange-ის პერსონალური წიგნაკის იმპორტის მოდული
Comment[kk]=MS Exchange адрестік кітапшасына экспорт/импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល​សៀវភៅ​អាសយដ្ឋាន​ផ្ទាល់​ខ្លួន​របស់ MS Exchange
Comment[lt]=Priedas leidžiantis importuoti MS Exchange asmenines adresų knygeles
diff --git a/kaddressbook/xxport/vcard_xxport.cpp b/kaddressbook/xxport/vcard_xxport.cpp
index 85cf8c76..1dfc9bcc 100644
--- a/kaddressbook/xxport/vcard_xxport.cpp
+++ b/kaddressbook/xxport/vcard_xxport.cpp
@@ -118,9 +118,15 @@ bool VCardXXPort::exportContacts( const KABC::AddresseeList &addrList, const TQS
return true;
if ( data == "v21" )
+#if defined(KABC_VCARD_ENCODING_FIX)
+ ok = doExport( url, converter.createVCardsRaw( list, KABC::VCardConverter::v2_1 ) );
+ else
+ ok = doExport( url, converter.createVCardsRaw( list, KABC::VCardConverter::v3_0 ) );
+#else
ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v2_1 ) );
else
ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v3_0 ) );
+#endif
} else {
TQString msg = i18n( "You have selected a list of contacts, shall they be "
"exported to several files?" );
@@ -151,10 +157,15 @@ bool VCardXXPort::exportContacts( const KABC::AddresseeList &addrList, const TQS
tmpList.append( *it );
if ( data == "v21" )
+#if defined(KABC_VCARD_ENCODING_FIX)
+ tmpOk = doExport( url, converter.createVCardsRaw( tmpList, KABC::VCardConverter::v2_1 ) );
+ else
+ tmpOk = doExport( url, converter.createVCardsRaw( tmpList, KABC::VCardConverter::v3_0 ) );
+#else
tmpOk = doExport( url, converter.createVCards( tmpList, KABC::VCardConverter::v2_1 ) );
else
tmpOk = doExport( url, converter.createVCards( tmpList, KABC::VCardConverter::v3_0 ) );
-
+#endif
ok = ok && tmpOk;
}
break;
@@ -166,9 +177,15 @@ bool VCardXXPort::exportContacts( const KABC::AddresseeList &addrList, const TQS
return true;
if ( data == "v21" )
+#if defined(KABC_VCARD_ENCODING_FIX)
+ ok = doExport( url, converter.createVCardsRaw( list, KABC::VCardConverter::v2_1 ) );
+ else
+ ok = doExport( url, converter.createVCardsRaw( list, KABC::VCardConverter::v3_0 ) );
+#else
ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v2_1 ) );
else
ok = doExport( url, converter.createVCards( list, KABC::VCardConverter::v3_0 ) );
+#endif
}
}
}
@@ -182,9 +199,14 @@ KABC::AddresseeList VCardXXPort::importContacts( const TQString& ) const
KABC::AddresseeList addrList;
KURL::List urls;
- if ( !XXPortManager::importData.isEmpty() )
+ if ( !XXPortManager::importData.isEmpty() ) {
+#if defined(KABC_VCARD_ENCODING_FIX)
+ TQCString data = XXPortManager::importData.ascii();
+ addrList = parseVCard( data );
+#else
addrList = parseVCard( XXPortManager::importData );
- else {
+#endif
+ } else {
if ( XXPortManager::importURL.isEmpty() )
urls = KFileDialog::getOpenURLs( TQString::null, "*.vcf|vCards", parentWidget(),
i18n( "Select vCard to Import" ) );
@@ -203,11 +225,28 @@ KABC::AddresseeList VCardXXPort::importContacts( const TQString& ) const
TQFile file( fileName );
if ( file.open( IO_ReadOnly ) ) {
+#if defined(KABC_VCARD_ENCODING_FIX)
+ TQByteArray data = file.readAll();
+ file.close();
+ if ( data.size() > 0 )
+ addrList += parseVCard( data );
+#else
TQByteArray rawData = file.readAll();
file.close();
- if ( rawData.size() > 0 )
- addrList += parseVCard( rawData );
-
+ if ( rawData.size() > 0 ) {
+
+ TQString vCardText;
+
+ // With version 3.0, vCards are encoded with UTF-8 by default. Otherwise, use fromLatin1()
+ // and hope that are fields are encoded correctly.
+ if ( TQString::fromLatin1( rawData ).lower().contains( "version:3.0" ) ) {
+ vCardText = TQString::fromUtf8( rawData );
+ } else {
+ vCardText = TQString::fromLatin1( rawData );
+ }
+ addrList += parseVCard( vCardText );
+ }
+#endif
KIO::NetAccess::removeTempFile( fileName );
} else {
TQString text = i18n( "<qt>When trying to read the vCard, there was an error opening the file '%1': %2</qt>" );
@@ -243,6 +282,29 @@ KABC::AddresseeList VCardXXPort::importContacts( const TQString& ) const
return addrList;
}
+#if defined(KABC_VCARD_ENCODING_FIX)
+KABC::AddresseeList VCardXXPort::parseVCard( const TQByteArray &data ) const
+{
+ KABC::VCardConverter converter;
+
+ return converter.parseVCardsRaw( data.data() );
+}
+
+bool VCardXXPort::doExport( const KURL &url, const TQByteArray &data )
+{
+ if( TQFileInfo(url.path()).exists() ) {
+ if(KMessageBox::questionYesNo( parentWidget(), i18n("Do you want to overwrite file \"%1\"").arg( url.path()) ) == KMessageBox::No)
+ return false;
+ }
+ KTempFile tmpFile;
+ tmpFile.setAutoDelete( true );
+
+ tmpFile.file()->writeBlock( data.data(), data.size() );
+ tmpFile.close();
+
+ return KIO::NetAccess::upload( tmpFile.name(), url, parentWidget() );
+}
+#else
KABC::AddresseeList VCardXXPort::parseVCard( const TQString &data ) const
{
KABC::VCardConverter converter;
@@ -252,6 +314,10 @@ KABC::AddresseeList VCardXXPort::parseVCard( const TQString &data ) const
bool VCardXXPort::doExport( const KURL &url, const TQString &data )
{
+ if( TQFileInfo(url.path()).exists() ) {
+ if(KMessageBox::questionYesNo( parentWidget(), i18n("Do you want to overwrite file \"%1\"").arg( url.path()) ) == KMessageBox::No)
+ return false;
+ }
KTempFile tmpFile;
tmpFile.setAutoDelete( true );
@@ -263,6 +329,7 @@ bool VCardXXPort::doExport( const KURL &url, const TQString &data )
return KIO::NetAccess::upload( tmpFile.name(), url, parentWidget() );
}
+#endif
KABC::AddresseeList VCardXXPort::filterContacts( const KABC::AddresseeList &addrList )
{
diff --git a/kaddressbook/xxport/vcard_xxport.desktop b/kaddressbook/xxport/vcard_xxport.desktop
index d0a0146a..0745d5a5 100644
--- a/kaddressbook/xxport/vcard_xxport.desktop
+++ b/kaddressbook/xxport/vcard_xxport.desktop
@@ -25,7 +25,6 @@ Name[hi]=केएबी वी-कार्डXXपोर्ट प्लगइ
Name[hu]=KAB vCard XXPort bővítőmodul
Name[is]=Íforrit fyrir KAB vCard XXPort
Name[ja]=KAB vCazrd インポート/エクスポートプラグイン
-Name[ka]=KAB vCard ექსპორტის მოდული
Name[kk]=vCard-ты экспорт/импорт ету
Name[km]=កម្មវិធី​ជំនួយ KAB vCard XXPort
Name[lt]=KAB vCard XXPort priedas
@@ -74,7 +73,6 @@ Comment[hu]=Bővítőmodul vCard névjegyek importálásához/exportálásához
Comment[is]=Íforrit til að flytja inn eða út tengiliði í vCard sniði
Comment[it]=Plugin per importare ed esportare contatti in formato vCard
Comment[ja]=vCard フォーマットで連絡先をインポート/エクスポートするプラグイン
-Comment[ka]=კონტაქტების vCard-ის ფორმატით იმპორტ/ექსპორტის მოდული
Comment[kk]=vCard пішіміне экспорт/импорт ету модулі
Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំចូល និង​នាំចេញ​ទំនាក់ទំនង​ក្នុង​ទ្រង់ទ្រាយ​ជា vCard
Comment[lt]=Įskiepis kontaktų importavimui ir eksportavimui vCard formatu
diff --git a/kaddressbook/xxport/vcard_xxport.h b/kaddressbook/xxport/vcard_xxport.h
index 8208e23c..191d37a3 100644
--- a/kaddressbook/xxport/vcard_xxport.h
+++ b/kaddressbook/xxport/vcard_xxport.h
@@ -25,6 +25,7 @@
#define VCARD_XXPORT_H
#include <xxport.h>
+#include <kabc/vcardparser.h> // for KABC_VCARD_ENCODING_FIX define
class VCardXXPort : public KAB::XXPort
{
@@ -40,8 +41,13 @@ class VCardXXPort : public KAB::XXPort
KABC::AddresseeList importContacts( const TQString &data ) const;
private:
- KABC::AddresseeList parseVCard( const TQString &data ) const;
- bool doExport( const KURL &url, const TQString &data );
+#if defined(KABC_VCARD_ENCODING_FIX)
+ KABC::AddresseeList parseVCard( const TQByteArray &data ) const;
+ bool doExport( const KURL &url, const TQByteArray &data );
+#else
+ KABC::AddresseeList parseVCard( const TQString &data ) const;
+ bool doExport( const KURL &url, const TQString &data );
+#endif
void addKey( KABC::Addressee &addr, KABC::Key::Types type );
KABC::AddresseeList filterContacts( const KABC::AddresseeList& );
diff --git a/kaddressbook/xxportmanager.cpp b/kaddressbook/xxportmanager.cpp
index c46855c4..aee87fd4 100644
--- a/kaddressbook/xxportmanager.cpp
+++ b/kaddressbook/xxportmanager.cpp
@@ -39,7 +39,7 @@
#include "xxportmanager.h"
KURL XXPortManager::importURL = KURL();
-TQString XXPortManager::importData = TQString::null;
+TQString XXPortManager::importData = TQString();
XXPortManager::XXPortManager( KAB::Core *core, TQObject *parent, const char *name )
: TQObject( parent, name ), mCore( core )
diff --git a/kalarm/Changelog b/kalarm/Changelog
index 6c51c621..a3a1c659 100644
--- a/kalarm/Changelog
+++ b/kalarm/Changelog
@@ -1,6 +1,6 @@
KAlarm Change Log
-=== Version 1.5.5 --- 21 January 2009 ===
+=== Version 1.5.5 --- 9 January 2009 ===
- Require a real double click to accept the selected template in pick list.
- Make mouse wheel work, and fix highlighting, for left-hand time spinbox
buttons in Plastik style.
@@ -15,7 +15,6 @@ KAlarm Change Log
- Ignore events in calendar without usable alarms, which prevents them getting
stuck in the alarm list).
- Prevent defer dialogue date being set outside the allowed range.
-- Cancel screensaver when an alarm is displayed.
=== Version 1.5.4 (KDE 3.5.10) --- 18 August 2008 ===
- Show background colour selector for file display alarms.
diff --git a/kalarm/alarmevent.cpp b/kalarm/alarmevent.cpp
index 8aa89892..34ce46a2 100644
--- a/kalarm/alarmevent.cpp
+++ b/kalarm/alarmevent.cpp
@@ -2427,7 +2427,7 @@ KARecurrence::Type KAEvent::checkRecur() const
KARecurrence::Type type = mRecurrence->type();
switch (type)
{
- case KARecurrence::MINUTELY: // hourly
+ case KARecurrence::MINUTELY: // hourly
case KARecurrence::DAILY: // daily
case KARecurrence::WEEKLY: // weekly on multiple days of week
case KARecurrence::MONTHLY_DAY: // monthly on multiple dates in month
@@ -2776,7 +2776,7 @@ void KAEvent::convertKCalEvents(KCal::Calendar& calendar, int version, bool adju
if (types.count() > 0)
alarm->setCustomProperty(APPNAME, TYPE_PROPERTY, types.join(","));
- if (pre_0_7 && alarm->repeatCount() > 0 && alarm->snoozeTime() > 0)
+ if (pre_0_7 && alarm->repeatCount() > 0 && alarm->snoozeTime().value() > 0)
{
// It's a KAlarm pre-0.7 calendar file.
// Minutely recurrences were stored differently.
@@ -3028,7 +3028,7 @@ void KAEvent::convertKCalEvents(KCal::Calendar& calendar, int version, bool adju
}
}
}
-
+
if (pre_1_5_0)
{
/*
@@ -3087,7 +3087,7 @@ bool KAEvent::convertRepetition(KCal::Event* event)
for (Alarm::List::ConstIterator alit = alarms.begin(); alit != alarms.end(); ++alit)
{
Alarm* alarm = *alit;
- if (alarm->repeatCount() > 0 && alarm->snoozeTime() > 0)
+ if (alarm->repeatCount() > 0 && alarm->snoozeTime().value() > 0)
{
if (!converted)
{
diff --git a/kalarm/functions.cpp b/kalarm/functions.cpp
index 45537e3d..28f73499 100644
--- a/kalarm/functions.cpp
+++ b/kalarm/functions.cpp
@@ -71,9 +71,6 @@ bool sendToKOrganizer(const KAEvent&);
bool deleteFromKOrganizer(const TQString& eventID);
bool runKOrganizer();
}
-#ifdef HAVE_XTEST
-void x11_cancelScreenSaver();
-#endif
namespace KAlarm
@@ -931,17 +928,6 @@ TQString stripAccel(const TQString& text)
return out;
}
-/******************************************************************************
-* Cancel the screen saver, in case it is active.
-* Only implemented if the X11 XTest extension is installed.
-*/
-void cancelScreenSaver()
-{
-#ifdef HAVE_XTEST
- x11_cancelScreenSaver();
-#endif // HAVE_XTEST
-}
-
} // namespace KAlarm
diff --git a/kalarm/functions.h b/kalarm/functions.h
index 762aecc6..37041f6f 100644
--- a/kalarm/functions.h
+++ b/kalarm/functions.h
@@ -108,7 +108,6 @@ UpdateStatus enableEvent(KAEvent&, AlarmListView* selectionView, bool ena
void displayUpdateError(TQWidget* parent, UpdateStatus, UpdateError, int nAlarms);
void displayKOrgUpdateError(TQWidget* parent, KOrgUpdateError, int nAlarms);
-void cancelScreenSaver();
TQString stripAccel(const TQString&);
int localeFirstDayOfWeek();
diff --git a/kalarm/kalarm.desktop b/kalarm/kalarm.desktop
index da42c911..8724fb64 100644
--- a/kalarm/kalarm.desktop
+++ b/kalarm/kalarm.desktop
@@ -44,7 +44,6 @@ GenericName[hu]=Emlékeztetőkezelő
GenericName[is]=Áminningakerfi
GenericName[it]=Programmatore degli avvisi personali
GenericName[ja]=個人アラームスケジューラ
-GenericName[ka]=პერსონალური მაღვიძარას მგეგმავი
GenericName[kk]=Дербес ескертулер жоспарлағышы
GenericName[km]=កម្មវិធី​កំណត់​ម៉ោង​រោទ៍​ផ្ទាល់​ខ្លួន
GenericName[lt]=Asmeninių žinučių-priminimų planuoklis
diff --git a/kalarm/kalarm.tray.desktop b/kalarm/kalarm.tray.desktop
index d161dc67..a15aa26b 100644
--- a/kalarm/kalarm.tray.desktop
+++ b/kalarm/kalarm.tray.desktop
@@ -34,7 +34,7 @@ Comment[et]=Häirete ja meeldetuletuste ajakava: käivitamine süsteemse doki ik
Comment[eu]=Alarma pertsonalen programatzailea: abiatu sistemaren bandejako ikono bezala
Comment[fa]=زمان‌بند هشدار شخصی: آغاز به عنوان شمایل سینی سیستم
Comment[fi]=Henkilökohtainen hälytysajastin: käynnistä paneelikuvake
-Comment[fr]=Planificateur d'alarme personnel : démarre dans la boîte à miniatures
+Comment[fr]=Planificateur d'alarme personnel : démarre dans la boîte à miniatures
Comment[fy]=Persoanlike alarmplanner: begjinne yn it systeemfak
Comment[gl]=Programador persoal de alarmas: iniciar como icona na bandexa do sistema
Comment[he]=מתזמן הודעות תזכורת: הפעלה בתור סמל במגש המערכת
@@ -43,7 +43,6 @@ Comment[hu]=Az emlékeztető üzenetek megjelenítőprogramja: indítás a panel
Comment[is]=Áminningakerfi: ræsir sem táknmynd á spjaldinu
Comment[it]=Programmatore personale degli avvisi: all'avvio si mette nel vassoio di sistema
Comment[ja]=個人アラームスケジューラ: システムトレイアイコンで起動
-Comment[ka]=პესონალური მაღვიძარას მგეგმავი: სისტემურ პანელის ხატულად იწყება
Comment[kk]=Дербес ескертулер жоспарлағышы: жүйелік сөреде орналасады
Comment[km]=កម្មវិធី​កំណត់​ម៉ោង​រោទ៍​ផ្ទាល់​ខ្លួន ៖ ចាប់ផ្ដើម​ជា​រូបតំណាង​ក្នុង​ថាស​ប្រព័ន្ធ
Comment[lt]=Žinučių-priminimų planuoklis: paleisti kaip sisteminio dėklo ženkliuką
diff --git a/kalarm/kalarmapp.cpp b/kalarm/kalarmapp.cpp
index f4daec9c..7607892d 100644
--- a/kalarm/kalarmapp.cpp
+++ b/kalarm/kalarmapp.cpp
@@ -1631,13 +1631,11 @@ void* KAlarmApp::execAlarm(KAEvent& event, const KAAlarm& alarm, bool reschedule
if (win)
win->setRecreating(); // prevent post-alarm actions
delete win;
- KAlarm::cancelScreenSaver();
(new MessageWin(event, alarm, reschedule, allowDefer))->show();
}
else
{
// Raise the existing message window and replay any sound
- KAlarm::cancelScreenSaver();
win->repeat(alarm); // N.B. this reschedules the alarm
}
break;
diff --git a/kalarm/kalarmd/kalarmd.autostart.desktop b/kalarm/kalarmd/kalarmd.autostart.desktop
index de5add48..c2ea7d56 100644
--- a/kalarm/kalarmd/kalarmd.autostart.desktop
+++ b/kalarm/kalarmd/kalarmd.autostart.desktop
@@ -23,7 +23,6 @@ Name[hu]=KAlarm szolgáltatás
Name[is]=KAlarm þjónn
Name[it]=Demone degli avvisi
Name[ja]=KAlarm デーモン
-Name[ka]=KAlarm დემონი
Name[kk]=KAlarm қызметі
Name[km]=ដេមិន KAlarm
Name[lt]=KAlarm tarnyba
@@ -71,7 +70,6 @@ Comment[hu]=A KAlarm emlékeztető szolgáltatás automatikus elindítása
Comment[is]=Ræsa KAlarm áminningaþjónn sjálfkrafa við byrjun setu
Comment[it]=Avvio automatico del demone degli avvisi
Comment[ja]=KAlarm アラームデーモンのログイン時の自動起動
-Comment[ka]=KAlarm მაღვიძარას დემონის ავტოდაწყება შესვლისას
Comment[kk]=KAlarm қызметі жүйеге кіргенде жегіледі
Comment[km]=ចាប់ផ្ដើម​ដេមិន​រោទ៍​របស់ KAlarm ពេល​ចូល
Comment[lt]=KOrganizer/KAlarm priminimų tarnybos automatinis paleidimas prisiregistruojant
diff --git a/kalarm/kalarmd/kalarmd.desktop b/kalarm/kalarmd/kalarmd.desktop
index 31d3a0fa..6b481718 100644
--- a/kalarm/kalarmd/kalarmd.desktop
+++ b/kalarm/kalarmd/kalarmd.desktop
@@ -23,7 +23,6 @@ Name[hu]=KAlarm szolgáltatás
Name[is]=KAlarm þjónn
Name[it]=Demone degli avvisi
Name[ja]=KAlarm デーモン
-Name[ka]=KAlarm დემონი
Name[kk]=KAlarm қызметі
Name[km]=ដេមិន KAlarm
Name[lt]=KAlarm tarnyba
diff --git a/kandy/src/kandy.desktop b/kandy/src/kandy.desktop
index b003dd04..d1357a92 100644
--- a/kandy/src/kandy.desktop
+++ b/kandy/src/kandy.desktop
@@ -24,7 +24,6 @@ Comment[hu]=Segédprogram számítógép és mobiltelefon címjegyzékének szin
Comment[is]=Tól sem samstillir vistfangagögn við farsíma
Comment[it]=Strumento per sincronizzare i dati della rubrica indirizzi con i telefoni cellulari
Comment[ja]=アドレス帳のデータを携帯電話と同期するためのツール
-Comment[ka]=მობილურ ტელეფონთან წიგნაკის მონაცემების სინქრონიზაციის ხელსაწყო
Comment[kk]=Адрестік кітапшаны қалта телефонмен қадамдастыру құралы
Comment[km]=ឧបករណ៍​សម្រាប់​ធ្វើ​សមកាលកម្ម​ទិន្នន័យ​សៀវភៅ​អាសយដ្ឋាន​ជាមួយ​នឹង​ទូរស័ព្ទ​ចល័ត
Comment[lt]=Įrankis adresų knygelės sinchronizavimui su mobiliaisiais telefonais
@@ -79,7 +78,6 @@ GenericName[hu]=Mobil-címjegyzék
GenericName[is]=Farsímatól
GenericName[it]=Strumento per i telefoni cellulari
GenericName[ja]=携帯電話ツール
-GenericName[ka]=მობილურ ტელეფონთან სამუშაო ხელსაწყო
GenericName[kk]=Қалта телефон құралы
GenericName[km]=ឧបករណ៍​ទូរស័ព្ទ​ចល័ត
GenericName[lt]=Mobilaus telefono įrankis
@@ -108,8 +106,7 @@ GenericName[tg]=Кор бо телефони мобилӣ
GenericName[th]=เครื่องมือสำหรับโทรศัพท์เคลื่อนที่
GenericName[tr]=Cep Telefonu Aracı
GenericName[uk]=Засіб для мобільних телефонів
-GenericName[uz]=Uyali telefon uchun vosita
-GenericName[uz@cyrillic]=Уяли телефон учун восита
+GenericName[uz]=Уяли телефон учун восита
GenericName[ven]=Tshishumiswa tsha lutingo thendeleki
GenericName[vi]=Công cụ điện thoại di động
GenericName[xh]=Isixhobo Semfono-mfono Ekuhanjwa nayo
diff --git a/karm/support/karm.desktop b/karm/support/karm.desktop
index 66b016af..736f497c 100644
--- a/karm/support/karm.desktop
+++ b/karm/support/karm.desktop
@@ -33,7 +33,6 @@ GenericName[hu]=Időfelhasználás-figyelő
GenericName[id]=Tracker Waktu Pribadi
GenericName[is]=Fylgjast með í hvað tíminn fer
GenericName[it]=Segnatempo personale
-GenericName[ka]=პერსონალური დროის აღმრიცხველი
GenericName[kk]=Дербес уақыт қадағалағышы
GenericName[km]=កម្មវិធី​តាមដាន​ពេលវេលា​ផ្ទាល់​ខ្លួន
GenericName[ko]=일하는 시간을 잴 수 있습니다
diff --git a/karm/task.cpp b/karm/task.cpp
index 5ade426f..7d84bcd2 100644
--- a/karm/task.cpp
+++ b/karm/task.cpp
@@ -183,12 +183,12 @@ void Task::setPercentComplete(const int percent, KarmStorage *storage)
void Task::setPixmapProgress()
{
- TQPixmap* icon = new TQPixmap();
+ TQPixmap icon ;
if (_percentcomplete >= 100)
- *icon = UserIcon("task-complete.xpm");
+ icon = UserIcon("task-complete.xpm");
else
- *icon = UserIcon("task-incomplete.xpm");
- setPixmap(0, *icon);
+ icon = UserIcon("task-incomplete.xpm");
+ setPixmap(0, icon);
}
bool Task::isComplete() { return _percentcomplete == 100; }
diff --git a/kfile-plugins/ics/kfile_ics.desktop b/kfile-plugins/ics/kfile_ics.desktop
index 2a530ce2..ce3f2188 100644
--- a/kfile-plugins/ics/kfile_ics.desktop
+++ b/kfile-plugins/ics/kfile_ics.desktop
@@ -24,7 +24,6 @@ Name[hu]=ICS-jellemzők
Name[is]=ICS upplýsingar
Name[it]=Informazioni ICS
Name[ja]=ICS 情報
-Name[ka]=ICS ინფორმაცია
Name[kk]=ICS ақпараты
Name[km]=ព័ត៌មាន ICS
Name[lt]=ICS informacija
diff --git a/kfile-plugins/palm-databases/kfile_palm.desktop b/kfile-plugins/palm-databases/kfile_palm.desktop
index 9d1fe121..66ccbfe9 100644
--- a/kfile-plugins/palm-databases/kfile_palm.desktop
+++ b/kfile-plugins/palm-databases/kfile_palm.desktop
@@ -26,7 +26,6 @@ Name[hu]=PalmOS adatbázis-jellemzők
Name[is]=PalmOS gagnagrunnsupplýsingar
Name[it]=Informazioni database PalmOs
Name[ja]=PalmOS データベース 情報
-Name[ka]=PalmOS-ს მონაცემთა ბაზის ინფორმაცია
Name[kk]=PalmOS деректер қорының мәліметі
Name[km]=ព័ត៌មាន​មូលដ្ឋាន​ទិន្នន័យ PalmOS
Name[lt]=PalmOS duomenų bazės info
diff --git a/kfile-plugins/rfc822/kfile_rfc822.desktop b/kfile-plugins/rfc822/kfile_rfc822.desktop
index 1428c96f..b6928cfd 100644
--- a/kfile-plugins/rfc822/kfile_rfc822.desktop
+++ b/kfile-plugins/rfc822/kfile_rfc822.desktop
@@ -27,7 +27,6 @@ Name[hu]=E-mail-jellemzők
Name[is]=Tölvupóst upplýsingar
Name[it]=Informazioni di posta elettronica
Name[ja]=Eメール 情報
-Name[ka]=ელფოსტის ინფორმაცია
Name[kk]=Эл.пошта мәліметі
Name[km]=ព័ត៌មាន​អ៊ីមែល
Name[lt]=E. pašto info
diff --git a/kfile-plugins/vcf/kfile_vcf.cpp b/kfile-plugins/vcf/kfile_vcf.cpp
index 76b3383c..5dcfc2c1 100644
--- a/kfile-plugins/vcf/kfile_vcf.cpp
+++ b/kfile-plugins/vcf/kfile_vcf.cpp
@@ -68,8 +68,11 @@ bool KVcfPlugin::readInfo( KFileMetaInfo& info, uint /*what*/ )
file.close();
KABC::VCardConverter converter;
- KABC::Addressee addr = converter.parseVCard(contents);
-
+#if defined(KABC_VCARD_ENCODING_FIX)
+ KABC::Addressee addr = converter.parseVCardRaw( contents.utf8() );
+#else
+ KABC::Addressee addr = converter.parseVCard( contents );
+#endif
KFileMetaInfoGroup group = appendGroup(info, "Technical");
// prepare the text
diff --git a/kfile-plugins/vcf/kfile_vcf.desktop b/kfile-plugins/vcf/kfile_vcf.desktop
index ced0dfc3..4d1c5b4b 100644
--- a/kfile-plugins/vcf/kfile_vcf.desktop
+++ b/kfile-plugins/vcf/kfile_vcf.desktop
@@ -26,7 +26,6 @@ Name[hu]=VCard-jellemzők
Name[is]=vCard upplýsingar
Name[it]=Informazioni vCard
Name[ja]=vCard 情報
-Name[ka]=vCard ინფორმაცია
Name[kk]=vCard мәліметі
Name[km]=ព័ត៌មាន vCard
Name[lt]=vCard informacija
diff --git a/kioslaves/imap4/imap4.cc b/kioslaves/imap4/imap4.cc
index 1cfd5602..2290c678 100644
--- a/kioslaves/imap4/imap4.cc
+++ b/kioslaves/imap4/imap4.cc
@@ -1780,14 +1780,15 @@ IMAP4Protocol::rename (const KURL & src, const KURL & dest, bool overwrite)
completeQueue.removeRef(cmd);
if (!ok)
{
- error(ERR_CANNOT_RENAME, i18n("Unable to close mailbox."));
+ kdWarning(7116) << "Unable to close mailbox!" << endl;
+ error(ERR_CANNOT_RENAME, src.path());
return;
}
setState(ISTATE_LOGIN);
}
imapCommand *cmd = doCommand (imapCommand::clientRename (sBox, dBox));
if (cmd->result () != "OK") {
- error (ERR_CANNOT_RENAME, cmd->result ());
+ error (ERR_CANNOT_RENAME, src.path());
completeQueue.removeRef (cmd);
return;
}
@@ -1798,13 +1799,13 @@ IMAP4Protocol::rename (const KURL & src, const KURL & dest, bool overwrite)
case ITYPE_MSG:
case ITYPE_ATTACH:
case ITYPE_UNKNOWN:
- error (ERR_CANNOT_RENAME, src.prettyURL());
+ error (ERR_CANNOT_RENAME, src.path());
break;
}
}
else
{
- error (ERR_CANNOT_RENAME, src.prettyURL());
+ error (ERR_CANNOT_RENAME, src.path());
return;
}
finished ();
@@ -2111,6 +2112,18 @@ bool IMAP4Protocol::makeLogin ()
removeCapability( "ANNOTATEMORE" );
}
+ // starting from Cyrus IMAP 2.3.9, shared seen flags are available
+ TQRegExp regExp( "Cyrus\\sIMAP[4]{0,1}\\sv(\\d+)\\.(\\d+)\\.(\\d+)", false );
+ if ( regExp.search( greeting ) >= 0 ) {
+ const int major = regExp.cap( 1 ).toInt();
+ const int minor = regExp.cap( 2 ).toInt();
+ const int patch = regExp.cap( 3 ).toInt();
+ if ( major > 2 || (major == 2 && (minor > 3 || (minor == 3 && patch > 9))) ) {
+ kdDebug(7116) << k_funcinfo << "Cyrus IMAP >= 2.3.9 detected, enabling shared seen flag support" << endl;
+ imapCapabilities.append( "x-kmail-sharedseen" );
+ }
+ }
+
kdDebug(7116) << "IMAP4::makeLogin - attempting login" << endl;
KIO::AuthInfo authInfo;
diff --git a/kioslaves/sieve/sieve.cpp b/kioslaves/sieve/sieve.cpp
index 9f3b547a..bc781166 100644
--- a/kioslaves/sieve/sieve.cpp
+++ b/kioslaves/sieve/sieve.cpp
@@ -39,6 +39,7 @@ extern "C" {
#include <kurl.h>
#include <kmdcodec.h>
#include <kglobal.h>
+#include <kmessagebox.h>
#include <tqcstring.h>
#include <tqregexp.h>
@@ -46,6 +47,7 @@ extern "C" {
#include <cstdlib>
using std::exit;
#include <sys/stat.h>
+#include <cassert>
#include <kdepimmacros.h>
@@ -193,6 +195,7 @@ kio_sieveProtocol::kio_sieveProtocol(const TQCString &pool_socket, const TQCStri
, m_connMode(NORMAL)
, m_supportsTLS(false)
, m_shouldBeConnected(false)
+ , m_allowUnencrypted(false)
{
}
@@ -274,7 +277,7 @@ bool kio_sieveProtocol::parseCapabilities(bool requestCapabilities/* = false*/)
setMetaData("tlsSupported", "true");
} else {
- ksDebug() << "Unrecognised key " << r.getKey() << endl;
+ ksDebug() << "Unrecognised key." << endl;
}
}
@@ -288,7 +291,7 @@ bool kio_sieveProtocol::parseCapabilities(bool requestCapabilities/* = false*/)
/* ---------------------------------------------------------------------------------- */
/**
- * Checks if connection parameters (currently - auth method) have changed.
+ * Checks if connection parameters have changed.
* If it it, close the current connection
*/
void kio_sieveProtocol::changeCheck( const KURL &url )
@@ -316,6 +319,14 @@ void kio_sieveProtocol::changeCheck( const KURL &url )
if ( isConnectionValid() )
disconnect();
}
+
+ // For TLS, only disconnect if we are unencrypted and are
+ // no longer allowed (otherwise, it's still fine):
+ const bool allowUnencryptedNow = url.queryItem("x-allow-unencrypted") == "true" ;
+ if ( m_allowUnencrypted && !allowUnencryptedNow )
+ if ( isConnectionValid() )
+ disconnect();
+ m_allowUnencrypted = allowUnencryptedNow;
}
/* ---------------------------------------------------------------------------------- */
@@ -349,8 +360,25 @@ bool kio_sieveProtocol::connect(bool useTLSIfAvailable)
}
// Attempt to start TLS
+ if ( !m_allowUnencrypted && !canUseTLS() ) {
+ error( ERR_SLAVE_DEFINED, i18n("Can not use TLS. Please enable TLS in the KDE cryptography setting.") );
+ disconnect();
+ return false;
+ }
+
+ if ( !m_allowUnencrypted && useTLSIfAvailable && canUseTLS() && !m_supportsTLS &&
+ messageBox( WarningContinueCancel,
+ i18n("TLS encryption was requested, but your Sieve server does not advertise TLS in its capabilities.\n"
+ "You can choose to try to initiate TLS negotiations nonetheless, or cancel the operation."),
+ i18n("Server Does Not Advertise TLS"), i18n("&Start TLS nonetheless"), i18n("&Cancel") ) != KMessageBox::Continue )
+ {
+ error( ERR_USER_CANCELED, i18n("TLS encryption requested, but not supported by server.") );
+ disconnect();
+ return false;
+ }
+
// FIXME find a test server and test that this works
- if (useTLSIfAvailable && m_supportsTLS && canUseTLS()) {
+ if (useTLSIfAvailable && canUseTLS()) {
sendData("STARTTLS");
if (operationSuccessful()) {
ksDebug() << "TLS has been accepted. Starting TLS..." << endl
@@ -362,15 +390,31 @@ bool kio_sieveProtocol::connect(bool useTLSIfAvailable)
parseCapabilities( requestCapabilitiesAfterStartTLS() );
} else {
ksDebug() << "TLS initiation failed, code " << retval << endl;
- disconnect(true);
- return connect(false);
- // error(ERR_INTERNAL, i18n("TLS initiation failed."));
+ if ( m_allowUnencrypted ) {
+ disconnect(true);
+ return connect(false);
+ }
+ if ( retval != -3 )
+ messageBox( Information,
+ i18n("Your Sieve server claims to support TLS, "
+ "but negotiation was unsuccessful."),
+ i18n("Connection Failed") );
+ disconnect(true);
+ return false;
}
+ } else if ( !m_allowUnencrypted ) {
+ ksDebug() << "Server incapable of TLS." << endl;
+ disconnect();
+ error( ERR_SLAVE_DEFINED, i18n("The server does not seem to support TLS. "
+ "Disable TLS if you want to connect without encryption.") );
+ return false;
} else
ksDebug() << "Server incapable of TLS. Transmitted documents will be unencrypted." << endl;
} else
ksDebug() << "We are incapable of TLS. Transmitted documents will be unencrypted." << endl;
+ assert( m_allowUnencrypted || usingTLS() );
+
infoMessage(i18n("Authenticating user..."));
if (!authenticate()) {
disconnect();
@@ -637,7 +681,7 @@ void kio_sieveProtocol::put(const KURL& url, int /*permissions*/, bool /*overwri
i18n("The script did not upload successfully.\n"
"This is probably due to errors in the script.\n"
"The server responded:\n%1").arg(r.getKey()));
- } else
+ } else
error(ERR_INTERNAL_SERVER,
i18n("The script did not upload successfully.\n"
"The script may contain errors."));
diff --git a/kioslaves/sieve/sieve.h b/kioslaves/sieve/sieve.h
index f8749f01..0fc3bbd6 100644
--- a/kioslaves/sieve/sieve.h
+++ b/kioslaves/sieve/sieve.h
@@ -122,6 +122,7 @@ protected:
QString m_sPass;
QString m_sAuth;
bool m_shouldBeConnected;
+ bool m_allowUnencrypted;
private:
bool requestCapabilitiesAfterStartTLS() const;
diff --git a/kioslaves/sieve/sieve.protocol b/kioslaves/sieve/sieve.protocol
index 3bd00e25..484d48da 100644
--- a/kioslaves/sieve/sieve.protocol
+++ b/kioslaves/sieve/sieve.protocol
@@ -23,14 +23,13 @@ Description[et]=Sieve e-kirjade filtreerimise protokolli IO-moodul
Description[eu]=Sieve posta iragazketa protokoloarentztko irteerako/sarrerako mendeko bat
Description[fa]=یک ioslave برای قرارداد پالایش نامۀ Sieve
Description[fi]=Siirräntätyöskentelijä Sieve-sähköpostiensuodatusyhteyskäytännölle
-Description[fr]=Un module d'entrées / sorties pour le protocole de filtrage de messagerie Sieve
+Description[fr]=Un ioslave pour le protocole de filtrage de messagerie Sieve
Description[fy]=In ioslave foar it Sieve-mailfilterprotokol
Description[gl]=Un esclavo io para o protocolo de filtraxe de correo Sieve
Description[hu]=KDE-protokoll a Sieve levélszűrő protokollhoz
Description[is]=Ioslave fyrir Sieve tölvupóstsíu samskiptaregluna
Description[it]=Un ioslave per il protocollo di filtraggio posta Sieve
Description[ja]=Sieve メールフィルタプロトコル用 ioslave
-Description[ka]=Sieve ფოსტის ფილტრის შეტანა-გამოტანის განაწესი
Description[kk]=Sieve поштаны сүзгілеу протоколының ioslave модулі
Description[km]=ioslave សម្រាប់​ពិធីការ​ត្រង​សំបុត្រ Sieve
Description[ms]=Hamba io untuk protokol tapisan mel saringan
diff --git a/kitchensync/src/kitchensync.desktop b/kitchensync/src/kitchensync.desktop
index e7df319b..e9f5ae60 100644
--- a/kitchensync/src/kitchensync.desktop
+++ b/kitchensync/src/kitchensync.desktop
@@ -26,7 +26,6 @@ GenericName[hu]=Szinkronizáció
GenericName[is]=Samstilling
GenericName[it]=Sincronizzazione
GenericName[ja]=同期
-GenericName[ka]=სინქრონიზაცია
GenericName[kk]=Қадамдастыру
GenericName[km]=ការ​​ធ្វើ​សមកាលកម្ម
GenericName[lt]=Sinchronizacija
diff --git a/kmail/KMail.desktop b/kmail/KMail.desktop
index 52e31f0e..556c9409 100644
--- a/kmail/KMail.desktop
+++ b/kmail/KMail.desktop
@@ -46,7 +46,6 @@ GenericName[id]=Klien Mail
GenericName[is]=Póstforrit
GenericName[it]=Programma di posta elettronica
GenericName[ja]=メールクライアント
-GenericName[ka]=ფოსტის კლიენტი
GenericName[kk]=Эл.пошта клиент бағдарламасы
GenericName[km]=កម្មវិធី​អ៊ីមែល
GenericName[lt]=Pašto klientas
@@ -77,8 +76,7 @@ GenericName[tg]=Клиенти почтавӣ
GenericName[th]=ไคลเอนต์จดหมายอิเล็กทรอนิกส์
GenericName[tr]=E-posta İstemcisi
GenericName[uk]=Поштовий клієнт
-GenericName[uz]=Xat-xabar klienti
-GenericName[uz@cyrillic]=Хат-хабар клиенти
+GenericName[uz]=Хат-хабар клиенти
GenericName[ven]=Mushumisani na poso
GenericName[xh]=Umxhasi Weposi
GenericName[zh_CN]=邮件客户程序
diff --git a/kmail/Makefile.am b/kmail/Makefile.am
index 56b89dbc..62939092 100644
--- a/kmail/Makefile.am
+++ b/kmail/Makefile.am
@@ -1,5 +1,5 @@
#KDE_OPTIONS = nofinal
-KDE_CXXFLAGS = $(USE_RTTI)
+KDE_CXXFLAGS = $(USE_RTTI) -fexceptions
SUBDIRS = interfaces . about pics profiles avscripts tests
@@ -91,6 +91,7 @@ libkmailprivate_la_SOURCES = kmmessage.cpp kmmainwin.cpp configuredialog.cpp \
headerstrategy.cpp headerstyle.cpp khtmlparthtmlwriter.cpp \
filehtmlwriter.cpp teehtmlwriter.cpp \
mailcomposerIface.skel objecttreeparser.cpp \
+ objecttreeparser_p.cpp \
attachmentcollector.cpp \
bodypartformatter.cpp bodypartformatterfactory.cpp \
partNode.cpp \
@@ -150,7 +151,15 @@ libkmailprivate_la_SOURCES = kmmessage.cpp kmmainwin.cpp configuredialog.cpp \
snippetsettingsbase.ui \
scalix.cpp \
messageactions.cpp \
- korghelper.cpp
+ korghelper.cpp \
+ foldersetselector.cpp \
+ stringutil.cpp \
+ treebase.cpp \
+ backupjob.cpp \
+ importjob.cpp \
+ folderutil.cpp \
+ archivefolderdialog.cpp \
+ importarchivedialog.cpp
libkmailprivate_la_COMPILE_FIRST = globalsettings_base.h customtemplates_base.h templatesconfiguration_base.h
@@ -209,7 +218,7 @@ update_SCRIPTS = upgrade-transport.pl kmail-pgpidentity.pl \
kmail-3.3b1-misc.pl \
kmail-3.4-misc.pl \
kmail-3.4.1-update-status-filters.pl \
- kmail-3.5-filter-icons.pl \
+ kmail-3.5-filter-icons.pl \
kmail-3.5-trigger-flag-migration.pl
confdir = $(kde_confdir)
@@ -226,10 +235,10 @@ kde_services_DATA = kmail_config_misc.desktop kmail_config_appearance.desktop \
kmail_config_security.desktop
messages: rc.cpp
- rm -f tips.txt
- $(PREPARETIPS) > tips.txt
- $(XGETTEXT) -ktranslate *.cpp *.txt *.h -o $(podir)/kmail.pot
- rm -f tips.txt
+ rm -f tips.cpp
+ $(PREPARETIPS) > tips.cpp
+ $(XGETTEXT) -ktranslate *.cpp *.h -o $(podir)/kmail.pot
+ rm -f tips.cpp
kde_kcfg_DATA = kmail.kcfg replyphrases.kcfg custommimeheader.kcfg \
templatesconfiguration_kfg.kcfg customtemplates_kfg.kcfg
diff --git a/kmail/accountdialog.cpp b/kmail/accountdialog.cpp
index 6203d3e8..8254bac9 100644
--- a/kmail/accountdialog.cpp
+++ b/kmail/accountdialog.cpp
@@ -984,7 +984,7 @@ void AccountDialog::makeImapAccountPage( bool connected )
++row;
mImap.subscribedFoldersCheck = new TQCheckBox(
- i18n("Show only s&ubscribed folders"), page1);
+ i18n("Show only serverside s&ubscribed folders"), page1);
grid->addMultiCellWidget( mImap.subscribedFoldersCheck, row, row, 0, 1 );
++row;
diff --git a/kmail/accountwizard.cpp b/kmail/accountwizard.cpp
index de6c4317..589ef5d6 100644
--- a/kmail/accountwizard.cpp
+++ b/kmail/accountwizard.cpp
@@ -146,7 +146,7 @@ void AccountWizard::showPage( TQWidget *page )
const KPIM::Identity &identity = manager->defaultIdentity();
mRealName->setText( identity.fullName() );
- mEMailAddress->setText( identity.emailAddr() );
+ mEMailAddress->setText( identity.primaryEmailAddress() );
mOrganization->setText( identity.organization() );
}
} else if ( page == mLoginInformationPage ) {
@@ -356,7 +356,7 @@ void AccountWizard::accept()
KPIM::Identity &identity = manager->modifyIdentityForUoid( manager->defaultIdentity().uoid() );
identity.setFullName( mRealName->text() );
- identity.setEmailAddr( mEMailAddress->text() );
+ identity.setPrimaryEmailAddress( mEMailAddress->text() );
identity.setOrganization( mOrganization->text() );
manager->commit();
diff --git a/kmail/acljobs.cpp b/kmail/acljobs.cpp
index 41931829..1f9b6bb5 100644
--- a/kmail/acljobs.cpp
+++ b/kmail/acljobs.cpp
@@ -48,7 +48,9 @@ static unsigned int IMAPRightsToPermission( const TQString& str, const KURL& url
case 'w': perm |= ACLJobs::WriteFlags; break;
case 'i': perm |= ACLJobs::Insert; break;
case 'p': perm |= ACLJobs::Post; break;
+ case 'k': // fall through
case 'c': perm |= ACLJobs::Create; break;
+ case 'x': // fall through
case 'd': perm |= ACLJobs::Delete; break;
case 'a': perm |= ACLJobs::Administer; break;
default: break;
diff --git a/kmail/acljobs.h b/kmail/acljobs.h
index 7abc8065..2a868540 100644
--- a/kmail/acljobs.h
+++ b/kmail/acljobs.h
@@ -59,6 +59,14 @@ namespace KMail {
*/
namespace ACLJobs {
+ // Used by KMFolderCachedImap and KMFolderImap, no better place for that yet, until we have a
+ // common base class for both
+ enum ACLFetchState {
+ NotFetchedYet, ///< The user rights/ACL have not been fetched from the server yet, we don't know them
+ Ok, ///< The user rights/ACL have been fetched from the server sucessfully
+ FetchFailed ///< The attempt to fetch the user rights/ACL from the server failed
+ };
+
/// Bitfield modelling the possible permissions.
/// This is modelled after the imap4 permissions except that Read is "rs".
/// The semantics of the bits is protocol-dependent.
diff --git a/kmail/annotationjobs.cpp b/kmail/annotationjobs.cpp
index 6b9cd8e8..4e5dc201 100644
--- a/kmail/annotationjobs.cpp
+++ b/kmail/annotationjobs.cpp
@@ -117,7 +117,7 @@ void AnnotationJobs::MultiGetAnnotationJob::slotResult( KIO::Job *job )
GetAnnotationJob* getJob = static_cast<GetAnnotationJob *>( job );
const AnnotationList& lst = getJob->annotations();
for ( unsigned int i = 0 ; i < lst.size() ; ++ i ) {
- kdDebug(5006) << "found annotation " << lst[i].name << " = " << lst[i].value << endl;
+ //kdDebug(5006) << "found annotation " << lst[i].name << " = " << lst[i].value << endl;
if ( lst[i].name.startsWith( "value." ) ) { // value.priv or value.shared
found = true;
value = lst[i].value;
diff --git a/kmail/antispamwizard.cpp b/kmail/antispamwizard.cpp
index e01093fd..17d7ed1e 100644
--- a/kmail/antispamwizard.cpp
+++ b/kmail/antispamwizard.cpp
@@ -34,7 +34,6 @@
#include "kmfilteraction.h"
#include "kmfiltermgr.h"
#include "kmkernel.h"
-#include "kmfolderseldlg.h"
#include "kmfoldertree.h"
#include "kmmainwin.h"
#include "networkaccount.h"
@@ -428,7 +427,13 @@ void AntiSpamWizard::accept()
classHamFilter->setConfigureShortcut( true );
classHamFilter->setConfigureToolbar( true );
filterList.append( classHamFilter );
- }
+ }
+
+ /* Now that all the filters have been added to the list, tell
+ * the filter manager about it. That will emit filterListUpdate
+ * which will result in the filter list in kmmainwidget being
+ * initialized. This should happend only once. */
+ KMKernel::self()->filterMgr()->appendFilters( filterList );
/* Now that all the filters have been added to the list, tell
* the filter manager about it. That will emit filterListUpdate
@@ -834,9 +839,8 @@ ASWizPage::ASWizPage( TQWidget * parent, const char * name,
banner = *bannerName;
mLayout = new TQHBoxLayout( this, KDialog::marginHint(), KDialog::spacingHint() );
- mPixmap = new TQPixmap( UserIcon(banner) );
mBannerLabel = new TQLabel( this );
- mBannerLabel->setPixmap( *mPixmap );
+ mBannerLabel->setPixmap( UserIcon(banner) );
mBannerLabel->setScaledContents( false );
mBannerLabel->setFrameShape( TQFrame::StyledPanel );
mBannerLabel->setFrameShadow( TQFrame::Sunken );
diff --git a/kmail/antispamwizard.h b/kmail/antispamwizard.h
index e9707e82..738d8516 100644
--- a/kmail/antispamwizard.h
+++ b/kmail/antispamwizard.h
@@ -29,6 +29,8 @@
#ifndef KMAIL_ANTISPAMWIZARD_H
#define KMAIL_ANTISPAMWIZARD_H
+#include "simplefoldertree.h"
+
#include <kconfig.h>
#include <klistbox.h>
#include <kwizard.h>
@@ -44,7 +46,6 @@ class TQLabel;
namespace KMail {
- class SimpleFolderTree;
class FolderRequester;
class ASWizInfoPage;
@@ -289,7 +290,6 @@ namespace KMail {
TQBoxLayout *mLayout;
private:
- TQPixmap *mPixmap;
TQLabel *mBannerLabel;
};
diff --git a/kmail/app_octetstream.cpp b/kmail/app_octetstream.cpp
index 73594645..c740f02d 100644
--- a/kmail/app_octetstream.cpp
+++ b/kmail/app_octetstream.cpp
@@ -38,7 +38,7 @@ namespace {
class Formatter : public KMail::Interface::BodyPartFormatter {
public:
- Result format( KMail::Interface::BodyPart *, KMail::HtmlWriter * ) const { return AsIcon; }
+ Result format( KMail::Interface::BodyPart *, KMail::HtmlWriter *, KMail::Callback & ) const { return AsIcon; }
};
class Plugin : public KMail::Interface::BodyPartFormatterPlugin {
diff --git a/kmail/application_octetstream.desktop b/kmail/application_octetstream.desktop
index a0272b6b..ec2bbf1e 100644
--- a/kmail/application_octetstream.desktop
+++ b/kmail/application_octetstream.desktop
@@ -14,7 +14,6 @@ Name[fy]=Applikaasje octetstream
Name[gl]=Aplicación Octetstream
Name[hu]=Alkalmazás-adatfolyam
Name[ja]=アプリケーション オクテット ストリーム
-Name[ka]=რვადინებიანი პროგრამა
Name[kk]=Қолданбаның бинарлы ағымы
Name[km]=Octetstream កម្មវិធី
Name[ms]=Aliran Oktet Aplikasi
@@ -55,7 +54,6 @@ Comment[hu]=Formázómodul application/octet-stream típusú adatfolyamokhoz
Comment[is]=Sniðmátstól fyrir application/octet-stream
Comment[it]=Un plugin per formattare application/octet-stream
Comment[ja]=application/octet-stream の Bodypart フォーマッタプラグイン
-Comment[ka]=ნაწილიბრივი დამფორმატებელი მოდული პროგრამისთვის/octet-stream
Comment[kk]=Application/octet-stream үшін пішімдегіш модулі
Comment[km]=កម្មវិធី​ជំនួយ​កម្មវិធី​ធ្វើ​ទ្រង់ទ្រាយ​ផ្នែក​តួ សម្រាប់​កម្មវិធី/octet-stream
Comment[lt]=application/octet-stream formatavimo priedas
diff --git a/kmail/archivefolderdialog.cpp b/kmail/archivefolderdialog.cpp
new file mode 100644
index 00000000..5bf2cf93
--- /dev/null
+++ b/kmail/archivefolderdialog.cpp
@@ -0,0 +1,209 @@
+/* Copyright 2009 Klarälvdalens Datakonsult AB
+
+ 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) version 3 or any later version
+ accepted by the membership of KDE e.V. (or its successor approved
+ by the membership of KDE e.V.), which shall act as a proxy
+ defined in Section 14 of version 3 of the license.
+
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "archivefolderdialog.h"
+
+#include "backupjob.h"
+#include "kmkernel.h"
+#include "kmfolder.h"
+#include "kmmainwidget.h"
+#include "folderrequester.h"
+#include "util.h"
+
+#include <klocale.h>
+#include <kcombobox.h>
+#include <kurlrequester.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+
+#include <tqlabel.h>
+#include <tqcheckbox.h>
+#include <tqlayout.h>
+
+using namespace KMail;
+
+static TQString standardArchivePath( const TQString &folderName )
+{
+ TQString currentPath = KGlobalSettings::documentPath();
+ TQDir dir( currentPath );
+ if( !dir.exists() ) {
+ currentPath = TQDir::homeDirPath() + '/';
+ }
+ return currentPath +
+ i18n( "Start of the filename for a mail archive file" , "Archive" ) + "_" + folderName +
+ "_" + TQDate::currentDate().toString( TQt::ISODate ) + ".tar.bz2";
+}
+
+ArchiveFolderDialog::ArchiveFolderDialog( TQWidget *parent )
+ : KDialogBase( parent, "archive_folder_dialog", false, i18n( "Archive Folder" ),
+ KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok, true ),
+ mParentWidget( parent )
+{
+ TQWidget *mainWidget = new TQWidget( this );
+ TQGridLayout *mainLayout = new TQGridLayout( mainWidget );
+ mainLayout->setSpacing( KDialog::spacingHint() );
+ mainLayout->setMargin( KDialog::marginHint() );
+ setMainWidget( mainWidget );
+
+ int row = 0;
+
+ // TODO: better label for "Ok" button
+ // TODO: Explaination label
+ // TODO: Use QFormLayout in KDE4
+
+ TQLabel *folderLabel = new TQLabel( i18n( "&Folder:" ), mainWidget );
+ mainLayout->addWidget( folderLabel, row, 0 );
+ mFolderRequester = new FolderRequester( mainWidget, kmkernel->getKMMainWidget()->folderTree() );
+ mFolderRequester->setMustBeReadWrite( false );
+ connect( mFolderRequester, TQT_SIGNAL(folderChanged(KMFolder *)),
+ TQT_SLOT(slotFolderChanged(KMFolder *)) );
+ folderLabel->setBuddy( mFolderRequester );
+ mainLayout->addWidget( mFolderRequester, row, 1 );
+ row++;
+
+ TQLabel *formatLabel = new TQLabel( i18n( "F&ormat:" ), mainWidget );
+ mainLayout->addWidget( formatLabel, row, 0 );
+ mFormatComboBox = new KComboBox( mainWidget );
+ formatLabel->setBuddy( mFormatComboBox );
+
+ // These combobox values have to stay in sync with the ArchiveType enum from BackupJob!
+ mFormatComboBox->insertItem( i18n( "Compressed Zip Archive (.zip)" ) );
+ mFormatComboBox->insertItem( i18n( "Uncompressed Archive (.tar)" ) );
+ mFormatComboBox->insertItem( i18n( "BZ2-Compressed Tar Archive (.tar.bz2)" ) );
+ mFormatComboBox->insertItem( i18n( "GZ-Compressed Tar Archive (.tar.gz)" ) );
+ mFormatComboBox->setCurrentItem( 2 );
+ connect( mFormatComboBox, TQT_SIGNAL(activated(int)),
+ this, TQT_SLOT(slotFixFileExtension()) );
+ mainLayout->addWidget( mFormatComboBox, row, 1 );
+ row++;
+
+ TQLabel *fileNameLabel = new TQLabel( i18n( "&Archive File:" ), mainWidget );
+ mainLayout->addWidget( fileNameLabel, row, 0 );
+ mUrlRequester = new KURLRequester( mainWidget );
+ mUrlRequester->setMode( KFile::LocalOnly );
+ mUrlRequester->setFilter( "*.tar *.zip *.tar.gz *.tar.bz2" );
+ mUrlRequester->fileDialog()->setKeepLocation( true );
+ fileNameLabel->setBuddy( mUrlRequester );
+ connect( mUrlRequester->lineEdit(), TQT_SIGNAL(textChanged(const TQString &)),
+ TQT_SLOT(slotUrlChanged(const TQString &)) );
+ connect( mUrlRequester, TQT_SIGNAL(urlSelected(const TQString&)),
+ this, TQT_SLOT(slotFixFileExtension()) );
+ mainLayout->addWidget( mUrlRequester, row, 1 );
+ row++;
+
+ // TODO: Make this appear more dangerous!
+ mDeleteCheckBox = new TQCheckBox( i18n( "&Delete folders after completion" ), mainWidget );
+ mainLayout->addMultiCellWidget( mDeleteCheckBox, row, row, 0, 1, TQt::AlignLeft );
+ row++;
+
+ // TODO: what's this, tooltips
+
+ // TODO: Warn that user should do mail check for online IMAP and possibly cached IMAP as well
+
+ mainLayout->setColStretch( 1, 1 );
+ mainLayout->addItem( new TQSpacerItem( 1, 1, TQSizePolicy::Expanding, TQSizePolicy::Expanding ), row, 0 );
+
+ // Make it a bit bigger, else the folder requester cuts off the text too early
+ resize( 500, minimumSize().height() );
+}
+
+void ArchiveFolderDialog::slotUrlChanged( const TQString &text )
+{
+ enableButton( Ok, !text.isEmpty() );
+}
+
+bool canRemoveFolder( KMFolder *folder )
+{
+ return
+ folder &&
+ folder->canDeleteMessages() &&
+ !folder->noContent() &&
+ !folder->isSystemFolder();
+}
+
+void ArchiveFolderDialog::slotFolderChanged( KMFolder *folder )
+{
+ mDeleteCheckBox->setEnabled( canRemoveFolder( folder ) );
+ enableButton( Ok, folder && !folder->noContent());
+}
+
+void ArchiveFolderDialog::setFolder( KMFolder *defaultFolder )
+{
+ mFolderRequester->setFolder( defaultFolder );
+ // TODO: what if the file already exists?
+ mUrlRequester->setURL( standardArchivePath( defaultFolder->name() ) );
+ mDeleteCheckBox->setEnabled( canRemoveFolder( defaultFolder ) );
+}
+
+void ArchiveFolderDialog::slotOk()
+{
+ if ( !Util::checkOverwrite( mUrlRequester->url(), this ) ) {
+ return;
+ }
+
+ if ( !mFolderRequester->folder() ) {
+ KMessageBox::information( this, i18n( "Please select the folder that should be archived." ),
+ i18n( "No folder selected" ) );
+ return;
+ }
+
+ // TODO: check if url is empty. or better yet, disable ok button until file is chosen
+ KMail::BackupJob *backupJob = new KMail::BackupJob( mParentWidget );
+ backupJob->setRootFolder( mFolderRequester->folder() );
+ backupJob->setSaveLocation( mUrlRequester->url() );
+ backupJob->setArchiveType( static_cast<BackupJob::ArchiveType>( mFormatComboBox->currentItem() ) );
+ backupJob->setDeleteFoldersAfterCompletion( mDeleteCheckBox->isEnabled() &&
+ mDeleteCheckBox->isChecked() );
+ backupJob->start();
+ accept();
+}
+
+void ArchiveFolderDialog::slotFixFileExtension()
+{
+ // KDE4: use KMimeType::extractKnownExtension() here
+ const int numExtensions = 4;
+
+ // These extensions are sorted differently, .tar has to come last, or it will match before giving
+ // the more specific ones time to match.
+ const char *sortedExtensions[numExtensions] = { ".zip", ".tar.bz2", ".tar.gz", ".tar" };
+
+ // The extensions here are also sorted, like the enum order of BackupJob::ArchiveType
+ const char *extensions[numExtensions] = { ".zip", ".tar", ".tar.bz2", ".tar.gz" };
+
+ TQString fileName = mUrlRequester->url();
+ if ( fileName.isEmpty() ) {
+ fileName = standardArchivePath( mFolderRequester->folder() ?
+ mFolderRequester->folder()->name() : "" );
+ }
+
+ // First, try to find the extension of the file name and remove it
+ for( int i = 0; i < numExtensions; i++ ) {
+ int index = fileName.lower().findRev( sortedExtensions[i] );
+ if ( index != -1 ) {
+ fileName = fileName.left( fileName.length() - TQString( sortedExtensions[i] ).length() );
+ break;
+ }
+ }
+
+ // Now, we've got a filename without an extension, simply append the correct one
+ fileName += extensions[mFormatComboBox->currentItem()];
+ mUrlRequester->setURL( fileName );
+}
+
+#include "archivefolderdialog.moc"
diff --git a/kmail/archivefolderdialog.h b/kmail/archivefolderdialog.h
new file mode 100644
index 00000000..806d5b12
--- /dev/null
+++ b/kmail/archivefolderdialog.h
@@ -0,0 +1,62 @@
+/* Copyright 2009 Klarälvdalens Datakonsult AB
+
+ 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) version 3 or any later version
+ accepted by the membership of KDE e.V. (or its successor approved
+ by the membership of KDE e.V.), which shall act as a proxy
+ defined in Section 14 of version 3 of the license.
+
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef ARCHIVEFOLDERDIALOG_H
+#define ARCHIVEFOLDERDIALOG_H
+
+#include <kdialogbase.h>
+
+class TQCheckBox;
+class KURLRequester;
+class KComboBox;
+class KMFolder;
+
+namespace KMail
+{
+class FolderRequester;
+
+class ArchiveFolderDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+
+ ArchiveFolderDialog( TQWidget *parent = 0 );
+ void setFolder( KMFolder *defaultFolder );
+
+ protected slots:
+
+ void slotFixFileExtension();
+ void slotFolderChanged( KMFolder * );
+ void slotUrlChanged( const TQString & );
+
+ /** reimp */
+ virtual void slotOk();
+
+ private:
+
+ TQWidget *mParentWidget;
+ TQCheckBox *mDeleteCheckBox;
+ FolderRequester *mFolderRequester;
+ KComboBox *mFormatComboBox;
+ KURLRequester *mUrlRequester;
+};
+
+}
+
+#endif
diff --git a/kmail/attachmentcollector.h b/kmail/attachmentcollector.h
index 52454e8d..e7449607 100644
--- a/kmail/attachmentcollector.h
+++ b/kmail/attachmentcollector.h
@@ -40,20 +40,7 @@ namespace KMail {
class AttachmentCollector {
public:
- AttachmentCollector()
- : mDiveIntoEncryptions( true ),
- mDiveIntoSignatures( true ),
- mDiveIntoMessages( false ) {}
-
- void setDiveIntoEncryptions( bool dive ) {
- mDiveIntoEncryptions = dive;
- }
- void setDiveIntoSignatures( bool dive ) {
- mDiveIntoSignatures = dive;
- }
- void setDiveIntoMessages( bool dive ) {
- mDiveIntoMessages = dive;
- }
+ AttachmentCollector() {}
void collectAttachmentsFrom( partNode * node );
@@ -61,9 +48,6 @@ namespace KMail {
private:
std::vector<partNode*> mAttachments;
- bool mDiveIntoEncryptions : 1;
- bool mDiveIntoSignatures : 1;
- bool mDiveIntoMessages : 1;
private: // disabled
AttachmentCollector( const AttachmentCollector & );
diff --git a/kmail/attachmentstrategy.cpp b/kmail/attachmentstrategy.cpp
index 8d1e59a9..6e147b94 100644
--- a/kmail/attachmentstrategy.cpp
+++ b/kmail/attachmentstrategy.cpp
@@ -45,6 +45,21 @@
namespace KMail {
+static AttachmentStrategy::Display smartDisplay( const partNode *node )
+{
+ if ( node->hasContentDispositionInline() )
+ // explict "inline" disposition:
+ return AttachmentStrategy::Inline;
+ if ( node->isAttachment() )
+ // explicit "attachment" disposition:
+ return AttachmentStrategy::AsIcon;
+ if ( node->type() == DwMime::kTypeText &&
+ node->msgPart().fileName().stripWhiteSpace().isEmpty() &&
+ node->msgPart().name().stripWhiteSpace().isEmpty() )
+ // text/* w/o filename parameter:
+ return AttachmentStrategy::Inline;
+ return AttachmentStrategy::AsIcon;
+}
//
// IconicAttachmentStrategy:
@@ -60,7 +75,7 @@ namespace KMail {
public:
const char * name() const { return "iconic"; }
const AttachmentStrategy * next() const { return smart(); }
- const AttachmentStrategy * prev() const { return hidden(); }
+ const AttachmentStrategy * prev() const { return headerOnly(); }
bool inlineNestedMessages() const { return false; }
Display defaultDisplay( const partNode * ) const { return AsIcon; }
@@ -86,18 +101,7 @@ namespace KMail {
bool inlineNestedMessages() const { return true; }
Display defaultDisplay( const partNode * node ) const {
- if ( node->hasContentDispositionInline() )
- // explict "inline" disposition:
- return Inline;
- if ( node->isAttachment() )
- // explicit "attachment" disposition:
- return AsIcon;
- if ( node->type() == DwMime::kTypeText &&
- node->msgPart().fileName().stripWhiteSpace().isEmpty() &&
- node->msgPart().name().stripWhiteSpace().isEmpty() )
- // text/* w/o filename parameter:
- return Inline;
- return AsIcon;
+ return smartDisplay( node );
}
};
@@ -134,13 +138,45 @@ namespace KMail {
public:
const char * name() const { return "hidden"; }
- const AttachmentStrategy * next() const { return iconic(); }
+ const AttachmentStrategy * next() const { return headerOnly(); }
const AttachmentStrategy * prev() const { return inlined(); }
bool inlineNestedMessages() const { return false; }
Display defaultDisplay( const partNode * ) const { return None; }
};
+ class HeaderOnlyAttachmentStrategy : public AttachmentStrategy {
+ friend class ::KMail::AttachmentStrategy;
+ protected:
+ HeaderOnlyAttachmentStrategy() : AttachmentStrategy() {}
+ virtual ~HeaderOnlyAttachmentStrategy() {}
+
+ public:
+ const char * name() const { return "headerOnly"; }
+ const AttachmentStrategy * next() const { return iconic(); }
+ const AttachmentStrategy * prev() const { return hidden(); }
+
+ bool inlineNestedMessages() const {
+ return true;
+ }
+
+ Display defaultDisplay( const partNode *node ) const {
+ if ( node->isInEncapsulatedMessage() ) {
+ return smartDisplay( node );
+ }
+
+ partNode::AttachmentDisplayInfo info = node->attachmentDisplayInfo();
+ if ( info.displayInHeader ) {
+ // The entire point about this attachment strategy: Hide attachments in the body that are
+ // already displayed in the attachment quick list
+ return None;
+ } else {
+ return smartDisplay( node );
+ }
+ }
+ };
+
+
//
// AttachmentStrategy abstract base:
@@ -156,10 +192,11 @@ namespace KMail {
const AttachmentStrategy * AttachmentStrategy::create( Type type ) {
switch ( type ) {
- case Iconic: return iconic();
- case Smart: return smart();
- case Inlined: return inlined();
- case Hidden: return hidden();
+ case Iconic: return iconic();
+ case Smart: return smart();
+ case Inlined: return inlined();
+ case Hidden: return hidden();
+ case HeaderOnly: return headerOnly();
}
kdFatal( 5006 ) << "AttachmentStrategy::create(): Unknown attachment startegy ( type == "
<< (int)type << " ) requested!" << endl;
@@ -168,10 +205,11 @@ namespace KMail {
const AttachmentStrategy * AttachmentStrategy::create( const TQString & type ) {
TQString lowerType = type.lower();
- if ( lowerType == "iconic" ) return iconic();
+ if ( lowerType == "iconic" ) return iconic();
//if ( lowerType == "smart" ) return smart(); // not needed, see below
- if ( lowerType == "inlined" ) return inlined();
- if ( lowerType == "hidden" ) return hidden();
+ if ( lowerType == "inlined" ) return inlined();
+ if ( lowerType == "hidden" ) return hidden();
+ if ( lowerType == "headeronly" ) return headerOnly();
// don't kdFatal here, b/c the strings are user-provided
// (KConfig), so fail gracefully to the default:
return smart();
@@ -181,6 +219,7 @@ namespace KMail {
static const AttachmentStrategy * smartStrategy = 0;
static const AttachmentStrategy * inlinedStrategy = 0;
static const AttachmentStrategy * hiddenStrategy = 0;
+ static const AttachmentStrategy * headerOnlyStrategy = 0;
const AttachmentStrategy * AttachmentStrategy::iconic() {
if ( !iconicStrategy )
@@ -206,4 +245,10 @@ namespace KMail {
return hiddenStrategy;
}
+ const AttachmentStrategy * AttachmentStrategy::headerOnly() {
+ if ( !headerOnlyStrategy )
+ headerOnlyStrategy = new HeaderOnlyAttachmentStrategy();
+ return headerOnlyStrategy;
+ }
+
} // namespace KMail
diff --git a/kmail/attachmentstrategy.h b/kmail/attachmentstrategy.h
index e4440b24..83576894 100644
--- a/kmail/attachmentstrategy.h
+++ b/kmail/attachmentstrategy.h
@@ -46,7 +46,7 @@ namespace KMail {
//
// Factory methods:
//
- enum Type { Iconic, Smart, Inlined, Hidden };
+ enum Type { Iconic, Smart, Inlined, Hidden, HeaderOnly };
static const AttachmentStrategy * create( Type type );
static const AttachmentStrategy * create( const TQString & type );
@@ -55,6 +55,7 @@ namespace KMail {
static const AttachmentStrategy * smart();
static const AttachmentStrategy * inlined();
static const AttachmentStrategy * hidden();
+ static const AttachmentStrategy * headerOnly();
//
// Navigation methods:
diff --git a/kmail/backupjob.cpp b/kmail/backupjob.cpp
new file mode 100644
index 00000000..fd53997b
--- /dev/null
+++ b/kmail/backupjob.cpp
@@ -0,0 +1,500 @@
+/* Copyright 2009 Klarälvdalens Datakonsult AB
+
+ 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) version 3 or any later version
+ accepted by the membership of KDE e.V. (or its successor approved
+ by the membership of KDE e.V.), which shall act as a proxy
+ defined in Section 14 of version 3 of the license.
+
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "backupjob.h"
+
+#include "kmmsgdict.h"
+#include "kmfolder.h"
+#include "kmfoldercachedimap.h"
+#include "kmfolderdir.h"
+#include "folderutil.h"
+
+#include "progressmanager.h"
+
+#include "kzip.h"
+#include "ktar.h"
+#include "kmessagebox.h"
+
+#include "tqfile.h"
+#include "tqfileinfo.h"
+#include "tqstringlist.h"
+
+using namespace KMail;
+
+BackupJob::BackupJob( TQWidget *parent )
+ : TQObject( parent ),
+ mArchiveType( Zip ),
+ mRootFolder( 0 ),
+ mArchive( 0 ),
+ mParentWidget( parent ),
+ mCurrentFolderOpen( false ),
+ mArchivedMessages( 0 ),
+ mArchivedSize( 0 ),
+ mProgressItem( 0 ),
+ mAborted( false ),
+ mDeleteFoldersAfterCompletion( false ),
+ mCurrentFolder( 0 ),
+ mCurrentMessage( 0 ),
+ mCurrentJob( 0 )
+{
+}
+
+BackupJob::~BackupJob()
+{
+ mPendingFolders.clear();
+ if ( mArchive ) {
+ delete mArchive;
+ mArchive = 0;
+ }
+}
+
+void BackupJob::setRootFolder( KMFolder *rootFolder )
+{
+ mRootFolder = rootFolder;
+}
+
+void BackupJob::setSaveLocation( const KURL &savePath )
+{
+ mMailArchivePath = savePath;
+}
+
+void BackupJob::setArchiveType( ArchiveType type )
+{
+ mArchiveType = type;
+}
+
+void BackupJob::setDeleteFoldersAfterCompletion( bool deleteThem )
+{
+ mDeleteFoldersAfterCompletion = deleteThem;
+}
+
+TQString BackupJob::stripRootPath( const TQString &path ) const
+{
+ TQString ret = path;
+ ret = ret.remove( mRootFolder->path() );
+ if ( ret.startsWith( "/" ) )
+ ret = ret.right( ret.length() - 1 );
+ return ret;
+}
+
+void BackupJob::queueFolders( KMFolder *root )
+{
+ mPendingFolders.append( root );
+ KMFolderDir *dir = root->child();
+ if ( dir ) {
+ for ( KMFolderNode * node = dir->first() ; node ; node = dir->next() ) {
+ if ( node->isDir() )
+ continue;
+ KMFolder *folder = static_cast<KMFolder*>( node );
+ queueFolders( folder );
+ }
+ }
+}
+
+bool BackupJob::hasChildren( KMFolder *folder ) const
+{
+ KMFolderDir *dir = folder->child();
+ if ( dir ) {
+ for ( KMFolderNode * node = dir->first() ; node ; node = dir->next() ) {
+ if ( !node->isDir() )
+ return true;
+ }
+ }
+ return false;
+}
+
+void BackupJob::cancelJob()
+{
+ abort( i18n( "The operation was canceled by the user." ) );
+}
+
+void BackupJob::abort( const TQString &errorMessage )
+{
+ // We could be called this twice, since killing the current job below will cause the job to fail,
+ // and that will call abort()
+ if ( mAborted )
+ return;
+
+ mAborted = true;
+ if ( mCurrentFolderOpen && mCurrentFolder ) {
+ mCurrentFolder->close( "BackupJob" );
+ mCurrentFolder = 0;
+ }
+ if ( mArchive && mArchive->isOpened() ) {
+ mArchive->close();
+ }
+ if ( mCurrentJob ) {
+ mCurrentJob->kill();
+ mCurrentJob = 0;
+ }
+ if ( mProgressItem ) {
+ mProgressItem->setComplete();
+ mProgressItem = 0;
+ // The progressmanager will delete it
+ }
+
+ TQString text = i18n( "Failed to archive the folder '%1'." ).arg( mRootFolder->name() );
+ text += "\n" + errorMessage;
+ KMessageBox::sorry( mParentWidget, text, i18n( "Archiving failed." ) );
+ deleteLater();
+ // Clean up archive file here?
+}
+
+void BackupJob::finish()
+{
+ if ( mArchive->isOpened() ) {
+ mArchive->close();
+ if ( !mArchive->closeSucceeded() ) {
+ abort( i18n( "Unable to finalize the archive file." ) );
+ return;
+ }
+ }
+
+ mProgressItem->setStatus( i18n( "Archiving finished" ) );
+ mProgressItem->setComplete();
+ mProgressItem = 0;
+
+ TQFileInfo archiveFileInfo( mMailArchivePath.path() );
+ TQString text = i18n( "Archiving folder '%1' successfully completed. "
+ "The archive was written to the file '%2'." )
+ .arg( mRootFolder->name() ).arg( mMailArchivePath.path() );
+ text += "\n" + i18n( "1 message of size %1 was archived.",
+ "%n messages with the total size of %1 were archived.", mArchivedMessages )
+ .arg( KIO::convertSize( mArchivedSize ) );
+ text += "\n" + i18n( "The archive file has a size of %1." )
+ .arg( KIO::convertSize( archiveFileInfo.size() ) );
+ KMessageBox::information( mParentWidget, text, i18n( "Archiving finished." ) );
+
+ if ( mDeleteFoldersAfterCompletion ) {
+ // Some saftey checks first...
+ if ( archiveFileInfo.size() > 0 && ( mArchivedSize > 0 || mArchivedMessages == 0 ) ) {
+ // Sorry for any data loss!
+ FolderUtil::deleteFolder( mRootFolder, mParentWidget );
+ }
+ }
+
+ deleteLater();
+}
+
+void BackupJob::archiveNextMessage()
+{
+ if ( mAborted )
+ return;
+
+ mCurrentMessage = 0;
+ if ( mPendingMessages.isEmpty() ) {
+ kdDebug(5006) << "===> All messages done in folder " << mCurrentFolder->name() << endl;
+ mCurrentFolder->close( "BackupJob" );
+ mCurrentFolderOpen = false;
+ archiveNextFolder();
+ return;
+ }
+
+ unsigned long serNum = mPendingMessages.front();
+ mPendingMessages.pop_front();
+
+ KMFolder *folder;
+ mMessageIndex = -1;
+ KMMsgDict::instance()->getLocation( serNum, &folder, &mMessageIndex );
+ if ( mMessageIndex == -1 ) {
+ kdWarning(5006) << "Failed to get message location for sernum " << serNum << endl;
+ abort( i18n( "Unable to retrieve a message for folder '%1'." ).arg( mCurrentFolder->name() ) );
+ return;
+ }
+
+ Q_ASSERT( folder == mCurrentFolder );
+ const KMMsgBase *base = mCurrentFolder->getMsgBase( mMessageIndex );
+ mUnget = base && !base->isMessage();
+ KMMessage *message = mCurrentFolder->getMsg( mMessageIndex );
+ if ( !message ) {
+ kdWarning(5006) << "Failed to retrieve message with index " << mMessageIndex << endl;
+ abort( i18n( "Unable to retrieve a message for folder '%1'." ).arg( mCurrentFolder->name() ) );
+ return;
+ }
+
+ kdDebug(5006) << "Going to get next message with subject " << message->subject() << ", "
+ << mPendingMessages.size() << " messages left in the folder." << endl;
+
+ if ( message->isComplete() ) {
+ // Use a singleshot timer, or otherwise we risk ending up in a very big recursion
+ // for folders that have many messages
+ mCurrentMessage = message;
+ TQTimer::singleShot( 0, this, TQT_SLOT( processCurrentMessage() ) );
+ }
+ else if ( message->parent() ) {
+ mCurrentJob = message->parent()->createJob( message );
+ mCurrentJob->setCancellable( false );
+ connect( mCurrentJob, TQT_SIGNAL( messageRetrieved( KMMessage* ) ),
+ this, TQT_SLOT( messageRetrieved( KMMessage* ) ) );
+ connect( mCurrentJob, TQT_SIGNAL( result( KMail::FolderJob* ) ),
+ this, TQT_SLOT( folderJobFinished( KMail::FolderJob* ) ) );
+ mCurrentJob->start();
+ }
+ else {
+ kdWarning(5006) << "Message with subject " << mCurrentMessage->subject()
+ << " is neither complete nor has a parent!" << endl;
+ abort( i18n( "Internal error while trying to retrieve a message from folder '%1'." )
+ .arg( mCurrentFolder->name() ) );
+ }
+
+ mProgressItem->setProgress( ( mProgressItem->progress() + 5 ) );
+}
+
+static int fileInfoToUnixPermissions( const TQFileInfo &fileInfo )
+{
+ int perm = 0;
+ if ( fileInfo.permission( TQFileInfo::ExeOther ) ) perm += S_IXOTH;
+ if ( fileInfo.permission( TQFileInfo::WriteOther ) ) perm += S_IWOTH;
+ if ( fileInfo.permission( TQFileInfo::ReadOther ) ) perm += S_IROTH;
+ if ( fileInfo.permission( TQFileInfo::ExeGroup ) ) perm += S_IXGRP;
+ if ( fileInfo.permission( TQFileInfo::WriteGroup ) ) perm += S_IWGRP;
+ if ( fileInfo.permission( TQFileInfo::ReadGroup ) ) perm += S_IRGRP;
+ if ( fileInfo.permission( TQFileInfo::ExeOwner ) ) perm += S_IXUSR;
+ if ( fileInfo.permission( TQFileInfo::WriteOwner ) ) perm += S_IWUSR;
+ if ( fileInfo.permission( TQFileInfo::ReadOwner ) ) perm += S_IRUSR;
+ return perm;
+}
+
+void BackupJob::processCurrentMessage()
+{
+ if ( mAborted )
+ return;
+
+ if ( mCurrentMessage ) {
+ kdDebug(5006) << "Processing message with subject " << mCurrentMessage->subject() << endl;
+ const DwString &messageDWString = mCurrentMessage->asDwString();
+ const uint messageSize = messageDWString.size();
+ const char *messageString = mCurrentMessage->asDwString().c_str();
+ TQString messageName;
+ TQFileInfo fileInfo;
+ if ( messageName.isEmpty() ) {
+ messageName = TQString::number( mCurrentMessage->getMsgSerNum() ); // IMAP doesn't have filenames
+ if ( mCurrentMessage->storage() ) {
+ fileInfo.setFile( mCurrentMessage->storage()->location() );
+ // TODO: what permissions etc to take when there is no storage file?
+ }
+ }
+ else {
+ // TODO: What if the message is not in the "cur" directory?
+ fileInfo.setFile( mCurrentFolder->location() + "/cur/" + mCurrentMessage->fileName() );
+ messageName = mCurrentMessage->fileName();
+ }
+
+ const TQString fileName = stripRootPath( mCurrentFolder->location() ) +
+ "/cur/" + messageName;
+
+ TQString user;
+ TQString group;
+ mode_t permissions = 0700;
+ time_t creationTime = time( 0 );
+ time_t modificationTime = time( 0 );
+ time_t accessTime = time( 0 );
+ if ( !fileInfo.fileName().isEmpty() ) {
+ user = fileInfo.owner();
+ group = fileInfo.group();
+ permissions = fileInfoToUnixPermissions( fileInfo );
+ creationTime = fileInfo.created().toTime_t();
+ modificationTime = fileInfo.lastModified().toTime_t();
+ accessTime = fileInfo.lastRead().toTime_t();
+ }
+ else {
+ kdWarning(5006) << "Unable to find file for message " << fileName << endl;
+ }
+
+ if ( !mArchive->writeFile( fileName, user, group, messageSize, permissions, accessTime,
+ modificationTime, creationTime, messageString ) ) {
+ abort( i18n( "Failed to write a message into the archive folder '%1'." ).arg( mCurrentFolder->name() ) );
+ return;
+ }
+
+ if ( mUnget ) {
+ Q_ASSERT( mMessageIndex >= 0 );
+ mCurrentFolder->unGetMsg( mMessageIndex );
+ }
+
+ mArchivedMessages++;
+ mArchivedSize += messageSize;
+ }
+ else {
+ // No message? According to ImapJob::slotGetMessageResult(), that means the message is no
+ // longer on the server. So ignore this one.
+ kdWarning(5006) << "Unable to download a message for folder " << mCurrentFolder->name() << endl;
+ }
+ archiveNextMessage();
+}
+
+void BackupJob::messageRetrieved( KMMessage *message )
+{
+ mCurrentMessage = message;
+ processCurrentMessage();
+}
+
+void BackupJob::folderJobFinished( KMail::FolderJob *job )
+{
+ if ( mAborted )
+ return;
+
+ // The job might finish after it has emitted messageRetrieved(), in which case we have already
+ // started a new job. Don't set the current job to 0 in that case.
+ if ( job == mCurrentJob ) {
+ mCurrentJob = 0;
+ }
+
+ if ( job->error() ) {
+ if ( mCurrentFolder )
+ abort( i18n( "Downloading a message in folder '%1' failed." ).arg( mCurrentFolder->name() ) );
+ else
+ abort( i18n( "Downloading a message in the current folder failed." ) );
+ }
+}
+
+bool BackupJob::writeDirHelper( const TQString &directoryPath, const TQString &permissionPath )
+{
+ TQFileInfo fileInfo( permissionPath );
+ TQString user = fileInfo.owner();
+ TQString group = fileInfo.group();
+ mode_t permissions = fileInfoToUnixPermissions( fileInfo );
+ time_t creationTime = fileInfo.created().toTime_t();
+ time_t modificationTime = fileInfo.lastModified().toTime_t();
+ time_t accessTime = fileInfo.lastRead().toTime_t();
+ return mArchive->writeDir( stripRootPath( directoryPath ), user, group, permissions, accessTime,
+ modificationTime, creationTime );
+}
+
+void BackupJob::archiveNextFolder()
+{
+ if ( mAborted )
+ return;
+
+ if ( mPendingFolders.isEmpty() ) {
+ finish();
+ return;
+ }
+
+ mCurrentFolder = mPendingFolders.take( 0 );
+ kdDebug(5006) << "===> Archiving next folder: " << mCurrentFolder->name() << endl;
+ mProgressItem->setStatus( i18n( "Archiving folder %1" ).arg( mCurrentFolder->name() ) );
+ if ( mCurrentFolder->open( "BackupJob" ) != 0 ) {
+ abort( i18n( "Unable to open folder '%1'.").arg( mCurrentFolder->name() ) );
+ return;
+ }
+ mCurrentFolderOpen = true;
+
+ const TQString folderName = mCurrentFolder->name();
+ bool success = true;
+ if ( hasChildren( mCurrentFolder ) ) {
+ if ( !writeDirHelper( mCurrentFolder->subdirLocation(), mCurrentFolder->subdirLocation() ) )
+ success = false;
+ }
+ if ( !writeDirHelper( mCurrentFolder->location(), mCurrentFolder->location() ) )
+ success = false;
+ if ( !writeDirHelper( mCurrentFolder->location() + "/cur", mCurrentFolder->location() ) )
+ success = false;
+ if ( !writeDirHelper( mCurrentFolder->location() + "/new", mCurrentFolder->location() ) )
+ success = false;
+ if ( !writeDirHelper( mCurrentFolder->location() + "/tmp", mCurrentFolder->location() ) )
+ success = false;
+ if ( !success ) {
+ abort( i18n( "Unable to create folder structure for folder '%1' within archive file." )
+ .arg( mCurrentFolder->name() ) );
+ return;
+ }
+
+ for ( int i = 0; i < mCurrentFolder->count( false /* no cache */ ); i++ ) {
+ unsigned long serNum = KMMsgDict::instance()->getMsgSerNum( mCurrentFolder, i );
+ if ( serNum == 0 ) {
+ // Uh oh
+ kdWarning(5006) << "Got serial number zero in " << mCurrentFolder->name()
+ << " at index " << i << "!" << endl;
+ // TODO: handle error in a nicer way. this is _very_ bad
+ abort( i18n( "Unable to backup messages in folder '%1', the index file is corrupted." )
+ .arg( mCurrentFolder->name() ) );
+ return;
+ }
+ else
+ mPendingMessages.append( serNum );
+ }
+ archiveNextMessage();
+}
+
+// TODO
+// - error handling
+// - import
+// - connect to progressmanager, especially abort
+// - messagebox when finished (?)
+// - ui dialog
+// - use correct permissions
+// - save index and serial number?
+// - guarded pointers for folders
+// - online IMAP: check mails first, so sernums are up-to-date?
+// - "ignore errors"-mode, with summary how many messages couldn't be archived?
+// - do something when the user quits KMail while the backup job is running
+// - run in a thread?
+// - delete source folder after completion. dangerous!!!
+//
+// BUGS
+// - Online IMAP: Test Mails -> Test%20Mails
+// - corrupted sernums indices stop backup job
+void BackupJob::start()
+{
+ Q_ASSERT( !mMailArchivePath.isEmpty() );
+ Q_ASSERT( mRootFolder );
+
+ queueFolders( mRootFolder );
+
+ switch ( mArchiveType ) {
+ case Zip: {
+ KZip *zip = new KZip( mMailArchivePath.path() );
+ zip->setCompression( KZip::DeflateCompression );
+ mArchive = zip;
+ break;
+ }
+ case Tar: {
+ mArchive = new KTar( mMailArchivePath.path(), "application/x-tar" );
+ break;
+ }
+ case TarGz: {
+ mArchive = new KTar( mMailArchivePath.path(), "application/x-gzip" );
+ break;
+ }
+ case TarBz2: {
+ mArchive = new KTar( mMailArchivePath.path(), "application/x-bzip2" );
+ break;
+ }
+ }
+
+ kdDebug(5006) << "Starting backup." << endl;
+ if ( !mArchive->open( IO_WriteOnly ) ) {
+ abort( i18n( "Unable to open archive for writing." ) );
+ return;
+ }
+
+ mProgressItem = KPIM::ProgressManager::createProgressItem(
+ "BackupJob",
+ i18n( "Archiving" ),
+ TQString(),
+ true );
+ mProgressItem->setUsesBusyIndicator( true );
+ connect( mProgressItem, TQT_SIGNAL(progressItemCanceled(KPIM::ProgressItem*)),
+ this, TQT_SLOT(cancelJob()) );
+
+ archiveNextFolder();
+}
+
+#include "backupjob.moc"
+
diff --git a/kmail/backupjob.h b/kmail/backupjob.h
new file mode 100644
index 00000000..f6383d66
--- /dev/null
+++ b/kmail/backupjob.h
@@ -0,0 +1,109 @@
+/* Copyright 2009 Klarälvdalens Datakonsult AB
+
+ 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) version 3 or any later version
+ accepted by the membership of KDE e.V. (or its successor approved
+ by the membership of KDE e.V.), which shall act as a proxy
+ defined in Section 14 of version 3 of the license.
+
+ 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, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef BACKUPJOB_H
+#define BACKUPJOB_H
+
+#include <kurl.h>
+#include <tqptrlist.h>
+
+#include <tqobject.h>
+
+class KMFolder;
+class KMMessage;
+class KArchive;
+class KProcess;
+class TQWidget;
+
+namespace KPIM {
+ class ProgressItem;
+}
+
+namespace KMail
+{
+ class FolderJob;
+
+/**
+ * Writes an entire folder structure to an archive file.
+ * The archive is structured like a hierarchy of maildir folders. However, every type of folder
+ * works as the source, i.e. also online IMAP folders.
+ *
+ * The job deletes itself after it finished.
+ */
+class BackupJob : public TQObject
+{
+ Q_OBJECT
+
+ public:
+
+ // These enum values have to stay in sync with the format combobox of ArchiveFolderDialog!
+ enum ArchiveType { Zip = 0, Tar = 1, TarBz2 = 2, TarGz = 3 };
+
+ explicit BackupJob( TQWidget *parent = 0 );
+ ~Ba