File indexing completed on 2024-05-19 05:11:23
0001 /* 0002 SPDX-FileCopyrightText: 2008 Kevin Krammer <kevin.krammer@gmx.at> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "akonadi_serializer_contactgroup.h" 0008 0009 #include <Akonadi/AbstractDifferencesReporter> 0010 #include <Akonadi/ContactGroupExpandJob> 0011 #include <Akonadi/Item> 0012 0013 #include <KContacts/ContactGroup> 0014 #include <KContacts/ContactGroupTool> 0015 #include <KLocalizedString> 0016 0017 #include <qplugin.h> 0018 0019 using namespace Akonadi; 0020 0021 //// ItemSerializerPlugin interface 0022 0023 bool SerializerPluginContactGroup::deserialize(Item &item, const QByteArray &label, QIODevice &data, int version) 0024 { 0025 Q_UNUSED(label) 0026 Q_UNUSED(version) 0027 0028 KContacts::ContactGroup contactGroup; 0029 0030 if (!KContacts::ContactGroupTool::convertFromXml(&data, contactGroup)) { 0031 // TODO: error reporting 0032 return false; 0033 } 0034 0035 item.setPayload<KContacts::ContactGroup>(contactGroup); 0036 0037 return true; 0038 } 0039 0040 void SerializerPluginContactGroup::serialize(const Item &item, const QByteArray &label, QIODevice &data, int &version) 0041 { 0042 Q_UNUSED(label) 0043 Q_UNUSED(version) 0044 0045 if (!item.hasPayload<KContacts::ContactGroup>()) { 0046 return; 0047 } 0048 0049 KContacts::ContactGroupTool::convertToXml(item.payload<KContacts::ContactGroup>(), &data); 0050 } 0051 0052 //// DifferencesAlgorithmInterface interface 0053 0054 static bool compareString(const QString &left, const QString &right) 0055 { 0056 if (left.isEmpty() && right.isEmpty()) { 0057 return true; 0058 } else { 0059 return left == right; 0060 } 0061 } 0062 0063 static QString toString(const KContacts::Addressee &contact) 0064 { 0065 return contact.fullEmail(); 0066 } 0067 0068 template<class T> 0069 static void compareVector(AbstractDifferencesReporter *reporter, const QString &id, const QList<T> &left, const QList<T> &right) 0070 { 0071 for (int i = 0; i < left.count(); ++i) { 0072 if (!right.contains(left[i])) { 0073 reporter->addProperty(AbstractDifferencesReporter::AdditionalLeftMode, id, toString(left[i]), QString()); 0074 } 0075 } 0076 0077 for (int i = 0; i < right.count(); ++i) { 0078 if (!left.contains(right[i])) { 0079 reporter->addProperty(AbstractDifferencesReporter::AdditionalRightMode, id, QString(), toString(right[i])); 0080 } 0081 } 0082 } 0083 0084 void SerializerPluginContactGroup::compare(Akonadi::AbstractDifferencesReporter *reporter, const Akonadi::Item &leftItem, const Akonadi::Item &rightItem) 0085 { 0086 Q_ASSERT(reporter); 0087 Q_ASSERT(leftItem.hasPayload<KContacts::ContactGroup>()); 0088 Q_ASSERT(rightItem.hasPayload<KContacts::ContactGroup>()); 0089 0090 reporter->setLeftPropertyValueTitle(i18n("Changed Contact Group")); 0091 reporter->setRightPropertyValueTitle(i18n("Conflicting Contact Group")); 0092 0093 const auto leftContactGroup = leftItem.payload<KContacts::ContactGroup>(); 0094 const auto rightContactGroup = rightItem.payload<KContacts::ContactGroup>(); 0095 0096 if (!compareString(leftContactGroup.name(), rightContactGroup.name())) { 0097 reporter->addProperty(AbstractDifferencesReporter::ConflictMode, i18n("Name"), leftContactGroup.name(), rightContactGroup.name()); 0098 } 0099 0100 // using job->exec() is ok here, not a hot path 0101 auto leftJob = new Akonadi::ContactGroupExpandJob(leftContactGroup); 0102 leftJob->exec(); 0103 0104 auto rightJob = new Akonadi::ContactGroupExpandJob(rightContactGroup); 0105 rightJob->exec(); 0106 0107 compareVector(reporter, i18n("Member"), leftJob->contacts(), rightJob->contacts()); 0108 } 0109 0110 //// GidExtractorInterface 0111 0112 QString SerializerPluginContactGroup::extractGid(const Item &item) const 0113 { 0114 if (!item.hasPayload<KContacts::ContactGroup>()) { 0115 return {}; 0116 } 0117 return item.payload<KContacts::ContactGroup>().id(); 0118 } 0119 0120 #include "moc_akonadi_serializer_contactgroup.cpp"