File indexing completed on 2024-06-16 05:00:34

0001 /*
0002    SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "importmailfolderattributejobimpl.h"
0008 #include "pimdataexportcore_debug.h"
0009 #include <Akonadi/CollectionFetchJob>
0010 #include <Akonadi/CollectionFetchScope>
0011 #include <Akonadi/CollectionModifyJob>
0012 #include <Akonadi/EntityDisplayAttribute>
0013 #include <Akonadi/FavoriteCollectionAttribute>
0014 #include <MailCommon/ExpireCollectionAttribute>
0015 
0016 ImportMailFolderAttributeJobImpl::ImportMailFolderAttributeJobImpl(QObject *parent)
0017     : ImportMailFolderAttributeJob{parent}
0018 {
0019 }
0020 
0021 ImportMailFolderAttributeJobImpl::~ImportMailFolderAttributeJobImpl() = default;
0022 
0023 void ImportMailFolderAttributeJobImpl::applyAttributes(const QMap<Akonadi::Collection::Id, ImportExportMailUtil::AttributeInfo> &map)
0024 {
0025     mIndexMap.reset(new QMapIterator<Akonadi::Collection::Id, ImportExportMailUtil::AttributeInfo>(map));
0026     nextAttribute();
0027 }
0028 
0029 void ImportMailFolderAttributeJobImpl::nextAttribute()
0030 {
0031     if (mIndexMap->hasNext()) {
0032         mIndexMap->next();
0033         qDebug() << " restoring folder attribute " << mIndexMap->key();
0034         if (mIndexMap->key() == -1) {
0035             qCWarning(PIMDATAEXPORTERCORE_LOG) << " It's a bug !  restoring folder attribute " << mIndexMap->key();
0036             nextAttribute();
0037             return;
0038         }
0039         auto fetch = new Akonadi::CollectionFetchJob(Akonadi::Collection(mIndexMap->key()), Akonadi::CollectionFetchJob::Base, this);
0040         fetch->fetchScope().fetchAttribute<Akonadi::EntityDisplayAttribute>();
0041         fetch->fetchScope().fetchAttribute<MailCommon::ExpireCollectionAttribute>();
0042         connect(fetch, &Akonadi::CollectionFetchJob::result, this, &ImportMailFolderAttributeJobImpl::collectionFetchResult);
0043         connect(fetch, &Akonadi::CollectionFetchJob::collectionsReceived, this, [this](const Akonadi::Collection::List &cols) {
0044             if (cols.count() != 1) {
0045                 nextAttribute();
0046                 return;
0047             }
0048             Akonadi::Collection col = cols.first();
0049             if (!mIndexMap->value().expireAttribute.isEmpty()) {
0050                 MailCommon::ExpireCollectionAttribute *expireAttribute =
0051                     col.attribute<MailCommon::ExpireCollectionAttribute>(Akonadi::Collection::AddIfMissing);
0052                 expireAttribute->deserialize(mIndexMap->value().expireAttribute);
0053             }
0054             if (!mIndexMap->value().displayAttribute.isEmpty()) {
0055                 Akonadi::EntityDisplayAttribute *entityAttribute = col.attribute<Akonadi::EntityDisplayAttribute>(Akonadi::Collection::AddIfMissing);
0056                 entityAttribute->deserialize(mIndexMap->value().displayAttribute);
0057             }
0058             if (!mIndexMap->value().favoriteAttribute.isEmpty()) {
0059                 Akonadi::FavoriteCollectionAttribute *favoriteAttribute =
0060                     col.attribute<Akonadi::FavoriteCollectionAttribute>(Akonadi::Collection::AddIfMissing);
0061                 favoriteAttribute->deserialize(mIndexMap->value().favoriteAttribute);
0062             }
0063 
0064             qDebug() << " modify folder attribute " << mIndexMap->key();
0065             auto job = new Akonadi::CollectionModifyJob(col, this);
0066             connect(job, &Akonadi::CollectionModifyJob::result, this, &ImportMailFolderAttributeJobImpl::slotCollectionModifyDone);
0067         });
0068     } else {
0069         // Call it when all is finished!
0070         qDebug() << " restoring folder attribute finished";
0071         restoreFileFolderAttribute();
0072     }
0073 }
0074 
0075 void ImportMailFolderAttributeJobImpl::collectionFetchResult(KJob *job)
0076 {
0077     if (job->error()) {
0078         qCWarning(PIMDATAEXPORTERCORE_LOG) << "Error when we fetch collection: " << job->errorString();
0079         nextAttribute();
0080     }
0081 }
0082 
0083 void ImportMailFolderAttributeJobImpl::slotCollectionModifyDone(KJob *job)
0084 {
0085     if (job->error()) {
0086         qCWarning(PIMDATAEXPORTERCORE_LOG) << "Error when we modified collection: " << job->errorString();
0087     }
0088     nextAttribute();
0089 }
0090 
0091 #include "moc_importmailfolderattributejobimpl.cpp"