File indexing completed on 2024-04-21 05:10:37

0001 /*
0002     This file is part of Akregator.
0003 
0004     SPDX-FileCopyrightText: 2005 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 "progressmanager.h"
0010 #include "feed.h"
0011 #include "treenode.h"
0012 
0013 #include <KLocalizedString>
0014 
0015 #include <Libkdepim/ProgressManager>
0016 
0017 using namespace Akregator;
0018 
0019 ProgressManager *ProgressManager::m_self = nullptr;
0020 
0021 ProgressManager *ProgressManager::self()
0022 {
0023     static ProgressManager sself;
0024     if (!m_self) {
0025         m_self = &sself;
0026     }
0027     return m_self;
0028 }
0029 
0030 ProgressManager::ProgressManager() = default;
0031 
0032 ProgressManager::~ProgressManager() = default;
0033 
0034 void ProgressManager::setFeedList(const QSharedPointer<FeedList> &feedList)
0035 {
0036     if (feedList == m_feedList) {
0037         return;
0038     }
0039 
0040     if (m_feedList) {
0041         qDeleteAll(m_handlers);
0042         m_handlers.clear();
0043         m_feedList->disconnect(this);
0044     }
0045 
0046     m_feedList = feedList;
0047 
0048     if (m_feedList) {
0049         const QList<Feed *> list = feedList->feeds();
0050 
0051         for (TreeNode *i : list) {
0052             slotNodeAdded(i);
0053         }
0054         connect(feedList.data(), &FeedList::signalNodeAdded, this, &ProgressManager::slotNodeAdded);
0055         connect(feedList.data(), &FeedList::signalNodeRemoved, this, &ProgressManager::slotNodeRemoved);
0056     }
0057 }
0058 
0059 void ProgressManager::slotNodeAdded(TreeNode *node)
0060 {
0061     Feed *const feed = qobject_cast<Feed *>(node);
0062     if (!feed) {
0063         return;
0064     }
0065 
0066     if (m_handlers.contains(feed)) {
0067         return;
0068     }
0069 
0070     m_handlers[feed] = new ProgressItemHandler(feed);
0071     connect(feed, &TreeNode::signalDestroyed, this, &ProgressManager::slotNodeDestroyed);
0072 }
0073 
0074 void ProgressManager::slotNodeRemoved(TreeNode *node)
0075 {
0076     Feed *feed = qobject_cast<Feed *>(node);
0077     if (feed) {
0078         feed->disconnect(this);
0079         delete m_handlers[feed];
0080         m_handlers.remove(feed);
0081     }
0082 }
0083 
0084 void ProgressManager::slotNodeDestroyed(TreeNode *node)
0085 {
0086     Feed *feed = qobject_cast<Feed *>(node);
0087     if (feed) {
0088         delete m_handlers[feed];
0089         m_handlers.remove(feed);
0090     }
0091 }
0092 
0093 ProgressItemHandler::ProgressItemHandler(Feed *feed)
0094 {
0095     m_feed = feed;
0096     m_progressItem = nullptr;
0097 
0098     connect(feed, &Feed::fetchStarted, this, &ProgressItemHandler::slotFetchStarted);
0099     connect(feed, &Feed::fetched, this, &ProgressItemHandler::slotFetchCompleted);
0100     connect(feed, &Feed::fetchError, this, &ProgressItemHandler::slotFetchError);
0101     connect(feed, &Feed::fetchAborted, this, &ProgressItemHandler::slotFetchAborted);
0102 }
0103 
0104 ProgressItemHandler::~ProgressItemHandler()
0105 {
0106     if (m_progressItem) {
0107         m_progressItem->setComplete();
0108         m_progressItem = nullptr;
0109     }
0110 }
0111 
0112 void ProgressItemHandler::slotFetchStarted()
0113 {
0114     if (m_progressItem) {
0115         m_progressItem->setComplete();
0116         m_progressItem = nullptr;
0117     }
0118 
0119     m_progressItem = KPIM::ProgressManager::createProgressItem(KPIM::ProgressManager::getUniqueID(), m_feed->title(), QString(), true);
0120 
0121     connect(m_progressItem, &KPIM::ProgressItem::progressItemCanceled, m_feed, &Feed::slotAbortFetch);
0122 }
0123 
0124 void ProgressItemHandler::slotFetchCompleted()
0125 {
0126     if (m_progressItem) {
0127         m_progressItem->setStatus(i18n("Fetch completed"));
0128         m_progressItem->setComplete();
0129         m_progressItem = nullptr;
0130     }
0131 }
0132 
0133 void ProgressItemHandler::slotFetchError()
0134 {
0135     if (m_progressItem) {
0136         m_progressItem->setStatus(i18n("Fetch error"));
0137         m_progressItem->setComplete();
0138         m_progressItem = nullptr;
0139     }
0140 }
0141 
0142 void ProgressItemHandler::slotFetchAborted()
0143 {
0144     if (m_progressItem) {
0145         m_progressItem->setStatus(i18n("Fetch aborted"));
0146         m_progressItem->setComplete();
0147         m_progressItem = nullptr;
0148     }
0149 }
0150 
0151 #include "moc_progressmanager.cpp"