File indexing completed on 2024-06-23 05:21:13

0001 /* Copyright (C) 2006 - 2014 Jan Kundrát <jkt@flaska.net>
0002 
0003    This file is part of the Trojita Qt IMAP e-mail client,
0004    http://trojita.flaska.net/
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU General Public License as
0008    published by the Free Software Foundation; either version 2 of
0009    the License or (at your option) version 3 or any later version
0010    accepted by the membership of KDE e.V. (or its successor approved
0011    by the membership of KDE e.V.), which shall act as a proxy
0012    defined in Section 14 of version 3 of the license.
0013 
0014    This program is distributed in the hope that it will be useful,
0015    but WITHOUT ANY WARRANTY; without even the implied warranty of
0016    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0017    GNU General Public License for more details.
0018 
0019    You should have received a copy of the GNU General Public License
0020    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0021 */
0022 
0023 
0024 #include "ExpungeMessagesTask.h"
0025 #include "Imap/Model/ItemRoles.h"
0026 #include "Imap/Model/Model.h"
0027 #include "Imap/Model/MailboxTree.h"
0028 #include "KeepMailboxOpenTask.h"
0029 
0030 namespace Imap
0031 {
0032 namespace Mailbox
0033 {
0034 
0035 
0036 ExpungeMessagesTask::ExpungeMessagesTask(Model *model, ImapTask *parentTask, const QList<QPersistentModelIndex> &messages):
0037     ImapTask(model), conn(parentTask), messages(messages)
0038 {
0039     if (messages.isEmpty()) {
0040         throw CantHappen("ExpungeMessagesTask called with empty message set");
0041     }
0042     Q_ASSERT(conn);
0043     conn->addDependentTask(this);
0044 }
0045 
0046 void ExpungeMessagesTask::perform()
0047 {
0048     parser = conn->parser;
0049     markAsActiveTask();
0050 
0051     IMAP_TASK_CHECK_ABORT_DIE;
0052 
0053     Sequence seq;
0054     bool first = true;
0055 
0056     Q_FOREACH(const QPersistentModelIndex& index, messages) {
0057         if (! index.isValid()) {
0058             // That message is gone already
0059         } else {
0060             TreeItem *item = static_cast<TreeItem *>(index.internalPointer());
0061             Q_ASSERT(item);
0062             TreeItemMessage *message = dynamic_cast<TreeItemMessage *>(item);
0063             Q_ASSERT(message);
0064             if (first) {
0065                 seq = Sequence(message->uid());
0066                 first = false;
0067             } else {
0068                 seq.add(message->uid());
0069             }
0070         }
0071     }
0072 
0073     if (first) {
0074         // No valid messages
0075         _failed(tr("All messages are gone already"));
0076         return;
0077     }
0078 
0079     if (!model->accessParser(parser).capabilities.contains(QStringLiteral("UIDPLUS"))) {
0080         _failed(tr("The IMAP server doesn't support the UIDPLUS extension"));
0081     }
0082 
0083     tag = parser->uidExpunge(seq);
0084 }
0085 
0086 bool ExpungeMessagesTask::handleStateHelper(const Imap::Responses::State *const resp)
0087 {
0088     if (resp->tag.isEmpty())
0089         return false;
0090 
0091     if (resp->tag == tag) {
0092         if (resp->kind == Responses::OK) {
0093             _completed();
0094         } else {
0095             _failed(tr("UID EXPUNGE failed"));
0096         }
0097         return true;
0098     } else {
0099         return false;
0100     }
0101 }
0102 
0103 QVariant ExpungeMessagesTask::taskData(const int role) const
0104 {
0105     return role == RoleTaskCompactName ? QVariant(tr("Removing some of the deleted messages")) : QVariant();
0106 }
0107 
0108 }
0109 }