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 }