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

0001 /*
0002   SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
0003 
0004   SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "filteractionjob_p.h"
0008 
0009 #include <Akonadi/Collection>
0010 #include <Akonadi/ItemFetchJob>
0011 #include <Akonadi/ItemFetchScope>
0012 
0013 #include "akonadi_mime_debug.h"
0014 
0015 using namespace Akonadi;
0016 
0017 class Akonadi::FilterActionJobPrivate
0018 {
0019 public:
0020     explicit FilterActionJobPrivate(FilterActionJob *qq)
0021         : q(qq)
0022     {
0023     }
0024 
0025     ~FilterActionJobPrivate()
0026     {
0027         delete functor;
0028     }
0029 
0030     FilterActionJob *const q;
0031     Collection collection;
0032     Item::List items;
0033     FilterAction *functor = nullptr;
0034     ItemFetchScope fetchScope;
0035 
0036     // Q_SLOTS:
0037     void fetchResult(KJob *job);
0038 
0039     void traverseItems();
0040 };
0041 
0042 void FilterActionJobPrivate::fetchResult(KJob *job)
0043 {
0044     if (job->error()) {
0045         // KCompositeJob takes care of errors.
0046         return;
0047     }
0048 
0049     auto fjob = qobject_cast<ItemFetchJob *>(job);
0050     Q_ASSERT(fjob);
0051     Q_ASSERT(items.isEmpty());
0052     items = fjob->items();
0053     traverseItems();
0054 }
0055 
0056 void FilterActionJobPrivate::traverseItems()
0057 {
0058     Q_ASSERT(functor);
0059     qCDebug(AKONADIMIME_LOG) << "Traversing" << items.count() << "items.";
0060     for (const Item &item : std::as_const(items)) {
0061         if (functor->itemAccepted(item)) {
0062             functor->itemAction(item, q);
0063             qCDebug(AKONADIMIME_LOG) << "Added subjob for item" << item.id();
0064         }
0065     }
0066     if (q->subjobs().isEmpty()) {
0067         qCDebug(AKONADIMIME_LOG) << "No subjobs; I am done";
0068     } else {
0069         qCDebug(AKONADIMIME_LOG) << "Have subjobs; Done when last of them is";
0070     }
0071     q->commit();
0072 }
0073 
0074 FilterAction::~FilterAction() = default;
0075 
0076 FilterActionJob::FilterActionJob(const Item &item, FilterAction *functor, QObject *parent)
0077     : TransactionSequence(parent)
0078     , d(new FilterActionJobPrivate(this))
0079 {
0080     d->functor = functor;
0081     d->items << item;
0082 }
0083 
0084 FilterActionJob::FilterActionJob(const Item::List &items, FilterAction *functor, QObject *parent)
0085     : TransactionSequence(parent)
0086     , d(new FilterActionJobPrivate(this))
0087 {
0088     d->functor = functor;
0089     d->items = items;
0090 }
0091 
0092 FilterActionJob::FilterActionJob(const Collection &collection, FilterAction *functor, QObject *parent)
0093     : TransactionSequence(parent)
0094     , d(new FilterActionJobPrivate(this))
0095 {
0096     d->functor = functor;
0097     Q_ASSERT(collection.isValid());
0098     d->collection = collection;
0099 }
0100 
0101 FilterActionJob::~FilterActionJob() = default;
0102 
0103 void FilterActionJob::doStart()
0104 {
0105     if (d->collection.isValid()) {
0106         qCDebug(AKONADIMIME_LOG) << "Fetching collection" << d->collection.id();
0107         auto fjob = new ItemFetchJob(d->collection, this);
0108         Q_ASSERT(d->functor);
0109         d->fetchScope = d->functor->fetchScope();
0110         fjob->setFetchScope(d->fetchScope);
0111         connect(fjob, &ItemFetchJob::result, this, [this](KJob *job) {
0112             d->fetchResult(job);
0113         });
0114     } else {
0115         d->traverseItems();
0116     }
0117 }
0118 
0119 #include "moc_filteractionjob_p.cpp"