MailTransport

filteractionjob.cpp
1 /*
2  SPDX-FileCopyrightText: 2009 Constantin Berzan <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "filteractionjob_p.h"
8 
9 #include <Akonadi/Collection>
10 #include <Akonadi/ItemFetchJob>
11 #include <Akonadi/ItemFetchScope>
12 
13 #include "mailtransportakonadi_debug.h"
14 
15 using namespace Akonadi;
16 
17 class Akonadi::FilterActionJobPrivate
18 {
19 public:
20  explicit FilterActionJobPrivate(FilterActionJob *qq)
21  : q(qq)
22  {
23  }
24 
25  ~FilterActionJobPrivate()
26  {
27  delete functor;
28  }
29 
30  FilterActionJob *const q;
31  Collection collection;
32  Item::List items;
33  FilterAction *functor = nullptr;
34  ItemFetchScope fetchScope;
35 
36  // Q_SLOTS:
37  void fetchResult(KJob *job);
38 
39  void traverseItems();
40 };
41 
42 void FilterActionJobPrivate::fetchResult(KJob *job)
43 {
44  if (job->error()) {
45  // KCompositeJob takes care of errors.
46  return;
47  }
48 
49  auto fjob = qobject_cast<ItemFetchJob *>(job);
50  Q_ASSERT(fjob);
51  Q_ASSERT(items.isEmpty());
52  items = fjob->items();
53  traverseItems();
54 }
55 
56 void FilterActionJobPrivate::traverseItems()
57 {
58  Q_ASSERT(functor);
59  qCDebug(MAILTRANSPORTAKONADI_LOG) << "Traversing" << items.count() << "items.";
60  for (const Item &item : std::as_const(items)) {
61  if (functor->itemAccepted(item)) {
62  functor->itemAction(item, q);
63  qCDebug(MAILTRANSPORTAKONADI_LOG) << "Added subjob for item" << item.id();
64  }
65  }
66  if (q->subjobs().isEmpty()) {
67  qCDebug(MAILTRANSPORTAKONADI_LOG) << "No subjobs; I am done";
68  } else {
69  qCDebug(MAILTRANSPORTAKONADI_LOG) << "Have subjobs; Done when last of them is";
70  }
71  q->commit();
72 }
73 
74 FilterAction::~FilterAction() = default;
75 
76 FilterActionJob::FilterActionJob(const Item &item, FilterAction *functor, QObject *parent)
77  : TransactionSequence(parent)
78  , d(new FilterActionJobPrivate(this))
79 {
80  d->functor = functor;
81  d->items << item;
82 }
83 
84 FilterActionJob::FilterActionJob(const Item::List &items, FilterAction *functor, QObject *parent)
85  : TransactionSequence(parent)
86  , d(new FilterActionJobPrivate(this))
87 {
88  d->functor = functor;
89  d->items = items;
90 }
91 
92 FilterActionJob::FilterActionJob(const Collection &collection, FilterAction *functor, QObject *parent)
93  : TransactionSequence(parent)
94  , d(new FilterActionJobPrivate(this))
95 {
96  d->functor = functor;
97  Q_ASSERT(collection.isValid());
98  d->collection = collection;
99 }
100 
101 FilterActionJob::~FilterActionJob() = default;
102 
103 void FilterActionJob::doStart()
104 {
105  if (d->collection.isValid()) {
106  qCDebug(MAILTRANSPORTAKONADI_LOG) << "Fetching collection" << d->collection.id();
107  auto fjob = new ItemFetchJob(d->collection, this);
108  Q_ASSERT(d->functor);
109  d->fetchScope = d->functor->fetchScope();
110  fjob->setFetchScope(d->fetchScope);
111  connect(fjob, &ItemFetchJob::result, this, [this](KJob *job) {
112  d->fetchResult(job);
113  });
114  } else {
115  d->traverseItems();
116  }
117 }
118 
119 #include "moc_filteractionjob_p.cpp"
QVector< Item > List
bool isValid() const
int error() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Mar 23 2023 04:19:12 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.