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"