8#include "collectionpage/attributes/expirecollectionattribute.h"
9#include "expiredeletejob.h"
10#include "expiremovejob.h"
11#include "kernel/mailkernel.h"
13#include <PimCommon/BroadcastStatus>
14using PimCommon::BroadcastStatus;
15#include "mailcommon_debug.h"
17#include <KLocalizedString>
19#include <Akonadi/ItemDeleteJob>
20#include <Akonadi/ItemFetchJob>
21#include <Akonadi/ItemFetchScope>
22#include <Akonadi/ItemModifyJob>
23#include <Akonadi/ItemMoveJob>
24#include <Akonadi/MessageFlags>
25#include <Akonadi/MessageParts>
26#include <Akonadi/MessageStatus>
27#include <KMime/Message>
48ExpireJob::~ExpireJob()
50 qCDebug(MAILCOMMON_LOG);
58void ExpireJob::execute()
60 const MailCommon::ExpireCollectionAttribute *expirationAttribute = mSrcFolder.attribute<MailCommon::ExpireCollectionAttribute>();
61 if (expirationAttribute) {
66 mExpireMessagesWithoutInvalidDate = expirationAttribute->expireMessagesWithValidDate();
67 expirationAttribute->daysToExpire(unreadDays, readDays);
70 qCDebug(MAILCOMMON_LOG) <<
"ExpireJob: deleting unread older than" << unreadDays <<
"days";
74 qCDebug(MAILCOMMON_LOG) <<
"ExpireJob: deleting read older than" << readDays <<
"days";
78 if ((mMaxUnreadTime == 0) && (mMaxReadTime == 0)) {
79 qCDebug(MAILCOMMON_LOG) <<
"ExpireJob: nothing to do";
87 qCDebug(MAILCOMMON_LOG) <<
"ExpireJob: starting to expire in folder" << mSrcFolder.name();
92void ExpireJob::slotDoWork()
94 auto job =
new Akonadi::ItemFetchJob(mSrcFolder,
this);
96 connect(job, &Akonadi::ItemFetchJob::result,
this, &ExpireJob::itemFetchResult);
99void ExpireJob::itemFetchResult(KJob *job)
108 for (
const Akonadi::Item &item : items) {
114 Akonadi::MessageStatus
status;
115 status.setStatusFromFlags(item.flags());
116 if ((
status.isImportant() ||
status.isToAct() ||
status.isWatched()) && SettingsIf->excludeImportantMailFromExpiry()) {
120 auto mailDate = mb->date(
false);
122 if (mExpireMessagesWithoutInvalidDate) {
123 mRemovedMsgs.append(item);
126 const time_t maxTime =
status.isRead() ? mMaxReadTime : mMaxUnreadTime;
127 if (mailDate->dateTime().toSecsSinceEpoch() < maxTime) {
128 mRemovedMsgs.append(item);
136void ExpireJob::done()
140 if (!mRemovedMsgs.isEmpty()) {
141 const int count = mRemovedMsgs.count();
144 mCancellable =
false;
146 const MailCommon::ExpireCollectionAttribute *expirationAttribute = mSrcFolder.attribute<MailCommon::ExpireCollectionAttribute>();
147 if (expirationAttribute) {
148 const QString srcFolderName{mSrcFolder.name()};
149 if (expirationAttribute->expireAction() == MailCommon::ExpireCollectionAttribute::ExpireDelete) {
151 qCDebug(MAILCOMMON_LOG) <<
"ExpireJob: finished expiring in folder" << srcFolderName << count <<
"messages to remove.";
152 auto job =
new ExpireDeleteJob(
this);
153 job->setRemovedMsgs(mRemovedMsgs);
154 job->setSourceFolderName(srcFolderName);
155 connect(job, &ExpireDeleteJob::expireDeleteDone,
this, &ExpireJob::slotExpireDeleteDone);
157 str =
i18np(
"Removing 1 old message from folder %2…",
"Removing %1 old messages from folder %2...", count, srcFolderName);
161 mMoveToFolder = Kernel::self()->collectionFromId(expirationAttribute->expireToFolderId());
162 if (!mMoveToFolder.isValid()) {
164 "Cannot expire messages from folder %1: destination "
165 "folder %2 not found",
167 expirationAttribute->expireToFolderId());
168 qCWarning(MAILCOMMON_LOG) << str;
170 qCDebug(MAILCOMMON_LOG) <<
"ExpireJob: finished expiring in folder" << srcFolderName << mRemovedMsgs.count() <<
"messages to move to"
171 << mMoveToFolder.name();
173 auto job =
new ExpireMoveJob(
this);
174 job->setRemovedMsgs(mRemovedMsgs);
175 job->setSrcFolderName(srcFolderName);
176 job->setMoveToFolder(mMoveToFolder);
177 connect(job, &ExpireMoveJob::expireMovedDone,
this, &ExpireJob::slotExpireDeleteDone);
180 str =
i18np(
"Moving 1 old message from folder %2 to folder %3…",
181 "Moving %1 old messages from folder %2 to folder %3…",
184 mMoveToFolder.name());
189 BroadcastStatus::instance()->setStatusMsg(str);
198void ExpireJob::slotExpireDeleteDone()
203#include "moc_expirejob.cpp"
virtual QString errorString() const
virtual Q_SCRIPTABLE void start()=0
QSharedPointer< Message > Ptr
virtual void kill()
Interrupt the job.
Base class for scheduled jobs.
Q_SCRIPTABLE CaptureState status()
QString i18np(const char *singular, const char *plural, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
AKONADI_MIME_EXPORT const char Envelope[]
QDateTime currentDateTime()
qint64 toSecsSinceEpoch() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T qobject_cast(QObject *object)
bool isEmpty() const const