File indexing completed on 2024-05-05 05:13:00

0001 /*
0002     This file is part of Akregator.
0003 
0004     SPDX-FileCopyrightText: 2008 Frank Osterfeld <osterfeld@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0007 */
0008 
0009 #include "expireitemscommand.h"
0010 
0011 #include "articlejobs.h"
0012 #include "feed.h"
0013 #include "feedlist.h"
0014 
0015 #include "akregator_debug.h"
0016 
0017 #include <QSet>
0018 #include <QTimer>
0019 
0020 #include <QSharedPointer>
0021 
0022 #include <cassert>
0023 
0024 using namespace Akregator;
0025 
0026 class Akregator::ExpireItemsCommandPrivate
0027 {
0028     ExpireItemsCommand *const q;
0029 
0030 public:
0031     explicit ExpireItemsCommandPrivate(ExpireItemsCommand *qq);
0032 
0033     void createDeleteJobs();
0034     void addDeleteJobForFeed(Feed *feed);
0035     void jobFinished(KJob *);
0036 
0037     QWeakPointer<FeedList> m_feedList;
0038     QList<uint> m_feeds;
0039     QSet<KJob *> m_jobs;
0040 };
0041 
0042 ExpireItemsCommandPrivate::ExpireItemsCommandPrivate(ExpireItemsCommand *qq)
0043     : q(qq)
0044     , m_feedList()
0045 {
0046 }
0047 
0048 void ExpireItemsCommandPrivate::addDeleteJobForFeed(Feed *feed)
0049 {
0050     Q_ASSERT(feed);
0051     auto job = new ArticleDeleteJob(q);
0052     QObject::connect(job, &ArticleDeleteJob::finished, q, [this](KJob *job) {
0053         jobFinished(job);
0054     });
0055     m_jobs.insert(job);
0056     feed->deleteExpiredArticles(job);
0057     job->start();
0058 }
0059 
0060 void ExpireItemsCommandPrivate::jobFinished(KJob *job)
0061 {
0062     Q_ASSERT(!m_jobs.isEmpty());
0063     m_jobs.remove(job);
0064     Q_EMIT q->progress(((m_feeds.count() - m_jobs.count()) * 100) / m_feeds.count(), QString());
0065     if (m_jobs.isEmpty()) {
0066         q->done();
0067     }
0068 }
0069 
0070 void ExpireItemsCommandPrivate::createDeleteJobs()
0071 {
0072     Q_ASSERT(m_jobs.isEmpty());
0073     const QSharedPointer<FeedList> feedList = m_feedList.lock();
0074 
0075     if (m_feeds.isEmpty() || !feedList) {
0076         if (!feedList) {
0077             qCWarning(AKREGATOR_LOG) << "Associated feed list was deleted, could not expire items";
0078         }
0079         q->done();
0080         return;
0081     }
0082 
0083     for (const uint i : std::as_const(m_feeds)) {
0084         Feed *const feed = qobject_cast<Feed *>(feedList->findByID(i));
0085         if (feed) {
0086             addDeleteJobForFeed(feed);
0087         }
0088     }
0089 }
0090 
0091 ExpireItemsCommand::ExpireItemsCommand(QObject *parent)
0092     : Command(parent)
0093     , d(new ExpireItemsCommandPrivate(this))
0094 {
0095 }
0096 
0097 ExpireItemsCommand::~ExpireItemsCommand() = default;
0098 
0099 void ExpireItemsCommand::setFeedList(const QWeakPointer<FeedList> &feedList)
0100 {
0101     d->m_feedList = feedList;
0102 }
0103 
0104 QWeakPointer<FeedList> ExpireItemsCommand::feedList() const
0105 {
0106     return d->m_feedList;
0107 }
0108 
0109 void ExpireItemsCommand::setFeeds(const QList<uint> &feeds)
0110 {
0111     d->m_feeds = feeds;
0112 }
0113 
0114 QList<uint> ExpireItemsCommand::feeds() const
0115 {
0116     return d->m_feeds;
0117 }
0118 
0119 void ExpireItemsCommand::doAbort()
0120 {
0121     for (KJob *const i : std::as_const(d->m_jobs)) {
0122         i->kill();
0123     }
0124 }
0125 
0126 void ExpireItemsCommand::doStart()
0127 {
0128     QTimer::singleShot(0, this, [this]() {
0129         d->createDeleteJobs();
0130     });
0131 }
0132 
0133 #include "moc_expireitemscommand.cpp"