File indexing completed on 2024-05-12 05:17:15

0001 /*
0002     SPDX-FileCopyrightText: 2016 Daniel Vrátil <dvratil@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "movejob.h"
0008 
0009 #include "job_p.h"
0010 #include "response_p.h"
0011 #include "rfccodecs.h"
0012 #include "session_p.h"
0013 
0014 #include <KLocalizedString>
0015 
0016 // TODO: when custom error codes are introduced, handle the NO [TRYCREATE] response
0017 
0018 namespace KIMAP
0019 {
0020 class MoveJobPrivate : public JobPrivate
0021 {
0022 public:
0023     MoveJobPrivate(Session *session, const QString &name)
0024         : JobPrivate(session, name)
0025     {
0026     }
0027 
0028     ~MoveJobPrivate()
0029     {
0030     }
0031 
0032     QString mailBox;
0033     ImapSet set;
0034     ImapSet resultingUids;
0035     bool uidBased = false;
0036 };
0037 }
0038 
0039 using namespace KIMAP;
0040 
0041 MoveJob::MoveJob(Session *session)
0042     : Job(*new MoveJobPrivate(session, i18n("Move")))
0043 {
0044     Q_D(MoveJob);
0045     d->uidBased = false;
0046 }
0047 
0048 MoveJob::~MoveJob()
0049 {
0050 }
0051 
0052 void MoveJob::setMailBox(const QString &mailBox)
0053 {
0054     Q_D(MoveJob);
0055     d->mailBox = mailBox;
0056 }
0057 
0058 QString MoveJob::mailBox() const
0059 {
0060     Q_D(const MoveJob);
0061     return d->mailBox;
0062 }
0063 
0064 void MoveJob::setSequenceSet(const ImapSet &set)
0065 {
0066     Q_D(MoveJob);
0067     d->set = set;
0068 }
0069 
0070 ImapSet MoveJob::sequenceSet() const
0071 {
0072     Q_D(const MoveJob);
0073     return d->set;
0074 }
0075 
0076 void MoveJob::setUidBased(bool uidBased)
0077 {
0078     Q_D(MoveJob);
0079     d->uidBased = uidBased;
0080 }
0081 
0082 bool MoveJob::isUidBased() const
0083 {
0084     Q_D(const MoveJob);
0085     return d->uidBased;
0086 }
0087 
0088 ImapSet MoveJob::resultingUids() const
0089 {
0090     Q_D(const MoveJob);
0091     return d->resultingUids;
0092 }
0093 
0094 void MoveJob::doStart()
0095 {
0096     Q_D(MoveJob);
0097 
0098     d->set.optimize();
0099     QByteArray parameters = d->set.toImapSequenceSet() + ' ';
0100     parameters += '\"' + KIMAP::encodeImapFolderName(d->mailBox.toUtf8()) + '\"';
0101 
0102     QByteArray command = "MOVE";
0103     if (d->uidBased) {
0104         command = "UID " + command;
0105     }
0106 
0107     d->tags << d->sessionInternal()->sendCommand(command, parameters);
0108 }
0109 
0110 void MoveJob::handleResponse(const Response &response)
0111 {
0112     Q_D(MoveJob);
0113 
0114     for (auto it = response.responseCode.cbegin(), end = response.responseCode.cend(); it != end; ++it) {
0115         if (it->toString() == "COPYUID") {
0116             it = it + 3;
0117             if (it < end) {
0118                 d->resultingUids = ImapSet::fromImapSequenceSet(it->toString());
0119             }
0120             break;
0121         }
0122     }
0123 
0124     handleErrorReplies(response);
0125 }
0126 
0127 #include "moc_movejob.cpp"