File indexing completed on 2024-05-12 05:11:12

0001 /*
0002     SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "specialmailcollections.h"
0008 #include "akonadi_mime_debug.h"
0009 #include "specialmailcollectionssettings.h"
0010 
0011 #include <Akonadi/AgentInstance>
0012 #include <Akonadi/CollectionModifyJob>
0013 #include <Akonadi/EntityDisplayAttribute>
0014 #include <Akonadi/ServerManager>
0015 #include <Akonadi/SpecialCollectionAttribute>
0016 
0017 #include <KLocalizedString>
0018 
0019 using namespace Akonadi;
0020 
0021 class Akonadi::SpecialMailCollectionsPrivate
0022 {
0023 public:
0024     SpecialMailCollectionsPrivate();
0025     ~SpecialMailCollectionsPrivate();
0026 
0027     SpecialMailCollections *mInstance = nullptr;
0028 };
0029 
0030 using Settings = SpecialMailCollectionsSettings;
0031 
0032 Q_GLOBAL_STATIC(SpecialMailCollectionsPrivate, sInstance)
0033 
0034 static const char s_specialCollectionTypes[SpecialMailCollections::LastType][11] =
0035     {"local-mail", "inbox", "outbox", "sent-mail", "trash", "drafts", "templates"};
0036 
0037 static const int s_numTypes = sizeof s_specialCollectionTypes / sizeof *s_specialCollectionTypes;
0038 
0039 static inline QByteArray enumToByteArray(SpecialMailCollections::Type value)
0040 {
0041     return s_specialCollectionTypes[value];
0042 }
0043 
0044 static inline SpecialMailCollections::Type typeToEnum(const QByteArray &type)
0045 {
0046     for (int i = 0; i < s_numTypes; ++i) {
0047         if (type == s_specialCollectionTypes[i]) {
0048             return static_cast<SpecialMailCollections::Type>(i);
0049         }
0050     }
0051     return SpecialMailCollections::Invalid;
0052 }
0053 
0054 SpecialMailCollectionsPrivate::SpecialMailCollectionsPrivate()
0055     : mInstance(new SpecialMailCollections(this))
0056 {
0057 }
0058 
0059 SpecialMailCollectionsPrivate::~SpecialMailCollectionsPrivate()
0060 {
0061     delete mInstance;
0062 }
0063 
0064 static KCoreConfigSkeleton *getConfig(const QString &filename)
0065 {
0066     Settings::instance(ServerManager::addNamespace(filename));
0067     return Settings::self();
0068 }
0069 
0070 SpecialMailCollections::SpecialMailCollections(SpecialMailCollectionsPrivate *dd)
0071     : SpecialCollections(getConfig(QStringLiteral("specialmailcollectionsrc")))
0072     , d(dd)
0073 {
0074 }
0075 
0076 SpecialMailCollections *SpecialMailCollections::self()
0077 {
0078     return sInstance->mInstance;
0079 }
0080 
0081 bool SpecialMailCollections::hasCollection(Type type, const AgentInstance &instance) const
0082 {
0083     return SpecialCollections::hasCollection(enumToByteArray(type), instance);
0084 }
0085 
0086 Collection SpecialMailCollections::collection(Type type, const AgentInstance &instance) const
0087 {
0088     return SpecialCollections::collection(enumToByteArray(type), instance);
0089 }
0090 
0091 bool SpecialMailCollections::registerCollection(Type type, const Collection &collection)
0092 {
0093     return SpecialCollections::registerCollection(enumToByteArray(type), collection);
0094 }
0095 
0096 bool SpecialMailCollections::unregisterCollection(const Collection &collection)
0097 {
0098     if (collection != Akonadi::SpecialMailCollections::self()->defaultCollection(Akonadi::SpecialMailCollections::Trash)) {
0099         return SpecialCollections::unregisterCollection(collection);
0100     } else {
0101         return false;
0102     }
0103 }
0104 
0105 bool SpecialMailCollections::hasDefaultCollection(Type type) const
0106 {
0107     return SpecialCollections::hasDefaultCollection(enumToByteArray(type));
0108 }
0109 
0110 Collection SpecialMailCollections::defaultCollection(Type type) const
0111 {
0112     return SpecialCollections::defaultCollection(enumToByteArray(type));
0113 }
0114 
0115 void SpecialMailCollections::verifyI18nDefaultCollection(Type type)
0116 {
0117     Collection collection = defaultCollection(type);
0118     QString defaultI18n;
0119 
0120     switch (type) {
0121     case SpecialMailCollections::Inbox:
0122         defaultI18n = i18nc("local mail folder", "inbox");
0123         break;
0124     case SpecialMailCollections::Outbox:
0125         defaultI18n = i18nc("local mail folder", "outbox");
0126         break;
0127     case SpecialMailCollections::SentMail:
0128         defaultI18n = i18nc("local mail folder", "sent-mail");
0129         break;
0130     case SpecialMailCollections::Trash:
0131         defaultI18n = i18nc("local mail folder", "trash");
0132         break;
0133     case SpecialMailCollections::Drafts:
0134         defaultI18n = i18nc("local mail folder", "drafts");
0135         break;
0136     case SpecialMailCollections::Templates:
0137         defaultI18n = i18nc("local mail folder", "templates");
0138         break;
0139     default:
0140         break;
0141     }
0142     if (!defaultI18n.isEmpty()) {
0143         if (collection.hasAttribute<Akonadi::EntityDisplayAttribute>()) {
0144             if (collection.attribute<Akonadi::EntityDisplayAttribute>()->displayName() != defaultI18n) {
0145                 collection.attribute<Akonadi::EntityDisplayAttribute>()->setDisplayName(defaultI18n);
0146                 auto job = new Akonadi::CollectionModifyJob(collection, this);
0147                 connect(job, &Akonadi::CollectionModifyJob::result, this, &SpecialMailCollections::slotCollectionModified);
0148             }
0149         }
0150     }
0151 }
0152 
0153 void SpecialMailCollections::slotCollectionModified(KJob *job)
0154 {
0155     if (job->error()) {
0156         qCDebug(AKONADIMIME_LOG) << " Error when we modified collection";
0157         return;
0158     }
0159 }
0160 
0161 SpecialMailCollections::Type SpecialMailCollections::specialCollectionType(const Akonadi::Collection &collection)
0162 {
0163     if (!collection.hasAttribute<SpecialCollectionAttribute>()) {
0164         return Invalid;
0165     } else {
0166         return typeToEnum(collection.attribute<SpecialCollectionAttribute>()->collectionType());
0167     }
0168 }
0169 
0170 #include "moc_specialmailcollections.cpp"