File indexing completed on 2024-06-23 05:21:16
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 "SubscribeUnsubscribeTask.h" 0025 #include "Imap/Model/ItemRoles.h" 0026 #include "Imap/Model/Model.h" 0027 #include "Imap/Model/MailboxTree.h" 0028 #include "GetAnyConnectionTask.h" 0029 0030 namespace Imap 0031 { 0032 namespace Mailbox 0033 { 0034 0035 0036 SubscribeUnsubscribeTask::SubscribeUnsubscribeTask(Model *model, const QString &mailboxName, SubscribeUnsubscribeOperation operation): 0037 ImapTask(model), operation(operation), mailboxName(mailboxName) 0038 { 0039 conn = model->m_taskFactory->createGetAnyConnectionTask(model); 0040 conn->addDependentTask(this); 0041 } 0042 0043 SubscribeUnsubscribeTask::SubscribeUnsubscribeTask(Model *model, ImapTask *parentTask, const QString &mailboxName, SubscribeUnsubscribeOperation operation): 0044 ImapTask(model), conn(parentTask), operation(operation), mailboxName(mailboxName) 0045 { 0046 conn->addDependentTask(this); 0047 } 0048 0049 void SubscribeUnsubscribeTask::perform() 0050 { 0051 parser = conn->parser; 0052 markAsActiveTask(); 0053 0054 IMAP_TASK_CHECK_ABORT_DIE; 0055 0056 switch (operation) { 0057 case SUBSCRIBE: 0058 tag = parser->subscribe(mailboxName); 0059 break; 0060 case UNSUBSCRIBE: 0061 tag = parser->unSubscribe(mailboxName); 0062 break; 0063 default: 0064 Q_ASSERT(false); 0065 } 0066 } 0067 0068 bool SubscribeUnsubscribeTask::handleStateHelper(const Imap::Responses::State *const resp) 0069 { 0070 if (resp->tag.isEmpty()) 0071 return false; 0072 0073 if (resp->tag == tag) { 0074 if (resp->kind == Responses::OK) { 0075 TreeItemMailbox *mailbox = dynamic_cast<TreeItemMailbox *>(model->findMailboxByName(mailboxName)); 0076 QString subscribed = QStringLiteral("\\SUBSCRIBED"); 0077 switch (operation) { 0078 case SUBSCRIBE: 0079 if (mailbox && !mailbox->m_metadata.flags.contains(subscribed)) { 0080 mailbox->m_metadata.flags.append(subscribed); 0081 } 0082 break; 0083 case UNSUBSCRIBE: 0084 if (mailbox) { 0085 mailbox->m_metadata.flags.removeOne(subscribed); 0086 } 0087 } 0088 if (mailbox) { 0089 auto index = mailbox->toIndex(model); 0090 emit model->dataChanged(index, index); 0091 } 0092 _completed(); 0093 } else { 0094 _failed(tr("SUBSCRIBE/UNSUBSCRIBE has failed")); 0095 // FIXME: error handling 0096 } 0097 return true; 0098 } else { 0099 return false; 0100 } 0101 } 0102 0103 QString SubscribeUnsubscribeTask::debugIdentification() const 0104 { 0105 return QStringLiteral("Subscription update for %1").arg(mailboxName); 0106 } 0107 0108 QVariant SubscribeUnsubscribeTask::taskData(const int role) const 0109 { 0110 return role == RoleTaskCompactName ? QVariant(tr("Updating subscription information")) : QVariant(); 0111 } 0112 0113 } 0114 }