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"