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

0001 /*
0002     SPDX-FileCopyrightText: 2009 Kevin Ottens <ervin@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "appendjob.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 namespace KIMAP
0017 {
0018 class AppendJobPrivate : public JobPrivate
0019 {
0020 public:
0021     AppendJobPrivate(Session *session, const QString &name)
0022         : JobPrivate(session, name)
0023     {
0024     }
0025     ~AppendJobPrivate()
0026     {
0027     }
0028 
0029     QString mailBox;
0030     QList<QByteArray> flags;
0031     QDateTime internalDate;
0032     QByteArray content;
0033     qint64 uid = 0;
0034 };
0035 }
0036 
0037 using namespace KIMAP;
0038 
0039 AppendJob::AppendJob(Session *session)
0040     : Job(*new AppendJobPrivate(session, i18n("Append")))
0041 {
0042 }
0043 
0044 AppendJob::~AppendJob()
0045 {
0046 }
0047 
0048 void AppendJob::setMailBox(const QString &mailBox)
0049 {
0050     Q_D(AppendJob);
0051     d->mailBox = mailBox;
0052 }
0053 
0054 QString AppendJob::mailBox() const
0055 {
0056     Q_D(const AppendJob);
0057     return d->mailBox;
0058 }
0059 
0060 void AppendJob::setFlags(const QList<QByteArray> &flags)
0061 {
0062     Q_D(AppendJob);
0063     d->flags = flags;
0064 }
0065 
0066 QList<QByteArray> AppendJob::flags() const
0067 {
0068     Q_D(const AppendJob);
0069     return d->flags;
0070 }
0071 
0072 void AppendJob::setInternalDate(const QDateTime &internalDate)
0073 {
0074     Q_D(AppendJob);
0075     d->internalDate = internalDate;
0076 }
0077 
0078 QDateTime AppendJob::internalDate() const
0079 {
0080     Q_D(const AppendJob);
0081     return d->internalDate;
0082 }
0083 
0084 void AppendJob::setContent(const QByteArray &content)
0085 {
0086     Q_D(AppendJob);
0087     d->content = content;
0088 }
0089 
0090 QByteArray AppendJob::content() const
0091 {
0092     Q_D(const AppendJob);
0093     return d->content;
0094 }
0095 
0096 qint64 AppendJob::uid() const
0097 {
0098     Q_D(const AppendJob);
0099     return d->uid;
0100 }
0101 
0102 void AppendJob::doStart()
0103 {
0104     Q_D(AppendJob);
0105 
0106     QByteArray parameters = '\"' + KIMAP::encodeImapFolderName(d->mailBox.toUtf8()) + '\"';
0107 
0108     if (!d->flags.isEmpty()) {
0109         parameters += " (";
0110         for (const QByteArray &flag : std::as_const(d->flags)) {
0111             parameters += flag + ' ';
0112         }
0113         parameters.chop(1);
0114         parameters += ')';
0115     }
0116 
0117     if (!d->internalDate.isNull()) {
0118         const QDateTime utcDateTime = d->internalDate.toUTC();
0119         parameters += " \"" + QLocale::c().toString(utcDateTime, QStringLiteral("dd-MMM-yyyy hh:mm:ss")).toLatin1() + " +0000" + '\"';
0120     }
0121 
0122     parameters += " {" + QByteArray::number(d->content.size()) + '}';
0123 
0124     d->tags << d->sessionInternal()->sendCommand("APPEND", parameters);
0125 }
0126 
0127 void AppendJob::handleResponse(const Response &response)
0128 {
0129     Q_D(AppendJob);
0130     const QList<Response::Part>::ConstIterator end(response.responseCode.end());
0131     for (QList<Response::Part>::ConstIterator it = response.responseCode.begin(); it != end; ++it) {
0132         if (it->toString() == "APPENDUID") {
0133             it = it + 2;
0134             if (it != end) {
0135                 d->uid = it->toString().toLongLong();
0136             }
0137             break;
0138         }
0139     }
0140 
0141     if (handleErrorReplies(response) == NotHandled) {
0142         if (!response.content.isEmpty() && response.content[0].toString() == "+") {
0143             d->sessionInternal()->sendData(d->content);
0144         }
0145     }
0146 }
0147 
0148 #include "moc_appendjob.cpp"