23 #include <KDE/KLocalizedString>
26 #include "message_p.h"
27 #include "session_p.h"
31 class StoreJobPrivate :
public JobPrivate
34 StoreJobPrivate( Session *session,
const QString& name ) : JobPrivate( session, name ) { }
35 ~StoreJobPrivate() { }
39 StoreJob::StoreMode mode;
42 QMap<int, MessageFlags> resultingFlags;
46 using namespace KIMAP;
48 StoreJob::StoreJob( Session *session )
49 : Job( *new StoreJobPrivate( session, i18n(
"Store" ) ) )
60 void StoreJob::setSequenceSet(
const ImapSet &set )
66 ImapSet StoreJob::sequenceSet()
const
68 Q_D(
const StoreJob );
72 void StoreJob::setUidBased(
bool uidBased)
75 d->uidBased = uidBased;
78 bool StoreJob::isUidBased()
const
80 Q_D(
const StoreJob );
84 void StoreJob::setFlags(
const MessageFlags &flags )
90 MessageFlags StoreJob::flags()
const
92 Q_D(
const StoreJob );
96 void StoreJob::setMode( StoreMode mode )
102 StoreJob::StoreMode StoreJob::mode()
const
104 Q_D(
const StoreJob );
108 QMap<int, MessageFlags> StoreJob::resultingFlags()
const
110 Q_D(
const StoreJob );
111 return d->resultingFlags;
114 void StoreJob::doStart()
118 if ( d->set.isEmpty() ) {
119 kWarning() <<
"Empty uid set passed to store job";
120 setError( KJob::UserDefinedError );
121 setErrorText( QLatin1String(
"Empty uid set passed to store job") );
126 QByteArray parameters = d->set.toImapSequenceSet()+
' ';
130 parameters +=
"FLAGS";
133 parameters +=
"+FLAGS";
136 parameters +=
"-FLAGS";
141 foreach (
const QByteArray &flag, d->flags ) {
142 parameters += flag +
' ';
144 if ( !d->flags.isEmpty() ) {
145 parameters.chop( 1 );
149 kDebug() << parameters;
151 QByteArray command =
"STORE";
153 command =
"UID "+command;
156 d->tags << d->sessionInternal()->sendCommand( command, parameters );
159 void StoreJob::handleResponse(
const Message &response )
163 if ( handleErrorReplies( response ) == NotHandled ) {
164 if ( response.content.size() == 4 &&
165 response.content[2].toString() ==
"FETCH" &&
166 response.content[3].type() == Message::Part::List ) {
168 int id = response.content[1].toString().toInt();
170 bool uidFound =
false;
171 QList<QByteArray> resultingFlags;
173 QList<QByteArray> content = response.content[3].toList();
175 for ( QList<QByteArray>::ConstIterator it = content.constBegin();
176 it != content.constEnd(); ++it ) {
177 QByteArray str = *it;
180 if ( str ==
"FLAGS" ) {
181 if ( ( *it ).startsWith(
'(' ) && ( *it ).endsWith(
')' ) ) {
182 QByteArray str = *it;
185 resultingFlags = str.split(
' ' );
187 resultingFlags << *it;
189 }
else if ( str ==
"UID" ) {
190 uid = it->toLongLong( &uidFound );
194 if ( !d->uidBased ) {
195 d->resultingFlags[id] = resultingFlags;
196 }
else if ( uidFound ) {
197 d->resultingFlags[uid] = resultingFlags;
199 kWarning() <<
"We asked for UID but the server didn't give it back, resultingFlags not stored.";
Represents a set of natural numbers (1-> ) in a as compact as possible form.