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"