From b12f18885861b125ed139f83fa27491d4b3f9f4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jkt@kde.org>
Date: Mon, 2 Jan 2017 19:01:16 +0100
Subject: [PATCH] Refactoring: move FETCH finalization to a corresponding Task
The tasks were always meant to be able to directly perform these
operations. There's no point in stashing all functionality in the Model
class -- that one is way too big already.
Change-Id: I9adfefbdf2d7ecd3d060e764ace5535be10dd0d3
---
src/Imap/Model/MailboxTree.cpp | 16 +++++++++++----
src/Imap/Model/MailboxTree.h | 2 ++
src/Imap/Model/Model.cpp | 28 -------------------------
src/Imap/Model/Model.h | 1 -
src/Imap/Tasks/FetchMsgPartTask.cpp | 32 ++++++++++++++++++++++++++++-
src/Imap/Tasks/FetchMsgPartTask.h | 10 +++++----
6 files changed, 51 insertions(+), 38 deletions(-)
diff --git a/src/Imap/Model/MailboxTree.cpp b/src/Imap/Model/MailboxTree.cpp
index 8c28775f..47ea675c 100644
--- a/src/Imap/Model/MailboxTree.cpp
+++ b/src/Imap/Model/MailboxTree.cpp
@@ -1556,8 +1556,12 @@ bool TreeItemMessage::hasNestedAttachments(Model *const model, TreeItemPart *par
}
-TreeItemPart::TreeItemPart(TreeItem *parent, const QByteArray &mimeType):
- TreeItem(parent), m_mimeType(mimeType.toLower()), m_octets(0), m_partMime(0), m_partRaw(0)
+TreeItemPart::TreeItemPart(TreeItem *parent, const QByteArray &mimeType)
+ : TreeItem(parent)
+ , m_mimeType(mimeType.toLower())
+ , m_octets(0)
+ , m_partMime(nullptr)
+ , m_partRaw(nullptr)
{
if (isTopLevelMultiPart()) {
// Note that top-level multipart messages are special, their immediate contents
@@ -1566,8 +1570,12 @@ TreeItemPart::TreeItemPart(TreeItem *parent, const QByteArray &mimeType):
}
}
-TreeItemPart::TreeItemPart(TreeItem *parent):
- TreeItem(parent), m_mimeType("text/plain"), m_octets(0), m_partMime(0), m_partRaw(0)
+TreeItemPart::TreeItemPart(TreeItem *parent)
+ : TreeItem(parent)
+ , m_mimeType("text/plain")
+ , m_octets(0)
+ , m_partMime(nullptr)
+ , m_partRaw(nullptr)
{
}
diff --git a/src/Imap/Model/MailboxTree.h b/src/Imap/Model/MailboxTree.h
index 5cfd843a..137d4a5f 100644
--- a/src/Imap/Model/MailboxTree.h
+++ b/src/Imap/Model/MailboxTree.h
@@ -55,6 +55,7 @@ class TreeItem
friend class MsgListModel; // for direct access to m_children
friend class ThreadingMsgListModel; // for direct access to m_children
friend class UpdateFlagsOfAllMessagesTask; // for direct access to m_children
+ friend class FetchMsgPartTask; // for direct access to m_children
protected:
/** @short Availability of an item */
@@ -140,6 +141,7 @@ class TreeItemMailbox: public TreeItem
friend class DeleteMailboxTask; // for direct access to maintainingTask
friend class KeepMailboxOpenTask; // needs access to maintainingTask
friend class SubscribeUnsubscribeTask; // needs access to m_metadata.flags
+ friend class FetchMsgPartTask; // needs access to partIdToPtr()
static QLatin1String flagNoInferiors;
static QLatin1String flagHasNoChildren;
static QLatin1String flagHasChildren;
diff --git a/src/Imap/Model/Model.cpp b/src/Imap/Model/Model.cpp
index e62ef3dd..dc985d44 100644
--- a/src/Imap/Model/Model.cpp
+++ b/src/Imap/Model/Model.cpp
@@ -500,34 +500,6 @@ void Model::emitMessageCountChanged(TreeItemMailbox *const mailbox)
emit messageCountPossiblyChanged(mailboxIndex);
}
-/** @short Retrieval of a message part has completed */
-bool Model::finalizeFetchPart(TreeItemMailbox *const mailbox, const uint sequenceNo, const QByteArray &partId)
-{
- // At first, verify that the message itself is marked as loaded.
- // If it isn't, it's probably because of Model::releaseMessageData().
- TreeItem *item = mailbox->m_children[0]; // TreeItemMsgList
- item = item->child(sequenceNo - 1, this); // TreeItemMessage
- Q_ASSERT(item); // FIXME: or rather throw an exception?
- if (item->accessFetchStatus() == TreeItem::NONE) {
- // ...and it indeed got released, so let's just return and don't try to check anything
- return false;
- }
-
- TreeItemPart *part = mailbox->partIdToPtr(this, static_cast<TreeItemMessage *>(item), partId);
- if (! part) {
- qDebug() << "Can't verify part fetching status: part is not here!";
- return false;
- }
- if (part->loading()) {
- part->setFetchStatus(TreeItem::UNAVAILABLE);
- QModelIndex idx = part->toIndex(this);
- emit dataChanged(idx, idx);
- return false;
- } else {
- return true;
- }
-}
-
void Model::handleCapability(Imap::Parser *ptr, const Imap::Responses::Capability *const resp)
{
updateCapabilities(ptr, resp->capabilities);
diff --git a/src/Imap/Model/Model.h b/src/Imap/Model/Model.h
index 46dce087..114e29ac 100644
--- a/src/Imap/Model/Model.h
+++ b/src/Imap/Model/Model.h
@@ -492,7 +492,6 @@ private:
void finalizeList(Parser *parser, TreeItemMailbox *const mailboxPtr);
void finalizeIncrementalList(Parser *parser, const QString &parentMailboxName);
- bool finalizeFetchPart(TreeItemMailbox *const mailbox, const uint sequenceNo, const QByteArray &partId);
void genericHandleFetch(TreeItemMailbox *mailbox, const Imap::Responses::Fetch *const resp);
void replaceChildMailboxes(TreeItemMailbox *mailboxPtr, const TreeItemChildrenList &mailboxes);
diff --git a/src/Imap/Tasks/FetchMsgPartTask.cpp b/src/Imap/Tasks/FetchMsgPartTask.cpp
index c7a49437..40e7ec81 100644
--- a/src/Imap/Tasks/FetchMsgPartTask.cpp
+++ b/src/Imap/Tasks/FetchMsgPartTask.cpp
@@ -121,7 +121,7 @@ void FetchMsgPartTask::markPendingItemsUnavailable()
QList<TreeItemMessage *> messages = model->findMessagesByUids(mailbox, uids);
Q_FOREACH(TreeItemMessage *message, messages) {
Q_FOREACH(const QByteArray &partId, parts) {
- if (model->finalizeFetchPart(mailbox, message->row() + 1, partId)) {
+ if (finalizeFetchPart(mailbox, message->row() + 1, partId)) {
log(QLatin1String("Fetched part ") + QString::fromUtf8(partId), Common::LOG_MESSAGES);
} else {
log(QLatin1String("Received no data for part ") + QString::fromUtf8(partId), Common::LOG_MESSAGES);
@@ -130,5 +130,35 @@ void FetchMsgPartTask::markPendingItemsUnavailable()
}
}
+/** @short Retrieval of a message part has completed */
+bool FetchMsgPartTask::finalizeFetchPart(TreeItemMailbox *const mailbox, const uint sequenceNo, const QByteArray &partId)
+{
+ Q_ASSERT(model);
+ // At first, verify that the message itself is marked as loaded.
+ // If it isn't, it's probably because of Model::releaseMessageData().
+ TreeItem *item = mailbox->m_children[0]; // TreeItemMsgList
+ item = item->child(sequenceNo - 1, model); // TreeItemMessage
+ Q_ASSERT(item); // FIXME: or rather throw an exception?
+ if (item->accessFetchStatus() == TreeItem::NONE) {
+ // ...and it indeed got released, so let's just return and don't try to check anything
+ return false;
+ }
+
+ TreeItemPart *part = mailbox->partIdToPtr(model, static_cast<TreeItemMessage *>(item), partId);
+ if (!part) {
+ log(QStringLiteral("Can't verify part fetching status: part is not here!"), Common::LOG_MESSAGES);
+ return false;
+ }
+ if (part->loading()) {
+ part->setFetchStatus(TreeItem::UNAVAILABLE);
+ QModelIndex idx = part->toIndex(model);
+ emit model->dataChanged(idx, idx);
+ return false;
+ } else {
+ return true;
+ }
+}
+
+
}
}
diff --git a/src/Imap/Tasks/FetchMsgPartTask.h b/src/Imap/Tasks/FetchMsgPartTask.h
index 4d5b591f..a7e4b2c1 100644
--- a/src/Imap/Tasks/FetchMsgPartTask.h
+++ b/src/Imap/Tasks/FetchMsgPartTask.h
@@ -26,10 +26,10 @@
#include <QPersistentModelIndex>
#include "ImapTask.h"
-namespace Imap
-{
-namespace Mailbox
-{
+namespace Imap {
+namespace Mailbox {
+
+class TreeItemMailbox;
/** @short Fetch a message part */
class FetchMsgPartTask : public ImapTask
@@ -48,6 +48,8 @@ public:
protected slots:
void markPendingItemsUnavailable();
private:
+ bool finalizeFetchPart(TreeItemMailbox *const mailbox, const uint sequenceNo, const QByteArray &partId);
+
CommandHandle tag;
ImapTask *conn;
Imap::Uids uids;
--
GitLab