9#include "kimap_debug.h"
10#include <KLocalizedString>
13#include "response_p.h"
18class StoreJobPrivate :
public JobPrivate
21 StoreJobPrivate(Session *session,
const QString &name)
22 : JobPrivate(session,
name)
30 QByteArray addFlags(
const QByteArray ¶m,
const MessageFlags &flags)
32 QByteArray parameters;
34 case StoreJob::SetFlags:
37 case StoreJob::AppendFlags:
38 parameters +=
"+" + param;
40 case StoreJob::RemoveFlags:
41 parameters +=
"-" + param;
46 for (
const QByteArray &flag : flags) {
47 parameters += flag +
' ';
49 if (!flags.isEmpty()) {
59 StoreJob::StoreMode mode;
61 MessageFlags gmLabels;
63 QMap<int, MessageFlags> resultingFlags;
69StoreJob::StoreJob(
Session *session)
70 : Job(*new StoreJobPrivate(session,
i18n(
"Store")))
81void StoreJob::setSequenceSet(
const ImapSet &set)
87ImapSet StoreJob::sequenceSet()
const
93void StoreJob::setUidBased(
bool uidBased)
96 d->uidBased = uidBased;
99bool StoreJob::isUidBased()
const
105void StoreJob::setFlags(
const MessageFlags &flags)
111MessageFlags StoreJob::flags()
const
117void StoreJob::setGMLabels(
const MessageFlags &gmLabels)
120 d->gmLabels = gmLabels;
123MessageFlags StoreJob::gmLabels()
const
129void StoreJob::setMode(StoreMode mode)
135StoreJob::StoreMode StoreJob::mode()
const
141QMap<int, MessageFlags> StoreJob::resultingFlags()
const
144 return d->resultingFlags;
147void StoreJob::doStart()
151 if (d->set.isEmpty()) {
152 qCWarning(KIMAP_LOG) <<
"Empty uid set passed to store job";
154 setErrorText(QStringLiteral(
"Empty uid set passed to store job"));
160 QByteArray parameters = d->set.toImapSequenceSet() +
' ';
162 if (!d->flags.isEmpty()) {
163 parameters += d->addFlags(
"FLAGS", d->flags);
165 if (!d->gmLabels.isEmpty()) {
166 if (!d->flags.isEmpty()) {
169 parameters += d->addFlags(
"X-GM-LABELS", d->gmLabels);
172 qCDebug(KIMAP_LOG) << parameters;
174 QByteArray command =
"STORE";
176 command =
"UID " + command;
179 d->tags << d->sessionInternal()->sendCommand(command, parameters);
182void StoreJob::handleResponse(
const Response &response)
186 if (handleErrorReplies(response) == NotHandled) {
187 if (response.content.size() == 4 && response.content[2].toString() ==
"FETCH" && response.content[3].type() == Response::Part::List) {
188 int id = response.content[1].toString().toInt();
190 bool uidFound =
false;
191 QList<QByteArray> resultingFlags;
193 QList<QByteArray> content = response.content[3].toList();
196 QByteArray str = *it;
199 if (str ==
"FLAGS") {
200 if ((*it).startsWith(
'(') && (*it).endsWith(
')')) {
201 QByteArray str = *it;
204 resultingFlags = str.
split(
' ');
206 resultingFlags << *it;
208 }
else if (str ==
"UID") {
209 uid = it->toLongLong(&uidFound);
214 d->resultingFlags[id] = resultingFlags;
215 }
else if (uidFound) {
216 d->resultingFlags[uid] = resultingFlags;
218 qCWarning(KIMAP_LOG) <<
"We asked for UID but the server didn't give it back, resultingFlags not stored.";
224#include "moc_storejob.cpp"
Represents a set of natural numbers (1->∞) in a as compact as possible form.
void setErrorText(const QString &errorText)
void setError(int errorCode)
QString i18n(const char *text, const TYPE &arg...)
QString name(StandardAction id)
QByteArray & remove(qsizetype pos, qsizetype len)
QList< QByteArray > split(char sep) const const
const_iterator constBegin() const const
const_iterator constEnd() const const