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"