1 // For license of this file, see <project-root-folder>/LICENSE.md.
2 
3 #include "services/abstract/unreadnode.h"
4 
5 #include "database/databasequeries.h"
6 #include "miscellaneous/application.h"
7 #include "miscellaneous/iconfactory.h"
8 
9 #include <QThread>
10 
UnreadNode(RootItem * parent_item)11 UnreadNode::UnreadNode(RootItem* parent_item) : RootItem(parent_item) {
12   setKind(RootItem::Kind::Unread);
13   setId(ID_UNREAD);
14   setIcon(qApp->icons()->fromTheme(QSL("mail-mark-unread")));
15   setTitle(tr("Unread articles"));
16   setDescription(tr("You can find all unread articles here."));
17 }
18 
undeletedMessages() const19 QList<Message> UnreadNode::undeletedMessages() const {
20   QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
21 
22   return DatabaseQueries::getUndeletedUnreadMessages(database, getParentServiceRoot()->accountId());
23 }
24 
updateCounts(bool including_total_count)25 void UnreadNode::updateCounts(bool including_total_count) {
26   Q_UNUSED(including_total_count)
27 
28   bool is_main_thread = QThread::currentThread() == qApp->thread();
29   QSqlDatabase database = is_main_thread ?
30                           qApp->database()->driver()->connection(metaObject()->className()) :
31                           qApp->database()->driver()->connection(QSL("feed_upd"));
32   int account_id = getParentServiceRoot()->accountId();
33 
34   m_totalCount = m_unreadCount = DatabaseQueries::getUnreadMessageCounts(database, account_id);
35 }
36 
cleanMessages(bool clean_read_only)37 bool UnreadNode::cleanMessages(bool clean_read_only) {
38   if (clean_read_only) {
39     return true;
40   }
41 
42   ServiceRoot* service = getParentServiceRoot();
43   QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
44 
45   if (DatabaseQueries::cleanUnreadMessages(database, service->accountId())) {
46     service->updateCounts(true);
47     service->itemChanged(service->getSubTree());
48     service->requestReloadMessageList(true);
49     return true;
50   }
51   else {
52     return false;
53   }
54 }
55 
markAsReadUnread(RootItem::ReadStatus status)56 bool UnreadNode::markAsReadUnread(RootItem::ReadStatus status) {
57   if (status == RootItem::ReadStatus::Unread) {
58     // NOTE: We do not need to mark already unread messages as unread.
59     return true;
60   }
61 
62   ServiceRoot* service = getParentServiceRoot();
63   auto* cache = dynamic_cast<CacheForServiceRoot*>(service);
64 
65   if (cache != nullptr) {
66     cache->addMessageStatesToCache(service->customIDSOfMessagesForItem(this), status);
67   }
68 
69   QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
70 
71   if (DatabaseQueries::markUnreadMessagesRead(database, service->accountId())) {
72     service->updateCounts(false);
73     service->itemChanged(service->getSubTree());
74     service->requestReloadMessageList(status == RootItem::ReadStatus::Read);
75     return true;
76   }
77   else {
78     return false;
79   }
80 }
81 
countOfUnreadMessages() const82 int UnreadNode::countOfUnreadMessages() const {
83   return m_unreadCount;
84 }
85 
countOfAllMessages() const86 int UnreadNode::countOfAllMessages() const {
87   return m_totalCount;
88 }
89