20 #include "setmetadatajob.h"
22 #include <KDE/KLocale>
25 #include "metadatajobbase_p.h"
26 #include "message_p.h"
27 #include "session_p.h"
32 class SetMetaDataJobPrivate :
public MetaDataJobBasePrivate
35 SetMetaDataJobPrivate( Session *session,
const QString& name ) : MetaDataJobBasePrivate(session, name), metaDataErrors(0), maxAcceptedSize(-1) { }
36 ~SetMetaDataJobPrivate() { }
38 QMap<QByteArray, QByteArray> entries;
39 QMap<QByteArray, QByteArray>::ConstIterator entriesIt;
41 SetMetaDataJob::MetaDataErrors metaDataErrors;
42 qint64 maxAcceptedSize;
46 using namespace KIMAP;
48 SetMetaDataJob::SetMetaDataJob( Session *session )
49 :
MetaDataJobBase( *new SetMetaDataJobPrivate(session, i18n(
"SetMetaData")) )
53 SetMetaDataJob::~SetMetaDataJob()
57 void SetMetaDataJob::doStart()
60 QByteArray parameters;
61 parameters =
'\"' + KIMAP::encodeImapFolderName( d->mailBox.toUtf8() ) +
"\" ";
62 d->entriesIt = d->entries.constBegin();
64 QByteArray command =
"SETMETADATA";
66 command =
"SETANNOTATION";
67 parameters +=
'\"' + d->entryName +
"\" (";
68 d->m_name = i18n(
"SetAnnotation");
69 if (!d->entries.isEmpty()) {
70 for (; d->entriesIt != d->entries.constEnd(); ++d->entriesIt) {
71 parameters +=
'\"' + d->entriesIt.key() +
"\" \"" + d->entriesIt.value() +
"\" ";
73 parameters[parameters.length() - 1] =
')';
77 if (!d->entries.isEmpty()) {
78 parameters +=
'\"' + d->entriesIt.key() +
'\"';
80 parameters +=
" {" + QByteArray::number(d->entriesIt.value().size()) +
'}';
84 if (d->entries.isEmpty()) {
88 d->tags << d->sessionInternal()->sendCommand( command, parameters );
92 void SetMetaDataJob::handleResponse(
const Message &response )
97 if ( !response.content.isEmpty()
98 && d->tags.contains( response.content.first().toString() ) ) {
99 if ( response.content[1].toString() ==
"NO" ) {
100 setError( UserDefinedError );
101 setErrorText( i18n(
"%1 failed, server replied: %2", d->m_name, response.toString().constData()) );
102 if (response.content[2].toString() ==
"[ANNOTATEMORE TOOMANY]" || response.content[2].toString() ==
"[METADATA TOOMANY]") {
104 }
else if (response.content[2].toString() ==
"[ANNOTATEMORE TOOBIG]" || response.content[2].toString().startsWith(
"[METADATA MAXSIZE")) {
105 d->metaDataErrors |=
TooBig;
106 d->maxAcceptedSize = -1;
107 if (response.content[2].toString().startsWith(
"[METADATA MAXSIZE")) {
108 QByteArray max = response.content[2].toString();
109 max.replace(
"[METADATA MAXSIZE",
"");
110 max.replace(
"]",
"");
111 d->maxAcceptedSize = max.toLongLong();
113 }
else if (response.content[2].toString() ==
"[METADATA NOPRIVATE]") {
116 }
else if ( response.content.size() < 2 ) {
117 setErrorText( i18n(
"%1 failed, malformed reply from the server.", d->m_name) );
118 }
else if ( response.content[1].toString() !=
"OK" ) {
119 setError( UserDefinedError );
120 setErrorText( i18n(
"%1 failed, server replied: %2", d->m_name, response.toString().constData()) );
123 }
else if ( d->serverCapability ==
Metadata && response.content[0].toString() ==
"+" ) {
124 QByteArray content = d->entriesIt.value();
126 if (d->entriesIt == d->entries.constEnd()) {
129 content +=
" {" + QByteArray::number(d->entriesIt.value().size()) +
'}';
132 d->sessionInternal()->sendData( content );
139 d->entries[name] = value;
145 d->entryName = entry;
151 return d->metaDataErrors;
154 #include "setmetadatajob.moc"