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

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