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"