From b12f18885861b125ed139f83fa27491d4b3f9f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= 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(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 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(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 #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