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"