File indexing completed on 2024-05-12 05:20:46

0001 /*
0002     SPDX-FileCopyrightText: 2005 Till Adam <adam@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "util.h"
0008 
0009 #include "job/handleclickedurljob.h"
0010 #include <MessageComposer/MessageHelper>
0011 #include <MessageCore/StringUtil>
0012 
0013 #include "kmail_debug.h"
0014 #include <KLocalizedString>
0015 #include <KMime/KMimeMessage>
0016 
0017 #include <QAction>
0018 #include <QStandardPaths>
0019 
0020 using namespace MailCommon;
0021 using namespace KMail;
0022 KMime::Types::Mailbox::List KMail::Util::mailingListsFromMessage(const Akonadi::Item &item)
0023 {
0024     KMime::Types::Mailbox::List addresses;
0025     // determine the mailing list posting address
0026     Akonadi::Collection parentCollection = item.parentCollection();
0027     if (parentCollection.isValid()) {
0028         const QSharedPointer<FolderSettings> fd = FolderSettings::forCollection(parentCollection, false);
0029         if (fd->isMailingListEnabled() && !fd->mailingListPostAddress().isEmpty()) {
0030             KMime::Types::Mailbox mailbox;
0031             mailbox.fromUnicodeString(fd->mailingListPostAddress());
0032             addresses << mailbox;
0033         }
0034     }
0035 
0036     return addresses;
0037 }
0038 
0039 Akonadi::Item::Id KMail::Util::putRepliesInSameFolder(const Akonadi::Item &item)
0040 {
0041     Akonadi::Collection parentCollection = item.parentCollection();
0042     if (parentCollection.isValid()) {
0043         const QSharedPointer<FolderSettings> fd = FolderSettings::forCollection(parentCollection, false);
0044         if (fd->putRepliesInSameFolder()) {
0045             return parentCollection.id();
0046         }
0047     }
0048     return -1;
0049 }
0050 
0051 bool KMail::Util::handleClickedURL(const QUrl &url, const QSharedPointer<MailCommon::FolderSettings> &folder, const Akonadi::Collection &collection)
0052 {
0053     if (url.scheme() == QLatin1StringView("mailto")) {
0054         auto job = new HandleClickedUrlJob;
0055         job->setUrl(url);
0056         job->setFolder(folder);
0057         job->setCurrentCollection(collection);
0058         job->start();
0059         return true;
0060     } else {
0061         qCWarning(KMAIL_LOG) << "Can't handle URL:" << url;
0062         return false;
0063     }
0064 }
0065 
0066 bool KMail::Util::mailingListsHandleURL(const QList<QUrl> &lst, const QSharedPointer<MailCommon::FolderSettings> &folder, const Akonadi::Collection &collection)
0067 {
0068     const QString handler = (folder->mailingList().handler() == MailingList::KMail) ? QStringLiteral("mailto") : QStringLiteral("https");
0069 
0070     QUrl urlToHandle;
0071     QList<QUrl>::ConstIterator end(lst.constEnd());
0072     for (QList<QUrl>::ConstIterator itr = lst.constBegin(); itr != end; ++itr) {
0073         if (handler == (*itr).scheme()) {
0074             urlToHandle = *itr;
0075             break;
0076         }
0077     }
0078     if (urlToHandle.isEmpty() && !lst.empty()) {
0079         urlToHandle = lst.constFirst();
0080     }
0081 
0082     if (!urlToHandle.isEmpty()) {
0083         return Util::handleClickedURL(urlToHandle, folder, collection);
0084     } else {
0085         qCWarning(KMAIL_LOG) << "Can't handle url";
0086         return false;
0087     }
0088 }
0089 
0090 bool KMail::Util::mailingListPost(const QSharedPointer<MailCommon::FolderSettings> &fd, const Akonadi::Collection &col)
0091 {
0092     if (fd) {
0093         return KMail::Util::mailingListsHandleURL(fd->mailingList().postUrls(), fd, col);
0094     }
0095     return false;
0096 }
0097 
0098 bool KMail::Util::mailingListSubscribe(const QSharedPointer<MailCommon::FolderSettings> &fd, const Akonadi::Collection &col)
0099 {
0100     if (fd) {
0101         return KMail::Util::mailingListsHandleURL(fd->mailingList().subscribeUrls(), fd, col);
0102     }
0103     return false;
0104 }
0105 
0106 bool KMail::Util::mailingListUnsubscribe(const QSharedPointer<MailCommon::FolderSettings> &fd, const Akonadi::Collection &col)
0107 {
0108     if (fd) {
0109         return KMail::Util::mailingListsHandleURL(fd->mailingList().unsubscribeUrls(), fd, col);
0110     }
0111     return false;
0112 }
0113 
0114 bool KMail::Util::mailingListArchives(const QSharedPointer<MailCommon::FolderSettings> &fd, const Akonadi::Collection &col)
0115 {
0116     if (fd) {
0117         return KMail::Util::mailingListsHandleURL(fd->mailingList().archiveUrls(), fd, col);
0118     }
0119     return false;
0120 }
0121 
0122 bool KMail::Util::mailingListHelp(const QSharedPointer<MailCommon::FolderSettings> &fd, const Akonadi::Collection &col)
0123 {
0124     if (fd) {
0125         return KMail::Util::mailingListsHandleURL(fd->mailingList().helpUrls(), fd, col);
0126     }
0127     return false;
0128 }
0129 
0130 void KMail::Util::lastEncryptAndSignState(bool &lastEncrypt, bool &lastSign, const KMime::Message::Ptr &msg)
0131 {
0132     lastSign = KMime::isSigned(msg.data());
0133     lastEncrypt = KMime::isEncrypted(msg.data());
0134 }
0135 
0136 void KMail::Util::addQActionHelpText(QAction *action, const QString &text)
0137 {
0138     action->setStatusTip(text);
0139     action->setToolTip(text);
0140     if (action->whatsThis().isEmpty()) {
0141         action->setWhatsThis(text);
0142     }
0143 }
0144 
0145 void KMail::Util::setActionTrashOrDelete(QAction *action, bool isInTrashFolder)
0146 {
0147     if (action) {
0148         action->setText(isInTrashFolder ? i18nc("@action Hard delete, bypassing trash", "&Delete") : i18n("&Move to Trash"));
0149         action->setIcon(isInTrashFolder ? QIcon::fromTheme(QStringLiteral("edit-delete-shred")) : QIcon::fromTheme(QStringLiteral("edit-delete")));
0150         // Use same text as in Text property. Change it in kf5
0151         action->setToolTip(isInTrashFolder ? i18nc("@action Hard delete, bypassing trash", "Delete") : i18n("Move to Trash"));
0152     }
0153 }