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

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 "AppendTask.h"
0025 #include "Imap/Model/ItemRoles.h"
0026 #include "Imap/Model/Model.h"
0027 #include "GetAnyConnectionTask.h"
0028 
0029 namespace Imap
0030 {
0031 namespace Mailbox
0032 {
0033 
0034 AppendTask::AppendTask(Model *model, const QString &targetMailbox, const QByteArray &rawMessageData, const QStringList &flags,
0035                        const QDateTime &timestamp):
0036     ImapTask(model), targetMailbox(targetMailbox), rawMessageData(rawMessageData), flags(flags), timestamp(timestamp)
0037 {
0038     conn = model->m_taskFactory->createGetAnyConnectionTask(model);
0039     conn->addDependentTask(this);
0040 }
0041 
0042 AppendTask::AppendTask(Model *model, const QString &targetMailbox, const QList<CatenatePair> &data, const QStringList &flags,
0043                        const QDateTime &timestamp):
0044     ImapTask(model), targetMailbox(targetMailbox), data(data), flags(flags), timestamp(timestamp)
0045 {
0046     conn = model->m_taskFactory->createGetAnyConnectionTask(model);
0047     conn->addDependentTask(this);
0048 }
0049 
0050 void AppendTask::perform()
0051 {
0052     parser = conn->parser;
0053     Q_ASSERT(parser);
0054     markAsActiveTask();
0055 
0056     IMAP_TASK_CHECK_ABORT_DIE;
0057 
0058     if (data.isEmpty()) {
0059         tag = parser->append(targetMailbox, rawMessageData, flags, timestamp);
0060     } else {
0061         tag = parser->appendCatenate(targetMailbox, data, flags, timestamp);
0062     }
0063 }
0064 
0065 bool AppendTask::handleStateHelper(const Imap::Responses::State *const resp)
0066 {
0067     if (resp->tag.isEmpty())
0068         return false;
0069 
0070     if (resp->tag == tag) {
0071 
0072         if (resp->kind == Responses::OK) {
0073             if (resp->respCode == Responses::APPENDUID) {
0074                 const Responses::RespData<QPair<uint, Sequence> > *const respData =
0075                         dynamic_cast<const Responses::RespData<QPair<uint, Sequence> >* const>(resp->respCodeData.data());
0076                 Q_ASSERT(respData);
0077                 auto uids = respData->data.second.toVector();
0078                 if (uids.size() != 1) {
0079                     log(QStringLiteral("APPENDUID: malformed data, cannot extract a single UID"));
0080                 } else {
0081                     emit appendUid(respData->data.first, uids.front());
0082                 }
0083             }
0084             // nothing should be needed here
0085             _completed();
0086         } else {
0087             _failed(resp->message);
0088         }
0089         return true;
0090     } else {
0091         return false;
0092     }
0093 }
0094 
0095 QVariant AppendTask::taskData(const int role) const
0096 {
0097     return role == RoleTaskCompactName ? QVariant(tr("Uploading message")) : QVariant();
0098 }
0099 
0100 }
0101 }